全网最最最轻量级检测网络 yolo-fastest 快速上手

2023-11-19

  • Update: 2021/0816
    原作者已经更新了好多个版本,我这里给出我写这篇文章时候的版本:Github,里面有我的最精简版的模型结构和模型

  • Update: 2021/05/19
    新增 yolo-fastest keras/tflite 模型推理代码,仅图片,仓库地址:yolo-fastest_inference

0x01 Yolo-Fastest

github:Yolo-Fastest 的中文快速上手教程,包括 mAP 计算、darknet 转 tflite

目前有个检测的任务,需要轻量级的检测网络,在 NanoDet 和 Yolo-Fastest 中最终选择了后者,

不过要将作者的网络做进一步删减,目标平台(ART-PI)的 FLOPS 要求不超过0.1B

将 yolo-fastest 搬到 artpi 开发板上,且搭载 rt-thread 系统的工具是 RT-AK ,即将开放内测资格,这条仅对嵌入式小伙伴公布

2020.10 之前 号称是全网最轻量级的目标检测网络,有多轻量级呢?请看下面数据:

这是 VOC 数据上的

Network Model Size mAP(VOC 2017) FLOPS
Tiny YOLOv2 60.5MB 57.1% 6.97BFlops
Tiny YOLOv3 33.4MB 58.4% 5.52BFlops
YOLO Nano 4.0MB 69.1% 4.51Bflops
MobileNetv2-SSD-Lite 13.8MB 68.6% &Bflops
MobileNetV2-YOLOv3 11.52MB 70.20% 2.02Bflos
Pelee-SSD 21.68MB 70.09% 2.40Bflos
Yolo Fastest 1.3MB 61.02% 0.23Bflops
Yolo Fastest-XL 3.5MB 69.43% 0.70Bflops
MobileNetv2-Yolo-Lite 8.0MB 73.26% 1.80Bflops

这是 COCO 数据集上的

Network COCO mAP(0.5) Resolution Run Time(Ncnn 1xCore) Run Time(Ncnn 4xCore) FLOPS Params Weight size
Yolo-Fastest 23.65 320X320 6.74ms 4.42ms 0.23BFlops 0.325M 1.3M
Yolo-Fastest-XL 32.45 320X320 15.15ms 7.09ms 0.70BFlops 0.875M 3.5M

这是 前段时间超级火的 NanoDet

Model COCO mAP Resolution Latency(ARM 4xCore) FLOPS Params Model Size(ncnn bin)
NanoDet-m 20.6 320*320 10.23ms 0.72B 0.95M 1.8mb
NanoDet-m 21.7 416*416 16.44ms 1.2B 0.95M 1.8mb
YoloV3-Tiny 16.6 416*416 37.6ms 5.62B 8.86M 33.7mb
YoloV4-Tiny 21.7 416*416 32.81ms 6.96B 6.06M 23.0mb

什么?没看懂?!

请详细关注下 FLOPSParams还有Model Size mAP 啊!!!

兄弟,要是还看不懂,emmm,

0x02 Prepare

由于该项目是基于 Darknet 训练和测试的,在开始之前需要先配置好 Darknet 环境

step1 clone

git clone https://github.com/dog-qiuqiu/Yolo-Fastest

step2 make

System: linux

windows 编译 darknet的请看这:How to compile on Windows

