本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——2Yolo使用之ONNX模型准备

news2024/11/15 8:31:49

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——2Yolo使用之ONNX模型准备

​ 大家好,因为板端BPU环境,可以加速目标检测的速度,所以今天在此先给大家带来如何准备一个模型,下一期会给大家带来如何在板端部署这一期的目标识别模型

​ 本文给大家带来的是yolov5-2.0 版本,在我最先接触的就是这个板子,当时也是参考了地平线社区的大佬带来一些方法,当然这个参考是在下一期哈哈、

​ 这一期其方法上是通用的,出这一期也是能够方便大家以后学会yolo任何版本的使用。

​ 因为我没有研究很深入,我写是针对比赛,至于其他版本会不会在使用过程中有小坑,在地平线官网也是有教程的,大家需要其他版本的可以去看看其他大佬的文章。

1.获取目标检测源码

​ 首先,是要获得yolov5-2.0得源码,正常情况是要教大家去github进行下载源码的,但是咳咳好像不太容易,因为“科学上网”

​ 当然下载完成2.0版本还有有很多bug的,这里给大家以附件形式给出我的源码吧

​ 下载的源码里主要由一下文件夹

image-20240802203012603

2.数据准备与标记

​ 要训练一个模型,首先需要一定的图片数据,然后标记,接下来开始告诉大家如何进行这些准备

​ 当然你首先要有Pyhton环境,这里就不教大家配置Python了,我这里使用的是Anaconda+Pycharm

​ 之前发现哔哩哔哩有好多讲解使用,大家可以看下

2.1 数据集准备

​ 首先建立一个文件夹dataset,里面放置image和label,每个子文件夹里面放置train和test。然后把你的jpg或者png图片放在image的train里面

image-20240802203525930

2.2 数据标记

​ 打开你的命令行,输入如下

pip install labelimg

image-20240802204001016

​ 稍等安装完毕,然后在命令行输入,如下内容,你会发现弹出如下窗口

labelimg

image-20240802204130724

​ 接下来点击View-选择第一行设置自动保存模式

image-20240802204209178

​ 接下来点击 Open Dir——>选择你刚才image所在的目录

image-20240802204350234

​ 接下来选择 Change Save Dir 找到你的label文件夹里的train

image-20240802204743843

​ 最后保证选择Yolo模式

image-20240802205052804

​ 此刻你就可以看到你的图片已经加载进来了

image-20240802205131915

​ 这里把鼠标移动到页面里,按下键盘里w,会出现一个十字

image-20240802205239892

​ 这时候你就可以,进行绘制矩形了,绘制完成后,就会出现一个提示框,这里写上你的标签

image-20240802205304825

​ 当你打完这个标签之后,使用键盘键A和D,可以切换上一张,下一张,最后你标记完成你所有图片,应该是下面这个样子

​ 一个文件夹有图片,另外一个文件夹里面是txt格式文件

image-20240802205653908

3.配置文件

3.1目录结构

​ 在你下载的源码中创建下面这样的文件夹,接下来,我将挨个进行刚才没有提及的文件进行解释

image-20240802205927731

3.2 test

​ 对于test里面的文件夹,这里下面我给大家提供一个分割脚本,其实本质是就是将刚才打标签的所有内容,进行划分,分成两部分

​ 当然下面代码是要大家改一些东西的,一些路径字符串我已经给大家写好了,大家改成自己对应的就可以了

import os
import shutil
from sklearn.model_selection import train_test_split


def move_files(src_dir, dst_dir, files, extension):
    """将指定的文件从源目录移动到目标目录。"""
    os.makedirs(dst_dir, exist_ok=True)  # 如果目标目录不存在,则创建
    for base_name in files:
        src_path = os.path.join(src_dir, f"{base_name}{extension}")
        dst_path = os.path.join(dst_dir, f"{base_name}{extension}")
        shutil.move(src_path, dst_path)


