【YOLOv5】利用Kaggle的GPU训练(运行)yolov5模型(项目)

news2024/11/24 5:41:00

文章目录

      • (一)下载YOLOv5源码
      • (二)修改YOLOv5源码
        • 1、修改输出文件的保存路径(适应Kaggle的输出路径)
        • 2、在data文件夹中新建一个yaml文件
        • 3、在 train.py 中修改data路径
        • 4、指定训练的轮数
        • 5、修改模型配置文件
        • 6、在 train.py 中修改模型配置文件(yolov5s.yaml)路径
        • 7、修改 loss.py 文件
        • 8、修改 plots.py 文件
        • 9、下载预训练权重
        • 10、添加预训练权重文件
        • 11、在 train.py 中修改预训练权重文件(yolov5s.pt)路径
        • 12 、修改datasets.py和general.py文件
        • 14、Arial.ttf字体下载报错问题
        • 15、共需修改的代码文件
      • (三)在Kaggle上部署项目
        • 1、删除 .cache 文件
        • 2、把源码本地打包成.zip格式上传到Kaggle的Datasets上
        • 3、新建一个笔记本(notebook),用来运行代码
        • 4、使用GPU
        • 5、部署环境
        • 6、运行测试
        • 7、离线训练前准备
        • 8、离线训练
        • 9、下载输出文件
      • (四)此次用到的项目下载
      • (五)记录一下可运行YOLOv5所需库的一个CPU版本


(一)下载YOLOv5源码

YOLOv5 开源代码项目下载地址:https://github.com/ultralytics/yolov5


(二)修改YOLOv5源码

1、修改输出文件的保存路径(适应Kaggle的输出路径)

train.py 中把以下代码

    parser.add_argument('--project', default=ROOT / 'runs/train', help='save to project/name')

修改为:

	# 采用kaggele训练模型一定要修改文件的保存路径
    parser.add_argument('--project', default= '/kaggle/working/runs/train', help='save to project/name')  
2、在data文件夹中新建一个yaml文件

在data文件夹中新建一个yaml文件(文件名可自取,例如我的是:mydata.yaml),向mydata.yaml文件中复制以下内容:

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: /kaggle/input/yolov5-animals/yolov5-6.0/data/dataset  # dataset root dir
train: train/images  # train images (relative to 'path') 128 images
val: val/images  # val images (relative to 'path') 128 images
test: test/images # test images (optional)

# Classes
nc: 11  # number of classes
names: ["animals", "cat", "chicken", "cow", "dog", "fox", "goat", "horse", "person", "racoon", "skunk"]  # class names

注意:
(1)、path为自己数据集的文件夹名称,要根据的数据集放置自己项目路径下的哪个位置进行更改。
之所以将 path: /kaggle/input/yolov5-animals/yolov5-6.0/data/dataset ,是因为等下要将项目上传到Kaggle中运行。
路径中的 yolov5-animals 为你等下上传项目到Kaggle所起的名字,需保证与上传到Kaggle时所起的名字一致。
在这里插入图片描述
(2)、代码中的类别数(number of classes)和类别名称(class names)需更改为自己的。

3、在 train.py 中修改data路径

train.py 中把以下代码

    parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='dataset.yaml path')

修改为:

    parser.add_argument('--data', type=str, default=ROOT / 'data/mydata.yaml', help='dataset.yaml path')
4、指定训练的轮数
	# 训练的轮数
    parser.add_argument('--epochs', type=int, default=300)

default=300表示训练300轮,可根据自身需求进行修改

5、修改模型配置文件

在这里插入图片描述
选择一个你想要导入的模型文件,例如这里选择yolov5s.yaml,在models文件夹下将yolov5s.yaml文件中的类别数(number of classes)更改为你自己的。
在这里插入图片描述

6、在 train.py 中修改模型配置文件(yolov5s.yaml)路径

train.py 中把以下代码

    parser.add_argument('--cfg', type=str, default='', help='model.yaml path')

