基于Caffe框架的目标检测算法SSD–进行自有数据替换并训练
主要步骤:
- 标签数据预处理
- 图片数据预处理
- 数据及标签的VOC格式以及LMDB格式转化
- 网络训练
- 其他问题分析
1.标签数据预处理
由于拿到的是YOLOv3格式的训练集label,不满足SSD标签格式。故标签需要先被转化成符合要求的输入格式。
注:YOLOv3标签格式为(x,y,w,h)。其中x,y为物体框中点横纵坐标表示,w,h为物体框的宽、高。四类信息数据均被进行了数值归一化预处理,除以了512(512为图片大小)。
我们需要调整为满足SSD数据输入格式的标签,保证txt格式的第一行为object_number,第二行五列数值依次为:标识物label序号–Xmin–Ymin–Xmax–Ymax。制作python脚本进行数值转换。
#在第一行插入object_number程序
for i in range(612): #612为待处理图片个数
i+=1
with open(str(i)+'.txt', 'r+') as f:
content = f.read()
f.seek(0, 0)
f.write('0\n'+content)
#坐标转换修改程序
import numpy as np
numbers = 612
for i in xrange(numbers):
f=open(str(i+1)+".txt", "r")
lines = f.readlines()
length = len(lines)
elements = np.zeros(shape=(length-1,5))
for j in xrange(length-1):
elements[j] = lines[j+1].split()
for k in xrange(4):
elements[j][k+1] = 512*float(elements[j][k+1])
elements[j][1] = elements[j][1] - elements[j][3]/2
elements[j][2] = elements[j][2] - elements[j][4]/2
elements[j][3] = elements[j][1] + elements[j][3]
elements[j][4] = elements[j][2] + elements[j][4]
f.close()
f = open(str(i+1)+".txt","w")
f.write('0')
f.close()
f = open(str(i+1)+".txt","a")
for j in xrange(length-1):
f.write('\n')
for k in xrange(5):
if k<4:
element = elements[j][k]
f.write(str(int(element))+' ')
else:
element = elements[j][k]
f.write(str(int(element)))
f.close()
图片数据预处理
由于拿到的图片为.png格式,但caffe的voc_to_lmdb过程需要.jpg图片格式,因此在这里需要进一步进行图片转化。图片转化不能借助python脚本强行修改文件名,要借助PIL库进行图片读取–保存,脚本程序如下:
import Image
i=0
for i in range(612):
i+=1
im = Image.open('/media/y666/00008FEA00024472/man/SSD/caffe/data/VOCdevkit/car/JPEGImages/'+str(i)+'.png')
im.save('/media/y666/00008FEA00024472/man/SSD/caffe/data/VOCdevkit/car/JPEGImages/'+str(i)+'.jpg')
特别说明的是,如果图片与label文件名为乱序,建议自行修改文件名为以1开头的自然数组成(1.jpg\2.jpg\1.txt...),借助此种方法可以保证在数据集制作的过程中避免因文件名出现的各类错误。