既然faster-rcnn原版发表时候是matlab版代码,那就用matlab版代码吧!不过遇到的坑挺多的,不知道python版会不会好一点。

======= update =========
总体上包括这些步骤,请注意检查:
1 获取数据;(标准数据集/比赛数据/自行收集数据)
2 整理图片名和标注信息格式、指定训练集和测试集;(转voc格式,同时记得修改vocinit.m中类别信息;或者自己修改代码中读取数据的地方)
3 正确使用均值图像:手动算一个或用默认的减去128,别用错
4 选择网络与设定网络参数(solver和net);(根据业务需求和显存大小设定;修改网络中目标类别数量)
5 检查batch_size;
6 检查anchor;
7 清空cache目录;
8 开始训练;
9 确保电脑供电且不会休眠睡眠;
10 执行测试;整理测试结果
======= update =========

anyway,这里记录一下我遇到的几个坑

这里假设你已经配置好了faster-rcnn。我是在win10下配置的,显卡GTX 970,使用ZF网络。

0. 准备数据集

官方训练时用的是voc2007系列数据,那就转换成这个系列的好了,主要包括:0.下载数据集 1.整理图片 2.xml格式的annotation文件 3.txt格式指定训练集、测试集、验证集、训练验证集,以及每个类别各自的这四种文件

0.0 下载数据集

看具体情况,比如做某个比赛,那就下载;如果是自己收集的数据集,那就统一放到一起

0.1 整理图片

主要是图片格式统一,比如都是png
以及,命名规范,比如统一是6位长度的数字:000001.png,并且序号是连续的
训练图片和测试图片都放在一个JPEGImages目录里

0.2 xml格式的annotation文件

其实voc2007这种方式:为每张图片编写一个xml文件,记录图片各种元信息(作者、文件名、宽度高度深度、来源),以及bounding box坐标信息(左上、右下定点)等,很蛋疼啊,图片多的话每次处理xml文件读写I/O就增大了。anyway,遵守标准的好处是省的自己造各种工具。

这里贴一个例子好了,000001.xml:

<annotation><folder>VOC2007</folder><filename>000001.png</filename><source><database>My Database</database><annotation>VOC2007</annotation><image>flickr</image><flickrid>NULL</flickrid></source><owner><flickrid>NULL</flickrid><name>chriszz</name></owner><size><width>1280</width><height>720</height><depth>3</depth></size><segmented>0</segmented><object><name>sign</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>369</xmin><ymin>403</ymin><xmax>409</xmax><ymax>418</ymax></bndbox></object><object><name>sign</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>434</xmin><ymin>375</ymin><xmax>443</xmax><ymax>401</ymax></bndbox></object><object><name>sign</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>461</xmin><ymin>368</ymin><xmax>471</xmax><ymax>395</ymax></bndbox></object><object><name>sign</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>571</xmin><ymin>473</ymin><xmax>593</xmax><ymax>490</ymax></bndbox></object><object><name>sign</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>674</xmin><ymin>470</ymin><xmax>683</xmax><ymax>478</ymax></bndbox></object><object><name>sign</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>693</xmin><ymin>471</ymin><xmax>714</xmax><ymax>480</ymax></bndbox></object><object><name>sign</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>976</xmin><ymin>413</ymin><xmax>998</xmax><ymax>438</ymax></bndbox></object><object><name>sign</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>1004</xmin><ymin>396</ymin><xmax>1011</xmax><ymax>410</ymax></bndbox></object><object><name>sign</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>1024</xmin><ymin>388</ymin><xmax>1031</xmax><ymax>405</ymax></bndbox></object><object><name>sign</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>1046</xmin><ymin>388</ymin><xmax>1071</xmax><ymax>406</ymax></bndbox></object><object><name>sign</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>1114</xmin><ymin>390</ymin><xmax>1143</xmax><ymax>410</ymax></bndbox></object><object><name>sign</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>913</xmin><ymin>431</ymin><xmax>928</xmax><ymax>458</ymax></bndbox></object>
</annotation>

记得所有xml文件的文件名要和图片序号一一对应:000001.xml对应000001.png
并且,所有xml文件放到Annotations目录中

0.3 txt文件指定训练集、测试集等

在ImageSets/Main目录下保存这些文件。比如我的任务是检测交通标识,只有一个类别需要检测,或者说是二分类问题,只需要判断一个bbox区域是否为交通标识(sign),那么我创建sign对应的4个文件;以及4个表示总体的训练、验证、训练验证、测试的txt文件:

其中,sign_train、sign_test、sign_trainval、sign_val每行格式相同

图片id(不带后缀,不用全路径) +1或-1(表示这张图片中是否包含sign类别的区域)

对于我的情况,类别标签都是+1

然后是train、val、trainval、test文件,其中trainval是train和val的拼接。

这里我是需要

1 修改faster-rcnn的几个代码细节

1.0 experiments\script_faster_rcnn_VOC2007_ZF.m第30、31行

这里默认居然是用select search生成region proposal,我也是醉了。
改成:

dataset                     = Dataset.voc2007_trainval(dataset, 'train', use_flipped);
dataset                     = Dataset.voc2007_test(dataset, 'test', false);

1.1 experiments\+Dataset\voc2007_test.m第11行、第14行,test改成val

这个真的是太坑了,在这里我卡了大半天。为什么会卡在这个地方,然后程序一直运行出错呢?以及,程序出错大概如下:

错误使用 proposal_prepare_image_roidb>scale_rois (line 110) 两个输入数组的单一维度必须相互匹配,...

