前言

好玩的,本来想用v8搞的,结果发现v10都用了,貌似精度也更好,那就换个环境再继续。


环境搭建

先用Pycharm创建一个新环境,然后从Github上下载yolov10源码:

git clone https://github.com/THU-MIG/yolov10.git

将源码拉取到本地后,需要根据官方指南安装项目所需的依赖:

pip install -r requirements.txt
pip install -e .

遇到版本不可寻的问题:

Could not find a version that satisfies the requirement opencv-python==4.9.0.80
ERROR: No matching distribution found for opencv-python==4.9.0.80

去仓库看了看,这个版本的opencv是存在的,再次尝试直接用pip安装opencv成功了,感觉是玄学的网络问题。

yolov10环境完成后,可以再装个pyautogui用于后续的键鼠操作:

pip install pyautogui

貌似环境里已经有了,至此环境搭建完成。

训练模型

首先在官方Github下载预训练模型:

pip install git+https://github.com/THU-MIG/yolov10.git

遇到网络问题:

unable to access 'https://github.com/THU-MIG/yolov10.git/': Failed to connect to github.com port 443

搜索一下,找到解决方案为刷新DNS缓存,在cmd中输入命令:

ipconfig/flushdns

预训练模型下载完成,根据官方示例,简单测试一下:

# -*- coding:utf8 -*-

from ultralytics import YOLOv10

model = YOLOv10.from_pretrained('jameslahm/yolov10n')
model.predict("cat.jpg", save=True)

得到检测结果,看起来不错:

然后进入准备的游戏游玩,同时录制完成每日委托的游玩视频,准备截图用于制作数据集,我这里录制了四天的份量,先做个简单的模型测试一下效果。

大地图

收集了67张图片,主要用于检测正在处理的委托和传送点,然后上传到标注网站roboflow进行标注

一张张图片打开进行标注:

标注完成后,按照推荐比例生成训练集,验证集和测试集:

最后导出到本地:

开始训练:

# -*- coding:utf8 -*-

from ultralytics import YOLOv10

model = YOLOv10.from_pretrained('jameslahm/yolov10n')
model.train(data="../../../../datasets/data.yaml", epochs=500, imgsz=640, device=0, batch=16)

但是在使用CUDA时发生问题:

ValueError: Invalid CUDA 'device=0' requested. Use 'device=cpu' or pass valid CUDA device(s) if available, i.e. 'device=0' or 'device=0,1,2,3' for Multi-GPU.

在网上搜索得到解决方法,应该是安装的torch为CPU版本导致的,需要卸载重装。

卸载:

pip uninstall torch torchvision torchaudio

找到对应版本重装:

pip install torch==2.3.0 torchvision==0.18.0 torchaudio==2.3.0 --index-url https://download.pytorch.org/whl/cu118

要下载挺久的,完成后重新开始训练,遇到新的问题:

CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: cudnnFinalize Descriptor Failed cudnn_status

看起来可能是没有安装CUDNN导致的,尝试去官方网站下载安装一下,根据参考文章,将文件解压到CUDA文件夹后,可以使用CUDA\v12.0\extras\demo_suite目录下的deviceQuery程序验证安装:

PS C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.0\extras\demo_suite> .\deviceQuery.exe
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.0\extras\demo_suite\deviceQuery.exe Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

...

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 12.0, CUDA Runtime Version = 12.0, NumDevs = 1, Device0 = NVIDIA GeForce RTX 3060 Laptop GPU
Result = PASS
PS C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.0\extras\demo_suite> .\bandwidthTest.exe
[CUDA Bandwidth Test] - Starting...
Running on...
...

Result = PASS

NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.

据说获得两个Result = PASS就是CUDNN环境配置完成的标志。

再次开始训练,仔细看问题仍然存在异常类型为CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR:

CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR

那就不是CUDNN的问题,搜索找到参考文章,据说是Pytorch 2.3.0的问题,需要进行卸载重装降低版本,或者更新到2.3.1版本:

pip install --upgrade torch

发生警告:

torchvision 0.18.0+cu118 requires torch==2.3.0+cu118, but you have torch 2.3.1 which is incompatible.
torchaudio 2.3.0+cu118 requires torch==2.3.0+cu118, but you have torch 2.3.1 which is incompatible.

看来要把这两个依赖也一起升级才行:

pip install --upgrade torchvision torchaudio

完成,将torchaudio更新到2.3.1版本,torchvision更新到0.18.1:

