自己制作深度学习数据集教程

自己制作的数据集

1.剪裁图片

图片大小不一,我的想法是遍历文件夹内的图片进行resize,然后作为放入网络中的输入。但是每个图片名字不一致,要改变,我就用了一个count,从001-999位置,全部剪裁,(这部分其实网络的预处理也可以做,我只是提前做了)。
—————————————————————————————————————

注意点

  1. 这里有个注意点,因为我的图片是网上截取的,所以不能保证每张图片质量都很好,在imread读取的时候,可能出现NoneType,一定要注意,不然会报错(这是个坑,我找了好久,才发现)
  2. 第二个是我把所有的图片都改成了JPG,可能有gif,png等等这类的,存在也会报错,所以建议大家一开始就右击保存,而不要只把图片拉下来。
  3. 因为我不是很熟悉xml文件,并且我的图片都是不需要重新用边界框截取,所以我没有用labelImg去做。
    —————————————————————————————————————
import cv2
import os
count=501
for filename in os.listdir(r"/home/parallels/Downloads/绿色/"):
	#print("/home/parallels/Downloads/1.黑/"+filename)
#filename=/home/parallels/Downloads/1.黑/1.jpg
	path="/home/parallels/Downloads/绿色/"+str(filename)
	#print(path)
	img=cv2.imread(path,cv2.IMREAD_COLOR)
	if img is None:
		continue
	if len(str(count))!=3:
		b=(3-len(str(count)))*"0"+str(count)+".jpg"
	else:
		b=str(count)+".jpg"
	if img.shape[0]>=50 and img.shape[1]>=50:
		img_2=cv2.resize(img,(50,50))
		cv2.imwrite(os.path.join("/home/parallels/Downloads/3/"+b),img_2)
		#cv2.imwrite(os.path.join("/home/wanglin/PycharmProjects/data_test/data/Train400/original.jpg" ), img)
		count+=1
		continue
	else:
		os.remove(path)

我这里暂时取得是(50,50,3),可以根据网络选择自己的尺寸,在写个脚本验证一下看看,是不是size都是(50,50)。

import cv2
import os
train=[]
for filename in os.listdir(r"/home/parallels/Downloads/3/"):
	#print("/home/parallels/Downloads/1.黑/"+filename)
#filename=/home/parallels/Downloads/1.黑/1.jpg
	path="/home/parallels/Downloads/3/"+str(filename)
	#print(path)
	img=cv2.imread(path,cv2.IMREAD_COLOR)
	print(img.shape)

2.把所有的图片的路径和标签写到txt文件里去(这部分查了很多网上的教程,dir /b/s> xxx.txt),我是没有实现,路径没有加进去,所以我稍微参考写了一个自己的py文件,供大家去使用。

import os 
f = open('/Users/qiubo/Desktop/train_list.txt','w')
for root,dirs,files in os.walk('/Users/qiubo/Desktop/3/',True):
	for file in files:
		f.writelines("/Users/qiubo/Desktop/3/"+file)
		f.write('\n')

这里的f.writelines括号里的前半个是路径,后面是每个图片名,至于标签的话,继续加上就行,并没有很麻烦。

3.读取训练的x,y,我做到这一步就结束了,因为网络需要改造,所以还没有具体想到要几个标签。

import pickle
import numpy as np 
import os.path
import codecs
def load_data(datafile, num_class=8, save=False, save_path='dataset.pkl'):
    fr = codecs.open(datafile, 'r', 'utf-8')
    train_list = fr.readlines()
    labels = []
    images = []
    for line in train_list:
        tmp = line.strip().split(' ')
        fpath = tmp[0]
        img = cv2.imread(fpath)
        np_img = np.asarray(img, dtype="float32")
        images.append(np_img)

        index = int(tmp[xxx])
        label = np.zeros(num_class)
        label[index] = 1
        labels.append(label)
    if save:
        pickle.dump((images, labels), open(save_path, 'wb'))
    fr.close()
    return images, labels

这个代码我是在修改了RCNN的预处理过程,就是读取txt文件,然后做个one-hot矩阵,看分类,由于这里我还没有试验过用到自己的数据集,所以大家有错误可以指出来,我修改一下

你可能感兴趣的:(自己制作深度学习数据集)