修改为:

    parser.add_argument('--cfg', type=str, default=ROOT / 'models/yolov5s.yaml', help='model.yaml path')
7、修改 loss.py 文件

在 utils 文件夹中找到 loss.py 文件,把第173行代码进行修改。

gain = torch.ones(7, device=targets.device).long()

在这里插入图片描述

8、修改 plots.py 文件

如果在训练模型时报错:AttributeError: ‘FreeTypeFont’ object has no attribute ‘getsize’
在 utils 文件夹中找到 plots.py 文件,如下图进行修改。

import PIL
def check_version(target_version):
    """
    Check if the current PIL version is greater than or equal to the target version.

    Args:
        target_version (str): The target version string to compare against (e.g., '9.2.0').

    Returns:
        bool: True if the current PIL version is greater than or equal to the target version, False otherwise.
    """
    current_version = PIL.__version__
    current_version_parts = [int(part) for part in current_version.split('.')]
    target_version_parts = [int(part) for part in target_version.split('.')]

    # Compare version parts
    for cur, tgt in zip(current_version_parts, target_version_parts):
        if cur > tgt:
            return True
        elif cur < tgt:
            return False

    # If all parts are equal, the versions are equal or current version is shorter
    return True
            if check_version('9.2.0'):
                self.font.getsize = lambda x: self.font.getbbox(x)[2:4]  # text width, height

在这里插入图片描述

或者直接降低pillow包的版本
!pip install pillow==9.5

9、下载预训练权重

预训练权重下载地址:https://github.com/ultralytics/yolov5/releases
根据自己需要选择预训练权重(注意要和源码版本对上)
下拉找到对应版本的 “Assets“ 导栏,在 “Assets“ 导栏 中选择所需文件进行下载。
在这里插入图片描述

10、添加预训练权重文件

在项目的根目录下新建一个文件夹“weights”(名字可自取),将下载的预训练权重文件(如:yolov5s.pt)存放在该文件夹下。
在这里插入图片描述

11、在 train.py 中修改预训练权重文件(yolov5s.pt)路径

train.py 中把以下代码

    parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')

修改为:

    parser.add_argument('--weights', type=str, default=ROOT / 'weights/yolov5s.pt', help='initial weights path')
12 、修改datasets.py和general.py文件

numpy版本numpy.int在NumPy 1.20中已弃用,在NumPy1.24中已删除。如果你使用了这些版本可能会报错:AttributeError: module numpy has no attribute int 。

在 utils 文件夹下找到 datasets.py和general.py文件
在datasets.py中,分别将第445行、第474行、第845行代码中的 np.int 改为 int
在general.py中,将第470行代码中的 np.int 改为 int

14、Arial.ttf字体下载报错问题

【问题描述】
在使用yolov5进行模型训练时,会自动下载Arial.ttf文件,而如果我们把代码部署到Kaggle或其他服务器上运行是无法下载Arial.ttf字体文件的,具体报错信息如下:
在这里插入图片描述
【解决方式】
看到有网友说可以预先从 https://ultralytics.com/assets/Arial.ttf这里将Arial.ttf下载放在yolov5的根目录下,就可以避免Arial.ttf字体会自动下载。但有些版本里的下载指令是不会先对文件夹里是否有arial字体作出判断再下载的,所以这个方法可能是行不通的,就看你的版本是怎么做这个决策的了。

另一种解决方式如下。
参考文章:

yolov5-6.0版本服务器配置训练遇到的问题

在文件yolov5/utils/plots.py中对Arial.ttf的引用定义作出修改。
把以下代码

class Annotator:
    if RANK in (-1, 0):
        check_font()  # download TTF if necessary

    # YOLOv5 Annotator for train/val mosaics and jpgs and detect/hub inference annotations
    def __init__(self, im, line_width=None, font_size=None, font='Arial.ttf', pil=False, example='abc'):

修改为

class Annotator:
	#if RANK in (-1, 0):
        # check_font()  # download TTF if necessary
    # YOLOv5 Annotator for train/val mosaics and jpgs and detect/hub inference annotations
    def __init__(self, im, line_width=None, font_size=None, font='', pil=False, example='abc'):

