2431 字
12 分钟
使用YOLO V11进行图像识别
2024-10-27
无标签

早就听闻YOLO的大名,最近偶然得知更新了v11版本,于是自己也想折腾一下。不过照着网上的教程还是踩了很多坑,于是在这里对看过的教程做一个整合。

关于YOLO版本#

其实可以看出每个YOLO版本之间并不是严格的迭代关系,个人理解是有些组织或者个人做出了一些改进之后就会升一个版本号,比如v6是美团开源的,而v10是清华大学团队的成果。

不过经常听说的v5和v8还是这家Ultralytics公司发布的,而v11也是该公司最新发布的版本。

由于博主也是第一次接触python语言,因此以下内容如果有错误还请见谅。

搭建Python环境#

建议直接使用Anaconda,可以灵活切换Python版本(类似于nvm?而且马上就会遇到一个由于版本过高导致软件不能运行的问题),而且貌似还包含了很多常用的软件包。

我下载的时候对应的Python版本是3.12,这个版本意味着默认虚拟环境的Python版本会是3.12,如果你需要其他版本的Python可以在稍后创建新的虚拟环境,或是下载旧版的Anaconda。

然后是一些安装选项,基本按照默认勾选的来就行。那个添加到环境变量的选项官方标记为了不推荐,可能会与其他应用起冲突,不勾这项的话就不能在普通命令行当中使用conda命令,而必须在 Anaconda (Powershell) Prompt中才能使用相关命令。

然后就是选一款IDE,VSCode当然很好用,但是我还是更喜欢那种开箱即用的软件,因此我选择PyCharm。

准备训练集#

不要被这个名词吓到了,最起码YOLO的训练集的准备还是很简单的。

训练集的标注可以用LabelImg,不过这个软件的仓库已经归档了,相关开发转到了更为强大的Label Studio当中,如果有兴趣可以自行前往Github进行查看和部署。

猜测是不再维护的原因,该软件在Python3.12环境下运行会报错和闪退,因此必须更换一个更低的Python版本。我这里测试的3.9的版本就可以正常运行,因此在安装之前先新建一个3.9的虚拟环境。

Terminal window
# 新创建一个Python3.9的虚拟环境
conda create -n env-name python=3.9
# 激活该环境
conda activate env-name

随后在该环境下进行安装。

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

如果你用的是官方Python环境,安装这里可能会报错缺少C++编译器什么的,在网上搜索相关教程安一个即可。

安装完成后输入labelimg即可打开软件。

然后就是图片的准备了,图片要分为两类,一类是训练用的图片,一类是用来测试模型准确度的图片,一般来说用于测试的图片不用太多(coco数据集当中有118287张图片用于训练,5000张图片用于测试)

勾选自动保存和显示标签选项,并将格式选择为YOLO,点击Change Save Dir选择标注文件保存路径(不要和图片放在同一个路径下),选择Open Dir打开装有图片的文件夹

打开文件夹后即可进行标注,选择Create RectBox框住要识别的物体,并打上标签。然后选择下一个图片进行标注。

由于勾选了自动保存,无需手动保存即可得到标注文件。

数据集的结构应该类似于这样:

├─images //存放图片
│ ├─test
│ └─train
└─labels //存放标注文件
├─test
└─train

相关快捷键:

Ctrl + uLoad all of the images from a directory
Ctrl + rChange the default annotation target dir
Ctrl + sSave
Ctrl + dCopy the current label and rect box
Ctrl + Shift + dDelete the current image
SpaceFlag the current image as verified
wCreate a rect box
dNext image
aPrevious image
delDelete the selected rect box
Ctrl++Zoom in
Ctrl—Zoom out
↑→↓←Keyboard arrows to move selected rect box

Tip:该软件是由PyQt编写的,如果你正好有Qt的相关环境,可以尝试下载源码编译为exe文件运行。

安装PyTorch#

在安装之前确定好你想把PyTorch安装在哪个环境下,使用conda env list来查看所有环境,conda activate env-name来激活该环境。

Windows下只支持Cuda(Nvidia显卡)和CPU,而不支持ROCm(AMD显卡),因此如果使用A卡应该考虑换个系统。

使用Nvidia显卡在命令行输入nvidia-smi来确定CUDA版本。

PyTorch官网选择对应的系统和版本即可得到安装命令,直接复制粘贴即可进行安装。例如我这里是Windows + CUDA12.4

等待安装完成即可。

配置开发工具#

这里以PyCharm为例。

先拉取YOLO V11 仓库

ultralytics/ultralytics: Ultralytics YOLO11 🚀

Terminal window
git clone https://github.com/ultralytics/ultralytics.git

然后使用PyCharm打开,将运行环境设置为刚才安装了PyTorch的虚拟环境。

