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


(一)下载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行、第473行、第843行代码中的 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
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值