文章目录[隐藏]
mmdetectionV2.x版本 训练自己的VOC数据集
1 首先根据规范的VOC数据集导入到项目目录下,如下图所示:
mmdetection
----mmdet
----tools
----configs
----data
--------VOCdevkit
------------VOC2007
--------------- Annotations
---------------- JPEGImages
---------------- ImageSets
------------------------ Main
---------------------------- test.txt
---------------------------- trainval.txt
---------------------------- val.txt
---------------------------- test.txt
先在mmdetection目录下依次创建data、VOCdevkit、VOC2007文件夹,嵌套关系如上,再在VOC2007文件夹下按VOC格式存放自己的数据集(Annotation存放检测框信息、JPEGImages存放要检测的图片,这两个文件夹的名字一定不能修改),ImageSets是放txt文件,可以修改名字,但是初次使用建议规范格式
2 修改配置文件
2.1 配置检测类别
mmdet/datasets/voc.py
2.2 配置图片格式
mmdet/datasets/xml_style.py
如果图片是jpg则改成jpg,是png格式就改成png
2.3 (非必要的步骤)针对标注文件 .xml的没有 <difficult> 标签的情况
(这一步并非必要,可以先跳过,完成所有步骤训练若报错:AttributeError: ‘NoneType‘ object has no attribute ‘text‘,再回来加上这一步)
报错原因:标注文件 .xml的<object>没有<difficult>的标签。difficlut表明这个待检测目标很难识别,有可能是虽然视觉上很清楚,但是没有上下文的话还是很难确认它属于哪个分类;标为difficult的目标在测试成绩的评估中一般会被忽略,下面举一个例子:
2种解决方法:
1、可以查找.xml标注文件,把没有difficlut标签的补上。
2、由于我的标签数据非常多,所有都添加上difficult的话非常耗时。如果数据没有特别难分的类别,可以忽略这个标签,在代码里把difficlut置为1,具体操作如下:打开mmdet/datasets/xml_style.py,将difficult=int(obj.find(‘difficult’).text)改为如下代码:
if obj.find('difficult'):
difficult = int(obj.find('difficult').text)
else:
difficult = 0
参考链接:https://blog.csdn.net/u014479551/article/details/107377992/
3 用自己的VOC数据集训练mmdetection中的faster_rcnn
这里以faster_rcnn 网络为例介绍如何使用mmdetection训练自己的VOC数据集
3.1 faster_rcnn 配置文件介绍
faster_rcnn 基本配置文件位置:mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py ,打开如下图所示:
会发现这里只是引入了_base_文件夹中的几个文件,这里简单介绍下:
- faster_rcnn_r50_fpn.py 包含了具体的模型配置
- coco_detection.py 表示的是COCO格式数据集的相关配置
- schedule_1x.py和default_runtime.py 包含训练相关数据
其实我们在mmdetection的configs文件夹中会看到许多类似的模型配置文件。之所以这样写,是为了简化代码的耦合性,简单来说就是,很多相同的配置我直接写入一个py文件每次import就可以了呀。初次学习不需要去完全弄懂,先跑通一个代码。等你多跑了几个模型,大概就明白为什么这样写了。
3.1.1 为了跑voc数据集我们需要将coco配置文件替换成voc配置文件,如下图所示:
接着我们需要分别修改将 num_classes 改为自己的类别数(有的博客用的mmdetection由于版本问题是类别数+1,这里用的版本是2.x,num_classes是类别数)
3.1.2 接着依次修改上图中的几个文件
1、首先,修改模型配置文件,根据上图中fast_rcnn_r50_fpn_1x.py中的路径(如下图)找到该文件位置,将所有的 num_classes 变量改为自己分类的类别数(有的博客用的mmdetection由于版本问题是类别数+1(表示背景),这里用的版本是2.x,num_classes就是类别数,比如我是四分类,那么这里就将所有的num_classes变量改为4)
…/base/models/faster_rcnn_r50_fpn.py
2、修改数据集配置文件,主要是填入你的数据集的路径,该文件在
- …/base/datasets/voc0712.py
可以关注一下这句代码,不用修改,可以理解步骤一中为什么数据要放在 data/VOCdevkit/下,之所以命名为VOC2007也是为了后续修改方便
修改你的data_root
修改data下的train、val、test中的ann_file的路径(txt文件的路径)和img_prefix的路径(图片的路径)
如图可见,路径中并未提及Annotations和JPEGImages这两个文件夹,img_prefix只指明了数据集的根目录’VOC2007’,说明在其他代码中会自动在img_prefix提供的路径后面自动添加Annotations和JPEGImages来搜索相应的检测框信息和图片,这也就是为什么步骤一中不能修改Annotations、JPEGImages名字的原因。ImageSets无所谓,这只是存放txt文件的文件夹,如果改成别的名字或路径,只要修改上面两图中的橙色框内的ann_file所指路径即可。
这里因为我是train和test数据集分开存放,所以路径和标准路径稍微有点不同,但是无论是train还是test都有各自的Annotations和JPEGImages这两个文件夹,这一点一定不能变。
4 修改mmdetection/mmdet/core/evaluation目录下class_names.py
这个类名的修改是用于模型测试的时候,如果不加修改,相当于训练的时候用的是正确的类,但是测试的时候显示的还是默认的类名。
重要:修改完 class_names.py 和 voc.py 之后一定要重新编译代码(运行python setup.py install),再进行之后的训练,否则验证输出仍然为VOC的类别,且训练过程中指标异常。建议以后修改完mmdetec这个文件夹中的任何文件,都运行一下上面这个命令,养成习惯。
参考链接:https://www.it610.com/article/1294190526756626432.htm
5 训练
5.1 训练很简单,利用官方文档给出的命令:
python tools/train.py ${CONFIG_FILE}
{CONFIG_FILE}就是你要跑的网络的配置文件,下面举两个例子
- 用faster_rcnn网络训练:
python tools/train.py configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712.py
- 用ssd训练:
python tools/train.py configs/pascal_voc/ssd512_voc.py
5.2 更改训练好的模型的存放目录
mmdetection会将训练过程中生成的log文件和模型文件默认放在mmdetection/work-dir目录下,若要指定目录,可以使用work-dir参数,只需在训练命令后面加入 --work-dir ${YOUR_WORK_DIR}
例如:
python tools/train.py configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712.py --work-dir my_workspace/
其他的参数、指令可以多看看github上面mmdetection的官方文档。
本文为原创文章,如需转载,请注明出处
如果有帮助到你的话,点个赞再走呀~
版权声明:本文为CSDN博主「桃子酱momo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42146720/article/details/114543889
暂无评论