参考:https://zhuanlan.zhihu.com/p/98059235
最近做实验,参考各位大神的教程来跑自己的数据集,
整个过程做一个记录,为以后的复现做参考。
所用的代码地址:https://github.com/lufficc/SSD
这份代码是比较新的,比起两年前star数量最多的SSD Pytorch实现有更多的灵活度,更详细的文档,作者给出了不同的Backbone,在readme里面给出了特别详细的修改指导,对于想要自己更改网络,写自己的数据类的小伙伴,强烈安利!在此感谢原作者。
因为安装使用SSD和源码解读是很大两块内容,分俩个部分来写,第一部分主要是关于SSD的使用。
SSD安装/训练/推理
安装:(ubuntu环境)对于如何安装并跑这份代码作者在readme里面写得简直不能太详尽,只补充几个注意点:
- 养成好习惯,尽量在conda 里面创个虚拟环境
- CUDA9/10皆可,但是CUDA8是不行的
- 小Tip: conda install torchvision==0.3.0,一行命令基本帮忙把torch相关依赖都装上了
git clone https://github.com/lufficc/SSD.git
cd SSD
# Required packages: torch torchvision yacs tqdm opencv-python vizer
pip install -r requirements.txt
# Done! That's ALL! No BUILD! No bothering SETUP!
插播一下数据准备:
在根目录下新建一个datasets文件夹。源码支持coco/voc格式,当然你也可以自定义一个数据接口,这个作者也有指导!自己写数据类请参考ssd/data/datasets/目录下的coco.py和voc.py
对于VOC
--datasets
| --voc2007
| --Annotations
| --1.xml,2.xml,....,......
| --JPEGImages
| --1.jpg,2.jpg,....,......
| --ImageSets
| --Main
| --test.txt #用于测试的。形如1,2,3,4...也就是index 加上.xml或者.jpg就是标签和图像的名字
| --train.txt #用于训练的
| --trainval.txt #训练加验证
| --val.txt #验证
仿照VOCDataset(torch.utils.data.Dataset)写一个针对自己特定数据格式的类就可!
对于想自己定义数据类以及更改网络结构的,给出原作者的指导
https://github.com/lufficc/SSD/blob/master/DEVELOP_GUIDE.md
含有三个目标的voc格式的.xml文件标长这样:
注意:这边有个坑,原作者是在训练时同事用了VOC2007和VOC2012的格式。所以在自己的数据集中也要有这两种格式的,其实就是吧VOC2007的复制一下,然后把名字改成VOC2012就行。或者如下修改只用voc2007就行。
当然也可以只用VOC2007,只需要在SSD-master/configs/vgg_ssd300_voc0712.yaml中设置就行
训练阶段
建立好自己数据后,需要把它的路径写到 ssd/config/path_catlog.py中,同时在configs/vgg_ssd300voc0712.yaml文件中指定所用数据。为了方便,上面我直接把自己的数据就命名为VOC2007,这样其实不需要改 pathcatlog.py.
注意要点:还有一个特别需要注意的点就是类别的更改,在SSD-master/ssd/config/defaults.py和,configs/vgg_ssd300voc0712.yaml中的NUM_CLASSES是自己的数据的类别,记得加上背景,且一定要和数据集中的一样,而且不能有大写,空格等符号,只能是小写字母。同时,一定要在SSD-master/ssd/data/datasets/voc.py或者SSD-master/ssd/data/datasets/coco.py中(如果用的voc/coco格式)将类别标签都改为自己的.
SSD-master/ssd/config/defaults.py
configs/vgg_ssd300voc0712.yaml
SSD-master/ssd/data/datasets/voc.py
注意:
运行train.py的训练的时候,由于在ssd/config/default.py中,默认是vgg网络作为backbone,但是如果你选择了使用预训练模型,那么往往会遇到一个问题,预训练模型需要到程序中指定的那个url去下载,但往往会失败。所以,这个时候不如到网上找一个vgg16的预训练模型vgg16_reducedfc.pth,根据错误提示,把模型放到~/.torch/models/下面,要在命令行下面操作,.torch是隐藏文件,图形界面找不到的
根据训练命令
python train.py --config-file configs/vgg_ssd300_voc0712.yaml
根据提示,由于在线下载vgg16的预训练模型vgg16_reducedfc.pth太慢,所以,在其他地方下载后放置提示文件夹。
再次执行训练命令
python train.py --config-file configs/vgg_ssd300_voc0712.yaml
训练成功。然后会再output文件夹下生成训练权重。注意:如果想要重新训练,要把生成的训练权重文件清除。
测试
python demo.py --config-file configs/vgg_ssd300_voc0712.yaml --images_dir demo --score_threshold 0.7 --ckpt ./outputs1
1/vgg_ssd300_voc0712/model_final.pth
测试结果
会再outputs11文件夹里面生成 result文件夹,里面是带有标签的测试结果