猫狗识别的代码:主要分为3个部分,
第一部分:数据的准备
第二部分:构造卷积神经网络,进行模型的训练
第三部分:使用saver.restore加载训练好的参数,进行模型的预测。
第一部分:数据的准备,构建read_train_data函数
第一步:输入的参数是文件的地址,图片的大小(进行图像的矩阵变换),标签,验证集的比例
第二步:对构造一个类dataset, 用于存储训练集和验证集
第三步:对标签进行循环,对输入的文件与标签值进行拼接,获得图片文件的地址,使用glob.glob获得每张图片的地址。
第四步:循环图片地址,读入图片
第一步:使用cv2.imread() 读入图片
第二步: 使用cv2.resize(img, (img_size, img_size), 0, 0, cv2.Inter) 进行图片的维度变换
第三步: 使用.astype('float32') 对图片进行数据类型的转换
第四步: 使用np.multiply(img, 1.0/255.0) 进行图片数值归一化操作, 并将图片加到列表中
第五步:使用np.zeros(num_classes) 构造标签的零矩阵
第六步:使用index = classes.index(filed) 获得标签值对应的索引,label[index] = 1 将索引位置赋值为1
第七步: 将标签加到列表中
第八步:使用os.path.basename(file) 获得图片的名字,添加到列表中,获得标签的名字,添加到列表中
第五步:对图片和标签使用np.array转换为数组类型,并返回图片,标签,名字,类别名
第六步:使用sklearn.utils 中的shuffle,对图片,标签,名字和类别名进行清洗
第七步:使用val_size,验证集的比例对训练集和验证集进行分割
第八步:创建类别DataSet,实例化dataset.train和dataset.val,创建.next_batch函数,
第九步:next_batch函数说明:使用一个变量self._epoch_index 对start和end进行递增循环,如果end > self._num_image, 将start置为0, self._epoch_index置为batch_size。
import numpy as np import tensorflow as tf import os import glob import cv2 from sklearn.utils import shuffle def load_image(file_path, image_size, classes): num_classes = len(classes) images = [] labels = [] names = [] cls = [] # 第三步:循环标签,将路径和标签名进行拼接,获得图片文件路径,使用glob.glob获得图片路径 for filed in classes: index = classes.index(filed) path = os.path.join(file_path, filed, '*g') files = glob.glob(path) # 第四步:循环图片路径,进行图片的读取 for file in files: # cv2.imread图片的读取 image = cv2.imread(file) # cv2.resize进行图片维度的重构 image = cv2.resize(image, (image_size, image_size), 0, 0, cv2.INTER_LINEAR) # .astype进行图片的数据类型的变换 image = image.astype('float32') # 使用np.multipy进行图片的归一化操作 image = np.multiply(image, 1.0/255.0) # 将图片添加到列表中 images.append(image) # 标签零值初始化 label = np.zeros(num_classes) # 对于类别位置与标签位置对应,即设置为1 label[index] = 1 # 将标签进行添加 labels.append(label) # 获得图片的名字,使用os.path.basename name = os.path.basename(file) # 将名字进行添加 names.append(name) # 将类别名进行添加 cls.append(filed) # 第五步: 将图片和标签名都转换为array格式, 并返回图片,标签,名字和类别 images = np.array(images) labels = np.array(labels) return images, labels, names, cls class DataSet(object): def __init__(self, images, labels, names, cls): self._num_image = images.shape[0] self._images = images self._labels = labels self._names = names self._cls = cls self._epoch_index = 0 # 私有属性,返回实际的函数值 @property def images(self): return self._images @property def labels(self): return self._labels @property def names(self): return self._names @property def cls(self): return self._cls @property def num_image(self): return self._num_image # next_batch函数,使用self._epoch_index用来创建初始索引和结束索引,返回batch图像,标签,名字和类别 def next_batch(self, batch_size): start = self._epoch_index self._epoch_index += batch_size if self._epoch_index > self._num_image: start = 0 self._epoch_index = batch_size assert batch_size < self._num_image end = self._epoch_index return self._images[start:end], self._labels[start:end], self._names[start:end], self._cls[start:end] # 第一步:输入文件名,图片大小,标签,验证集的比例 def read_train_data(file_path, image_size, classes, val_size): # 第二步:构造类,实例化dataset用于存储训练集和验证集 class DataSets(object): pass dataset = DataSets() # 第三步:载入图片,标签, 名字,类别名 images, labels, names, cls = load_image(file_path, image_size, classes) # 第六步:对图片,标签,名字和类别名进行清洗 images, labels, names, cls = shuffle(images, labels, names, cls) # 第七步:使用val_size 对训练集和验证集图片进行分开 val_num = int(images.shape[0] * val_size) val_images = images[0:val_num] val_labels = labels[0:val_num] val_names = names[0:val_num] val_cls = cls[0:val_num] train_images = images[val_num:] train_labels = labels[val_num:] train_names = names[val_num:] train_cls = cls[val_num:] # 第八步:创建类别DataSet,实例化train和val数据集,并创建next_batch dataset.train = DataSet(train_images, train_labels, train_names, train_cls) dataset.val = DataSet(val_images, val_labels, val_names, val_cls) return dataset