Thundernet 训练自己的数据集

前言:前几天准备想用个轻量的目标检测算法,但是我又不想在动脑子,就想着拿来用用,没想到竟然没看到有人写ThunderNet训练自己数据集的博客,我这暴脾气没人写是吧,那就我写。说干就干
Thundernet 训练自己的数据集
这配置还合手吧!合手的话别忘了点赞评论加关注我,后续我会推出更合手的。

代码: https://github.com/ouyanghuiyu/Thundernet_Pytorch
环境:
Ubuntu16.04
python 3.5
torch 1.1.0
cuda 9

根据我上面提供的链接把模型下载下来

数据集准备

对于跑模型最重要的就是数据集的准备,数据集准备好了,练丹就完成一半了。今天跑的模型ThunderNet数据集还是比较简单的VOC数据格式,但是对于没有用过的VOC数据集的同学还是有点陌生的,主要就是三部分Annotations ImageSets JPEGImages。

Annotations: 存放标签数据的xml文件
ImageSets: 存放训练和验证数据的txt文件
JPEGImages:存放训练的图片

Thundernet 训练自己的数据集

首先在项目里创建一个这样的文件夹目录 data/VOCdevkit/VOC2007/ 接着目录下面存放这些数据

Annotations文件里面存的是标签的xml文件
Thundernet 训练自己的数据集

ImageSet/Main/下面存tain.txt,val.txt,这些txt里面是训练和验证数据的名字
Thundernet 训练自己的数据集

JPGEImages
Thundernet 训练自己的数据集

数据准备完了那你已经成功一半了,继续,不要停不要停。

Thundernet 训练自己的数据集

编译

首先在终端目录下 cd lib 然后执行python3 setup.py build_ext --inplace这里我用的是Python3,因为我系统如果只用python的话是默认指向python2的,所以在python后面加一个3
Thundernet 训练自己的数据集
之后在输入cd psroialign/PSROIAlign 先不要急着执行sh build.sh 进入build.sh文件把python改成Python3(如果你系统python默认指向python3的话,那就不用改)
Thundernet 训练自己的数据集
执行sh build.sh
Thundernet 训练自己的数据集

编译完成之后就要修改一下相关的代码了,因为代码是根据训练voc数据集和coco数据集写的。
首先是改一下trainval_net.py,从255行开始,把voc_2012_train的去掉只留下voc_2007_train。
263行的20改成1,因为原来的voc数据集合是20个类别,但是我的数据只是检测一个目标,所以改成了1。
Thundernet 训练自己的数据集
接着把 /lib/roi_data_layer/roibatchLoader.py 87行 >=20改成了>=1
Thundernet 训练自己的数据集

还有就是/lib/datasets/pascal_voc.py 把原来的20个名字删除,改成自己的目标名字,我的是people,所以留下背景__background__ 和 自己目标名称就可以了,如果你这里是多个目标,就写多个名称就是了。
Thundernet 训练自己的数据集

然后我们去掉一些对我们训练没有用反而会报错的库,注释删除都可以了,对代码没影响。所以没用的当然要剪掉啊

第一个剪掉 /test_net.py 文件下的
from external.nms import soft_nms
第二个剪掉 /lib/model/rpn/proposal_layer.py 文件下的
from external.nms import soft_nms
第三个剪掉 /lib/datasets/coco.py里面的
from pycocotools.coco import COCO
from pycocotools.cocoeval import COCOeval
from pycocotools import mask as COCOmask

Thundernet 训练自己的数据集

训练

训练可以选的3种主干网络,我这里用的是49的,想用其他的改对应的脚本就是了。改训练脚本/script/train_49.sh 。
–save_dir 对应训练的权重保存目录,–net 对应主干网络,被注释的一行代码从哪里接着训练,我注释代表从0开始训练。
Thundernet 训练自己的数据集

预测

作者预测部分也已经写好了脚本,但还要改几个地方。
demo.py文件176行MAX_NUM_GT_BOXES后面的20改成1。
Thundernet 训练自己的数据集

demo.py 207行类别改成自己的目标
Thundernet 训练自己的数据集
script/pre.sh脚本内容更改,voc_images/input/ 是测试图片的文件路径,–net 对应主干网络,–load_dir 权重保存目录
Thundernet 训练自己的数据集

注意两点:

1.因为预测出来的图片结果会存在voc_images/output/ 下面,但是不会自动创建所以需要自己手动提前创建好,否则跑完依旧看不到结果。

2.如果预测出来的图片框很多可以设置一下NMS的值,在lib/model/utils/config.py 文件里的183行 C.TEST.NMS = 0.1 原本是0.5,我改成了0.1,具体值根据你目标类型来定。

终于,你干完了…感觉怎么样!

Thundernet 训练自己的数据集