设断点debug后发现,roidb_train里各种字段都有值(比如gt、坐标、阈值、类别等);而roidb_val里面是空的。
实际上是在experiments\+Faster_RCNN_Train\do_proposal_train.m里面,把dataset.roidb_test赋值给roidb_val了:

function model_stage = do_proposal_train(conf, dataset, model_stage, do_val)if ~do_valdataset.imdb_test = struct();dataset.roidb_test = struct();endmodel_stage.output_model_file = proposal_train(conf, dataset.imdb_train, dataset.roidb_train, ...'do_val',           do_val, ...'imdb_val',         dataset.imdb_test, ...'roidb_val',        dataset.roidb_test, ...   # 尼玛,在这里赋值了'solver_def_file',  model_stage.solver_def_file, ...'net_file',         model_stage.init_net_file, ...'cache_name',       model_stage.cache_name);
end

问题就是在这里了,不多说。那么接下来就是把experiments\+Dataset\voc2007_test.m第11行、第14行,test改成val,保证以后在imdb\cache目录下有val的mat数据存在,roidb_val也不会说里面内容都为空的了。

2 修改网络参数

看到下面这张图应该知道要改那几个文件了:

具体可以参考小咸鱼的faster-rcnn matlab版的配置

【faster-rcnn】训练自己的数据集时的坑相关推荐

  1. 目标检测simple Faster R-CNN训练自己的数据集

    一.复现 刚开始接触目标检测,自己动手复现的第一个开源项目是github上chenyuntc的simple faster rcnn.历经千辛万苦最后貌似因为服务器显卡内存不够,在训练时一直出现一个错误 ...

  2. Faster RCNN训练FLIR红外线数据集

    1. Fater RCNN检测网络下载 网络学习视频 [源码地址]https://github.com/bubbliiiing/faster-rcnn-pytorch 2. FLIR 数据集准备 数据 ...

  3. faster rcnn 训练自己的数据集---踩坑记录!!!

    1.下载代码: git clone https://github.com/jwyang/faster-rcnn.pytorch.git 也可以暴力下载<--直接download压缩包--> ...

  4. mask rcnn训练自己的数据集

    原文首发于微信公众号「3D视觉工坊」--mask rcnn训练自己的数据集 前言 最近迷上了mask rcnn,也是由于自己工作需要吧,特意研究了其源代码,并基于自己的数据进行训练~ 本博客参考:ht ...

  5. Fast RCNN 训练自己的数据集(3训练和检测)

    Fast RCNN 训练自己的数据集(3训练和检测) 转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ https ...

  6. Faster RCNN 训练自己的检测模型

    Faster RCNN 训练自己的检测模型 一.准备自己的训练数据 根据pascal VOC 2007的训练数据集基本架构,第一步,当然是要准备自己的训练图片集,本文直接将自己的准备的图片集(.jpg ...

  7. Faster RCNN 训练中的一些问题及解决办法

    今天使用Faster RCNN训练自己的数据的时候,出现了一些因为boost或者是numpy版本不兼容导致的问题,经过各种查资料和求助大神,总算是顺利把网络跑起来了.下面内容都是今天亲测出现的问题并与 ...

  8. Faster rcnn 训练coco2017数据报错 RuntimeError: CUDA error: device-side assert triggered

    Faster rcnn 训练coco2017数据报错 RuntimeError: CUDA error: device-side assert triggered 使用faster rcnn训练自己的 ...

  9. faster rcnn在自己的数据集上训练

    本文是一个总结,参考了网上的众多资料,汇集而成,以供自己后续参考. 一般说来,训练自己的数据,有两种方法:第一种就是将自己的数据集完全改造成VOC2007的形式,然后放到py-faster-rcnn/ ...

最新文章

  1. php要怎么使用imagettftext_延长防腐木使用要怎么做呢?
  2. 重建控制文件具体解释
  3. PVNet: 像素级投票网络估计6DoF位姿
  4. C#生成带Logo二维码
  5. 创意留言墙图片_年会攻略2|创意合影墙、特色文化墙,有点意思启动仪式,继续玩出彩!!...
  6. pthread_create如何传递两个参数以上的参数
  7. php动态生成链接,PHP动态生成javascript文件的2个例子
  8. 去掉a标签下划线_条码软件如何修改条码标签的字体格式
  9. C#并行编程(1):理解并行
  10. 帝国cms录入表单模板php,帝国cms7.5在线表单提交制作教程
  11. laravel 自带的用户登录视图路径_Laravel实现找回密码及密码重置,详细操作
  12. 9、MySQL逻辑架构介绍
  13. linux下启动管理,rEFInd启动管理器配置文件详解
  14. 数据库知识与技巧日常汇总
  15. Python的伪造数据生成器:Faker
  16. flutter之dart语言发展
  17. TypeScript 学习笔记(四)--- 泛型(Generics)
  18. Gradle同步工程下载依赖慢
  19. 第五天实验---MGRE环境下的OSPF实验
  20. DVB信道编解码与调制解调

热门文章

  1. boost::safe_numerics模块实现数据类型下溢的测试程序
  2. boost::iostreams::newline用法的测试程序
  3. boost::fusion::result_of::as_vector用法的测试程序
  4. GDCM:gdcm::ModuleEntry的测试程序
  5. VTK:相互作用之PickableOff
  6. VTK:IO之ReadPolyData
  7. VTK:IO之GLTFImporter
  8. VTK:几何对象之Planes
  9. VTK:Filtering之SelectionSource
  10. C++palindrome partitioning回文分割算法的实现(附完整源码)