小言_互联网的博客

Android实现车辆检测(含Android源码 可实时运行)

518人阅读  评论(0)

Android实现车辆检测(含Android源码 可实时运行)

目录

Android实现车辆检测(含Android源码 可实时运行)

1. 前言

2. 车辆检测数据集说明

3. 基于YOLOv5的车辆检测模型训练

4.车辆检测模型Android部署

(1) 将Pytorch模型转换ONNX模型

(2) 将ONNX模型转换为TNN模型

(3) Android端上部署模型

(4) 一些异常错误解决方法

5. 车辆检测效果

6.项目源码下载


1. 前言

本篇博客是《YOLOv5实现车辆检测(含车辆检测数据集+训练代码)》续作Android篇,主要分享将Python训练后的YOLOv5的车辆检测模型移植到Android平台。我们将开发一个简易的、可实时运行的车辆检测Android Demo。

考虑到原始YOLOv5的模型计算量比较大,鄙人在YOLOv5s基础上,开发了一个非常轻量级的的车辆检测模型yolov5s05_320。从效果来看,Android车辆检测模型的检测效果还是可以的,高精度版本YOLOv5s平均精度平均值mAP_0.5=0.57192,而轻量化版本yolov5s05_416平均精度平均值mAP_0.5=0.47022左右。APP在普通Android手机上可以达到实时的检测识别效果,CPU(4线程)约30ms左右,GPU约25ms左右 ,基本满足业务的性能需求。

 先展示一下Android Demo效果:

【Android APP体验】https://download.csdn.net/download/guyuealian/87244599

【项目源码下载】 Android实现车辆检测(含Android源码 可实时运行)

【尊重原创,转载请注明出处】https://panjinquan.blog.csdn.net/article/details/128190532


2. 车辆检测数据集说明

目前收集了约10W+的车辆检测数据集:UA-DETRAC车辆检测数据集+Vehicle-Dataset车辆检测数据集+BITVehicle车辆检测数据集 

关于车辆检测数据集使用说明和下载,详见另一篇博客说明:《UA-DETRAC BITVehicle车辆检测数据集(含下载地址)


3. 基于YOLOv5的车辆检测模型训练

官方YOLOv5给出了YOLOv5l,YOLOv5m,YOLOv5s等模型。考虑到手机端CPU/GPU性能比较弱鸡,直接部署yolov5s运行速度十分慢。所以本人在yolov5s基础上进行模型轻量化处理,即将yolov5s的模型的channels通道数全部都减少一半,并且模型输入由原来的640×640降低到416×416或者320×320,该轻量化的模型我称之为yolov5s05。从性能来看,yolov5s05比yolov5s快5多倍,而mAP下降了10%(0.57→0.47),对于手机端,这精度勉强可以接受。

下面是yolov5s05和yolov5s的参数量和计算量对比:

模型 input-size params(M) GFLOPs mAP0.5
yolov5s 640×640 7.2 16.5 0.57192
yolov5s05 416×416 1.7 1.8 0.47022
yolov5s05 320×320 1.7 1.1 0.44788

yolov5s05和yolov5s训练过程完全一直,仅仅是配置文件不一样而已;碍于篇幅,本篇博客不在赘述,详细训练过程请参考:YOLOv5实现车辆检测(含车辆检测数据集+训练代码)


4.车辆检测模型Android部署

(1) 将Pytorch模型转换ONNX模型

训练好yolov5s05或者yolov5s模型后,你需要将模型转换为ONNX模型,并使用onnx-simplifier简化网络结构


  
  1. # 转换yolov5s05模型
  2. python export.py --weights "runs/yolov5s05_320/weights/best.pt" --img-size 320 320
  3. # 转换yolov5s模型
  4. python export.py --weights "runs/yolov5s_640/weights/best.pt" --img-size 640 640

GitHub: https://github.com/daquexian/onnx-simplifier
Install:  pip3 install onnx-simplifier 

(2) 将ONNX模型转换为TNN模型

