目标检测 | YOLOv5 训练自标注数据集实现迁移学习

Hi,大家好,我是源于花海。本文主要了解 YOLOv5 训练自标注数据集(自行车和摩托车两种图像)进行目标检测,实现迁移学习。YOLOv5 是一个非常流行的图像识别框架,这里介绍一下使用 YOLOv5 给使用 Labelme 标注自己的数据集进行训练和测试。


目录

一、YOLOv5 核心基础知识

1. YOLOv5 四种网络模型

2. 核心基础内容

二、YOLOv5 迁移学习过程

1. YOLOv5 框架的下载及结构介绍

2. 创建 YOLOv5 虚拟环境

3. 数据集准备

3.1 数据集下载

3.2 Labelme 数据标注

3.3 json 转 txt

3.4 数据集分割及其对应标签生成

4. 模型配置

4.1 修改数据集配置文件

4.2 修改模型配置文件

4.3 其他修改

5. 模型训练

6. 模型验证

7. 模型预测


一、YOLOv5 核心基础知识

可以参考大白的 深入浅出Yolo系列之Yolov5核心基础知识完整讲解-CSDN博客 这一文章进去详细学习 YOLOv5 相关知识,当然也包含 YOLO 的其他系列的知识。

1. YOLOv5 四种网络模型

  • YOLOv5s
  • YOLOv5m
  • YOLOv5l
  • YOLOv5x

YOLOv5 的四个 pt 格式权重模型:

YOLOv5 作者算法性能测试图:

Yolov5作者也是在COCO数据集上进行的测试COCO数据集的小目标占比)。

YOLOv5s 网络是 YOLOv5 系列中深度最小,特征图的宽度最小的网络(网络最小,速度最少,AP精度也最低)。但如果检测的以大目标为主,追求速度,倒也是个不错的选择。

后面的三种都是在此基础上不断加深、加宽网络AP精度也不断提升,但速度的消耗也在不断增加

2. 核心基础内容

YOLOv5 网络结构图:

我们可以采用 pt->onnx->netron 的折中方式,先使用 YOLOv5 代码中 models/export.py 脚本将 pt文件 转换为 onnx格式,再用 netron工具 打开,这样就可以看全网络的整体架构了。

​上图即 YOLOv5 的网络结构图,可以看出,还是分为输入端、Backbone、Neck、Prediction四个部分。

  • 输入端: Mosaic 数据增强、自适应锚框计算
  • Backbone: Focus 结构,CSP 结构
  • Neck: FPN + PAN 结构
  • Prediction: GIOU_Loss

二、YOLOv5 迁移学习过程

1. YOLOv5 框架的下载及结构介绍

官方介绍文档: YOLOv5官方文档 或者 YOLOv5-master 。

pycharm 里面大致是这样的结构

现在来对代码的整体目录做一个介绍

  • data:主要是存放一些超参数的配置文件(这些文件(yaml文件)是用来配置训练集和测试集还有验证集的路径的,其中还包括目标检测的种类数和种类的名称);还有一些官方提供测试的图片。如果是训练自己的数据集的话,那么就需要修改其中的 yaml 文件。但是自己的数据集不建议放在这个路径下面,而是建议把数据集放到 YOLOv5 项目的同级目录下面。
  • models:里面主要是一些网络构建的配置文件和函数,其中包含了该项目的四个不同的版本,分别为是s、m、l、x。从名字就可以看出,这几个版本的大小。他们的检测测度分别都是从快到慢,但是精确度分别是从低到高。这就是所谓的鱼和熊掌不可兼得。如果训练自己的数据集的话,就需要修改这里面相对应的 yaml 文件来训练自己模型。
  • utils:存放的是工具类的函数,里面有 loss 函数,metrics 函数,plots 函数等等。
  • weights:放置训练好的权重参数。
  • train.py:训练自己的数据集的函数。
  • test.py:测试训练的结果的函数。
  • detect.py:利用训练好的权重参数进行目标检测,可以进行图像、视频和摄像头的检测。
  • requirements.txt:这是一个文本文件,里面是使用 YOLOv5 项目的环境依赖包的一些版本,可以用该文本导入相应版本的包。

以上是 YOLOv5 项目代码的整体介绍。我们训练、验证、测试自己的数据集基本就是利用到如上代码。

2. 创建 YOLOv5 虚拟环境

这边建议使用 conda 创建一个新的虚拟环境。

(1)创建虚拟环境

conda create -n YOLOv5 python=3.9

(2)激活并进入虚拟环境

activate YOLOv5