修改 Makefile, 且编译 make -j, 成功标志是出现 darknet 这个可执行文件

  1. 财力充足:GPU

    GPU=1
    CUDNN=1
    CUDNN_HALF=1
    OPENCV=1
    ...
    # 我用的是 1080ti, 所以要把前面几行删除
    ARCH= -gencode arch=compute_52,code=[sm_52,compute_52] \
                   -gencode arch=compute_61,code=[sm_61,compute_61]
    
    ...
    ifeq ($(CUDNN), 1)
    COMMON+= -DCUDNN
    ifeq ($(OS),Darwin) #MAC
    CFLAGS+= -DCUDNN -I/usr/local/cuda/include
    LDFLAGS+= -L/usr/local/cuda/lib -lcudnn
    else
    # CFLAGS+= -DCUDNN -I/usr/local/cudnn/include
    # LDFLAGS+= -L/usr/local/cudnn/lib64 -lcudnn
    CFLAGS+= -DCUDNN -I/usr/local/cuda/include
    LDFLAGS+= -L/usr/local/cuda/lib64 -lcudnn
    endif
    endif
    

    在这个地方,可能会遇到一些问题。

    Makefile 文件中检索的CUDA 路径可能会遇到一些问题。

    我习惯了用 conda 来傻瓜式安装 tensorflow,但是这个时候,这个笨笨的 Makefile 竟然不会识别 conda 环境下的 CUDA 路径

    为了简单的快速上手,我选择了脱离 conda,在服务器上手动安装CUDAcudnn,并且安装了一个 tensorflow-gpu, 所以上面需要更改 CUDNN 路径

    此时,顺利的话,执行 make -j 之后,就应该可以看到当前文件夹下出现一个 darknet 的可执行文件。

    Soft Version
    CUDA 11.0.228
    CUDNN cudnn-11.0-linux-x64-v8.0.5.39
    tensorflow-gpu 2.4.0

    当然,还有不顺利的情况,意外频频有,今年特别多。

    有一个问题我不记得了,出现的时候没有记录,问题的原因是找不到 nvcc

    解决方法:

    • 查看/usr/local/cuda/bin下是否有nvcc可执行程序
    • 添加环境变量,打开 ~/.bashrc ,添加环境变量 export PATH=$PATH:/usr/local/cuda/bin
    • 如果找不到,重新安装 sudo apt install nvidia-cuda-toolkit
    • 是否安装成功命令:nvcc --version
  2. 囊中羞涩:CPU

    好了,上面的一些巨佬的一些配置通通跟咱们没有任何的关系。

    高兴的话,在 Makefile 的第4行,将 OPENCV=0 改成1,保不齐啥时候咱会用到 opencv 这个大杀器。一般我都会必装 opencv 的。

    执行:

    make -j
    

    在当前文件夹下面,生成了 darknet 可执行文件

step3 run darknet

图片检测验证:

bash image_yolov3.sh

# 等同于
./darknet detector  test ./data/coco.data  ./Yolo-Fastest/COCO/yolo-fastest.cfg  ./Yolo-Fastest/COCO/yolo-fastest.weights  data/person.jpg  -thresh 0.55

# 不显示图片,因为有时候在服务器上,不能显示图片,会报这个warning,有点看不顺眼
# Gtk-WARNING **: 17:42:47.783: cannot open display:
./darknet detector  test ./data/coco.data  ./Yolo-Fastest/COCO/yolo-fastest.cfg  ./Yolo-Fastest/COCO/yolo-fastest.weights  data/person.jpg  -thresh 0.55 -dont_show

# 神奇的命令
./darknet detector  test ./data/coco.data  ./Yolo-Fastest/COCO/yolo-fastest.cfg  ./Yolo-Fastest/COCO/yolo-fastest.weights   -thresh 0.55 -dont_show

视频检测验证:

# 这个时候就不能直接使用下面这个命令了 
# sh video_yolov3.sh
# 需要指定视频路径

./darknet detector  demo ./data/coco.data  ./Yolo-Fastest/COCO/yolo-fastest.cfg  ./Yolo-Fastest/COCO/yolo-fastest.weights /home/lebhoryi/RT-Thread/Detection_API/video/000.mp4 -thresh 0.55

0x03 Train

作者的建议是先获取训练好的权重文件,然后在此基础上做训练。嗯,按照作者的思路走,不会有坑

以训练单个person类别为例,VOC数据集

step1 获取权重文件

./darknet partial yolo-fastest.cfg yolo-fastest.weights yolo-fastest.conv.109 109

step2 准备数据集

# 该步骤来自:https://pjreddie.com/darknet/yolo/
# Training YOLO on VOC