目前CNN模型有多种部署方式,可以采用TNN,MNN,NCNN,以及TensorRT等部署工具,鄙人采用TNN进行Android端上部署:

TNN转换工具:

(3) Android端上部署模型

项目实现了Android版本的车辆检测Demo,部署框架采用TNN,支持多线程CPU和GPU加速推理,在普通手机上可以实时处理。Android源码核心算法YOLOv5部分均采用C++实现,上层通过JNI接口调用


  
  1. package com.cv.tnn.model;
  2. import android.graphics.Bitmap;
  3. public class Detector {
  4. static {
  5. System.loadLibrary( "tnn_wrapper");
  6. }
  7. /***
  8. * 初始化模型
  9. * @param model: TNN *.tnnmodel文件文件名(含后缀名)
  10. * @param root:模型文件的根目录,放在assets文件夹下
  11. * @param model_type:模型类型
  12. * @param num_thread:开启线程数
  13. * @param useGPU:关键点的置信度,小于值的坐标会置-1
  14. */
  15. public static native void init (String model, String root, int model_type, int num_thread, boolean useGPU);
  16. /***
  17. * 检测
  18. * @param bitmap 图像(bitmap),ARGB_8888格式
  19. * @param score_thresh:置信度阈值
  20. * @param iou_thresh: IOU阈值
  21. * @return
  22. */
  23. public static native FrameInfo[] detect(Bitmap bitmap, float score_thresh, float iou_thresh);
  24. }

如果你想在这个Android Demo部署你自己训练的YOLOv5模型,你可将训练好的Pytorch模型转换ONNX ,再转换成TNN模型,然后把TNN模型代替你模型即可。

(4) 一些异常错误解决方法

  • TNN推理时出现:Permute param got wrong size

官方YOLOv5:  GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite 

如果你是直接使用官方YOLOv5代码转换TNN模型,部署TNN时会出现这个错误Permute param got wrong size,这是因为TNN最多支持4个维度计算,而YOLOv5在输出时采用了5个维度。你需要修改model/yolo.py文件 

 export.py文件设置model.model[-1].export = True:


  
  1. .....
  2. # Exports
  3. if 'torchscript' in include:
  4. export_torchscript(model, img, file, optimize)
  5. if 'onnx' in include:
  6. model.model[- 1].export = True # TNN不支持5个维度,修改输出格式
  7. export_onnx(model, img, file, opset, train, dynamic, simplify=simplify)
  8. if 'coreml' in include:
  9. export_coreml(model, img, file)
  10. # Finish
  11. print( f'\nExport complete ({time.time() - t:.2f}s)'
  12. f"\nResults saved to {colorstr('bold', file.parent.resolve())}"
  13. f'\nVisualize with https://netron.app')
  14. .....
  • TNN推理时效果很差,检测框一团麻

 这个问题,大部分是模型参数设置错误,需要根据自己的模型,修改C++推理代码YOLOv5Param模型参数。


  
  1. struct YOLOv5Param {
  2. ModelType model_type; // 模型类型,MODEL_TYPE_TNN,MODEL_TYPE_NCNN等
  3. int input_width; // 模型输入宽度,单位:像素
  4. int input_height; // 模型输入高度,单位:像素
  5. bool use_rgb; // 是否使用RGB作为模型输入(PS:接口固定输入BGR,use_rgb=ture时,预处理将BGR转换为RGB)
  6. bool padding;
  7. int num_landmarks; // 关键点个数
  8. NetNodes InputNodes; // 输入节点名称
  9. NetNodes OutputNodes; // 输出节点名称
  10. vector<YOLOAnchor> anchors;
  11. vector<string> class_names; // 类别集合
  12. };

input_width和input_height是模型的输入大小;vector<YOLOAnchor> anchors需要对应上,注意Python版本的yolov5s的原始anchor是


  
  1. anchors:
  2. - [ 10, 13, 16, 30, 33, 23] # P3/8
  3. - [ 30, 61, 62, 45, 59, 119] # P4/16
  4. - [ 116, 90, 156, 198, 373, 326] # P5/32

