项目作者: imistyrain

项目描述 :
把极速检测器的门槛给我打下来make lightweight caffe-ssd great again
高级语言: Python
项目地址: git://github.com/imistyrain/ssd-models.git
创建时间: 2017-09-13T14:41:38Z
项目社区:https://github.com/imistyrain/ssd-models

开源协议:MIT License

下载


ssd-models 轻量级SSD检测器

License
GitHub repo size
stars

快速上手

releases下载转换好的Face模型, 将其置于Face文件夹下.
下载demo脚本, opencv版demo.py或caffe版demo_caffe.py

  1. Note: opencv版需要依赖3.4.*及以上, pip install opencv-python==3.4.0.14
  2. 调整脚本里设置模型的路径,选择从文件夹测试或者从摄像头运行, python python/demo.py

1. 下载并编译ssd

原始版本仅能在ubuntu下编译通过,这里提供一个可以在Windows、Linux和MAC跨平台编译的版本,并且添加了可分离卷积层、ShuffleNet和Focalloss的实现,支持python 2.7、3.5、3.6、3.7等

  1. git clone https://github.com/imistyrain/ssd
  2. mkdir build
  3. cd build
  4. make -j8

为方便起见,后文将下载的ssd所在文件夹记为$SSD_ROOT

2.python运行

releases里下载训练好的模型voc_mobilenet_iter_73000.caffemodel, 转换模型, 合并BN层, 加快运行速度

  1. python python/merge_bn.py

也可直接下载转换好的模型

  1. python python/demo.py

用980Ti花费4天训了一个模型,日志见voc_MobileNetSSD_980Ti_120k.log, mAP 61.8

3. C++运行

本项目使用CMake进行跨平台编译并且需要OpenCV版本为3.4及以上

  1. git clone https://github.com/imistyrain/ssd-models
  2. cd ssd-models
  3. ./build.sh

Note: 如果遇到找不到mropencv.h等文件, 可参考opencv跨平台自动化配置MRHead

ncnn部署

ncnn下提供了移动端部署的示例

4. 数据准备

我们提供了下载和转换一些典型公开检测数据集如VOCfddbFreiHandBrainwashWiderPerson的脚本download_data.sh,你可以解开里面的注释以便下载所需的文件, 里面含有自动转换成训练所需lmdb的脚本.

如果要训练自定义目标的话需要标注数据, 推荐一个好用的标注工具:MRLabeler