这可能是系统一种字体的缺失,需要下载,但是服务器上下载不了,直接注释掉代码就可以了。

如果在之后运行的时候,会出现报错:

UnicodeEncodeError: 'ascii' codec can't encode character '\U0001f680' in position 99: ordinal not in`

解决步骤:
1、命令前添加:PYTHONIOENCODING=utf-8
例如:PYTHONIOENCODIN在报错的文件开头添加G=utf-8 python train.py
2、在报错的文件开头添加

import sys
import importlib
importlib.reload(sys)
import codecs
sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())
15、共需修改的代码文件

在这里插入图片描述


(三)在Kaggle上部署项目

1、删除 .cache 文件

检查数据集中是否存在 .cache文件,若有,则进行删除。
在这里插入图片描述

2、把源码本地打包成.zip格式上传到Kaggle的Datasets上

注:上传时需要挂代理/梯子

在这里插入图片描述

3、新建一个笔记本(notebook),用来运行代码

在这里插入图片描述

4、使用GPU

在这里插入图片描述

5、部署环境
!pip install -U -r /kaggle/input/yolov5-animals/yolov5-6.0/requirements.txt

在这里插入图片描述

注意:第一次运行上述代码时,可能会失败,这是由于有的环境包的版本与其他包有冲突,那么kaggle会自动匹配不冲突的版本并进行下载。因此第一次运行失败后,应重启内核,该按钮位置如下图所示:
在这里插入图片描述
之后再次运行部署环境的命令即可。(如果还是出现红色字体报错,则重复以上操作,直至不报错)

6、运行测试

先定义epochs=5,看代码是否能正常运行。

!python /kaggle/input/yolov5-animals/yolov5-6.0/train.py --data /kaggle/input/yolov5-animals/yolov5-6.0/data/mydata.yaml --batch-size 32 --epochs 5 --cfg /kaggle/input/yolov5-animals/yolov5-6.0/models/yolov5s.yaml --weights /kaggle/input/yolov5-animals/yolov5-6.0/weights/yolov5s6.pt
'''
!python /kaggle/input/yolov5-animals/yolov5-6.0/train.py 
--data /kaggle/input/yolov5-animals/yolov5-6.0/data/mydata.yaml 
--batch-size 32 
--epochs 5 
--cfg /kaggle/input/yolov5-animals/yolov5-6.0/models/yolov5s.yaml 
--weights  /kaggle/input/yolov5-animals/yolov5-6.0/weights/yolov5s6.pt
'''

如果遇到以下错误:
在这里插入图片描述
则使用以下命令把对应文件复制到 /kaggle/working/ 下(例如这里的weights文件夹下的yolov5s6.pt文件):

!cp -r /kaggle/input/yolov5-animals/yolov5-6.0/weights /kaggle/working/

在这里插入图片描述
可看到weights文件夹及该文件夹里的yolov5s6.pt文件已经被复制到 /kaggle/working/ 文件夹下。

然后执行以下命令看代码是否能正常运行。

!python /kaggle/input/yolov5-animals/yolov5-6.0/train.py --data /kaggle/input/yolov5-animals/yolov5-6.0/data/mydata.yaml --batch-size 32 --epochs 5 --cfg /kaggle/input/yolov5-animals/yolov5-6.0/models/yolov5s.yaml --weights /kaggle/working/weights/yolov5s.pt
'''
!python /kaggle/input/yolov5-animals/yolov5-6.0/train.py 
--data /kaggle/input/yolov5-animals/yolov5-6.0/data/mydata.yaml 
--batch-size 32 
--epochs 5 
--cfg /kaggle/input/yolov5-animals/yolov5-6.0/models/yolov5s.yaml 
--weights /kaggle/working/weights/yolov5s.pt
'''

可以看到代码能够正常无误的运行。
在这里插入图片描述

7、离线训练前准备

1、在notebook中把!pip install -U -r /kaggle/input/yolov5-data/yolov5_6/requirements.txt删去
2、把epochs进行修改(比如我想离线训练500轮就调为500)
在这里插入图片描述