Anaconda的执行文件选择安装目录下的/script/conda.exe。

开始训练#

先在选定的环境下安装ultralytics软件包:

Terminal window
# Install the ultralytics package from PyPI
pip install ultralytics

准备好数据集,新建一个data.yml文件

# dataset path
train: ../ultralytics/datasets/images/train # 用于训练的图片路径
val: ../ultralytics/datasets/images/test # 用于验证的图片路径
test: ../ultralytics/datasets/images/train # 用于测试的图片路径
# number of classes
nc: 2
# class names
names: ['ding', 'jia'] # 这里可以看刚才标注文件的保存牡蛎下有一个classes.txt文件,把其中的文件复制过来,注意一定要按顺序。

在训练之前先下载一个预训练模型(仓库的readme文件当中有下载地址),下载适用于物体识别的已经在coco数据集上进行预训练的模型。主要区别在于模型的大小和参数量不同,供不同性能的设备使用。

关于这个预训练模型有什么用,这是GPT给出的回答:

在预训练模型的基础上训练和直接从头开始训练有几个主要区别:

  1. 训练时间
    • 预训练模型:通常需要的训练时间较短,因为模型已经在大规模数据集上学习到了基本特征。
    • 直接训练:需要从零开始训练,时间较长,尤其是在数据集较大的情况下。
  2. 数据需求
    • 预训练模型:通常需要较少的标注数据来达到较好的效果,因为模型已经有了良好的初始权重。
    • 直接训练:需要大量的标注数据才能获得良好的性能,特别是在复杂任务中。
  3. 模型性能
    • 预训练模型:往往能够更快地收敛到较高的性能,因为它已经学习到了许多有用的特征。
    • 直接训练:模型性能的提升往往较慢,且可能容易陷入过拟合,尤其是在样本不足的情况下。
  4. 特征学习
    • 预训练模型:已经学习到了一些通用的特征,可以更好地捕捉到复杂模式。
    • 直接训练:模型从头开始学习所有特征,可能会错过一些重要的模式。
  5. 灵活性
    • 预训练模型:可以通过微调来适应特定任务,适合多种应用。
    • 直接训练:可能需要更多的实验和调参才能达到理想效果。

总体来说,使用预训练模型可以更快地实现高效的目标检测,而直接训练则适合在数据丰富且特定于某一任务的情况下。

新建一个py文件,填入以下代码,data项替换成上面编写的data.yaml路径:

from ultralytics import YOLO
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'
# Load a model
model = YOLO("yolo11n.pt") # load a pretrained model (recommended for training)
# Train the model
if __name__ == '__main__':
results = model.train(data="./data.yaml", epochs=100, batch=4, device='0', imgsz=640, workers=2, cache=False,
amp=True, mosaic=False, project='runs/train', name='anc')

其中epoch是训练轮数,batch是每轮训练的图片数量,依据你的显存大小进行调整。

编写好后右键运行即可。

训练好后可以在保存目录下看到训练好的模型和一堆训练数据。

其中best.pt是最优模型,last.pt是最后一次训练的模型,因为训练不是越多越好,一般用best.pt

Tip:如果你要导出onnx等其他格式,可以参照官网文档进行操作。

推理#

直接复制官网代码:

from ultralytics import YOLO
# Load a model
model = YOLO("./runs/train/anc/weights/best.pt") # 换成刚才训练好的模型
# Run batched inference on a list of images
results = model(["./R (1).jpg"]) # return a list of Results objects # 填入需要进行识别的图片路径
# Process results list,根据实际业务需要进行调整
for result in results:
boxes = result.boxes # Boxes object for bounding box outputs
masks = result.masks # Masks object for segmentation masks outputs
keypoints = result.keypoints # Keypoints object for pose outputs
probs = result.probs # Probs object for classification outputs
obb = result.obb # Oriented boxes object for OBB outputs
result.show() # display to screen
result.save(filename="result.jpg") # save to disk

运行即可得到结果

其他#

本文只介绍了基本的步骤,而模型的训练是一个相当复杂的过程,为了得到尽可能好的模型需要进行调参等其他操作。

导出onnx等其他格式的模型可以在其他框架当中运行。

参考文章#

  1. YOLOv11入门到入土使用教程(含结构图)_yolo11 模型结构图-CSDN博客
  2. 深度学习工具|LabelImg(标注工具)的安装与使用教程_labelimg安装-CSDN博客
  3. 安装PyTorch详细过程_pytorch安装-CSDN博客
  4. anaconda的安装和使用(管理python环境看这一篇就够了)-CSDN博客
使用YOLO V11进行图像识别
https://next.ivmiku.com/posts/241027/
作者
iVMiku
发布于
2024-10-27
许可协议
CC BY-NC-SA 4.0