YOLOV9保姆级教程

一、总述

这一篇则详细讲解如何配置YOLOv9,在本地电脑或者服务器都可,然后利用自己的数据集进行训练、推理、检测等。
在这里插入图片描述

二、YOLOv9代码下载

YOLOv9是原YOLOv7团队打造,提出了可编程梯度信息(PGI)的概念来应对深度网络实现多个目标所需的各种变化。 PGI可以为目标任务计算目标函数提供完整的输入信息,从而获得可靠的梯度信息来更新网络权值。此外,还设计了一种新的轻量级网络架构——基于梯度路径规划的通用高效层聚合网络(GELAN)。 GELAN的架构证实了PGI在轻量级模型上取得了优异的结果。

论文地址:YOLOv9论文地址
GitHub地址:GitHub代码下载地址

代码下载: 此处直接点击【Download ZIP】下载即可
此处直接点击【Download ZIP】下载即可

权重下载: 此处直接选择【YOLOv9-C】和【YOLOv9-E】下载即可
目前【YOLOv9-S】和【YOLOv9-M】无法下载,选择【YOLOv9-C】和【YOLOv9-E】下载即可
注意:目前【YOLOv9-S】和【YOLOv9-M】无法下载,应该是个BUG,相信很快就会得到解决。

在全部下载完成后,将权重文件放到yolov9文件夹内
权重文件放到yolov9文件夹

三、环境配置

在windows系统下打开Anaconda的终端,创造虚拟环境。

cd到yolov9所在文件夹

cd yolov9所在目录

在这里插入图片描述
创建虚拟环境
如下:输入 conda create -n yolov9(代表环境名称) python=3.8 (使用Python的版本),然后创建就可以了

conda create -n yolov9 python=3.8

在这里插入图片描述
环境安装完成后,conda activate yolov9进入刚才创建的环境(这块我设置的为v9,只是一个名称,无伤大雅)

是否安装环境所需基础包,输入y安装即可,安装完成如下图:
在这里插入图片描述

输入下面命令查看是否创建成功

conda env list

在这里插入图片描述

激活进入环境

conda activate yolov9

在这里插入图片描述
注:进入环境后,前面会从base变为yolov9

安装requirements.txt文件,后面加清华的镜像源效果更好。

//不加清华源
pip install -r requirements.txt
//加清华源
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

下载完毕
在这里插入图片描述

此时我们安装的只是基础的CPU状态,如果需要使用GPU训练,需要在pytorch中找到适合自己的cuda版本的torch口令然后下载
1、打开pytorch官网pytorch官网
在这里插入图片描述
2、向下翻动找到适配于自己cuda版本的指令

例如说我的是CUDA 11.7版本,就选择对应的cuda指令
在这里插入图片描述
注:经过测试,当英伟达显卡超过1060系列的,基本上使用这条指令即可(如出现不兼容情况,欢迎留言)

# CUDA 11.7
conda install pytorch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 pytorch-cuda=11.7 -c pytorch -c nvidia

等安装完毕后,gpu的训练环境就基本配置结束。
在这里插入图片描述

四、制作数据集

  1. 文件夹格式设置
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
  2. 划分数据集
    采用如下代码划分为训练数据集、验证数据集和测试数据集
# 将图片和标注数据按比例切分为 训练集和测试集
import shutil
import random
import os

# 原始路径
image_original_path = "E:/A/lycium_barbarum/datasets/mydata/images/"
label_original_path = "E:/A/lycium_barbarum/datasets/mydata/labels/"

cur_path = os.getcwd()

# 训练集路径
train_image_path = os.path.join(cur_path, "E:/A/lycium_barbarum/datasets/images/train/")
train_label_path = os.path.join(cur_path, "E:/A/lycium_barbarum/datasets/labels/train/")

# 验证集路径
val_image_path = os.path.join(cur_path, "E:/A/lycium_barbarum/datasets/images/val/")
val_label_path = os.path.join(cur_path, "E:/A/lycium_barbarum/datasets/labels/val/")

# 测试集路径
test_image_path = os.path.join(cur_path, "E:/A/lycium_barbarum/datasets/images/test/")
test_label_path = os.path.join(cur_path, "E:/A/lycium_barbarum/datasets/labels/test/")

# 训练集目录
list_train = os.path.join(cur_path, "E:/A/lycium_barbarum/datasets/train.txt")
list_val = os.path.join(cur_path, "E:/A/lycium_barbarum/datasets/val.txt")
list_test = os.path.join(cur_path, "E:/A/lycium_barbarum/datasets/test.txt")