def split_dataset(src_images_dir, src_labels_dir, dst_dirs, train_ratio=0.8, val_ratio=0.1):
    """
    将数据集分为训练集、验证集和测试集,并移动到指定目录。

    参数:
    - src_images_dir: 图片的源目录。
    - src_labels_dir: 标签的源目录。
    - dst_dirs: 目标目录的字典,包含'train', 'val', 'test'对应的图片和标签目录。
    - train_ratio: 训练集在总数据中的比例。
    - val_ratio: 验证集在总数据中的比例。
    """
    test_ratio = 1 - train_ratio - val_ratio
    assert test_ratio > 0, "Invalid ratios: Sum of train and val ratios must be less than 1."

    # 读取并分割数据
    files = [os.path.splitext(file)[0] for file in os.listdir(src_images_dir)]
    train_files, test_files = train_test_split(files, test_size=test_ratio, random_state=42)
    train_files, val_files = train_test_split(train_files, test_size=val_ratio / (train_ratio + val_ratio),
                                              random_state=42)

    # 移动文件到相应的目录
    for part, file_list in [('train', train_files), ('val', val_files), ('test', test_files)]:
        move_files(src_images_dir, dst_dirs[part]['images'], file_list, '.jpg') #这里使用的是jpg格式,如果是png需要修改
        move_files(src_labels_dir, dst_dirs[part]['labels'], file_list, '.txt')


def main():
    # 定义源目录
    src_images_dir = r'刚才的tain里面的所有图片'
    src_labels_dir = r'刚才label所有txt'

    # 定义目标目录
    dst_dirs = {
        'train': {'images': r'训练集图片路径',
                  'labels': r'训练集标签路径'},
        'val': {'images': r'验证集图片路径',
                'labels': r'验证集标签路径'},
        'test': {'images': r'测试集标签路径',
                 'labels': r'测试集标签路径'}
    }

    # 调用函数,进行数据划分和文件移动
    split_dataset(src_images_dir, src_labels_dir, dst_dirs, train_ratio=0.8, val_ratio=0.1)


if __name__ == '__main__':
    main()

3.3 my_model.yaml

​ 对于这个yaml文件,大家只需要吧第一个参数nc改成自己的实际类别,对于小白其他参数不需要管

# parameters
nc: 1  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple

# anchors
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

# YOLOv5 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Focus, [64, 3]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, BottleneckCSP, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 9, BottleneckCSP, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, BottleneckCSP, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 1, SPP, [1024, [5, 9, 13]]],
   [-1, 3, BottleneckCSP, [1024, False]],  # 9
  ]

# YOLOv5 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, BottleneckCSP, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, BottleneckCSP, [256, False]],  # 17

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, BottleneckCSP, [512, False]],  # 20

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, BottleneckCSP, [1024, False]],  # 23

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

3.4 my_para.yaml

​ 对于这个yaml文件,下面四个参数都要修改,具体修改下面已经用中文给出大家了

# COCO 2017 dataset http://cocodataset.org - first 128 training images
# Download command:  python -c "from yolov5.utils.google_utils import *; gdrive_download('1n_oKgR81BJtqk75b00eAjdv03qVCQn2f', 'coco128.zip')"
# Train command: python train.py --data coco128.yaml
# Default dataset location is next to /yolov5:
#   /parent_folder
#     /coco128
#     /yolov5


# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: "训练集图片的路径"  # 128 images
val: "验证集的图片路径"  # 128 images

# 这个地方写类别个数,数字
nc: 1

# class names
names: ['刚才标记的字符串名字','标记的第二个label名字']

4.训练配置

4.1train.py

​ 对于训练,打开train.py 按照我下面截图框进行设置,下面是解释

​ (1)cfg 这个把刚才的my_mode.yaml路径放进来

​ (2)data这个把刚才的my_para.yaml路径放进来

​ (3)epochs:这个设置轮数

​ (4)device:选择cpu,当然我这里是0 是因为我配置了cuda

​ (5)img-size:这里注意一下。这里选择672*672 和我一样就行,方便后面转模型,我也没有研究很深入,好像是转模型有点影响

image-20240802211637078

4.2 model/yolo.py

​ 现在我们是训练阶段,我给大家提供的里面就是我现在截图这个样子,

​ 大家需要把红框的这个取消注释

​ 把红框下面的进行注释掉

image-20240802212009895

4.3正式训练

​ 到现在你就可以愉快的进行训练啦

​ 当你看到类似下面这种情况,代表你的模型正常训练了

image-20240802212419007

4.4训练完成

​ 训练时间还是挺漫长的,当你最后训练完成了,你会发现,控制台输出了一个日志,当然不一定和我的一模一样,因为我的是v5-7.0版本