8、离线训练

当调试代码成功运行后,由于深度学习模型训练都需要耗费大量的时间,而像kaggle这种线上的训练网站可能会出现内核挂掉,所以我们可以在进入训练状态后选择保存此时的版本,让模型离线训练,这样我们就只要在训练完成后下载权重文件即可。
但是需要注意的:第一,虽然kaggle每周给予每人41小时的免费gpu时长,但是一次训练最长持续12个小时,超过时长则会自动停止训练。第二,当你选择保存版本离线训练时,需要注意此时离线训练的环境也在使用你的gpu免费训练时长,如果你不退出kaggle而是继续开启gpu看着模型训练,那么你将会使用两倍的gpu训练时长。下面是离线训练的操作:

  • 1、点击 Save Version
    在这里插入图片描述
  • 2、进行相关选择
    在这里插入图片描述
  • 3、点击 Save 后可以看到一个正在运行的笔记本
    在这里插入图片描述
  • 4、此时可以将环境重新改为None,避免消耗两倍的GPU时长
    在这里插入图片描述
9、下载输出文件

kaggle的output没办法直接下载文件夹,倒是可以下载文件,当你的训练模型很多个文件的时候, 一个一个下载太慢了, 所以先将output压缩一下,然后下载就可以了。
在cell中运行以下代码:

import os
import zipfile
import datetime

def file2zip(packagePath, zipPath):
    '''
  :param packagePath: 文件夹路径
  :param zipPath: 压缩包路径
  :return:
  '''
    zip = zipfile.ZipFile(zipPath, 'w', zipfile.ZIP_DEFLATED)
    for path, dirNames, fileNames in os.walk(packagePath):
        fpath = path.replace(packagePath, '')
        for name in fileNames:
            fullName = os.path.join(path, name)
            name = fpath + '\\' + name
            zip.write(fullName, name)
    zip.close()


if __name__ == "__main__":
    # 文件夹路径
    packagePath = '/kaggle/working/'
    zipPath = '/kaggle/working/output.zip'
    if os.path.exists(zipPath):
        os.remove(zipPath)
    file2zip(packagePath, zipPath)
    print("打包完成")
    print(datetime.datetime.utcnow())

(四)此次用到的项目下载

上传到Kaggle训练的源码和在本地(CPU)运行的源码在个人博客的资源可进行下载:个人博客主页下载资源


(五)记录一下可运行YOLOv5所需库的一个CPU版本

Package                 Version
----------------------- --------------------
absl-py                 2.1.0
cachetools              5.3.3
certifi                 2024.2.2
charset-normalizer      3.3.2
colorama                0.4.6
contourpy               1.1.1
cycler                  0.12.1
filelock                3.13.4
fonttools               4.51.0
fsspec                  2024.3.1
google-auth             2.29.0
google-auth-oauthlib    1.0.0
grpcio                  1.62.1
idna                    3.7
importlib_metadata      7.1.0
importlib_resources     6.4.0
Jinja2                  3.1.3
kiwisolver              1.4.5
Markdown                3.6
MarkupSafe              2.1.5
matplotlib              3.7.5
mpmath                  1.3.0
networkx                3.1
numpy                   1.20.3
oauthlib                3.2.2
opencv-python           4.9.0.80
packaging               24.0
pandas                  2.0.3
pillow                  10.3.0
pip                     23.3.1
protobuf                5.26.1
pyasn1                  0.6.0
pyasn1_modules          0.4.0
pyparsing               3.1.2
python-dateutil         2.9.0.post0
pytz                    2024.1
PyYAML                  6.0.1
requests                2.31.0
requests-oauthlib       2.0.0
rsa                     4.9
scipy                   1.10.1
seaborn                 0.13.2
setuptools              68.2.2
six                     1.16.0
sympy                   1.12
tensorboard             2.14.0
tensorboard-data-server 0.7.2
thop                    0.1.1.post2209072238
torch                   2.2.2
torchvision             0.17.2
tqdm                    4.41.0
typing_extensions       4.11.0
tzdata                  2024.1
urllib3                 2.2.1
Werkzeug                3.0.2
wheel                   0.41.2
zipp                    3.18.1

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

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

