Android实现红绿灯检测(含Android源码 可实时运行)

news2025/2/3 6:58:39

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.93919,而轻量化版本yolov5s05_416平均精度平均值mAP_0.5=0.71944左右。APP在普通Android手机上可以达到实时的检测识别效果,CPU(4线程)约30ms左右,GPU约25ms左右 ,基本满足业务的性能需求。

 先展示一下Android Demo效果:

【Android APP体验】Android实现红绿灯检测APP(可实时运行))

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

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


2. 红绿灯检测数据集说明

目前收集了约1W+的红绿灯(交通信号灯)检测数据集:Traffic-Lights-Dataset-Domestic+Traffic-Lights-Dataset-Foreign: 

关于红绿灯检测数据集使用说明和下载,详见另一篇博客说明:《红绿灯(交通信号灯)检测数据集》


3. 基于YOLOv5的红绿灯检测模型训练

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

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

模型input-sizeparams(M)GFLOPsmAP0.5
yolov5s640×6407.216.50.93919
yolov5s05416×4161.71.80.77174
yolov5s05320×3201.71.10.71944

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:
  - [ 1,3, 2,5, 3,7 ]
  - [ 4,9, 9,5, 5,12 ]
  - [ 7,17, 9,25, 17,38 ]

因此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, {{12, 32}, {17, 47}, {35, 76}}},
                                          {"415", 16, {{6, 17}, {18, 8}, {9, 22}}},
                                          {"output", 8, {{2, 6}, {3, 9}, {5, 12}}},
                                  },
                                  CLASS_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, {{7, 18}, {10, 27}, {18, 45}}},
                                                   {"415", 16, {{4, 11}, {5, 13}, {12, 6}}},
                                                   {"output", 8, {{2, 4}, {2, 6}, {3, 8}}}, //
                                           },
                                           CLASS_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, {{7, 17}, {9, 25}, {17, 38}}},
                                                   {"415", 16, {{4, 9}, {9, 5}, {5, 12}}},
                                                   {"output", 8, {{1, 3}, {2, 5}, {3, 7}}}, //
                                           },
                                           CLASS_NAME
};
  • 运行APP闪退:dlopen failed: library "libomp.so" not found

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


5. 红绿灯检测效果

【Android APP体验】Android实现红绿灯检测APP(可实时运行))

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

​​​​​​​

6.项目源码下载

 【Android APP体验】Android实现红绿灯检测APP(可实时运行))

 【红绿灯检测Android源码下载】 Android实现红绿灯检测(含Android源码 可实时运行)

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

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

如果你需要红绿灯检测数据集:《红绿灯(交通信号灯)检测数据集》

如果你需要红绿灯训练代码:《YOLOv5实现红绿灯检测(含红绿灯数据集+训练代码)》

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

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

相关文章

吉林优美姿:抖音怎么增加销量?

为了更好的在做抖音好物联盟&#xff0c;那么一些抖音达人也会想方设法的去报名申请&#xff0c;那么大家是否真的清楚这个报名要怎么做呢&#xff1f;具体有什么要求呢&#xff1f;跟着吉林优美姿小编来一起看看吧&#xff01; 注册要求&#xff1a;凡注册抖音 APP并开通产品分…

大数据培训Impala之存储和压缩

注&#xff1a;impala不支持ORC格式 1.创建parquet格式的表并插入数据进行查询 [hadoop104:21000] > create table student2(id int, name string) > row format delimited > fields terminated by ‘\t’ > stored as PARQUET; [hadoop104:21000] > insert …

工控CTF之协议分析9——其他协议

协议分析 流量分析 主要以工控流量和恶意流量为主&#xff0c;难度较低的题目主要考察Wireshark使用和找规律&#xff0c;难度较高的题目主要考察协议定义和特征 简单只能简单得干篇一律&#xff0c;难可以难得五花八门 常见的工控协议有&#xff1a;Modbus、MMS、IEC60870、…

【计算机视觉】回顾2022年计算机视觉领域最激动人心的进展

目录&#xff1a;回顾2022年计算机视觉一、前言二、计算机视觉趋势2.1 Transformer统治计算机视觉2.2 以数据为中心的计算机视觉获得牵引力2.3 AI 生成的艺术作品2.4 多模态人工智能成熟三、计算机视觉的新应用3.1 运动领域3.2 环境保护3.3 自动驾驶3.4 健康与医药四、总结一、…

数据类型隐式转换导致的阻塞

背景 不合适的数据类型隐式转换会导致性能下降和并发下降&#xff0c;而且大多数技术人员对隐式转换的概念是陌生的&#xff0c;因此在生产环境中非常常见&#xff0c;通过本文做一个系统的梳理。 现象 收到SQL专家云阻塞告警邮件&#xff0c;登录SQL专家云&#xff0c;进入实…

推荐系统学习笔记-冷启动

简介 推荐系统的主要目标是将大量的标的物推荐给可能喜欢的海量用户, 这里涉及到标的物和用户两类对象。任何互联网推荐产品, 标的物和用户都是不断增长变化的&#xff0c;所以一定会频繁面对新标的物和新用户, 推荐系统冷启动问题指的就是对于新注册的用户或者新入库的标的物…

CDGA|2022年内有超20家银行因数据治理模块受罚,原因都在这里

今年&#xff0c;银保监会对银行数据治理的监管趋严&#xff0c;对银行机构在监管数据质量和数据报送中存在的违法违规行为&#xff0c;不断加大处罚与整治力度。 近日&#xff0c;北京农商银行收到的一张630万元罚单显示&#xff0c;该行主要存在的违法违规事实具体为&#xf…