train_percent = 0.8
val_percent = 0.1
test_percent = 0.1


def del_file(path):
    for i in os.listdir(path):
        file_data = path + "\\" + i
        os.remove(file_data)


def mkdir():
    if not os.path.exists(train_image_path):
        os.makedirs(train_image_path)
    else:
        del_file(train_image_path)
    if not os.path.exists(train_label_path):
        os.makedirs(train_label_path)
    else:
        del_file(train_label_path)

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

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


def clearfile():
    if os.path.exists(list_train):
        os.remove(list_train)
    if os.path.exists(list_val):
        os.remove(list_val)
    if os.path.exists(list_test):
        os.remove(list_test)


def main():
    mkdir()
    clearfile()

    file_train = open(list_train, 'w')
    file_val = open(list_val, 'w')
    file_test = open(list_test, 'w')

    total_txt = os.listdir(label_original_path)
    num_txt = len(total_txt)
    list_all_txt = range(num_txt)

    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从list_all_txt取出num_train个元素
    # 所以list_all_txt列表只剩下了这些元素
    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 + '.jpg'
        srcLabel = label_original_path + name + ".txt"

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

    file_train.close()
    file_val.close()
    file_test.close()

if __name__ == "__main__":
    main()


  1. 制作data.yaml文件
    新建yaml文件,其中yaml文件与YOLOV8类似

train: E:/A/lycium_barbarum/datasets/images/train # train images (relative to 'path') 128 images
val: E:/A/lycium_barbarum/datasets/images/val # val images (relative to 'path') 128 images
test: E:/A/lycium_barbarum/datasets/images/test # test images (optional)

nc: 2

# Classes
names: ['immaturate', 'mature']

五、开始训练

使用PyCharm打开yolov9文件夹,并将环境转为刚建立的yolov9虚拟环境环境
在这里插入图片描述

首先更改小错误,打开utils/loss_tal.py文件,到第167行,将p改为p[0]
在这里插入图片描述

其次打开trian.py文件,更改如下几个位置:
在这里插入图片描述
–weights : 此处更改为yolov9-c.pt的绝对路径
–cfg : 此处更改为yolov9-c.yaml的绝对路径
–data : 此处更改为data.yaml的绝对路径 ##上面4-3的data.yaml文件
–hyp : 此处更改为data/hyps/hyp.scratch-high.yaml
原本是data/hyps/hyp.scratch-low.yaml 但该文件内并未找到,,,猜测为YOLOv9作者调试过程中的小疏忽
–project : 此处更改为训练后文件保存的绝对路径
个人爱好,放源文件夹下太占地方,可不更改

最后开启正式训练:
trian.py文件下右键【run ‘train’】
在这里插入图片描述

运行正常
在这里插入图片描述

六、报错解决

attributeerror: ‘FreeTypeFont‘ object has no attribute ‘getsize‘

这是因为安装了新版本的 Pillow (10),pip install tf-models-official删除了该getsize 功能,降级到 Pillow 9.0.1 解决了该问题

# 降低版本
pip install Pillow==9.0.1

如有问题,欢迎大家一起交流,不胜感激!!!

  • 93
    点赞
  • 480
    收藏
    觉得还不错? 一键收藏
  • 85
    评论
要跑通YOLOv7保姆教程,可以按照以下步骤操作: 1. 首先,根据引用[1]中提到的文章,安装CPU环境下的OpenVINO,并参考该文章中的教程使用ONNX导出YOLOv7模型并调用接口进行摄像头推理预测。 2. 接下来,根据引用中的文章,详细学习如何配置YOLOv7代码。这个教程详细讲解了在本地电脑或者服务器上配置YOLOv7,并且使用自己的数据集进行训练、推理和检测等操作。 3. 参考引用中提到的文章,可以了解更多关于YOLOv7的实现和训练自己的数据集的详细教程。这些文章提供了有关YOLOv5和YOLOv7的目标检测和训练自己的数据集的具体步骤和方法。 通过按照这些教程的步骤进行操作,你应该能够跑通YOLOv7保姆教程,并且学习如何配置和训练自己的数据集。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [YOLOv7教程系列:一、基于自定义数据集训练专属于自己的目标检测模型(保姆教程,含数据集预处理),包含...](https://blog.csdn.net/weixin_45921929/article/details/126448031)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [YOLOv7保姆教程(个人踩坑无数)----训练自己的数据集](https://blog.csdn.net/weixin_55749226/article/details/128480595)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 85
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值