Pytorch版Faster R-CNN训练自己数据集

引言
最近在做目标检测方面的代码复现,复现过程中也遇到了一些问题,现在把整个过程遇到的问题记录一下,过程分享一下。
一、Faster R-CNN
代码下载pytorch版源码:https://github.com/jwyang/faster-rcnn.pytorch.git
具体配置文中讲得很清楚,需要准备数据集、与训练的模型VGG-16 or ResNet 101(不是直接可以用的模型)
我的代码复现环境:python3.6 + cuda 9.0 + Ubuntu16.04 + Pytorch0.4.0 (pytorch版本不能高于0.4.0)+含GPU(无GPU参照解决方法,修改weakref.py后可完美解决。)
第一步(复制代码):

git clone https://github.com/jwyang/faster-rcnn.pytorch.git

第二步:

 cd faster-rcnn.pytorch && mkdir data

第三步(准备数据集和预训练模型),如图位置有相关教程说明:
在这里插入图片描述
数据集:VOC 2007COCOVisual Genome
预训练模型:VGG16ResNet101
第四步(安装依赖):

 pip install -r requirements.txt

第五步(编译):

cd lib
sh make.sh

上述步骤完成,便可以进行训练了。
注意事项:

  • 不要拿过代码直接跑demo,除非你的/models里面有训练好的模型。此处说的模型不是指Vgg或Resnet在分类数据集ImageNet下训好的Transfer模型,而是指的是在目标检测集VOC或COCO下进行fine-tune的模型。对于VOC2007数据集,训练好后该模型大概1个G
  • 训练数据集训练数据命令:
//训练
$ CUDA_VISIBLE_DEVICES=1 python trainval_net.py --dataset pascal_voc --net vgg16 --bs 1 --nw 4  --cuda --epochs 5

“CUDA_VISIBLE_DEVICES”指代了gpu的id,这得看你实验室服务器哪块gpu是闲置的,一块GPU是设为0,epochs此处设为5,代码默认20,需要跑很久。
“–dataset”指代你跑得数据集名称,我们就以pascal-voc为例。
“–net”指代你的backbone网络是啥,我们以vgg16为例。
"–bs"指的batch size。
“–nw”指的是worker number,取决于你的Gpu能力,我用的是Titan Xp 12G,所以选择4。稍微差一些的gpu可以选小一点的值。
“–cuda”指的是使用gpu。
训好的model会存到models文件夹底下。
测试集命令测试:

//批量测试
$  python test_net.py --dataset pascal_voc --net vgg16 --checksession 1 --checkepoch 20 --checkpoint 10021  --cuda

注意,这里的三个check参数,是定义了训好的检测模型名称,我训好的名称为faster_rcnn_1_20_10021,代表了checksession = 1,checkepoch = 20, checkpoint = 10021,这样才可以读到模型“faster_rcnn_1_20_10021”。训练中,源码代码默认设置的epoch为20,所以checkepoch选择20,也就是选择最后那轮训好的模型,理论上应该是效果最好的。下图就是我20次epochs的模型。
在这里插入图片描述

  • demo.py运行指令
//个例实验
$ python demo.py --net vgg16  --checksession 1  --checkepoch 20 --checkpoint 10021 --cuda --load_dir models

此处我们需输入使用的网络(vgg16),以及训练好的模型路径(models),测试的图片都在images文件夹里。在此处有坑。作者提供了4张image做测试,因为测试完的图像会输出到images文件夹里,所以做完一次测试,images文件夹会有8张图片(输出图片命名规则是在原图像文件名后面加上"_det"),而原作者没有把他自己测试后的图片删去,所以大家在做demo测试时,别忘把以"_det"结尾的检测输出文件先删去,否则测试完你的images文件夹可能会得到16张图像。
当然,可以放一些你自己在网上搜的图片在images文件夹里进行demo测试,看看效果,但检测类别一定在训练的类别中。VOC2007数据集的类别在路径"/faster-rcnn.pytorch/lib/datasets/pascal_voc.py"文件中已注明,如下所示:

//个例实验
        self._classes = ('__background__',  # always index 0
                         'aeroplane', 'bicycle', 'bird', 'boat',
                         'bottle', 'bus', 'car', 'cat', 'chair',
                         'cow', 'diningtable', 'dog', 'horse',
                         'motorbike', 'person', 'pottedplant',
                         'sheep', 'sofa', 'train', 'tvmonitor','plane')

二、训练数据集制作

假设你以有相关数据集,如图所示:
在这里插入图片描述
有了上诉标注文件后,便可以制作VOC格式的数据集了。其数据集格式如下:

---VOC2007
------Annotations
------ImagesSet
---------Main
------JPEGImages

Annotations中存放的是.xml文件,文件中记录描述每张图片的信息
在这里插入图片描述
ImagesSet\Main中存放txt文件,每个文件中写入训练和测试所用的数据(也就是图片名称的集合) ,此处我只弄了训练集和测试集。
在这里插入图片描述
JPEGImages中存放的是数据集中的图片
关于VOC数据集格式,不清楚的可以直接下载一份VOC2007数据集,解压出来看一下文件就明白了。搞明白了数据集包含哪些内容之后就可以制作数据集了,首先是Annotations中的xml文件,这些文件是根据标注信息得到的txt文件生成的。我参考了网上的一些代码,自己写了一份python脚本,运行良好。只需要读入txt文件和遍历图片即可。
代码地址:https://github.com/xinyu-ch/VOC2007_dataset_create
按照上面介绍的VOC数据集文件夹目录,在examples文件夹下建立VOC2007文件夹及子文件夹,在JPEGImages文件夹下面放你的原始图片文件,按照example的Train_annotation.txt文件构建自己的数据集对应标注,运行

python ./examples/inria_example.py

因为JPEGImages中只是存放图片,所以我在生成Annotations时,同时拷贝了每张图片到JPEGImages中,也就完成了这两个文件夹的内容。
【注意】: xml文件中很多标签内容不一定要一样,可以自己定义,比如作者什么的,我是根据VOC的xml内容来修改的,大家也可以自己修改。
制作Main中的四个txt文件

  • test.txt是测试集,大概是整个数据集的50%;
  • trainval是训练和验证数据集,也就是整个数据集的剩余的50%
  • train.txt是训练集,是trainval的50%val.txt是验证集,trainval剩余的50%

三、模型相关部分修改

第一处:faster-rcnn.pytorch/lib/datasets/pascal_voc.py
在这里插入图片描述
第二处:发生如下错误:
Keyerror:'width'
该句指的是得到的图像数据库imdb文件没有‘width’,也就是没有读到图像的宽度值,而这个宽度值是通过图片读出来的,所以说明你的训练文件夹JPEGImage中没有ImagesSet\Main\trainval.txt里列出的图片,图片都放进去了,那为啥还出错呢?原因是在训练原数据集VOC时,图像数量是10021张(进行了数据增强),这时会保存训练信息至缓存中,文件路径为:

/home/user/faster_rcnn/data/cache/voc_2007_trainval_gt_roidb.pkl

因此你在重新训练新数据集的时候,会读取这个缓存配置,以加快训练,那么此时就入坑了,自己的数据集可能只有很少,所以训练时读的缓存里,需要读的图像还是原来那10021张,那势必会找不到这10021张图像,所以要做的就是,把这个缓存文件voc_2007_trainval_gt_roidb.pkl删掉,建议初次训练时cache都删掉。接下来就可以训练了:
在这里插入图片描述
第三处:faster-rcnn.pytorch/demo.py
我们训的模型,预测层是两个节点(代表2类,钢筋+背景),而测试的时候,发现模型是21类(原数据集的类数,20类+背景)。此处需要在demo.py中进行修改,如图:
在这里插入图片描述
跟更改pascal_voc,py方法类似,更改自己训练集的类别,有几类就填几类。

参考文献

  1. https://blog.csdn.net/m0_37407756/article/details/80810364
  2. https://blog.csdn.net/weixin_43380510/article/details/83004127#fasterrcnn_pytorch_6
  3. https://blog.csdn.net/gvfdbdf/article/details/52214008
  • 4
    点赞
  • 9
    评论
  • 25
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值