一、jetson-nano上的SSD模型选择
为什么选择SSD模型?
- 如果应用场景没有小目标检测需求。
- 推理的硬件设备算力不是很高又要求较高的实时检测能力。
- 要求较高的目标检测准确率。
满足以上几点,在jetson-nano设备上部署SSD目标检测模型是个比较好的选择。目前官方支持较好的有三种SSD模型:
ssd_inception_v2_coco
ssd_mobilenet_v1_coco
ssd_mobilenet_v2_coco
如果对实时性要求高一点,可以选择ssd_mobilenet_v2_coco
如果对准确率要求高一点,可以选择ssd_inception_v2_coco
在deepstream4.0里有ssd_inception_v2_coco的demo,路径在deepstream_sdk_v4.0.1_jetson\sources\objectDetector_SSD
二、jetson-nano上模型部署
运行环境:JETSON-Nano刷机运行deepstream4.0的demo
- 安装TensorFlow 参考jetson-nano安装TensorFlow并运行目标检测需要安装deepstream4.0
- 下载并解压ssd_inception_v2_coco预训练模型
- cd ssd_inception_v2_coco_2017_11_17
- python3 /usr/lib/python3.6/dist-packages/uff/bin/convert_to_uff.py frozen_inference_graph.pb -O NMS -p /usr/src/tensorrt/samples/sampleUffSSD/config.py -o sample_ssd_relu6.uff
- copy sample_ssd_relu6.uff 到deepstream_sdk_v4.0.1_jetson/sources/objectDetector_SSD
- copy ssd_coco_labels.txt 到deepstream_sdk_v4.0.1_jetson/sources/objectDetector_SSD
该文件在tensorrt的安装目录下 - cd deepstream_sdk_v4.0.1_jetson/sources/objectDetector_SSD
- make -C nvdsinfer_custom_impl_ssd
- deepstream-app -c deepstream_app_config_ssd.txt
三、SSD模型原理
-
多尺度检测
不同尺度的特征图来做检测
SSD使用6个不同特征图检测不同尺度的目标。低层预测小目标,高层预测大目标。 -
不同尺度和长宽比的先验框
SSD借鉴了Faster R-CNN中anchor的理念,每个单元设置尺度或者长宽比不同的先验框,预测的边界框(bounding boxes)是以这些先验框为基准的,在一定程度上减少训练难度。
底层的特征图较大,高层的特征图较小。高层的特征图感受野大,适合检测大目标。SSD的先验框可以是正方形,也可以是矩形。
从上图看出不同大小的先验框有利于提升mAP。 -
小目标识别
SSD对小目标识别的情况不是很理想。解决方法是用更大的图片做输入。一般SSD采用的是300X300的图片大小,512X512的输入会有更好的小目标检测效果。因为更大的输入图像,卷积以后得到的小目标信息更多。 -
数据增强
ssd论文里的数据增广方法可以提升2%~3%的mAP。
ssd_random_crop、random_horizontal_flip都是典型的数据增强方法。这些方法在各种目标检测模型里已经普遍使用了。
TensorFlow的object detection api里有数据增强的方法,开发人员自己选择采用哪些数据增广方法。可以参考preprocessor.py文件。
data_augmentation_options {
random_horizontal_flip {
}
}
data_augmentation_options {
ssd_random_crop {
}
}
在SSD模型配置文件里默认是有上面两种数据增强的方法。
参考文献: https://arxiv.org/pdf/1512.02325.pdf