搭建简单图片分类的卷积神经网络(一)-- 训练模型的图片数据预处理

一、训练之前数据的预处理主要包括两个方面

1、将图片数据统一格式,以标签来命名并存到train文件夹中(假设原始图片按类别存到文件夹中)。

2、对命名好的图片进行训练集和测试集的划分以及图片数据化。

先对整个项目文件进行说明:

项目文件夹

image文件里是用来对模型测试的未处理图片(训练模型不用)。

logs文件存放训练好的模型。

prediction文件是image文件中图片经过模型测试后分类的图片。

train文件有两个文件子层orig_data和train_data,前一个是未处理训练模型图片,后一个是处理好的进行模型训练的图片。

.py文件是项目程序,其他项目自带的,无关。

二、OK!现在先进行第一步,新建IntputData.py文件


 
 
  1. import os
  2. from PIL import Image
  3. #未处理图片位置
  4. orig_picture = r'E:\PycharmPython\NewCnn\train\orig_data'
  5. #已处理图片存储位置
  6. gen_picturn = r'E:\PycharmPython\NewCnn\train\train_data'
  7. #查询需要分类的类别以及总样本个数
  8. classes = []
  9. num_samples = 0
  10. for str_classes in os.listdir(orig_picture):
  11. classes.append(str_classes)
  12. #统一图片大小
  13. def get_traindata(orig_dir,gen_dir,classes):
  14. i = 0
  15. for index,name in enumerate(classes):
  16. class_path = orig_dir + '\\' + name + '\\' #扫描原始图片
  17. gen_train_path = gen_dir + '\\' + name #判断是否有文件夹
  18. folder = os.path.exists(gen_train_path)
  19. if not folder :
  20. os.makedirs(gen_train_path)
  21. print(gen_train_path, 'new file')
  22. else:
  23. print( 'There is this flie')
  24. #给图片加编号保存
  25. for imagename_dir in os.listdir(class_path):
  26. i += 1
  27. origimage_path = class_path + imagename_dir
  28. #统一格式
  29. image_data = Image.open(origimage_path).convert( 'RGB')
  30. image_data = image_data.resize(( 64, 64))
  31. image_data.save(gen_train_path + '\\'+str(index) + name + str(i) + '.jpg' )
  32. num_samples = i
  33. print( 'picturn :%d' % num_samples)
  34. if __name__ == '__main__':
  35. get_traindata(orig_picture,gen_picturn,classes)

这段程序将原始图片统一为64X64格式,并分类保存。

三、然后新建GetCnnData文件


 
 
  1. import os
  2. import math
  3. import matplotlib.pyplot as plt
  4. import numpy as np
  5. import tensorflow as tf
  6. #加载图片路径
  7. train_data_dir = r'E:\PycharmPython\NewCnn\train\train_data'
  8. classes = []
  9. image_list = []
  10. label_list = []
  11. def get_files(file_path,ratdio):
  12. for str_classes in os.listdir(train_data_dir):
  13. classes.append(str_classes)
  14. for index, name in enumerate(classes):
  15. path = file_path + '\\'+name
  16. for file in os.listdir(path):
  17. image_list.append(path + '\\' + file)
  18. label_list.append(index)
  19. print(name, 'ok')
  20. #打乱顺序
  21. temp = np.array([image_list,label_list])
  22. temp = temp.transpose()
  23. np.random.shuffle(temp)
  24. #打乱之后分出测试集和训练集
  25. image_data = list(temp[:, 0])
  26. image_label = list(temp[:, 1])
  27. n_sample = len(image_label)
  28. n_val = int(math.ceil(n_sample * ratdio))
  29. n_train = n_sample - n_val
  30. train_images = image_data[ 0:n_train]
  31. train_labels = image_label[ 0:n_train]
  32. train_labels = [int(float(i)) for i in train_labels]
  33. val_images = image_data[n_train: -1]
  34. val_labels = image_label[n_train: -1]
  35. val_labels = [int(float(i)) for i in val_labels]
  36. return train_images,train_labels,val_images,val_labels
  37. def get_batch(image,label,image_W,image_H,batch_size,capacity):
  38. #统一数据类型
  39. image = tf.cast(image,tf.string)
  40. label = tf.cast(label,tf.int32)
  41. # make an input queue
  42. input_queue = tf.train.slice_input_producer([image, label])
  43. label = input_queue[ 1]
  44. image_contents = tf.read_file(input_queue[ 0]) # read img from a queue
  45. # 将图像解码,不同类型的图像不能混在一起,要么只用jpeg,要么只用png等。
  46. image = tf.image.decode_jpeg(image_contents, channels= 3)
  47. # 数据预处理,对图像进行旋转、缩放、裁剪、归一化等操作,让计算出的模型更健壮。
  48. image = tf.image.resize_image_with_crop_or_pad(image, image_W, image_H)
  49. image = tf.image.per_image_standardization(image)
  50. # image_batch: 4D tensor [batch_size, width, height, 3],dtype=tf.float32
  51. # label_batch: 1D tensor [batch_size], dtype=tf.int32
  52. image_batch, label_batch = tf.train.batch([image, label],
  53. batch_size=batch_size,
  54. num_threads= 32,
  55. capacity=capacity)
  56. # 重新排列label,行数为[batch_size]
  57. label_batch = tf.reshape(label_batch, [batch_size])
  58. image_batch = tf.cast(image_batch, tf.float32)
  59. return image_batch, label_batch

对输入到CNN的图片数据的处理。

连载:https://blog.csdn.net/qq_28821995/article/details/83587530

  https://blog.csdn.net/qq_28821995/article/details/83587802

参考:https://blog.csdn.net/ywx1832990/article/details/78610231

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值