(3)安装各软件包

 比如使用清华镜像源安装库:

pip install torch==2.1.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install torchvision==0.16.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
······

打开 requirements.txt 文件,里面写有 YOLOv5 运行所需要的各种软件包,输入以下命令到 pycharm 里的终端中运行即可:(我不太记得了,感觉是在 Command Prompt 里面运行的,但是 Windows PowerShell 也可以)

pip install -r requirements.txt

这个过程可快可慢,看网速,静静地等待吧。有几个包的安装可能会出问题,没关系,把报错信息在 CSDN / ChatGPT 上搜一搜都能找到解决办法!

(4)添加此虚拟环境到该项目中

3. 数据集准备

数据集格式:

数据集文件夹的树形结构:

├── BikeMotorcycle        数据集文件夹

        ├── PNGImages     所有图像(两种放一起,命名为(名称+)编号)

        ├── json                  所有图像对应的 json 文件(同上)

        ├── Annotations      由 json 文件转换的 txt 文件(同上)

        ├── images             分割后的数据集(子文件夹里两种放一起,命名同上)

                ├── train          训练集

                ├── val            验证集

                ├── test           测试集

        ├── labels               分割后的数据集对应的 txt 标签文件(同上)

                ├── train          训练集

                ├── val            验证集

                ├── test           测试集

3.1 数据集下载

本项目数据集是在以下链接中的图像分类里面的 VOC2005 车辆数据集(The PASCAL Visual Object Classes Challenge)中选取自行车和摩托车而得:图像处理及深度学习开源数据集大全(四万字呕心沥血整理)-CSDN博客 。

3.2 Labelme 数据标注

① Open Dir(选择并打开数据集图像的文件夹路径)

②③④ File —> Save Automatically —> Change Output Dir

  • Save Automatically:自动保存,减少麻烦
  • Change Output Dir:改变 json 文件输出路径

⑤ Create Rectangle(快捷键:Ctrl+R)(画矩形边界框)

3.3 json 转 txt

json_to_txt.py 代码如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@Project : yolov5-master
@File    : json_to_txt.py
@IDE     : PyCharm
@Author  : 源于花海
@Date    : 2023/12/10 19:43
"""
import json
import os

name2id = {'bike': 0, 'motorcycle': 1}  # 标签名称


def convert(img_size, box):
    dw = 1. / (img_size[0])
    dh = 1. / (img_size[1])
    x = (box[0] + box[2]) / 2.0 - 1
    y = (box[1] + box[3]) / 2.0 - 1
    w = box[2] - box[0]
    h = box[3] - box[1]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return x, y, w, h


def decode_json(json_floder_path, json_name):
    txt_name = 'D:\\Python_demo\\neural_network\\yolov5-master\\BikeMotorcycle\\Annotations\\' + json_name[0:-5] + '.txt'
    # 存放txt的绝对路径
    txt_file = open(txt_name, 'w')

    json_path = os.path.join(json_floder_path, json_name)
    data = json.load(open(json_path, 'r', encoding='gb2312', errors='ignore'))

    img_w = data['imageWidth']
    img_h = data['imageHeight']

    for i in data['shapes']:
        label_name = i['label']
        if i['shape_type'] == 'rectangle':
            x1 = int(i['points'][0][0])
            y1 = int(i['points'][0][1])
            x2 = int(i['points'][1][0])
            y2 = int(i['points'][1][1])

            bb = (x1, y1, x2, y2)
            bbox = convert((img_w, img_h), bb)
            txt_file.write(str(name2id[label_name]) + " " + " ".join([str(a) for a in bbox]) + '\n')


if __name__ == "__main__":
    json_floder_path = 'D:\\Python_demo\\neural_network\\yolov5-master\\BikeMotorcycle\\json'
    # 存放json的文件夹的绝对路径
    json_names = os.listdir(json_floder_path)
    for json_name in json_names:
        decode_json(json_floder_path, json_name)

3.4 数据集分割及其对应标签生成

split+labels.py 代码如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@Project : yolov5-master
@File    : split+labels.py
@IDE     : PyCharm
@Author  : 源于花海
@Date    : 2023/12/10 19:29
"""
import shutil
import random
import os

# 将图片和标注数据按比例切分为训练集、验证集和测试集
# 数据集路径
image_original_path = './BikeMotorcycle/PNGImages/'
label_original_path = './BikeMotorcycle/Annotations/'
# 训练集路径
train_image_path = './BikeMotorcycle/images/train/'
train_label_path = './BikeMotorcycle/labels/train/'
# 验证集路径
val_image_path = './BikeMotorcycle/images/val/'
val_label_path = './BikeMotorcycle/labels/val/'
# 测试集路径
test_image_path = './BikeMotorcycle/images/test/'
test_label_path = './BikeMotorcycle/labels/test/'