# Get The Pascal VOC Data
wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
wget https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
tar xf VOCtrainval_11-May-2012.tar
tar xf VOCtrainval_06-Nov-2007.tar
tar xf VOCtest_06-Nov-2007.tar

# Generate Labels for VOC
# <object-class> <x> <y> <width> <height>
# 记得修改代码文件中对应的路径,由于要训练一个person类别,classes那里也需要做更改
# classes = ['person']
wget https://pjreddie.com/media/files/voc_label.py
python voc_label.py

ls
# 2007_test.txt   VOCdevkit
# 2007_train.txt  voc_label.py
# 2007_val.txt    VOCtest_06-Nov-2007.tar
# 2012_train.txt  VOCtrainval_06-Nov-2007.tar
# 2012_val.txt    VOCtrainval_11-May-2012.tar

cat 2007_train.txt 2007_val.txt 2012_*.txt > train.txt

step3 修改 data/voc.data 和 data/voc.names

classes= 1
train  = <path-to-voc>/train.txt
valid  = <path-to-voc>/2007_test.txt
names = data/voc.names
backup = backup   #  模型存储文件夹

data/voc.names 文件中的类别删除只剩下 person

step4 train

 ./darknet detector train voc.data ./Yolo-fastest/VOC/yolo-fastest.cfg yolo-fastest.conv.109 

训练好的模型文件将会保存在backup文件夹下面。

step5 mAP

# 我选择了最简单的,更多信息请戳下面链接
# https://github.com/MuhammadAsadJaved/darknet#how-to-calculate-map-on-pascalvoc-2007

# points 11 是VOC 数据集,101 是 MS COCO,0 是 ImageNet, PascalVOC 2010-2012, your custom dataset
./darknet detector map data/voc.data Yolo-Fastest/VOC/yolo-fastest.cfg Yolo-Fastest/VOC/yolo-fastest.weights -points 11

这个时候,就很奇怪,我测出来是 56.19 %,没有到作者说的61.02%,可能是数据集不对,我用 VOC2007 测得,作者上写的是 VOC2017

这个不重要,重要的是我成功获取了mAP这个指标。嗯,距离大佬又近了一步。

0x04 darknet 转 keras、tflite

既然看到了这里,差不多大家都可以获取到 darknet 训练好的模型

但是在下对 darknet 不熟啊,要搬到目标平台,还是 kerastflite 更适合我

然后,认真的看了两圈作者的仓库,没有发现如何转 tensorflow 的教程,嗯,问题不大,因为我发现了这个:

NCNNMNN,这些都吸引不了我,我一眼就相中了 TensorRT,正好手里有一块 Jetson nano,等下周挤出点时间折腾一下。


darknetkerastflite 仓库:

david8862/keras-YOLOv3-model-set

step1 darknet 转 keras

git clone https://github.com/david8862/keras-YOLOv3-model-set
cd keras-YOLOv3-model-set
pip install -r requirement.txt

# -f 是固定输入,否则你会发现输入是 None×None×3
# -p 是将神经网络结构图保存为 <name>.png 
python tools/model_converter/convert.py <path-to-cfg>/yolo-fastest.cfg <path-to-weights>/yolo-fastest.weights weights/yolo-s.h5  -f -p

如果你训练的时候,输入是 weight×height×1,则需要改动:

...
print('Creating Keras model.')
if width and height and args.fixed_input_shape:
    # input_layer = Input(shape=(height, width, 3), name='image_input')
    input_layer = Input(shape=(height, width, 1), name='image_input')
else:
    # input_layer = Input(shape=(None, None, 3), name='image_input')
    input_layer = Input(shape=(None, None,1), name='image_input')
...

step2 keras 转 tflite

python tools/model_converter/custom_tflite_convert.py --keras_model_file ./weights/yolo-fastest.h5 --output_file ./weights/yolo-fastest.tflite

step3 keras 转 int8 量化的 tflite

python tools/model_converter/post_train_quant_convert.py --keras_model_file ./weights/yolo-fastest.h5 --annotation_file <path-to-voc>/2007_test.txt --model_input_shape 320x320 --sample_num 30 --output_file ./weights/yolo-fastest.tflite