相关文章

C语言 | Leetcode C语言题解之第38题外观数列

题目&#xff1a; 题解&#xff1a; class Solution { public:string countAndSay(int n) {string s "1", ans "1";for (int i 2; i < n; i) {ans "";for (int j 0; j < int(s.size()); ) {int k j;while(k < int(s.size()) &am…

使用yolov8 进行实例分割训练

1、基于windows 的ISAM标注 直接下载安装包&#xff0c;解压后即可使用 链接&#xff1a;https://pan.baidu.com/s/1u_6jk-7sj4CUK1DC0fDEXQ 提取码&#xff1a;c780 2、标注结果转yolo格式 通过ISAM标注后的json文件路径 原始json格式如下&#xff1a; ISAM.json 转 yolo.…

[阅读笔记1][GPT-3]Language Models are Few-Shot Learners

首先讲一下GPT3这篇论文&#xff0c;文章标题是语言模型是小样本学习者&#xff0c;openai于2020年发表的。 这篇是在GPT2的基础上写的&#xff0c;由于GPT2还存在一些局限&#xff0c;这篇对之前的GPT2进行了一些完善。GPT2提出了多任务学习&#xff0c;也就是可以零样本地用在…

深入剖析跨境电商平台风控机制,探索测评安全与稳定的秘诀

在跨境电商测评市场鱼龙混杂的当下&#xff0c;测评过程中可能隐藏的陷阱保持高度警觉。多年的测评经验告诉我们&#xff0c;选择一个适合的测评系统对于项目的成功至关重要。近年来&#xff0c;测评技术如雨后春笋般涌现&#xff0c;市场上涌现出众多测评系统&#xff0c;覆盖…

SQL-Oracle 获取最大值,第二大,第三大,第 N 大值

