1.剪裁图片
图片大小不一,我的想法是遍历文件夹内的图片进行resize,然后作为放入网络中的输入。但是每个图片名字不一致,要改变,我就用了一个count,从001-999位置,全部剪裁,(这部分其实网络的预处理也可以做,我只是提前做了)。
注意点
这里有个注意点,因为我的图片是网上截取的,所以不能保证每张图片质量都很好,在imread读取的时候,可能出现NoneType,一定要注意,不然会报错(这是个坑,我找了好久,才发现)
第二个是我把所有的图片都改成了JPG,可能有gif,png等等这类的,存在也会报错,所以建议大家一开始就右击保存,而不要只把图片拉下来。
因为我不是很熟悉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