深度学习原理与框架-猫狗图像识别-卷积神经网络(代码)

猫狗识别的代码:主要分为3个部分,

                             第一部分:数据的准备

                             第二部分:构造卷积神经网络,进行模型的训练

                             第三部分:使用saver.restore加载训练好的参数,进行模型的预测。

第一部分:数据的准备,构建read_train_data函数

第一步:输入的参数是文件的地址,图片的大小(进行图像的矩阵变换),标签,验证集的比例

第二步:对构造一个类dataset, 用于存储训练集和验证集

第三步:对标签进行循环,对输入的文件与标签值进行拼接,获得图片文件的地址,使用glob.glob获得每张图片的地址。

第四步:循环图片地址,读入图片

              第一步:使用cv2.imread() 读入图片

              第二步: 使用cv2.resize(img, (img_size, img_size), 0, 0, cv2.Inter) 进行图片的维度变换

扫描二维码关注公众号,回复: 5550134 查看本文章

              第三步: 使用.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

猜你喜欢

转载自www.cnblogs.com/my-love-is-python/p/10541030.html