猫狗图像识别

复制代码
#导入相关的库
import tensorflow as tf
import os
import numpy as np
import matplotlib.pyplot as plt

<!-- 打标签  
设定猫为0,狗为1  
打乱数据集,细节如下 -->

#读取数据集中所有图片的路径和标签
def get_files(file_dir):
    cats=[]  #定义cat_list,
    label_cats=[] #定义cat的标签
    dogs=[] #定义dog_list,
    label_dogs=[] #定义dog的标签
    for file in os.listdir(file_dir): #os.listdir返回指定路径下的文件和文件夹名的列表   
#形如file=cat.0.jpg       
        name=file.split('.')
#          str.split(str="",num=string.count(str))[n]
#           str:表示为分隔符,默认为空格,但是不能为空('')。若字符串中没有分隔符,则把整个字符串作为列表的一个元素
#           num:表示分割次数。如果存在参数num,则仅分隔成 num+1 个子字符串,并且每一个子字符串可以赋给新的变量
#           [n]:表示选取第n个分片
#形如name=['cat', '0', 'jpg']
        if name[0]=='cat': #第一个元素是cat
            cats.append(os.path.join(file_dir+file))#组合路径和文件
            label_cats.append(0)
        elif name[0] == 'dog':
            # dogs.append(file_dir + file)
            dogs.append(os.path.join(file_dir, file))
            label_dogs.append(1)

        print('cats:', cats)
        print('label_cats:', label_cats)
        print('dogs:', dogs)
        print('label_dogs:', label_dogs)
#现在开始打算顺序
        image_list=np.hstack((cats,dogs)) #hstack(tup) ,参数tup可以是元组,列表,或者numpy数组,返回结果为numpy的数组
                                          #参数元组的元素数组按水平方向进行叠加,eg:([[1,2],[3,4]]+[[2,5],[3,4]]).hstack==[[1,2,2,5],[3,4,3,4]]                        
        #将cats和dogs矩阵按水平拼接
        #print('image_list:',image_list)
        label_list=np.hstack((label_cats,label_dogs))
        #print('label_list',label_list)
        temp=np.array([image_list,label_list])#存储多维数组
        temp=temp.transpose() #转置
        np.random.shuffle(temp)
        image_list=list(temp[:,0])#取所有维的第一个元素
        label_list=list(temp[:,1])#取第二个
        label_list = [int(i) for i in label_list]#label_list里面的数据类型是字符串类型,所以要转化成int
        return image_list,label_list

<!-- 分批
tf.train.slice_input_producer,它是一个tensor生成器,每次从一个tensor列表中按顺序或者随机抽取出一个tensor放入队列。
tensor_list:[image,label],tensor的第一维度的值必须相等,即个数必须相等,有多少个图像,就应该有多少个对应的标签。
num_epochs: 可选参数,是一个整数值,代表迭代的次数,设置成None表示生成器可以无限次遍历tensor列表,设置成N表示遍历N次
shuffle=True:生成的样本顺序就被打乱了,shuffle=False,就需要在批处理时候使用 tf.train.shuffle_batch函数打乱样本。
seed: 可选的整数,是生成随机数的种子,在第三个参数设置为shuffle=True的情况下才有用。
capacity:设置tensor列表的容量
shared_name:可选参数,如果设置一个‘shared_name’,则在不同的上下文环境(Session)中可以通过这个名字共享生成的tensor。 -->

#生成相同的批次
def get_batch(image,label,batch_size,image_W,image_H,capacity):#capacity:队列容量
#batch_size批次大小
# image和label参数就是函数get_files()返回的image_list和label_list,
# 是python中的list类型,所以需要将其转为TensorFlow可以识别的tensor格式。
     image=tf.cast(image,tf.string)#cast函数将image的List数据类型转化tf的string
     label=tf.cast(label,tf.int32)
     input_queue=tf.train.slice_input_producer([image,label])
     '''该函数返回image和label对应的队列:queue列表, input_queue[0]与image对应; input_queue[1]与label对应 '''
     image_contens=tf.read_file(input_queue[0])#读取图片文件
     image=tf.image.decode_jpeg(image_contens,channels=3)#解码,图片格式为jpg,用jpeg。
     label=input_queue[1]
     image = tf.image.resize_images(image, [image_H, image_W], method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)
     #训练库中图片大小是不一样的,需要将图片裁剪成相同大小
     image = tf.cast(image, tf.float32)#不进行数据标准化要将数据类型转化成floa32,conv2d()要求输入数据为float32类型
     # 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)
     return image_batch, label_batch
复制代码

 

 
posted @   是冰美式诶  阅读(176)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示