Keras训练检测模型(Yolo3/tiny Yolo3),部署到Jetson TX2处理多路视频

Keras训练检测模型(Yolo3/tiny Yolo3),部署到Jetson TX2处理多路视频

通过自己的数据训练目标检测器,然后部署到边缘设备上进行检测,并能够进行多路视频处理。
主要内容包括:
1,使用自己数据训练yolo3/yolo3_tiny模型(Keras版本)
2,模型格式转换(.h5-ONNX)
3,部署ONNX模型到tx2 Deepstream
4,检测结果
代码:https://github.com/xiaomaozhou26/keras_onnx_tx2

使用数据训练自己的yolov3/yolov3_tiny模型

训练这一块网上有很多详细的资料,不再累述,实验过程参考blog:
https://blog.csdn.net/Patrick_Lxc/article/details/80615433
keras模型参考:
https://github.com/qqwweee/keras-yolo3

.h5文件转换为ONNX格式

Keras框架保存的模型为.h5格式,在部署到边缘设备之前,一般需要经过格式转换进行加速,可以通过转换到ONNX,并进一步经过TensorRT加速进行部署。下面提供不同模型转换所使用的代码:
.h5–.onnx --.trt 代码:https://github.com/onnx/keras-onnx;https://github.com/zombie0117/yolov3-tiny-onnx-TensorRT
.h5–.weights 代码:https://github.com/xiaomaozhou26/keras_onnx_tx2

在实际的部署过程中发现,只需要提供.cfg和.weights文件,deepstream能够将上述文件自动生成tensorrt engine…

ONNX部署到TX2 Deepstream

得到的ONNX模型部署到TX2上可以进行视频流进行检测

具体做法参考blog:https://medium.com/m/global-identity?redirectUrl=https%3A%2F%2Ftowardsdatascience.com%2Fhow-to-deploy-onnx-models-on-nvidia-jetson-nano-using-deepstream-b2872b99a031

注意:上述blog中的bounding box解析函数是针对tiny yolo2的,而我们使用tiny yolo3模型,需要对parse函数进行修改。可以参考deepstream示例中对不同版本yolo进行解析的函数。
https://github.com/Kwull/deepstream-4.0.1/tree/master/sources
(包含对ssd,yolo,rcnn系列的解析)
解析函数的build过程参考文件中README步骤,build完成后可以直接使用不同检测模型的解析函数

你可以更改./objectDetector_Yolo/nvdsinfer_custom_impl_Yolo/nvdsparsebbox_Yolo.cpp中的参数,然后build
例如:
static const int NUM_CLASSES_YOLO = 1;

const uint kNUM_BBOXES = 3;
static const float kNMS_THRESH = 0.2f;
static const float kPROB_THRESH = 0.12f;

对于自己训练生产的模型,要把.cfg和.weights重新命名,对于我们使用yolov3-tiny解析函数,我们把自己的模型重新命名为yolov3-tiny.cfg和yolov3-tiny.weights,否则,会解析失败。
https://forums.developer.nvidia.com/t/deepstream-4-0-custom-yolo-model-app-run-failed/81395
Keras训练检测模型(Yolo3/tiny Yolo3),部署到Jetson TX2处理多路视频

ONNX部署到TX2 Deepstream

试验结果如下:
能够同时处理4路1080p视频,fps大概12左右。。。Keras训练检测模型(Yolo3/tiny Yolo3),部署到Jetson TX2处理多路视频
注:deepstream提供插件服务,推理后的视频能够联同推理数据保存到本地,或生产出rtsp视频流继续送往下一环节进行处理,参考
https://developer.nvidia.com/deepstream-sdk