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

news2024/11/15 3:55:13

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%

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

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

相关文章

【DevOps-07-2】Sonarqube基本使用

一、简要说明 Sonar Qube的使用方式很多,Maven可以整合,也可以采用sonar-scanner的方式,再查看Sonar Qube的检测效果 Sonarqube集成在Maven实现代码检测使用sonar-scanner客户端的方式 二、Sonarqube管理后台安装中文插件 1、登录Sonarqube管…

Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models

ABSTRACT 现代大规模视觉-语言模型(LVLMs)采用了相同的视觉词汇-CLIP,可以涵盖大多数常见的视觉任务。然而,对于一些需要密集和细粒度视觉感知的特殊视觉任务,例如文档级OCR或图表理解,尤其是在非英语环境…

用通俗易懂的方式讲解:ChatGPT 开放的多模态的DALL-E 3功能,好玩到停不下来!

最近 ChatGPT 对 Plus 用户逐步开放一些多模态的功能,包括 (图像生成)、 GPT-4V(图像识别)等,很多网友乐此不疲地对这些新功能进行试用, 目前已经解锁了不少有趣的玩法,我将这些好玩…

软件测试/测试开发丨Vuetify框架的使用

介绍 Vuetify 是一个基于 Vue.js 精心打造 UI 组件库,整套 UI 设计为 Material 风格。能够让没有任何设计技能的开发者创造出时尚的 Material 风格界面。 为什么要使用Vuetify框架 所有组件遵从 Material Design 设计规范,UI 体验非常优秀&#xff0c…

FindMy技术用于键盘

键盘是我们生活中不可或缺的输入工具,是人与计算机之间沟通的桥梁,无论是编写文档、浏览网页、玩游戏、或是进行复杂的数据分析,键盘都在其中发挥着关键的作用。此外,键盘还是各种软件的快捷键操作的关键。通过熟练地运用快捷键&a…

【Axure高保真原型】树形表格_多选效果

今天和大家分享树形表格_多选效果的原型模板,点击树的箭头可以展开或者收起子节点,点击多选按钮可以选中或取消选择该行以及子级行内容,同时反选父级行内容,父级行内容能根据子级选中的数量自动反选,包括全选、半选和未…

数据结构 模拟实现LinkedList双向不循环链表

目录 一、双向不循环链表的概念 二、链表的接口 三、链表的方法实现 (1)display方法 (2)size方法 (3)contains方法 (4)addFirst方法 (5)addLast方法 …

网络连接 UDP2,UDP Connect, bind, send, recieve认知, -入门8

LWIP编程接口有RAW, NETCONN, SOCKET 2.UDP函数的理解 #define UDP_SERVER_PORT 8000 //PC side #define UDP_CLIENT_PORT 1234 // ctrl board side //PC IP address #define DEST_IP_ADDR0 192 #define DEST_IP_ADDR1 168 #define DEST_IP_ADDR2 3 #define DEST_IP_ADDR3 11…

2023-2024学年上学期算法设计与分析题期末考试模拟卷

2023-2024学年上学期算法设计与分析题期末考试模拟卷 文章目录 2023-2024学年上学期算法设计与分析题期末考试模拟卷单选题程序填空题输入格式:输出格式:输入样例1:输出样例1: 主观题 注意:该题集非标准答案,仅供参考,如果异议,请…

淘宝商品详情API接口(item_get-获得淘宝商品详情)主图,属性,sku,价格,搜索商品列表

淘宝开放平台提供了API接口,允许开发者获取淘宝商品的相关信息。为了获取商品详情,您可以使用 item_get API接口。以下是如何使用此API接口来获取商品的主图、属性、SKU、价格以及搜索商品列表的简要说明: 公共参数 名称类型必须描述keyStr…

SpringBoot Redis入门(一)——redis、Lettuce、Redisson使用

本章:将展示SpringBoot集成Redis三种客户端的配置要点和常见应用示例;下章:自行实现一个方法级的缓存注解,简化版的Cacheable,使初学者加深对Spring缓存框架的理解。 一、Lettuce客户端 Lettuce 是一种可扩展的、线程…

Java接口和抽象类的区别?

Java接口和抽象类的区别? Java接口和抽象类的含义: 接口(Interface): 含义: 接口是一种抽象类型,它定义了一组抽象方法,但不能包含具体实现。接口可以包含常量和默认方法&#xff0c…

机器学习模型超参数优化,最频繁使用的5个工具包

优化超参数始终是确保模型性能最佳的关键任务。通常,网格搜索、随机搜索和贝叶斯优化等技术是主要使用的方法。 今天分享几个常用于模型超参数优化的 Python 工具包,如下所示: scikit-learn:使用在指定参数值上进行的网格搜索或随…

HarmonyOS应用开发学习笔记 包名、icon图标,应用名修改 UIAbility组件介绍、UIAbility启动模式、UIAbility组件基本用法

目前HarmonyOS应用主推的是Stage模型开发 一、Stage模型基本概念 项目描述UIAbility组件UIAbility组件是一种包含UI界面的应用组件,主要用于和用户交互。例如,图库类应用可以在UIAbility组件中展示图片瀑布流,在用户选择某个图片后&#xf…

Mongodb启动客户端 并简单演示切换数据库

上文 window下载安装Mongodb数据库 我们简单搭起了Mongodb的服务 但是 我们还需要一个客户端 我们还是将服务端启动起来 mongod --dbpath..\data\db我们再以管理员身份运行一个终端 直接进入 Mongodb安装目录的bin下 然后启动客户端的命令是 mongo --host 服务ip --port 服务…

Android studio环境配置

1.搜索android studio下载 Android Studio - Download 2.安装 3.配置环境 配置gradle,gradle参考网络配置。最后根据项目需求选择不同的jdk。

将PPT4页并排成1页

将PPT4页并排成1页打印 解决方法: 方法一 在打印时选择: 打开 PPT,点击文件选项点击打印点击整页幻灯片点击4张水平放置的幻灯平页面就会显示4张PPT显示在一张纸上 方法二 另存为PDF: 打开电脑上的目标PPT文件,点击文件点击…

一种DevOpts的实现方式:基于gitlab的CICD(一)

写在之前 笔者最近准备开始入坑CNCF毕业的开源项目,看到其中有一组开源项目的分类就是DevOpts。这个领域内比较出名的项目是Argocd,Argo CD 是一个用于 Kubernetes 的持续交付 (Continuous Delivery) 工具,它以声明式的方式实现了应用程序的…

手把手带你手撕一个shell

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:HEART BEAT—YOASOBI 2:20━━━━━━️💟──────── 5:35 🔄 ◀️ ⏸ ▶️ ☰ …

Underactuated Robotics - 欠驱动机器人学(一)- 全驱动与欠驱动系统

系列文章目录 前言 如今的机器人行动过于保守,只能完成机械性能所能完成的一小部分任务,实现一小部分性能。在某些情况下,我们仍然从根本上受限于在结构化工厂环境中成熟的刚性机械臂控制技术,在这种环境中,可以使用大…