如果你训练的时候,输入是 weight×height×1,则需要改动:

...
image = np.array([image], dtype=np.float32)
image = image[..., -1]
image = np.expand_dims(image, axis=-1)
yield [image]
...

0x05 魔改网络结构

Model mAP(%) Input BFLOPS Size Inference Data
yolo-fastest 56.19 320x320x3 0.238 613.6k Failed 01/09
yolo-xl 44.51 320x320x1 0.096 224.1k Failed 01/08
yolo-l 22.67 320x320x1 0.057 176.7k 787ms 01/12
yolo-s 28.41 160x160x1 0.012 146.5k ~~01/13 ~~

yolo-s 单类别检测(人):21.58%,在 art-pi 上的推理时间是 50ms

推理时间是在 rt-thread 系统 + ART-PI 开发板下做的测试

Size 是量化后的 tflite 模型大小


i5-9400 yolo-fastest 的推理时间是 50ms,mAP 56.19%

i5-9400 yolo-xl 的推理时间是 19ms,mAP 44.51%

i5-9400 yolo-l 的推理时间是 10ms,mAP 22.67%

有一个问题,1080ti 服务器下的推理时间是150ms,不知道为啥

好了,下一步就是将yolo-fastest 请上jetson nano

0x06 参考文献

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

全网最最最轻量级检测网络 yolo-fastest 快速上手 的相关文章