image-20240802212455738

​ 哈哈大同小异,反正根据日志找到位置就好了,然后你会看到,里面有这些,通常我们会使用best.pt

​ 到此为止,windows的模型就训练得到啦

image-20240802212626331

5 ONNX模型转化

​ 这一步就很简单了,大家只需要,先把yolo.py里面的换到处onnx该使用的那一行就好啦

image-20240802213044574

​ 这个时候大家吧expoer.py里面的weights路径改成刚才的pt就行了

​ 运行代码你就会发现,现在onnx成功转化了,然后你就可以使用这个进行下一期的bin模型转化了

image-20240802213032934

6.总结与下期预告

本期,给大家带来了如何在windows训练yolov5,大家可以试试

当然本期介绍确实没啥含金量,网上有关教程也满天飞,我也参考了好多大佬的文章,也就是对于大佬们详细版本的总结一下

下一期讲给大家带来与地平线更为相关的内容,包括bin模型转化环境,以及转化过程的提炼版本

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

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

相关文章

如何做一个惊艳领导和客户的原型?

在产品开发过程中,原型设计是验证设计想法、提升用户体验的重要环节。Axure作为一款业界领先的原型设计工具,凭借其强大的交互设计和丰富的功能,赢得了全球设计师和开发者的信赖。而Axure的高效交互元件库,则如同一本字典或说明书…

将YOLOv8模型从PyTorch的.pt格式转换为OpenVINO支持的IR格式

OpenVINO是Open Visual Inference & Neural Network Optimization工具包的缩写,是一个用于优化和部署AI推理模型的综合工具包。OpenVINO支持CPU、GPU和NPU设备。 OpenVINO的优势: (1).性能:OpenVINO利用英特尔CPU、集成和独立GPU以及FPGA的强大功能提…

原生IP节点是什么意思?和socks5节点有什么区别?

在了解这两种代理节点前,我们首先要了解:节点是什么? 首先,在电信网络当中,一个节点是一个连接点。表示一个再分发点又或者是一个通信端点。节点的定义依赖于所提及的网络和协议层。一个物理网络节点是一个连接到网络…

深度强化学习:穿越智能迷雾,探索AI新纪元

近年来,深度强化学习成为关注的热点。在自动驾驶、棋牌游戏、分子重排和机器人等领域,计算机程序能够通过强化学习,理解以前被视为超级困难的问题,取得了令人瞩目的成果。在围棋比赛中,AlphaGo接连战胜樊麾、李世石和柯…

使用 SpringBoot + 虚拟线程将服务性能提升几百倍

虚拟线程简介 虚拟线程是 Java 平台的一项创新特性。虚拟线程是一种轻量级的线程实现,它在操作系统层面并不对应真实的内核线程,而是由 JVM 进行管理和调度。这使得可以在不消耗大量系统资源的情况下创建大量的线程,从而能够更高效地处理并发任务。 虚拟线程与普通线程的区…

【数学建模】——【A题 信用风险识别问题】全面解析

目录 1.题目 2.解答分析 问题1:指标筛选 1.1 问题背景 1.2 数据预处理 1.3 特征选择方法 1.4 多重共线性检测 1.5 实现步骤 问题2:信用评分模型 2.1 问题背景 2.2 数据分割 2.3 处理不平衡数据 2.4 模型选择与理由 问题3:模型对…

『 Linux 』线程池与 POSIX 线程的封装编码实现

文章目录 线程池概念线程池的编码实现线程池的测试参考代码 线程的封装使用测试封装后的线程参考代码 线程池概念 池化技术是一种资源管理方法,通过预先创建和管理一组资源以便在需要使用时快速分配这些资源; 线程池是池化技术的一种典型应用; 资源分配 在线程池中预先创建一定…

【python015】常见成熟AI-图像识别场景算法清单(已更新)

1.欢迎点赞、关注、批评、指正,互三走起来,小手动起来! 【python015】常见成熟AI-图像识别场景算法清单及代码【python015】常见成熟AI-图像识别场景算法清单及代码【python015】常见成熟AI-图像识别场景算法清单及代码文章目录 1.背景介绍2.`Python`版数据爬取、解析代码2.…

鸿蒙应用框架开发【画中画效果实现】 UI框架