如果暂时没有转换好的数据的话,本项目提供一个人脸检测领域常用的已经转换好的fddblmdb(百度网盘, 密码:g33x,约102M, 训练日志见fddb_MobileNetSSD_P40_120k.log, 并将其置于data/fddb下,这个步骤过程可以参见将fddb标注转换为VOC格式标注

数据结构如下所示:

  1. ${SSD-MODELS}
  2. `-- data
  3. `-- voc
  4. |-- lmdb
  5. | |-- VOC0712_trainval_lmdb
  6. | |-- VOC0712_test_lmdb
  7. `-- fddb
  8. |-- lmdb
  9. | |-- trainval_lmdb
  10. | |-- test_lmdb
  11. `-- Hand
  12. |-- lmdb
  13. | |-- trainval_lmdb
  14. | |-- test_lmdb
  15. ...

所有的数据都要转换为lmdb格式,有3种方式:

  • 第一种是使用caffe-ssd里使用的脚本:create_list.shcreate_data.sh,好处是资料比较多,步骤也很详细,缺点是比较繁琐,需要先转换成VOC格式,对文件位置也有较高的要求
  • 第二种是使用本项目中的create_lmdb.py,其解除了对文件位置严格的限制,而且能一键式运行,省心省力

    原始ssd需要将数据放到指定目录并且要运行两个脚本,其对文件位置有这严苛的要求,稍有不慎就会弄错.本项目根据其中的内容提取成了create_list.py文件,其包含两个函数,create_list把训练图片路径及其标注按行写入到trainval.txt中,把测试图片路径及其标注按行写入到test.txt中,把测试图片路径及其大小(高度、宽度)写入到test_name_size.txt中

    1. Note:由于fddb中含有多级目录,为了兼容SSDYOLO的训练结构要求,此脚本将路径中的"/"转换为了"_"
    1. python python/create_lmdb.py
  • 最后一种是使用convert2lmdb.py

    其使用python直接生成训练所需的lmdb文件,不必再繁琐的转换成VOC格式,直接和pytorch似的加载自定义数据集,也可进行转换好的lmdb数据进行可视化,方便检查其中的问题,其还给出了数据集的统计分布和推荐的anchor设置.

    对于FaceMask数据, 结果如下:

    1. face: 10596
    2. face_mask: 2985
    3. -------Total: 13581
    4. Iteration: 26: Accuracy: 71.57%
    5. Recommanded aspect ratios(width/height)
    6. Width Height Height/Width
    7. 0.011 0.019 1.8
    8. 0.020 0.034 1.7
    9. 0.031 0.058 1.8
    10. 0.052 0.086 1.7
    11. 0.082 0.119 1.5
    12. 0.111 0.188 1.7
    13. 0.180 0.268 1.5
    14. 0.280 0.404 1.4
    15. 0.435 0.570 1.3

数据检查

showpreprocess.py可以对预处理后的数据进行可视化,便于分析其中存在的问题,可参考SSD 中的数据增强

5 启动训练

可以使用如下命令训练, 仅仅需要一个cfg配置文件,配置所需的网络和数据:

  1. python train.py

FLOPs分析

  1. svd15 90x160
  2. layer name Filter Shape Output Size Params Flops Ratio
  3. Convolution1 (4, 3, 3, 3) (1, 4, 160, 90) 108 1555200 7.087%
  4. Convolution2 (4, 4, 3, 3) (1, 4, 160, 90) 144 2073600 9.449%
  5. Convolution3 (8, 4, 3, 3) (1, 8, 80, 45) 288 1036800 4.724%
  6. Convolution4 (8, 8, 3, 3) (1, 8, 80, 45) 576 2073600 9.449%
  7. Convolution5 (24, 8, 3, 3) (1, 24, 40, 23) 1728 1589760 7.244%
  8. Convolution6 (24, 24, 3, 3) (1, 24, 40, 23) 5184 4769280 21.732%
  9. Convolution7 (24, 24, 1, 1) (1, 24, 40, 23) 576 529920 2.415%
  10. Convolution8 (24, 24, 1, 1) (1, 24, 40, 23) 576 529920 2.415%
  11. Convolution9 (24, 24, 1, 1) (1, 24, 40, 23) 576 529920 2.415%
  12. Convolution10 (24, 24, 3, 3) (1, 24, 20, 12) 5184 1244160 5.669%
  13. conv3_2_norm_mbox_loc (8, 24, 3, 3) (1, 8, 40, 23) 1728 1589760 7.244%
  14. conv3_2_norm_mbox_conf (4, 24, 3, 3) (1, 4, 40, 23) 864 794880 3.622%
  15. conv6_2_mbox_loc (8, 24, 3, 3) (1, 8, 40, 23) 1728 1589760 7.244%
  16. conv6_2_mbox_conf (4, 24, 3, 3) (1, 4, 40, 23) 864 794880 3.622%
  17. conv7_2_mbox_loc (16, 24, 3, 3) (1, 16, 20, 12) 3456 829440 3.78%
  18. conv7_2_mbox_conf (8, 24, 3, 3) (1, 8, 20, 12) 1728 414720 1.89%
  19. Layers num: 39
  20. Total number of parameters: 25308
  21. Total number of FLOPs: 21945600

aizoo28 96x96

  1. layer name Filter Shape Output Size Params Flops Ratio
  2. Convolution1 (32, 3, 3, 3) (1, 32, 96, 96) 864 7962624 9.455%
  3. Convolution2 (64, 32, 3, 3) (1, 64, 48, 48) 18432 42467328 50.424%
  4. Convolution3 (64, 64, 3, 3) (1, 64, 24, 24) 36864 21233664 25.212%
  5. Convolution4 (64, 64, 3, 3) (1, 64, 12, 12) 36864 5308416 6.303%
  6. Convolution5 (128, 64, 3, 3) (1, 128, 6, 6) 73728 2654208 3.152%
  7. Convolution6 (128, 128, 3, 3) (1, 128, 3, 3) 147456 1327104 1.576%
  8. Convolution7 (128, 128, 3, 3) (1, 128, 2, 2) 147456 589824 0.7%
  9. Convolution8 (128, 128, 3, 3) (1, 128, 1, 1) 147456 147456 0.175%
  10. conv2d_3_norm_mbox_loc (12, 64, 3, 3) (1, 12, 12, 12) 6912 995328 1.182%
  11. conv2d_3_norm_mbox_conf (6, 64, 3, 3) (1, 6, 12, 12) 3456 497664 0.591%
  12. conv2d_4_mbox_loc (12, 128, 3, 3) (1, 12, 6, 6) 13824 497664 0.591%
  13. conv2d_4_mbox_conf (6, 128, 3, 3) (1, 6, 6, 6) 6912 248832 0.295%
  14. conv2d_5_mbox_loc (12, 128, 3, 3) (1, 12, 3, 3) 13824 124416 0.148%
  15. conv2d_5_mbox_conf (6, 128, 3, 3) (1, 6, 3, 3) 6912 62208 0.074%
  16. conv2d_6_mbox_loc (12, 128, 3, 3) (1, 12, 2, 2) 13824 55296 0.066%
  17. conv2d_6_mbox_conf (6, 128, 3, 3) (1, 6, 2, 2) 6912 27648 0.033%
  18. conv2d_7_mbox_loc (12, 128, 3, 3) (1, 12, 1, 1) 13824 13824 0.016%
  19. conv2d_7_mbox_conf (6, 128, 3, 3) (1, 6, 1, 1) 6912 6912 0.008%
  20. Layers num: 47
  21. Total number of parameters: 702432
  22. Total number of FLOPs: 84220416
  1. MobileNetSSD 300x300
  2. Layers num: 47
  3. Total number of parameters: 5492672
  4. Total number of FLOPs: 1124416960

训练日志及预训练模型

dataset model model_size iters mAP log

voc | MobileNetSSD | 22M| 120000 | 61.9 | voc_MobileNetSSD_980Ti_120k.log
fddb | MobileNetSSD | 22M | 6000 | 89.58 |fddb_MobileNetSSS_1060_6k.log
fddb | aizoo28| 2.8M | 6000 | 89.37 | fddb_aizoo28_320x320_6k.log
fddb | sdv15 | 115K | 13000 | 78.2 | fddb_svd15_90x160.log
widerface| MobileNetSSD | 22M | 90000 | 43.6 | widerface_MobileNetSSD_980Ti_120k.log
Person |aizoo28 | 2.8M | 22000 | 50.5| Person_aizoo28_320x320.log
Hand | aizoo28 | 2.8M | 16000 | 89.77 | Hand_aizoo28_320x320.log
Head | aizoo28 | 2.8M | 103000 | 55.2 | Head_aizoo28_320x320.log
Mask | aizoo28 | 2.8M | 60000 | 82.11 | Mask_aizoo28_320x320.log
Car | aizoo28 | 2.8M | 92000 | 34.74 | Car_aizoo28_320x320.log

MobileNetSSD训练

如果想训练MobileNetSSD系列网络可以使用

  1. cd MobileNetSSD
  2. ./run.sh

vgg_ssd

  1. 不推荐, 模型大(90M)且慢
  2. python ssd/ssd_train.py
  3. python ssd/ssd_test.py

参考