目录 1、原始数据2、获取最大值记录3、获取第二大值记录4、获取第三大值记录 1、原始数据 select * from test_2024_04_15_001 order by 销量 desc,渠道2、获取最大值记录 select 渠道,销量 from ( select a.渠道, a.销量 from test_2024_04_15_001 a order by a.销量 desc,…

Pytorch实用教程:nn.CrossEntropyLoss()的用法

在 PyTorch 中&#xff0c;nn.CrossEntropyLoss() 是一个非常常用且功能强大的损失函数&#xff0c;特别适合用于多类分类问题。这个损失函数结合了 nn.LogSoftmax() 和 nn.NLLLoss() (Negative Log Likelihood Loss) 两个操作&#xff0c;从而在一个模块中提供完整的交叉熵损失…

Spring Boot与Vue联手打造前沿智能学习平台

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

windows下vscode调试虚拟机linux c++工程的三种方法

vscode去远程调试方法有很多种&#xff0c;不同的插件对应了不同的调试方法&#xff0c;比如&#xff1a; 1.C/C插件进行GDB调试(编写launch.json文件) 2.C/C Runner插件 3.CMake Tools插件&#xff08;只针对CMake工程&#xff0c;需要搭配C/C插件一起使用&#xff0c;但无…

【系统分析师】系统测试与维护

文章目录 1、测试方法2、测试阶段3、面向对象的测试4、测试自动化5、软件调试6、软件评审7、软件改进过程8、软件开发环境与工具9、系统转换计划10、系统的运行与维护11、系统审计 1、测试方法 例题 2、测试阶段 注意区分:每个阶段都做了什么事情3、面向对象的测试 4、测试自动…

设计模式之模板方法模式详解(下)

3&#xff09;钩子方法的使用 1.概述 钩子方法的引入使得子类可以控制父类的行为。 2.结构图 3.代码实现 将公共方法和框架代码放在抽象父类中 abstract class DataViewer {//抽象方法&#xff1a;获取数据public abstract void GetData();//具体方法&#xff1a;转换数据…

【传输层】

文章目录 传输层传输服务和协议传输层 vs. 网络层Internet传输层协议多路复用/解复用在发送方主机多路复用在接收方主机多路解复用 多路解复用工作原理无连接&#xff08;UDP&#xff09;多路解复用无连接传输&#xff1a;UDPUDP&#xff1a;用户数据报协议UDP校验和 传输层 目…

华为服务Fellow、首席项目管理专家,华为H5M项目管理标准制定主导者孙虎受邀为PMO大会演讲嘉宾

全国PMO专业人士年度盛会 华为服务Fellow、首席项目管理专家&#xff0c;华为H5M项目管理标准制定主导者孙虎先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“落地项目管理标准&#xff0c;打赢班长的战争”。大会将于5月25-26日在北京举办&am…

excel中vlookup查找值必须在table_array的第一列,有其他办法吗有XLOOKUP

vlookup查找值必须在table_array的第一列&#xff0c;有其他办法吗&#xff1f;有XLOOKUP。 vlookup 查找如下&#xff0c;查找值必须在table_array的第一列 如果下面&#xff0c;编码和名称交换位置&#xff0c;就不能使用vlookup查找了。 XLOOKUP 查找如下

电脑桌面便签软件哪个好?好用的电脑桌面便签

电脑作为我们日常工作的重要工具&#xff0c;承载着大量的任务和项目。当工作任务繁重时&#xff0c;如何在电脑桌面上高效管理这些任务就显得尤为重要。这时&#xff0c;选择一款优秀的桌面便签软件&#xff0c;无疑会给我们带来极大的便利。 一款好的桌面便签软件&#xff0…

注意力机制基本思想(一)

​&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客&#x1f525; 系列专栏&#xff1a; &#x1f3c0;《深度学习基础知识》 相关专栏&#xff1a; ⚽《机器学习基础知识》 &#x1f3d0;《机器学习项目实战》 &#x1f94e;《深度学习项目实战…

2024年华中杯B题论文发布+数据预处理问题一代码免费分享

【腾讯文档】2024年华中杯B题资料汇总 https://docs.qq.com/doc/DSExMdnNsamxCVUJt 行车轨迹估计交通信号灯周期问题 摘要 在城市化迅速发展的今天&#xff0c;交通管理和优化已成为关键的城市运营问题之一。本文将基于题目给出的数据&#xff0c;对行车轨迹估计交通信号灯…

记录Python链接mysql的数据库的2种操作方式

一、使用pymysql库方式 import pymysqldb pymysql.connect(hostlocalhost,userroot,password123456) #创建链接&#xff0c;在3.8以后好像已经不支持这个种链接方式了&#xff0c; #db pymysql.connect(localhost,root,123456) cursor db.cursor()#拿到游标这样我们就拿到了…

Rust 语言 GUI 用户界面框架汇总(持续更新)

拜登&#xff1a;“一切非 Rust 项目均为非法”&#x1f60e; 什么是 GUI 图形用户界面&#xff08;Graphical User Interface&#xff0c;简称 GUI&#xff0c;又称图形用户接口&#xff09;是指采用图形方式显示的计算机操作用户界面。 现在的应用开发&#xff0c;是既要功…

云从科技AI智能体云月亮相中国铁建GSF项目展示中心

近日&#xff0c;中国铁建大湾区科学论坛永久会址项目综合展示体验中心&#xff08;以下简称“中国铁建GSF项目展示中心”&#xff09;迎来了一位特别的客服——云月数智人。云月是云从从容多模态大模型的融合承载体——AI智能体&#xff08;AI-Agent&#xff09;&#xff0c;她…

设计模式系列:适配器模式

简介 适配器模式&#xff08;Adapter Pattern&#xff09;又称为变压器模式&#xff0c;它是一种结构型设计模式。适配器模式的目的是将一个类的接口转换成客户端所期望的另一种接口&#xff0c;从而使原本因接口不匹配而不能一起工作的两个类能够一起工作。 适配器模式有两种…