NVMe解读

看NVMe协议&#xff08;1.0e&#xff09;过程中&#xff0c;参考了SSDFans的很多文章内容&#xff0c; 目录 1. 综述 3 1.1 名词解释 3 1.1.1 Namespace 3 1.1.2 Fused Operations 4 1.1.3 指令执行顺序 4 1.1.4 写单元的原子性 4 1.1.5 元数据 4 1.1.6 仲裁机制 4 1…

图数据库知识点3:图数据库解决了什么问题?

在前面的两个知识点中我们先后介绍了&#xff1a; 知识点1&#xff1a;图数据库与关系型数据库的区别 知识点2&#xff1a;图思维方式 现在,我们可以更进一步来通过具体的例子来了解图数据库、图计算到底解决了什么问题。我们先来剖析下面这个问题&#xff1a; 图数据库查询…

【Vue实用功能】elementUI 自定义表单模板组件

elementUI 实现一个自定义的表单模板组件 注&#xff1a;该功能基于elementUI 背景&#xff1a;在项目开发中&#xff0c;我们会遇到这种需求&#xff0c;在管理后台添加自定义表单&#xff0c;在指定的页面使用定义好的表单 直接上代码&#xff1a; <template><di…

DBCO-PEG-NHS, 可溶于水,有多种分子量供选择

凯新生物DBCO-PEG-NHS衍生物可以点击化学反应不需要任何金属催化剂。反应促进1,3-偶极环加成反应&#xff0c;环辛炔和叠氮化合物&#xff0c;也被称为铜自由点击反应&#xff0c;是一种生物正交反应使溶液中的两个分子的共轭。DBCO PEG衍生物具有缓冲溶液中快速的动力学和稳定…

C语言基础【程序=算法+数据结构】——(数据结构——基础篇)

欢迎小伙伴的点评✨✨ 本篇章系列是对C语言的深度思考和总结、关于C语言内容会持续更新。 文章目录✨前言✨数据的表现形式✨数据类型一、基本类型1.1、整型类型1.1.1、基本整型(int)1.1.2、短整型(short int)1.1.3、长整型(long int)1.1.4、*双长整型(long long int)1.1.5、字…

1556:Dis——Tarjan求LCA、倍增求LCA

【题目描述】 给出 n 个点的一棵树&#xff0c;多次询问两点之间的最短距离。 注意&#xff1a;边是双向的。 【输入】 第一行为两个整数 n 和 m。n 表示点数&#xff0c;m 表示询问次数&#xff1b; 下来 n−1 行&#xff0c;每行三个整数 x,y,k&#xff0c;表示点 x 和点 …

英文计算机论文写作,需要注意哪些细节? - 易智编译EaseEditing

&#xff08;1&#xff09;尽量用动词少用名词化 那些大篇名词的文章真的很难读懂&#xff0c;而有强大动词的句子更容易理解。 我们注意到客户在论文中经常使用的名词有“agreement”, “disagreement”, “investigation”, “analysis”, “examination”, “comparison”…

Qt 中的多项目管理

背景&#xff1a; 在Visual Studio中使用 “Solution” 来组织多个 Projects。 在Qt中&#xff0c;使用 "Subdirs Project"来组成多个projects &#xff0c;实现VS中的Solution功能。 项目类型 首先是先新建一个子目录项目&#xff0c;再根据需要在子目录项目中添…

漏洞深度分析|CVE-2022-1471 SnakeYaml 命令执行漏洞

项目介绍 YAML是一种数据序列化格式&#xff0c;设计用于人类的可读性和与脚本语言的交互。 SnakeYaml是一个完整的YAML1.1规范Processor&#xff0c;支持UTF-8/UTF-16&#xff0c;支持Java对象的序列化/反序列化&#xff0c;支持所有YAML定义的类型。 项目地址 https://gi…

javaee之MyBatis框架3

mybatis中编写dao实现类的使用方式 简单说一下实现原理&#xff1a; 下面来说一下UserDaoImpl的实现原理 mybatis主配置文件中properties标签的使用 第一种&#xff1a; <property name"driver" value"com.mysql.jdbc.Driver"></property> &…

软件加密保护:Mirage License Protector v5 注册版

Mirage License Protector v5.1.0 适用于许多编译器 License Protector 是一个 DLL / COM exe&#xff0c;几乎可以与 所有编译器一起使用&#xff1a;C、C#、.NET、Delphi、VB6 和 VB.NET&#xff0c; 32 位和 64 位的 Java 哪种产品适合我&#xff1f; 选择许可证保护器 应…

智能无障碍轮椅——PID算法控制

文章目录一、PID算法二、控制方法对比棒棒控制&#xff08;启停控制器&#xff09;比例控制PI控制PID控制三、PID的手动整定四、PID衰减曲线整定五、PID调节器各校正环节的作用是&#xff1a;六、PID算法的一般表达式是&#xff1a;七、计算注意事项一、PID算法 PID控制是最早…

图像语义分割网络FCN(32s、16s、8s)原理及MindSpore实现

一、FCN网络结构 全卷积网络(Fully Convolutional Networks)&#xff0c;是较早用于图像语义分割的神经网络。根据名称可知&#xff0c;FCN主要网络结构全部由卷积层组成&#xff0c;在图像领域&#xff0c;卷积是一种非常好的特征提取方式。本质上&#xff0c;图像分割是一个分…