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

news2024/11/19 6:29:47

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-sizeparams(M)GFLOPsmAP0.5
yolov5s640×6407.216.50.57192
yolov5s05416×4161.71.80.47022
yolov5s05320×3201.71.10.44788

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


4.车辆检测模型Android部署

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

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

# 转换yolov5s05模型
python export.py --weights "runs/yolov5s05_320/weights/best.pt" --img-size 320 320

# 转换yolov5s模型
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转换工具:

  • (1)将ONNX模型转换为TNN模型,请参考TNN官方说明:TNN/onnx2tnn.md at master · Tencent/TNN · GitHub
  • (2)一键转换,懒人必备:一键转换 Caffe, ONNX, TensorFlow 到 NCNN, MNN, Tengine   (可能存在版本问题,这个工具转换的TNN模型可能不兼容,建议还是自己build源码进行转换,2022年9约25日测试可用)

(3) Android端上部署模型

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

package com.cv.tnn.model;

import android.graphics.Bitmap;

public class Detector {

    static {
        System.loadLibrary("tnn_wrapper");
    }


    /***
     * 初始化模型
     * @param model: TNN *.tnnmodel文件文件名(含后缀名)
     * @param root:模型文件的根目录,放在assets文件夹下
     * @param model_type:模型类型
     * @param num_thread:开启线程数
     * @param useGPU:关键点的置信度,小于值的坐标会置-1
     */
    public static native void init(String model, String root, int model_type, int num_thread, boolean useGPU);

    /***
     * 检测
     * @param bitmap 图像(bitmap),ARGB_8888格式
     * @param score_thresh:置信度阈值
     * @param iou_thresh:  IOU阈值
     * @return
     */
    public static native FrameInfo[] detect(Bitmap bitmap, float score_thresh, float iou_thresh);
}

如果你想在这个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:

.....
    # Exports
    if 'torchscript' in include:
        export_torchscript(model, img, file, optimize)
    if 'onnx' in include:
        model.model[-1].export = True  # TNN不支持5个维度,修改输出格式
        export_onnx(model, img, file, opset, train, dynamic, simplify=simplify)
    if 'coreml' in include:
        export_coreml(model, img, file)

    # Finish
    print(f'\nExport complete ({time.time() - t:.2f}s)'
          f"\nResults saved to {colorstr('bold', file.parent.resolve())}"
          f'\nVisualize with https://netron.app')

.....
  • TNN推理时效果很差,检测框一团麻

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


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

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

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

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

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

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

//YOLOv5s模型参数
static YOLOv5Param YOLOv5s_640 = {MODEL_TYPE_TNN,
                                         640,
                                         640,
                                         true,
                                         true,
                                         0,
                                         {{{"images", nullptr}}}, //InputNodes
                                         {{{"boxes", nullptr},   //OutputNodes
                                           {"scores", nullptr}}},
                                         {
                                                 {"434", 32,
                                                  {{116, 90}, {156, 198}, {373, 326}}},
                                                 {"415", 16, {{30, 61}, {62, 45}, {59, 119}}},
                                                 {"output", 8,
                                                  {{10, 13}, {16, 30}, {33, 23}}}, //
                                         },
                                         HELMET_NAME};

//YOLOv5s05模型参数
static YOLOv5Param YOLOv5s05_ANCHOR_416 = {MODEL_TYPE_TNN,
                                                  416,
                                                  416,
                                                  true,
                                                  true,
                                                  0,
                                                  {{{"images", nullptr}}}, //InputNodes
                                                  {{{"boxes", nullptr},   //OutputNodes
                                                    {"scores", nullptr}}},
                                                  {
                                                          {"434", 32,
                                                           {{75, 58}, {101, 128}, {242, 211}}},
                                                          {"415", 16,
                                                           {{19, 39}, {40, 29}, {38, 77}}},
                                                          {"output", 8,
                                                           {{6, 8}, {10, 19}, {21, 14}}}, //
                                                  },
                                                  HELMET_NAME};