随机推荐

  • 2018年AI成败将见分晓;全球经济重心东移,上海料将在2035年超越巴黎

    2017临近结束 我们先来看看对于来年 都有些什么预测 埃森哲预测CES 2018 AI 5G 区块链以及无人车 明年1月9 12日 CES又将在拉斯维加斯举行 每年 咨询巨头埃森哲 Accenture 都会对CES上的技术趋势做出预测 这
  • 100天精通Python(可视化篇)——第91天:Pyecharts绘制各种折线图实战

    文章目录 专栏导读 1 基本流程 2 多条折线图 3 添加最小值最大值平均值 4 竖线提示信息 5 阶梯图 6 平滑曲线折线图 7 面积折线图 8 堆积图 9 双横坐标折线图 专栏导读 本文已收录于 100天精通Python从入门到就业 本
  • Windows Server 2008 R2 下配置AD证书服务器和HTTPS访问的图文教程 DNS+IIS+AD证书服务

    提前配置好虚拟机和客户机的访问 保证能ping通虚拟机 虚拟机和客户机网络的DNS填写为虚拟机的ip地址 接下来配置好DNS服务 配置域名解析服务 这个用于域名解析 不需要域名访问的可以不配置DNS 使用IP访问即可 安装DNS 进入DNS
  • (ros/qt报错) FATAL: ROS_MASTER_URI is not defined in the environment

    安装qt之后 明明打开roscore但是qt运行跟ros有关的节点时报错 FATAL 1450943695 306401842 ROS MASTER URI is not defined in the environment Either
  • 哪些 Java 知识不需要再学了

    张无忌在学太极拳的时候 他爹的师父张三丰告诫他一定要把之前所学习的武功全部忘掉 忘得越多就会学得越快 同样的 自学 Java 的时候一定要先知道哪些 Java 知识不需要再学了 毕竟技术的更新迭代就好像火箭一样快 Java 的一些知识点早已
  • OJ:algorithm头文件中sort函数的应用

    include
  • 【单片机笔记】STM32+ESP8266通过AT指令WIFI连接阿里云MQTT服务器

    上一篇使用USB转串口的方式通过ESP8266wifi模块的方式成功连接上了阿里云 现在就要通过单片机来替换电脑上位机了 这样单片机自动的去调用并发送串口数据更加方便 也更加符合一个产品的开发 板载的传感器有NTC温度 光强 这两个主要用来
  • 100流明相当于多少w_中艺光影秀揭秘一场大型灯光秀究竟要耗费多少电量呢?...

    炫酷的灯光秀 让城市景区的夜色被赋予了无限可能性 现代的灯光秀始于法国里昂 然而 现代技术的飞速发展 现在的灯光秀的技术也是越玩越炫丽 越来越复杂 在大家纷纷对灯光秀表示震撼的同时 也有一些人质疑 举办这么大规模的灯光秀 太 费 电 了 某
  • [Linux打怪升级之路]-文件操作

    前言 作者 小蜗牛向前冲 名言 我可以接受失败 但我不能接受放弃 如果觉的博主的文章还不错的话 还请点赞 收藏 关注 支持博主 如果发现有问题的地方欢迎 大家在评论区指正 目录 一 认识操纵系统下的文件 1 什么是文件 2 文件的类型 3
  • 医疗器械相关展会

    1 CMEF中国国际医疗器械博览会 始创于1979年 每年春秋两届 已成为亚太地区最大的医疗器械及相关产品 服务展览会
  • 机器学习实战项目总结

    1 预测模型新项目模板 机器学习是针对数据进行自动挖掘 找出数据的内在规律 并应用这个规律来预测新数据 一个很好的实践机器学习项目的方法 使用从UCI机器学习仓库链接 获取的数据集开启一个机器学习项目 分类或回归模型的机器学习项目可以分成以
  • Linux Nginx配置静态html

    Linux Nginx配置静态html 第一次接触服务器时 对项目部署和域名部署感觉很新鲜 有意思 很神奇 开始学习Nginx配置静态的HTML 使用工具 MobaXterm CHS exe 第一步 将html的项目放入服务器 将自己做好的
  • 【华为OD机试真题 JAVA】信道分配

    JS版 华为OD机试真题 JS 信道分配 标题 信道分配 时间限制 1秒 内存限制 262144K 语言限制 不限 算法工程师小明面对着这样一个问题 需要将通信用的信道分配给尽量多的用户 信道的条件及分配规则如下 1 所有信道都有属性 阶
  • origin中把多个拟合曲线放在一张图

    双击其中一个 或者New一个graph 这里直接双击其中一个图 右键 找到layer contents 可以看到 一个scatter配一个polynomial fit line 把剩下的B C D对应的点和拟合曲线添加进去 注意 这里的pl
  • 01、Java并发 Java ExecutorService

    ExecutorService 是 Java java util concurrent 包的重要组成部分 是 Java JDK 提供的框架 用于简化异步模式下任务的执行 一般来说 ExecutorService 会自动提供一个线程池和相关
  • 程序员如何做副业?35岁前,千万别让死工资绊住你赚钱的步伐

    近年来互联网行情下降 好多人都在思考要不要搞个副业来抵御风险 这不又来事了 这两天又爆了互联网大裁员 继阿里 向社会输送人才 之后 京东又搞了个 毕业礼 整的小伙伴们人心惶惶 副业的关注度又一波升级 那今天我们就来聊聊 程序员做副业这件事
  • cef编译

    按照大神的一遍过 具体过程非常详细 链接https kefong blog csdn net article details 119908780 spm 1001 2101 3001 6650 2 utm medium distribute
  • 《C++ Primer(第5版)》学习笔记(第5章)

    第5章 语句 C 提供了条件执行语句 循环语句和用于中断当前控制流的跳转语句 本章将具体介绍这些语句 5 1 简单语句 空语句 最简单的语句是空语句 只有一个单独的分号 如在程序的某个地方语法上需要一条语句但是逻辑上不需要 此时应该使用空语
  • 透过Python 将接收邮件邮件进行分类统计

    工作的需要自行学习了Python的一些功能 将所学的经验在这里分享给大家 文章目录 目录 文章目录 前言 一 环境准备 二 使用步骤 1 引入库 2 读入数据 总结 前言 工作中我们可能会透过邮件 让其他公司收集资料 在学会Python之前
  • 全网最最最轻量级检测网络 yolo-fastest 快速上手

    文章目录 0x01 Yolo Fastest 0x02 Prepare step1 clone step2 make step3 run darknet 0x03 Train step1 获取权重文件 step2 准备数据集 step3 修