Successfully installed torchaudio-2.3.1 torchvision-0.18.1

再次开始训练,结果问题又回来了:

ValueError: Invalid CUDA 'device=0' requested. Use 'device=cpu' or pass valid CUDA device(s) if available, i.e. 'device=0' or 'device=0,1,2,3' for Multi-GPU.

问题在于更新后的torch又变回了CPU版本的:

Ultralytics YOLOv8.1.34 🚀 Python-3.9.13 torch-2.3.1+cpu 

卸载后去掉前面的版本指定重新安装:

pip install torch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 --index-url https://download.pytorch.org/whl/cu118

再次遇到问题:

ERROR: THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE. If you have updated the package versions, please update the hashes. Otherwise, examine the package contents carefully; someone may
have tampered with them.

清除一下pip缓存再继续:

pip cache purge

问题依然存在,但是他文件还没下载完就在校验哈希,怀疑网络之类的问题导致的,尝试使用浏览器下载,等完成后再自行校验哈希。

下载完成后校验哈希,计算出哈希与torch官网给出的哈希一致:

PS C:\Users\Twings\Downloads> Get-FileHash .\torch-2.3.1+cu118-cp39-cp39-win_amd64.whl -Algorithm sha256

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA256          78C9E0206F40A9F12C0369B2737D78D1998244238384286FD5492B39299059A7

使用pip安装whl,然后继续安装torchvision等剩余依赖,全部完成后再次开始训练,发现总是有问题:

RuntimeError: 
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

搜索一下,给train方法添加workers=0的参数可以解决,继续训练,训练终于正常可以进行了,训练完成:

Validating runs\detect\train15\weights\best.pt...
Ultralytics YOLOv8.1.34 🚀 Python-3.9.13 torch-2.3.1+cu118 CUDA:0 (NVIDIA GeForce RTX 3060 Laptop GPU, 6144MiB)
YOLOv10n summary (fused): 285 layers, 2696366 parameters, 0 gradients, 8.2 GFLOPs
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 1/1 [00:00<00:00,  5.34it/s]
                   all         13         27      0.842        0.4      0.333      0.217
                 daily         13          9      0.271          1      0.616      0.402
             far daily         13          4      0.941          1      0.995      0.653
    state of the seven         13          4          1          0      0.037       0.02
              teleport         13          7          1          0     0.0102    0.00509
        under teleport         13          3          1          0    0.00653    0.00326
Speed: 0.5ms preprocess, 5.2ms inference, 0.0ms loss, 0.0ms postprocess per image
Results saved to runs\detect\train15

训练完成后,使用训练好的模型对验证集进行测试:

model_path = "runs/detect/train15/weights/best.pt"
validateImg_path = "datasets/valid/images"
model = YOLOv10(model_path)
for img in os.listdir(validateImg_path):
    if img.endswith(".jpg"):
        img_path = os.path.join(validateImg_path, img)
        results = model.predict(img_path, save=True)

效果:

感觉上训练效果很差,看来需要修改一下训练集数量和生成方法。

因为roboflow是个外网网站,使用起来没那么方便,所以这次使用的是本地标注工具labelimg,安装一下:

pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple

创建好数据集目录:

使用命令打开软件进行标注:

labelimg JPEGImages classes.txt

完成后,将数据集分割成训练集、验证集和测试集,配置好yaml文件,然后开始训练,遇到问题:

WARNING ⚠️ no labels found in detect set, can not compute metrics without labels

又回去看了看参考文章,应该是数据集格式的问题,现在的格式为voc格式的xml文件,需要转化为yolo格式的txt文件。

训练完之后测试了一下,感觉大部分检测效果还行,但是其中一类应该是由于样本量太少的原因检测不出来:

                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 1/1 [00:00<00:00,  5.74it/s]
                   all          5        162      0.782      0.582      0.645      0.408
                 daily          5         12          1          0      0.107     0.0608
             the_seven          5         15      0.659      0.933      0.903      0.645
              teleport          5        102      0.796      0.833      0.874      0.503
        under_teleport          5         33      0.673      0.561      0.694      0.422

贴一张预测结果图:


参考

官方手册

标注网站roboflow

深度学习(10)之Roboflow 使用详解:数据集标注、训练及下载

YOLOv10 正式发布!原理、部署、应用一站式齐全

目标检测:yolov8(ultralytics)训练自己的数据集,新手小白也能学会训练模型,一看就会


Python 机器学习

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

关于Java17下面的类加载问题
Python yolov8学习