能在ARM-CPU上实时识别图像的深度学习算法之yolo-fastest

2023-11-07 18:40

本文主要是介绍能在ARM-CPU上实时识别图像的深度学习算法之yolo-fastest,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

近期一直在寻找一种用CPU就可以快速识别图像的方法,从经典的特征匹配方式到后面的深度学习,过程涉及了sift、surf、tensorflow2、yolov4-tiny、nanodet、yolo-fastest。经过层层筛选,最后确定了yolo-fastest,官方称树莓派4b可以达30+fps官方地址。刚好有个树莓派在手上,于是决定试试。

官方预训练模型测试

下载官方源码Yolo-Fastest-master.zip,把源码放到树莓派,解压源码

unzip Yolo-Fastest-master.zip

进入源码目录,在编译之前先确定下树莓派的gcc/g++、opencv、python版本,我的环境:
gcc (Raspbian 8.3.0-6+rpi1) 8.3.0
Python 3.7.3
opencv 4.5.1 (最好是4.x版本以上的,因为后续要用到DNN模块)
说一下opencv 4.5.1的安装方法:
输入命令

pip3 install opencv-python

这个会默认安装最新版的opencv-python,因为国外的资源非常慢,最好是通过命令后显示的网址拷贝到迅雷下载,下载好后文件是,然后输入命令进行安装
opencv_python-4.5.1.48-cp37-cp37m-linux_armv7l.whl

pip3 install opencv_python-4.5.1.48-cp37-cp37m-linux_armv7l.whl

这个时候提示需要下载numpy,用同样的方法迅雷下载numpy后,再进行pip3安装,下载完后先安装numpy再安装opencv,如果安装过程遇到需要安装其他的库,用同样的方法下载后安装。

pip3 install numpy-1.19.5-cp37-cp37m-linux_armv7l.whl
pip3 install opencv_python-4.5.1.48-cp37-cp37m-linux_armv7l.whl

完成opencv的安装后,就可以进行yolo-fastest的编译,编译之前先修改下Makefile文件,一下是我的配置,只改了一个地方。
在这里插入图片描述
改好后保存,然后输命令

make

编译成功后,就会在目录下生成darknet文件,这个时候就可以进行测试了,输入命令:

sh image_yolov3.sh

注意,我示例是用的yolo-fastest-xl的权重,如果要用yolo-fastest的权重,需要修改下image_yolov3.sh脚本里的内容。
在这里插入图片描述
权重文件都在Yolo-Fastest文件夹里面
在这里插入图片描述

可以看到,官方的例子成功跑起来了,fastest-xl比fast好,我用fast测试的时候,图片里面狗被识别成了猫。但是耗时还是很高934毫秒?怎么回事???
不急,重新去官网看了资料,发现Darknet CPU推理效率优化不好,CPU建议使用NCNN
在这里插入图片描述
很明显,我们直接编译出来的是darknet框架,要想实时看来只能选NCNN或者MNN框架。因为之前没接触过NCNN和MNN,百度了下,是腾讯和阿里的基于arm的推理框架,可以把其他模型转成各自框架的模型,然后再去推理。也就说,你可以tflite、yolo等去训练,然后再转成NCNN/MNN模型,再通过NCNN/MNN方法去推理。

NCNN是nihui大佬在搞的一个框架,貌似只有c++,不支持python;而MNN是阿里的团队搞的,有python api也有c++ api。根据yolo-fastest官网的连接,在树莓派上都部署了MNN和NCNN,试了下速度,果然能达到40ms一张示例图。至于怎么部署MNN和NCNN可以到官网去了解,这个就不赘述了。贴张图
在这里插入图片描述

训练自己的数据

我的目的是测试自己训练的数据,看下识别率和处理速率。
关于训练,按官网说明进行
(1)下载yolov4的源码https://github.com/AlexeyAB/darknet[github地址],看官网关于训练的说明文档(https://github.com/AlexeyAB/darknet)
(2)按VOC的数据结构,准备好数据集,我只训练一个对象,准备了269张图片(640*480),目录结构如下
└── VOC2007
├── Annotations
│ └── data
├── ImageSets
│ ├── Layout
│ ├── Main
│ └── Segmentation
├── JPEGImages
└── labels
Annotations里面是通过labelImg软件生成的标注.xml文件
data文件夹可以不用
ImageSets里面的三个文件夹都不需要
JPEGImages文件夹是装的原始图片
labels是voc_label.py生成的txt文件,每个文件里面的内容大致如下

0 0.4609375 0.45625 0.328125 0.7541666666666667

还需要生成训练文件train.txt和测试文件test.txt,可以参考这个链接
https://blog.csdn.net/Creama_/article/details/106209388 yolov4训练
(3)按照官网生成yolo-fastest.conv.109文件
(4)创建obj.data、obj.names文件,并修改好内容
在这里插入图片描述

(5)修改配置文件yolo-fastest.cfg,主要修改[yolo]下的classes 和 挨着[yolo]上面的fitters。具体填写需要根据你的classes来填,我只改了3个地方,如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(6)改完后就可以进行训练了,我的是用虚拟机训练,8个小时训练完269张图片,效果还可以。

./darknet detector train obj.data yolo-fastest.cfg yolo-fastest.conv.109

(7)训练完成后会再backup的路劲下生成自己的权重文件,拷贝出来就可以用了。

测试

把训练好的.cfg和.weight及.names文件复制到树莓派,进行测试
本来要通过NCNN框架进行测试的,后面发现opencv4.x的DNN支持读取darknet训练的配置文件。
官方上有示例:https://blog.csdn.net/nihate/article/details/108670542 根据官方的这个示例,修改下自己的代码就可以运行了。视频检测的话60ms-100ms,够用了。
在这里插入图片描述

这篇关于能在ARM-CPU上实时识别图像的深度学习算法之yolo-fastest的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/365553

相关文章

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

MySQL中优化CPU使用的详细指南

《MySQL中优化CPU使用的详细指南》优化MySQL的CPU使用可以显著提高数据库的性能和响应时间,本文为大家整理了一些优化CPU使用的方法,大家可以根据需要进行选择... 目录一、优化查询和索引1.1 优化查询语句1.2 创建和优化索引1.3 避免全表扫描二、调整mysql配置参数2.1 调整线程数2.