训练SSD时出现的数据问题
使用COCO2014训练SSD网络。
参照https://github.com/weiliu89/coco.git的方法处理数据集。
生成lmdb格式数据。
开始训练之后报这种错误。
OpenCV Error: Assertion failed ((scn == 3 || scn == 4) && (depth == CV_8U || depth == CV_32F)) in cvtColor。
各种搜索之后发发现是因为SSD只支持3通道的RGB图像。(也有人说是因为训练图像可能最小边<300,这样resize到固定300x300的时候就会有问题)
解决方案有两个(反正这两个方案对我的问题都有效,不过我选择了第二个):
1. 修改resize_mode为FIT_SMALL_SIZE,batch_size=1.
虽然能解决问题,但是batch_size设为1可能会导致无法收敛等问题,而且所有图像尺寸也不是统一的300x300了,训练的结果就会和原作者有误差,所以我没选择次方案。
2.从训练集中选出灰度图,然后删掉,重新生成lmdb文件重新训练。筛选代码如下,我是用matlab写的:
fid=fopen('/your_root/new_train.txt','wt');%新建一个txt列表
lst = ['/your_root/train.txt']; %要读取的列表所在的路径
imgpath = '/image_root/MS-COCO2014/';
count = 0;
fpn = fopen (lst, 'rt');
while feof(fpn) ~= 1
elem = fgetl(fpn);
res = strsplit(elem); %空格分开
%disp(strcat(imgpath,char(res(1))));
img = imread(strcat(imgpath,char(res(1))));%获取图像路径
if ndims(img)== 2 %灰度图
disp(strcat(imgpath,char(res(1))));
count=count+1;
else
fprintf(fid,'%s\n',elem);%删除灰度图的list
end
end
fclose(fid);
disp(count);
发现train里面有227张灰度图,相对于118287的训练集来说,删除227也没关系。然后就可以不用修改网络参数直接训练了。
不过我发现minival里面也有10张灰度图,但是加载minival_lmdb文件就没出错。这是为什么?难道验证集不需要3通道RGB也可以?
—————————————————————————分割线———————————————————————
果然测试加载数据的时候还是出问题了。
BUG:
mean_values_.size() == 1 || mean_values_.size() ==img_channels Specify either 1 mean_value or as many as channels: 1
因为minival里面只有10张灰度图,所以我直接将这十张灰度图转为了三通道图,直接s使用opencv中的 cvtcolor()函数。
然后......因为修改了图像信息。
又开始了漫长的处理数据过程(心好累!)
如果还出问题。。。。再说吧
下一篇: python双边队列可真香
推荐阅读
-
解决的错误-20200306-安装darknet时,opencv 出现路径问题
-
pandas DataFrame进行条件选取数据时出现SettingWithCopyWarning的解决方法
-
网络监听和数据缓存结合使用:解决打开app数据加载时界面空白的问题
-
解决J2ME联网时出现的中文乱码问题
-
php中查询数据库含通配符时需要转义的问题
-
jquery使用ajax向后台请求数据时,使用IE访问出现问题 博客分类: jqueryajax jqueryajaxiecache
-
解决mybatis一对多查询问题时的只显示一条数据的问题(查询部门的同时把所属部门的员工信息查出来)关联查询
-
expdp导出数据库时遇到ora-31626作业不存在的问题
-
用yolov3 VOC训练自己的数据时出现的问题及解决方法
-
总结训练SSD时的小trick