Tensorflow学习笔记:数据集加工和转化为TensorFlow专用格式——Finetuning,猫狗大战,VGGNet的重新针对训练

Kaggle 猫狗大战
猫狗大战的数据集来源于Kaggle上的一个竞赛:Dogs vs. Cats 
 Tensorflow学习笔记:数据集加工和转化为TensorFlow专用格式——Finetuning,猫狗大战,VGGNet的重新针对训练_第1张图片
猫狗大战的数据集下载地址http://www.kaggle.com/c/dogs-vs-cats,其中数据集有12500只猫和12500只狗 ,官方数据集下载需要帐号,大家也可以百度以下,百度网盘上数据有
 Tensorflow学习笔记:数据集加工和转化为TensorFlow专用格式——Finetuning,猫狗大战,VGGNet的重新针对训练_第2张图片
整个项目的文件结构如下:

Tensorflow学习笔记:数据集加工和转化为TensorFlow专用格式——Finetuning,猫狗大战,VGGNet的重新针对训练_第3张图片

下载下来来的图片尺寸都不一样,我这里先统一把图像尺寸调整到224*224*3(虽然后面转换为TensorFlow专用格式的时候代码也会调整图片尺寸,但是没有这一步运行的精度不一样),调整图片的代码如下img_resize.py:

import cv2
import os
dir='./kaggle/train'
for root, dirs, files in os.walk(dir):
    for file in files:
        filepath = os.path.join(root, file)
        try:
            image = cv2.imread(filepath)
            dim = (224, 224)
            resized = cv2.resize(image, dim)
            path = './cat_and_dog/'+file
            cv2.imwrite(path, resized)
        except:
            print(filepath)
            os.remove(filepath)
    cv2.waitKey(0)

经过上面的代码,所有图片的尺寸都变成了224*224*3,因为我们需要获取那些图片是猫,那些图片是狗,虽然图片的名称里标注了是猫还是狗,不过我们这里采用手动的方式,把前12500张猫的图片放到cat文件夹里,后面的12500张狗的图片放到dog文件夹里

Tensorflow学习笔记:数据集加工和转化为TensorFlow专用格式——Finetuning,猫狗大战,VGGNet的重新针对训练_第4张图片

接下来我们根据这两个文件夹,我把图片读取进来,分成2类,猫分类为0,狗分类1,并转换为TensorFlow专用格式,见

create_and_read_TFRecord2.py
import tensorflow as tf
import numpy as np
import os
img_width = 224
img_height = 224


def get_file(file_dir):
    images = []
    temp = []
    for root, sub_folders, files in os.walk(file_dir):
        for name in files:
            images.append(os.path.join(root, name))
        for name in sub_folders:
            temp.append(os.path.join(root, name))
    labels = []
    for one_folder in temp:
        n_img = len(os.listdir(one_folder))
        letter = one_folder.split('\\')[-1]
        if letter == 'cat':
            labels = np.append(labels, n_img * [0])
        else:
            labels = np.append(labels, n_img * [1])
    # shuffle
    temp = np.array([images, labels])
    temp = temp.transpose()
    np.random.shuffle(temp)
    image_list = list(temp[:, 0])
    label_list = list(temp[:, 1])
    label_list = [int(float(i)) for i in label_list]

    return image_list, label_list


def get_batch(image_list, label_list, img_width, img_height, batch_size, capacity):

    image = tf.cast(image_list, tf.string)
    label = tf.cast(label_list, tf.int32)

    input_queue = tf.train.slice_input_producer([image,label])

    label = input_queue[1]
    image_contents = tf.read_file(input_queue[0])
    image = tf.image.decode_jpeg(image_contents,channels=3)

    image = tf.image.resize_image_with_crop_or_pad(image,img_width,img_height)
    image = tf.image.per_image_standardization(image) # 将图片标准化
    image_batch,label_batch = tf.train.batch([image,label],batch_size=batch_size,num_threads=64,capacity=capacity)
    label_batch = tf.reshape(label_batch,[batch_size])

    return image_batch,label_batch


def onehot(labels):
    n_sample = len(labels)
    n_class = max(labels) + 1
    onehot_labels = np.zeros((n_sample, n_class))
    onehot_labels[np.arange(n_sample), labels] = 1
    return onehot_labels

这里定义的get_file函数对输入文件的文件夹进行分类,通过以不同的文件夹作为分类标准将图片分为2类,使用2个列表文件分别用来存储图片地址和对应的标记地址

get_batch函数是通过对列表地址的读取而循环载入具有参数batch_size大小而定的图片,并读取相应的图片标签作为数据标签一同进行训练

你可能感兴趣的:(python,机器学习)