# 数据集划分比例,训练集75%,验证集15%,测试集10%,按需修改
train_percent = 0.75
val_percent = 0.15
test_percent = 0.1


# 检查文件夹是否存在
def mkdir():
    if not os.path.exists(train_image_path):
        os.makedirs(train_image_path)
    if not os.path.exists(train_label_path):
        os.makedirs(train_label_path)

    if not os.path.exists(val_image_path):
        os.makedirs(val_image_path)
    if not os.path.exists(val_label_path):
        os.makedirs(val_label_path)

    if not os.path.exists(test_image_path):
        os.makedirs(test_image_path)
    if not os.path.exists(test_label_path):
        os.makedirs(test_label_path)


def main():
    mkdir()

    total_txt = os.listdir(label_original_path)
    num_txt = len(total_txt)
    list_all_txt = range(num_txt)  # 范围 range(0, num)

    num_train = int(num_txt * train_percent)
    num_val = int(num_txt * val_percent)
    num_test = num_txt - num_train - num_val

    train = random.sample(list_all_txt, num_train)
    # 在全部数据集中取出train
    val_test = [i for i in list_all_txt if not i in train]
    # 再从val_test取出num_val个元素,val_test剩下的元素就是test
    val = random.sample(val_test, num_val)

    print("训练集数目:{}, 验证集数目:{},测试集数目:{}".format(len(train), len(val), len(val_test) - len(val)))
    for i in list_all_txt:
        name = total_txt[i][:-4]

        srcImage = image_original_path + name + '.png'
        srcLabel = label_original_path + name + '.txt'

        if i in train:
            dst_train_Image = train_image_path + name + '.png'
            dst_train_Label = train_label_path + name + '.txt'
            shutil.copyfile(srcImage, dst_train_Image)
            shutil.copyfile(srcLabel, dst_train_Label)
        elif i in val:
            dst_val_Image = val_image_path + name + '.png'
            dst_val_Label = val_label_path + name + '.txt'
            shutil.copyfile(srcImage, dst_val_Image)
            shutil.copyfile(srcLabel, dst_val_Label)
        else:
            dst_test_Image = test_image_path + name + '.png'
            dst_test_Label = test_label_path + name + '.txt'
            shutil.copyfile(srcImage, dst_test_Image)
            shutil.copyfile(srcLabel, dst_test_Label)


if __name__ == '__main__':
    main()

4. 模型配置

模型配置其实就是一些预训练权重的准备,在 YOLOv5 中,主要是 .yaml 配置文件及一些 .py 文件的参数或路径修改。

4.1 修改数据集配置文件

在 data 目录下复制 VOC.yaml,并粘贴重命名为 BikeMotorcycle.yaml,打开进行修改。

  • path:项目当前的路径
  • train、val、test:对应的训练集、验证集、测试集的路径
  • nc:类别数
  • names:类别名

4.2 修改模型配置文件

在 models 目录下找到 yolov5s.yaml,将其复制一份,并重命名为 BikeMotorcycle.yaml,然后打开它,把 nc 改成数据集类别数。

4.3 其他修改

5. 模型训练

  • ① weights: r'yolov5s.pt'
  • ② cfg: r'models/BikeMotorcycle.yaml''
  • ③ data: r'data/BikeMotorcycle.yaml'
  • ④ epochs: 训练次数:10
  • ⑤ batch-size: 训练的批次:16

修改 train.py 文件上面的信息之后运行,开始训练:

训练结果对应 runs\train\exp 文件夹下:

result.png 结果如下:

由上图可以看出,本项目 YOLOv5 训练效果很好,准确率为 99.1% 

6. 模型验证

评估模型好坏就是在有标注的测试集或者验证集上进行模型效果的评估,在目标检测中最常使用的评估指标为 mAP。

  • ① weights: 训练好的模型的权重 r'runs\train\exp30\weights\best.pt'
  • ② data: r'data/animal_detection.yaml'

val.py 文件中指定数据集配置文件和训练结果模型,运行进行测试某一张图片或某个文件夹里的图片,直接 "右键+运行",或者在终端输入以下命令

python val.py --data data/BikeMotorcycle.yaml --weights runs\train\exp\weights\best.pt --augment

