0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于YOLOv5框架如何训练一个自定义对象检测模型

OpenCV学堂 来源:OpenCV学堂 作者:OpenCV学堂 2022-09-21 10:10 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

安装与测试

最近YOLOv5最新更新升级到v6.x版本,工程简便性有提升了一大步,本教程教你基于YOLOv5框架如何训练一个自定义对象检测模型,首先需要下载对应版本:
https://github.com/ultralytics/yolov5/releases/tag/v6.1

鼠标滚到最下面下载源码zip包:

https://github.com/ultralytics/yolov5/archive/refs/tags/v6.1.zip

下载完成之后解压缩到:

D:pythonyolov5-6.1
首先运行下面命令行完成依赖库的安装:

3e0f0b56-38bb-11ed-ba43-dac502259ad0.png

等待一段时间,完成全部安装之后,运行测试:
python detect.py --weights yolov5s.pt --source dataimageszidane.jpg
运行结果如下:

3e18a346-38bb-11ed-ba43-dac502259ad0.jpg

数据集准备与制作

自己百度收集了一个无人机与飞鸟的数据集,其中训练集270张图像,测试集26张图像。

3e281af6-38bb-11ed-ba43-dac502259ad0.png

使用labelImg工具完成标注,工具下载地址:

https://gitee.com/opencv_ai/opencv_tutorial_data/tree/master/tools

YOLOv5要求的数据集目录结构如下:

3e3b0706-38bb-11ed-ba43-dac502259ad0.png

其中images是所有图像的集合,labels是所有标签信息集合。train表示训练集、valid表示测试集。这里需要注意的是,labels信息中的标签信息YOLO格式标注框需要把原始标注信息的标注框格式从:
Left top right bottom

转换为

Center_x, center_y, width, height
并归一化到0~1之间,这部分我写了一个脚本来完成label标签的生成,把xml的标注信息转换为YOLOv5的labels文件,这样就完成了数据集制作。最后需要创建一个dataset.ymal文件,放在与data文件夹同一层,它的内容如下:
# train and val datasets (image directory or *.txt file with image paths)train: uav_bird_training/data/images/train/val: uav_bird_training/data/images/valid/
# number of classesnc: 2
# class namesnames: ['bird', 'drone']

三:模型训练

制作好数据集之后,模型训练就成为一件很简单事情,一条命令行搞定。运行下面的命令行:
python train.py --img 640 --batch 4 --epochs 25 --data uav_bird_trainingdataset.yaml --weights yolov5s.pt
其中uav_bird_training文件夹里是制作好的数据集。这样就开始训练,训练过程中可以通过tensorboard来查看可视化的结果,

3e496bc0-38bb-11ed-ba43-dac502259ad0.png

3e578bce-38bb-11ed-ba43-dac502259ad0.png

3e64e6fc-38bb-11ed-ba43-dac502259ad0.png

3e720558-38bb-11ed-ba43-dac502259ad0.png

PR曲线说明训练效果还错!

不同框架与硬件平台推理比较

YOLOv5的6.x版本支持不同框架模型导出与推理,看下图:

3e7e15b4-38bb-11ed-ba43-dac502259ad0.png

这里分别导出模型为ONNX、XML、engien格式之后,使用同一段视频在我的笔记本上(CPUi7, GPU3050ti):在下面四种推理框架上运行
-OpenCV DNN-OpenVINO-ONNXRUNTIME-TensorRT
测试,分别截图如下:

OpenCV DNN推理速度

3e921726-38bb-11ed-ba43-dac502259ad0.png

OpenVINO平台上的推理速度

3e9dd070-38bb-11ed-ba43-dac502259ad0.png

ONNXRUNTIME GPU推理速度

3eb19182-38bb-11ed-ba43-dac502259ad0.png

TensorRT框架部署-FP32版本模型推理统计:

3ec34c88-38bb-11ed-ba43-dac502259ad0.png

YOLOv5的6.x版本,是支持TensorRT 量化到FP16模型直接导出的,但是不支持INT8量化生成,所以自己实现了导出量化INT8版本,测试结果如下:
python detect.py --weights uav_bird_training/uav_bird_int8.engine --data uav_bird_training/dataset.yaml --source D:/bird/bird_fly.mp4

TensorRT框架部署-INT8版本模型推理统计:

3ecf9524-38bb-11ed-ba43-dac502259ad0.png

最终比较:

3edd3c2e-38bb-11ed-ba43-dac502259ad0.png

注意:以上结果是基于Python语言上测试结果(前后处理都使用pytorch完成)

番外篇:C++推理与比较

使用C++部署时候,前后处理都改成了基于OpenCV 完成,使用CPU完成前后处理,OpenVINO+CPU运行速度截图如下:

3f0609a6-38bb-11ed-ba43-dac502259ad0.png

OpenCV DNN + CUDA版本推理

3f168a10-38bb-11ed-ba43-dac502259ad0.png

TensorRT-FP32模型推理速度

3f2ca642-38bb-11ed-ba43-dac502259ad0.png

TensorRT-INT8模型推理速度

3f3d0b04-38bb-11ed-ba43-dac502259ad0.png

最后把自定义训练导出的模型转换为TensorRT Engine文件之后,部署到了我的一块Jetson Nano卡上面,实现了边缘端的部署,有图有真相:

3f48ca48-38bb-11ed-ba43-dac502259ad0.png

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 检测模型
    +关注

    关注

    0

    文章

    17

    浏览量

    7402
  • 数据集
    +关注

    关注

    4

    文章

    1230

    浏览量

    26046

原文标题:YOLOv5新版本6.x 自定义对象检测-从训练到部署

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    技术分享 | RK3588基于Yolov5的目标识别演示

    YOLO是种基于深度神经网络的目标检测算法,用在图像或视频中实时识别和定位多个对象。在其各个版本的迭代中,YOLOv5凭借易用性和性能平衡在工业、医疗、农业、零售等领域被广泛的应用。
    的头像 发表于 09-18 17:27 1045次阅读
    技术分享 | RK3588基于<b class='flag-5'>Yolov5</b>的目标识别演示

    基于瑞芯微RK3576的 yolov5训练部署教程

    s、YOLOv5m、YOLOv5l、YOLOv5x 四模型YOLOv5 相比
    的头像 发表于 09-11 16:43 2406次阅读
    基于瑞芯微RK3576的 <b class='flag-5'>yolov5</b><b class='flag-5'>训练</b>部署教程

    在k230上使用yolov5检测图像卡死,怎么解决?

    0.99以上 模型转换指令 再将该模型放到k230设备上使用yolo大作战中yolov5检测示例,检测就会卡死,打印出的
    发表于 08-11 07:41

    yolov5训练部署全链路教程

    m、YOLOv5l、YOLOv5x四模型YOLOv5相比YOLOv4而言,在
    的头像 发表于 07-25 15:22 1343次阅读
    <b class='flag-5'>yolov5</b><b class='flag-5'>训练</b>部署全链路教程

    完整指南:如何使用树莓派5、Hailo AI Hat、YOLO、Docker进行自定义数据集训练

    今天,我将展示如何使用令人印象深刻的HailoAIHat在树莓派5训练、编译和部署自定义模型。注意:文章内的链接可能需要科学上网。HailoAIHat根据你的设置,在树莓派
    的头像 发表于 06-28 08:23 3464次阅读
    完整指南:如何使用树莓派<b class='flag-5'>5</b>、Hailo AI Hat、YOLO、Docker进行<b class='flag-5'>自定义</b>数据集<b class='flag-5'>训练</b>?

    HarmonyOS应用自定义键盘解决方案

    自定义键盘是种替换系统默认键盘的解决方案,可实现键盘个性化交互。允许用户结合业务需求与操作习惯,对按键布局进行可视化重构、设置多功能组合键位,使输入更加便捷和舒适。在安全防护层面,自定义键盘可以
    的头像 发表于 06-05 14:19 1581次阅读

    在K230上部署yolov5时 出现the array is too big的原因?

    重现步骤 1将yolov5的kmodel放入k230的data数据 2使用yolo大作战里的视频流推理代码 3运行 期待结果和实际结果 期待的结果 将目标检测的框圈起来 实际看到的结果
    发表于 05-28 07:47

    RV1126 yolov8训练部署教程

    YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的基于YOLOV5进行更新的 下一个重大更新版本,目前支持图像分类、物体检测和实例分割任务,鉴于
    的头像 发表于 04-16 14:53 1140次阅读
    RV1126 <b class='flag-5'>yolov</b>8<b class='flag-5'>训练</b>部署教程

    请问如何在imx8mplus上部署和运行YOLOv5训练模型

    我正在从事 imx8mplus yocto 项目。我已经在自定义数据集上的 YOLOv5训练对象检测
    发表于 03-25 07:23

    YOLOv5类中rgb888p_size这个参数要与模型推理和训练的尺寸致吗?致会达到更好的效果?

    YOLOv5类中rgb888p_size这个参数要与模型推理和训练的尺寸致吗,致会达到更好的效果
    发表于 03-11 08:12

    使用OpenVINO™ 2021.4在CPU和MYRIAD上进行自定义对象检测,为什么结果差异巨大?

    使用自定义训练模型执行推理,以便在 2021.4 OpenVINO™中进行人员检测。 与 MYRIAD 相比,CPU 的输出结果取得了巨大的差异
    发表于 03-06 07:45

    使用OpenVINO™ 2021.4将经过训练自定义PyTorch模型加载为IR格式时遇到错误怎么解决?

    使用 OpenVINO™ 2021.4 将经过训练自定义 PyTorch 模型加载为 IR 格式时遇到错误: RuntimeError: [ GENERAL_ERROR ] Failed
    发表于 03-05 08:40

    【米尔RK3576开发板评测】+项目名称YOLOV5目标检测

    /examples/yolov5/model ./download_model.sh 下载的是ONNX格式的神经网络模型,但发现它无法在瑞芯微系统中直接运行。为了解决这个问题,您计
    发表于 02-15 13:24

    【ELF 2学习板试用】ELF2开发板(飞凌嵌入式)部署yolov5s的自定义模型

    ELF2开发板(飞凌嵌入式)部署yolov5s的自定义模型` 本人将零基础教学自己训练yolov5s
    发表于 02-04 18:15

    think-cell;自定义think-cell()

    本章介绍如何自定义 think-cell,即如何更改默认颜色和其他默认属性;这是通过 think-cell 的样式文件完成的,这些文件将在前四部分中进行讨论。 第五部分 C.5 设置默认议程幻灯片
    的头像 发表于 01-08 11:31 1243次阅读
    think-cell;<b class='flag-5'>自定义</b>think-cell(<b class='flag-5'>一</b>)