画中画效果实现 介绍 本示例通过kit.ArkUI、kit.MediaKit等接口,实现了视频播放、手动和自动拉起画中画、画中画窗口控制视频播放和暂停等功能。 效果预览 使用说明 在主界面,可以点击对应视频按钮进入视频播放页面;视频播放页面点击开启…

三星One UI 7.0引入苹果的几大特色功能,iOS用户都羡慕哭了

在智能手机操作系统的创新之路上,苹果iOS系统的Dynamic Island和Live Activities功能无疑为用户带来了全新的交互体验。 现在,三星One UI 7.0系列的即将发布,似乎预示着安卓阵营也将迎头赶上,甚至可能在某些方面超越苹果。以下是…

AcWing-AcWing 837. 连通块中点的数量

在原来并查集的基础上增加一个Size数组,Size的初始化是必须先每个元素初始化为1 Size只对根节点有效,比如Size[find(1)]就是找1的祖先节点,然后访问祖先节点的个数。当我们联通a点和b点时,如果已经是联通状态了,那么无…

深度解读:等保测评标准与实践指南

在信息时代,数据安全与隐私保护成为企业和组织不可忽视的关键议题。等保测评,即信息安全等级保护测评,作为我国信息安全管理体系的重要组成部分,为各行业提供了标准化的安全评估与改进路径。本文旨在深度解读等保测评标准的核心要…

探索Python日期时间的宝藏:`dateutil`库的神秘面纱

文章目录 探索Python日期时间的宝藏:dateutil库的神秘面纱背景:为何选择dateutil?dateutil是什么?如何安装dateutil?简单函数介绍与使用parse函数:智能日期时间解析relativedelta:计算相对日期t…

一个超强的Python机器学习超参优化库

在机器学习模型的训练过程中,选择合适的超参数对模型性能的提升至关重要。超参数优化是指在给定的超参数空间内,找到一组能够使模型表现最佳的超参数组合。虽然有许多方法可以用来进行超参数优化,但在本文中,我们将重点介绍一个强大且易用的库——Optuna。 什么是Optuna?…

顺序表、单链表、顺序栈,链栈的基本运算

目录 顺序表的基本运算 单链表的基本运算 顺序栈的基本运算 链栈的基本运算 线性表的9个基本运算&#xff1a; 栈的6个基本运算&#xff1a; 顺序表的基本运算 //顺序表的基本运算************************************************************** #include<stdio…

通过yfinance获取股票历史数据

以比亚迪为例&#xff0c;要获取A股比亚迪的十年的历史数据并保存为CSV文件&#xff0c;我们可以使用Python中的第三方库如pandas和yfinance。yfinance库是一个用于下载雅虎财经数据的工具&#xff0c;它支持股票、期权等金融工具的数据获取。 1.安装yfinance和pandas 首先&a…

云服务器带宽什么意思?如何正确选择

云服务器带宽什么意思?云服务器带宽指的是云服务器在互联网上的数据传输能力。就像水流通过水管一样&#xff0c;数据通过所谓的“带宽”在网络中流动。这个带宽越大&#xff0c;每秒能够传输的数据就越多&#xff0c;对大量访问处理的能力也就越强。云服务器带宽是云服务器可…

【开源项目】基于RTP协议的H264码流发送器和接收器

RTP协议 1. 概述1.1 RTP协议1.2 RTP和UDP的关系 2. RTP打包H264码流2.1 RTP单一传输2.2 RTP分片传输2.3 RTP多片合入传输 3.工程3.1 头文件3.1.1 rtp.h3.1.2 utils.h 3.2 cpp文件3.2.1 rtp.cpp3.2.2 utils.cpp 4.测试5.小结 参考&#xff1a; 视音频数据处理入门&#xff1a;UD…

Arco Design 之Table表格

此篇文章为table表格示例&#xff0c;包含列、data数据、展开、选中、自定义等相关属性 基础表格 <a-table :columns"columns1" :data"tableData1" />const columns1 [{ title: "编号", dataIndex: "no"},{ title: "名称…

Linux线程2

线程相关函数 线程分离--pthread_detach&#xff08;后面会详细讲&#xff09; 函数原型&#xff1a;int pthread_datach(pthread_t thread); 调用该函数之后不需要 pthread_join 子线程会自动回收自己的PCB 杀死&#xff08;取消&#xff09;线程--pthread_cancel 取…