验证结果对应 runs\val\exp 文件夹下:

由上图可以看出,本项目 YOLOv5 验证效果很好,准确率同样接近 100%

7. 模型预测

模型推理和模型测试比较类似,主要区别是模型推理是对那些没有标注的数据集上进行推理,修改detect.py文件的要进行推理的图片和模型的路径:

  • ① weights: 训练好的模型的权重 r'runs\train\exp\weights\best.pt'
  • ② source: r'BikeMotorcycle\images\test'
  • ③ data: r'data/BikeMotorcycle.yaml'

 test.py 文件中指定数据集配置文件和训练结果模型,运行进行推理某一张图片或某个文件夹里的图片,直接 "右键+运行",或者在终端输入以下命令

python detect.py --weights runs\train\exp\weights\best.pt --source BikeMotorcycle\images\test

预测结果对应 runs\detect\exp 文件夹下:

 由上图可以看出,本项目 YOLOv5 预测效果很好,检测类别的准确度达到 100%

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI模型部署落地综述(ONNX/NCNN/TensorRT等)

导读 费尽心血训练好的深度学习模型如何给别人展示?只在服务器上运行demo怎么吸引别人的目光?怎么才能让自己的成果落地?这篇文章带你进入模型部署的大门。 0 前言 模型部署的步骤: 训练一个深度学习模型; 使用不同…

NNDL总结

第四章 前馈神经网络 4.1 神经元 人工神经元&#xff0c;简称神经元&#xff0c;是构成神经网络的基本单元。 当>0时&#xff0c;为1&#xff0c;兴奋&#xff1b; 当<0时&#xff0c;为0&#xff0c;抑制。 激活函数的性质 1、连续可导的非线性函数。 2、激活函数及其导…

C语言 B树的分析与实现

本文主要说明了B树的概念、应用以及如何用C语言实现B树。 概述 有使用过数据库的朋友都知道&#xff0c;数据库需要存储大量的数据&#xff0c;并且查询数据的性能也需要一定的保证。那么数据库的底层数据结构是如何实现的呢&#xff0c;就是我们要讨论的B树和B树&#xff0c…

【电源专题】电池充放电中常说的0.2C是什么概念

在工作中我们时常会听到老员工说拿这个电池去做一下充放电,以0.2C充,0.2C放。那么这个0.2C到底是啥? 这就要说到电池C-rate概念。在《GB 31241:便携式电子产品用锂离子电池和电池安全要求》中我们可以看到3.7中写了额定容量为C,也就是制造商标明的电池或电池组容量。 那么…

src refspec master does not match any

新项目推送至 Git 空仓库时抛出如下异常 src refspec master does not match any 初始化 init 都做了但反复尝试 git push -u origin master 均无果 后发现权限不够 .... 起初设置为开发者,后变更为了主程序员再次尝试 push 成功 .... 以上便是此次分享的全部内容&#xff0c;…

MyBatisPlus学习二:常用注解、条件构造器、自定义sql

常用注解 基本约定 MybatisPlus通过扫描实体类&#xff0c;并基于反射获取实体类信息作为数据库表信息。可以理解为在继承BaseMapper 要指定对应的泛型 public interface UserMapper extends BaseMapper<User> 实体类中&#xff0c;类名驼峰转下划线作为表名、名为id的…

etcd储存安装

目录 etcd介绍: etcd工作原理 选举 复制日志 安全性 etcd工作场景 服务发现 etcd基本术语 etcd安装(centos) 设置&#xff1a;etcd后台运行 etcd 是云原生架构中重要的基础组件&#xff0c;由 CNCF 孵化托管。etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册…

单片机大小端模式

单片机大小端模式 参考链接 单片机干货-什么是大小端_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Ju4y1M7Tx/?spm_id_from333.337.search-card.all.click&vd_sourcee821a225c7ba4a7b85e5aa6d013ac92e 特此记录 anlog 2024年1月2日

C语言——内存函数【memcpy,memmove,memset,memcmp】

&#x1f4dd;前言&#xff1a; 在之前的文章C语言——字符函数和字符串函数&#xff08;一&#xff09;中我们学习过strcpy和strcat等用来实现字符串赋值和追加的函数&#xff0c;那么除了字符内容&#xff0c;其他的数据&#xff08;例如整型&#xff09;能否被复制或者移动呢…

IDEA2023 最新版详细图文安装教程(Java环境搭建+IDEA安装+运行测试+汉化+背景图设置)