而yolov5s05由于input size由原来640变成320,anchor也需要做对应调整:


  
  1. anchors:
  2. - [ 5, 6, 8, 15 , 16, 11 ]
  3. - [ 15, 30, 31, 22, 29, 59 ]
  4. - [ 58, 45 , 78, 99, 186, 163 ]

因此C++版本的yolov5s和yolov5s05的模型参数YOLOv5Param如下设置


  
  1. //YOLOv5s模型参数
  2. static YOLOv5Param YOLOv5s_640 = {MODEL_TYPE_TNN,
  3. 640,
  4. 640,
  5. true,
  6. true,
  7. 0,
  8. {{{ "images", nullptr}}}, //InputNodes
  9. {{{ "boxes", nullptr}, //OutputNodes
  10. { "scores", nullptr}}},
  11. {
  12. { "434", 32,
  13. {{ 116, 90}, { 156, 198}, { 373, 326}}},
  14. { "415", 16, {{ 30, 61}, { 62, 45}, { 59, 119}}},
  15. { "output", 8,
  16. {{ 10, 13}, { 16, 30}, { 33, 23}}}, //
  17. },
  18. HELMET_NAME};
  19. //YOLOv5s05模型参数
  20. static YOLOv5Param YOLOv5s05_ANCHOR_416 = {MODEL_TYPE_TNN,
  21. 416,
  22. 416,
  23. true,
  24. true,
  25. 0,
  26. {{{ "images", nullptr}}}, //InputNodes
  27. {{{ "boxes", nullptr}, //OutputNodes
  28. { "scores", nullptr}}},
  29. {
  30. { "434", 32,
  31. {{ 75, 58}, { 101, 128}, { 242, 211}}},
  32. { "415", 16,
  33. {{ 19, 39}, { 40, 29}, { 38, 77}}},
  34. { "output", 8,
  35. {{ 6, 8}, { 10, 19}, { 21, 14}}}, //
  36. },
  37. HELMET_NAME};
  38. //YOLOv5s05模型参数
  39. static YOLOv5Param YOLOv5s05_ANCHOR_320 = {MODEL_TYPE_TNN,
  40. 320,
  41. 320,
  42. true,
  43. true,
  44. 0,
  45. {{{ "images", nullptr}}}, //InputNodes
  46. {{{ "boxes", nullptr}, //OutputNodes
  47. { "scores", nullptr}}},
  48. {
  49. { "434", 32,
  50. {{ 58, 45}, { 78, 99}, { 186, 163}}},
  51. { "415", 16,
  52. {{ 15, 30}, { 31, 22}, { 29, 59}}},
  53. { "output", 8,
  54. {{ 5, 6}, { 8, 15}, { 16, 11}}}, //
  55. },
  56. HELMET_NAME};
  • 运行APP闪退:dlopen failed: library "libomp.so" not found

参考解决方法:解决dlopen failed: library “libomp.so“ not found_PKing666666的博客-CSDN博客_dlopen failed 


5. 车辆检测效果

 Android APP体验 : https://download.csdn.net/download/guyuealian/87244599

APP在普通Android手机上可以达到实时的车辆检测效果,CPU(4线程)约30ms左右,GPU约25ms左右 ,基本满足业务的性能需求。


6.项目源码下载

 【Android APP体验】https://download.csdn.net/download/guyuealian/87244599

 【车辆检测Android源码下载】 Android实现车辆检测(含Android源码 可实时运行)

整套Android项目源码内容包含:

  1. 提供快速版yolov5s05车辆检测模型,在普通手机可实时检测识别,CPU(4线程)约30ms左右,GPU约25ms左右
  2. 提供高精度版本yolov5s车辆检测模型,CPU(4线程)约250ms左右,GPU约100ms左右
  3. Demo支持图片,视频,摄像头测试

如果你需要车辆检测数据集:UA-DETRAC BITVehicle车辆检测数据集(含下载地址)

如果你需要车辆训练代码:YOLOv5实现车辆检测(含车辆检测数据集+训练代码)


转载:https://blog.csdn.net/guyuealian/article/details/128190532
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场