//YOLOv5s05模型参数
static YOLOv5Param YOLOv5s05_ANCHOR_320 = {MODEL_TYPE_TNN,
                                                  320,
                                                  320,
                                                  true,
                                                  true,
                                                  0,
                                                  {{{"images", nullptr}}}, //InputNodes
                                                  {{{"boxes", nullptr},   //OutputNodes
                                                    {"scores", nullptr}}},
                                                  {
                                                          {"434", 32,
                                                           {{58, 45}, {78, 99}, {186, 163}}},
                                                          {"415", 16,
                                                           {{15, 30}, {31, 22}, {29, 59}}},
                                                          {"output", 8,
                                                           {{5, 6}, {8, 15}, {16, 11}}}, //
                                                  },
                                                  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实现车辆检测(含车辆检测数据集+训练代码)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/72366.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python编程 圣诞树教程 (附代码)程序员的浪漫

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.python 做圣诞树 1.turtle库 2.python函数的定义规则 2.引入库 3.定…

中断系统中的设备树__在S3C2440上使用设备树描述中断体验

目录 1 怎么描述一个中断 2 怎么描述一个中断控制器 3 总结 1 怎么描述一个中断 我们想在设备树文件中描述一个中断&#xff0c;那么需要两个东西 a.指定是哪一个中断控制器 b.是中断控制器里面的哪一个中断。 假设我们有一个网卡&#xff0c;当网卡有数据时会产生一个中…

论文速度系列三:SA-SSD、CIA-SSD、SE-SSD

如有错误&#xff0c;恳请指出。 参考网上资料&#xff0c;对一些经典论文进行快速思路整理 文章目录1. SA-SSD2. CIA-SSD3. SE-SSD1. SA-SSD paper&#xff1a;《Structure Aware Single-stage 3D Object Detection from Point Cloud》&#xff08;2020CVPR&#xff09; 结构…

网络工程师备考4章

4.1 历年考点分布 4.2 局域网和城域网 4.2.1 局域网体系与拓扑结构 一般数据链路层的协议都是IEEE这个组织规范的,网络层是有RFC这个组织规范的。 数据链路层是可以划分为两个子层的,第一个叫逻辑链路控制LLC(对接上面的网络层),第二个叫MAC子层(更偏向于物理层)。 最…

【hadoop】Hadoop 3.3.4 集群安装及简单使用

目录环境信息1. 准备1.1 服务器规划1.2 主机名及hosts文件修改1.2.1 hostname修改1.2.2 hosts文件修改1.3 创建hadoop用户&#xff08;建议&#xff09;1.4 为hadoop用户添加sudo权限1.5 互信免密登录1.6 快速文件同步&#xff08;可选&#xff09;2. 安装2.1 下载并安装jdk2.2…

变量学习笔记

一:作用域 说起变量第一个要说到的肯定就是作用域,正是因为不熟悉JS的作用域,往往就会把面向对象的作用域张冠李戴,毕竟有些东西总是习惯性 的这样,但是并不是每次照搬都是可以的,那么下一个问题就来了,js到底是什么作用域,当然是函数作用域了,我们的浏览器就是一个被…

基于工业物联网的温度监测系统在钢铁行业的应用

随着钢铁行业的快速发展&#xff0c;越来越多电气设备被接入到工业生产系统中&#xff0c;对自动化和连续性的生产提出新的要求&#xff0c;需要关注到供电的稳定可靠&#xff0c;也要关注到用电设备的运行状态。电气设备在长期运行中会面临越来越高的风险&#xff0c;引发危险…

ncurses交叉编译

1.环境 编译环境&#xff1a;ubuntu18.04虚拟机 板端&#xff1a;移远AG550平台 编译链aarch64-oe-linux 2.ncurses下载 ncurses库下载地址&#xff1a;Index of /pub/gnu/ncurses 下载5.9的版本 3.解压并且编译 tar xvf ncurses-5.9.tar.gz cd ncurses-5.9 执行configure命…

Android与H5(Vue)交互

Android与H5互调 实现效果&#xff1a; JS调用Android方法实现dialog弹窗&#xff0c;Android点击弹窗确定/取消按钮调用JS方法&#xff0c;在H5界面展示传递的参数。 Vue准备&#xff1a; 执行 npm run serve 命令启动项目&#xff0c;启动成功后会在命令行看到两个地址&am…

beego框架学习之安装框架

Beego 是一个快速开发 Go 应用的 HTTP 框架&#xff0c;可以用来快速开发 API、Web 及后端服务等各种应用&#xff0c;是一个 RESTful 的框架&#xff0c;相对于echo框架仅包含路由和控制器核心模块&#xff0c;beego是一个完整的MVC框架包括路由&控制器、model 数据库ORM封…

GitLab结合fortify实现自动化代码审计实践

一、背景 在甲方做安全的同学可能会有一项代码审计的工作&#xff0c;通常需要从gitlab把代码拉取下来&#xff0c;然后使用代码审计工具进行扫描&#xff0c;然后对结果进行人工确认&#xff1b; 在这个流程中需要做的事情比较繁琐&#xff0c;比如说gitlab如何配置token、如…

.net开发安卓入门 - 基本交互(Button,输入EditText,TextView,Toast)

.net开发安卓入门 - 基本交互前言TextViewEditTextButtonxml代码如下C#代码如下运行效果优化代码先看原生Android给一个View添加点击事件的三种方式在Xamarin.Android中添加onClick也的两种办法使用onClick绑定前后台调用处理逻辑第一步&#xff1a;第二步&#xff1a;第三步&a…

【实操篇】Linux组管理

目录 ●组管理 ●linux组的基本介绍 ●组的创建以及对用户的操作&#xff08;复习&#xff09; ●查看文件的所有者 ●改变文件所有者 ●修改文件所在的组 ●改变用户所在组 ●linux组的基本介绍 在Linux中的每个用户必须属于一个组&#xff0c;不能独立于组外。并且在Li…

[附源码]Python计算机毕业设计SSM基于云服务器网上论坛设计(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

软件测试 | 版本控制神器GitHub的基本使用与踩坑,教你一铲子填平!

首先需要申请GitHub帐号&#xff0c;这个就不多说了&#xff0c;大家自行百度或Google吧哈。这里默认大家都已经有GitHub账号了~ PS:&#xff08;如果已经配置好的小伙伴可以跳过配置GitHub这部分&#xff09; 配置GitHub 踩坑时刻 - 配置 第一次使用&#xff0c;如果没有配…

Photoshop使用蓝湖 cutterman插件快速切图

快速切图便于节约我们的开发时间 一 蓝湖插件 1.蓝湖官网下载插件 2.ps加载插件 一般都会自动加载 3.开始使用蓝湖插件切图 点击蓝湖插件选择对应的团队点击面板上的切图&#xff0c;选中图层进行标记 标记完成后选择上传全部面板 会提示到蓝湖官网下载对应的切图选择对应的…

mac OS 环境下安装 Redis(使用Homebrew终端安装)

使用Homebrew终端安装Redis&#xff08;好处后面会介绍&#xff09; 获取安装Homebrew&#xff08;复制如下代码到终端运行&#xff09;&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"选择好克隆原后按提示…

【学习经验分享NO.15】本科硕士学位论文和学术论文查重及降重方法

文章目录前言一、查重方法1、查重指标的含义2、查重方法二、如何修改论文重复三、常见问题答疑总结前言 学术小论文以及本科和硕士大论文在发表前需要进行降重处理&#xff0c;不然重复率过高会影响论文的发表&#xff0c;小论文一般查重要至少在20%以下&#xff0c;有些sci期…

pandas设置和显示数据框行列的数量

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 pandas设置和显示数据框行列的数量 [太阳]选择题 以下python代码结果错误的一项是? import pandas as pd pd.set_option(display.max_columns, None) pd.set_option(display.max_rows, None…

vue集成ant-design-vue

因为需要集成ant-design-vue&#xff0c;所以我在老的vue项目上进行集成&#xff0c;这不集成不要紧&#xff0c;一集成项目都起不来&#xff0c;下面进行下梳理 1遇到问题&#xff1a; BrowserslistError: Unknown browser query dead 查资料得到; 1.删除package.json文件里…