IDEA2023 最新版详细图文安装教程 名人说&#xff1a;工欲善其事&#xff0c;必先利其器。——《论语》 作者&#xff1a;Code_流苏(CSDN) o(‐&#xff3e;▽&#xff3e;‐)o很高兴你打开了这篇博客&#xff0c;跟着教程去一步步尝试安装吧。 目录 IDEA2023 最新版详细图文安…

Linux第15步_安装FTP客户端

安装完FTP服务器后&#xff0c;还需要安装FTP客户端&#xff0c;才可以实现Ubuntu系统和Windows系统进行文件互传。 1、在STM32MP157开发板A盘基础资料\03软件中&#xff0c;找到“FileZilla_3.51.0_win64-setup.exe”&#xff0c;双击它&#xff0c;就可以安装。 2、点击“I …

吉他打谱软件Guitar Pro8苹果Mac电脑简体中文特别版

Guitar Pro 8 Mac是一款吉他编曲学习软件&#xff0c;用于吉他、贝和其他弦乐器的制谱和演奏&#xff0c;这是一个多轨编辑器&#xff0c;具有集成的 MIDI 编辑器、合唱绘图仪、吉他、节拍器和其他音乐家工具。它使您能够编辑吉他、贝司和尤克里里、乐谱、指法谱&#xff0c;并…

浅谈云可观测性的关键组件及重要性

在云计算时代&#xff0c;企业和开发团队不仅需要关注应用程序的功能性&#xff0c;还需要关心系统在生产环境中的性能、可用性和可靠性。云可观测性成为一项关键的技术实践&#xff0c;它涵盖了日志、指标、追踪等多个方面&#xff0c;为系统监控和故障诊断提供了全方位的支持…

二手买卖、废品回收小程序 在app.json中声明permission scope.userLocation字段 教程说明

处理二手买卖、废品回收小程序 在app.json中声明permission scope.userLocation字段 教程说明 sitemapLocation 指明 sitemap.json 的位置&#xff1b;默认为 ‘sitemap.json’ 即在 app.json 同级目录下名字的 sitemap.json 文件 找到app.json这个文件 把这段代码加进去&…

分解质因数算法总结

知识概览 n中最多只包含一个大于的质因子。 例题展示 题目链接 活动 - AcWing 系统讲解常用算法与数据结构&#xff0c;给出相应代码模板&#xff0c;并会布置、讲解相应的基础算法题目。https://www.acwing.com/problem/content/869/ 题解 分解质因数可以用试除法解决&…

Zoho SalesIQ:构建客户服务知识库的实用工具与指南

客服人员每天都有很多事情要做&#xff0c;包括在线聊天、音频通话、屏幕共享和发送电子邮件。为什么要将搜索常用信息添加到他们列表中呢&#xff1f;因为客户在遇到问题的同时想快速解决问题。所以&#xff0c;我们要使用Zoho SalesIQ客服系统构建客户服务知识库。 一、什么…

根据MySql的表名,自动生成实体类,模仿ORM框架

ORM框架可以根据数据库的表自动生成实体类&#xff0c;以及相应CRUD操作 本文是一个自动生成实体类的工具&#xff0c;用于生成Mysql表对应的实体类。 新建Winform窗体应用程序AutoGenerateForm&#xff0c;框架(.net framework 4.5)&#xff0c; 添加对System.Configuration的…

【经验】VSCode连接远程服务器(可以使用git管理、方便查看和编辑Linux源码)

1、查看OpenSSH Windows10通常自带OpenSSH不需要安装。 Windows10下检查是否已经安装OpenSSH的方法: 1)按下快捷键Win + X,选择Windows PoweShell(管理员) 2)输入以下指令: Get-WindowsCapability -Online | ? Name -like ‘OpenSSH*’ 3)如果电脑未安装OpenSSH,…

RFID标签在汽车监管方面的应用与实施方案

RFID技术在汽车工业领域得到了广泛应用&#xff0c;主要体现在汽车资质证书远程监管系统的普及化&#xff0c;系统包括OBD接口监视器、车证监管箱、超高频读写设备、应用系统软件以及大数据采集与处理等组成部分。 在汽车物流监管方面&#xff0c;系统利用OBD接口监控车辆并实时…

JavaWeb 期末考--复盘

Javaweb 期末复习题目 1 单选 2 多选 3 问答与分析 4 程序填空 5 程序设计&#xff08;该部分无&#xff09; 需要word版资料详见文章末尾&#xff0c;免费自提 0、学期知识点回顾 一、注释和注解 1、Java的三种注释&#xff1a;单行、多行和文档注释。 2、常用…