Utralytics YOLO V11🚀
之后做项目要用到YOLO,然后也是趁着这个机会捡一下YOLO的相关的知识,这篇博客记录一下,配置Utralytics建立一个训练YOLO的环境,然后使用官方提供的COCO.yaml文件进行自动下载和训练的完整过程,整个过程也是比较曲折,里面涉及到的细节有很多,最终是做出了一个可实现的版本。
Ultralytics是一家专注于开发先进计算机视觉模型的技术公司,特别是在目标检测和图像识别任务方面。它最为人知的是创建和维护了YOLO(You Only Look Once)系列模型,这些模型因其速度快、精度高而被广泛应用于实时目标检测。公司的模型,如YOLOv5和YOLOv8,旨在易于实现、高效并且在各种应用场景中具有很强的性能表现,包括安防系统和自动驾驶等领域。Ultralytics还提供工具、教程和开源代码,帮助工业和科研领域的用户更好地使用这些模型。
文章目录
1.新建Conda 虚拟环境
首先是要新建一个虚拟环境,10月份了,我之前用的都是3.10,然后我觉得python官方的最新的稳定版本应该是更新了,通过查看官网我发现,现在的最新的稳定版本是3.11了,所以的话这次打算安装了一个最新的稳定版本。
https://www.python.org/downloads/
- 在Anaconda 命令提示窗中输入如下新建环境命令(这里由于我之前安装过其他3.11版本,所以没出进度条直接用的本地缓存进度)
conda create --name ultralytics python=3.11
- 在命令提示行内输入python,可以看到安装的python版本,我们的命令安装的python版本为3.11.7。
2.安装GPU pytroch
首先需要进入我们上一步建立好的虚拟环境
conda activate ultralytics
- 然后win+R 打开系统命令窗口输入cmd(这是另外一个命令窗口)
输入下面的命令查看cuda版本(前提已经安好了GPU的各项驱动)
nvidia-smi
- 我自己的CUDA版本是12.6,然后进入pytroch官网,去找安装pytroch的下载命令。https://pytorch.org/,首先
Package
这一行我们选Conda,因为我们用的的是Anaconda建立的虚拟环境,用conda命令安装会舒服些。然后在ompute Platform
一行选一个自己能安装的版本,例如我的CUDA版本是12.6,然后我就选了12.4。
然后把下面的下载命令复制下来,复制到之前的Conda的命令提示框中。
输入命令之后,按回车,出现如下内容。
拉到下面,然后输入y然后回车。
然后由于之前我在其他虚拟环境中下载过对应版本的pytroch,所以没出进度条,直接出现了done,表示下载完成。
然后,输入pip list 看到pytorch已经下载成功了。
3.安装Utralytics
然后就是安装Utralytics,这个也是很简单粗暴,直接按照官方提示 pip install 安装就行了,我自己配置了清华园下载能稍微快点。
pip install ultralytics
然后再输入一下pip list 就可以看到 pytroch 和 ultralytics 都已经被正确安装了。
4.下载YOLO V11 模型
进入到Ultralytics 的YOLO V11 的下载界面,然后点进去之后稍微下滑一下就能看到Performance Metrics
然后需要什么版本点蓝色的版本名称完就可以下了。然后左侧是其他版本的YOLO版本的模型文件下载地址。(如果要从官网主页面进的话,就是先点上方选项卡的Models选项卡,然后点左侧的YOLO 11)
https://docs.ultralytics.com/models/yolo11/#supported-tasks-and-modes
5.下载COCO数据集
在Kaggle里下载就行了,27个G大概解压之后。
https://www.kaggle.com/datasets/awsaf49/coco-2017-dataset?resource=download
6.下载 COCO.yaml
https://docs.ultralytics.com/datasets/detect/coco/#usage
然后就是下载COCO,数据集的yaml文件。
COCO(Common Objects in Context)数据集是一个广泛使用的计算机视觉数据集,旨在支持对象检测、分割和图像标注等任务。它包含了超过33万张复杂的日常生活场景图片,覆盖了80类常见物体,每张图片中物体被标注在不同的上下文环境中,具有丰富的多样性。COCO数据集以其精细的标注和多种任务的支持而闻名,广泛用于训练和评估深度学习模型,尤其是在目标检测和图像语义分割领域。
7.搭建训练文件目录
- 这块我折腾了一阵才整明白,首是新建一个项目,然后把coco2017数据集解压进来,然后把下载的coco.yaml也拖进去。
然后在项目文件下下新建一个datasets文件下,然后datasets文件下下再建两个新的文件夹images
和labels
。
然后把coco2017中的 train2017和val2017粘到datasets/images里(这两个文件还挺大的,最好是在外部文件夹复制粘贴,不要在Pycharm内复制粘贴)
然后在labels下面也建两个空文件夹,一个是train2017,一个是val2017。
8.制作txt格式标签
在项目文件下下新建了一个make_label.py文件,然后需要用coco2017中annotation中的json文件解析成txt类型的标签。
把下面代码粘贴进去,然后训练集和验证集各运行一次,代码参考了一方热衷
博主的博客,在此表示感谢。
import os
import json
from tqdm import tqdm
import argparse
# 生成训练集标签(换成自己的路径)
json_path = r'E:\YOLO_V11\coco2017\annotations\instances_train2017.json'
label_path = r'E:\YOLO_V11\datasets\labels\train2017'
# 生成验证集标签 (换成自己的路径)
# json_path = r'E:\YOLO_V11\coco2017\annotations\instances_val2017.json'
# label_path = r'E:\YOLO_V11\datasets\labels\val2017'
parser = argparse.ArgumentParser()
parser.add_argument('--json_path', default=json_path, type=str,
help="input: coco format(json)")
parser.add_argument('--save_path', default=label_path, type=str,
help="specify where to save the output dir of labels")
arg = parser.parse_args()
def convert(size, box):
dw = 1. / (size[0])
dh = 1. / (size[1])
x = box[0] + box[2] / 2.0
y = box[1] + box[3] / 2.0
w = box[2]
h = box[3]
x = x * dw
w = w * dw
y = y * dh
h = h * dh
return (x, y, w, h)
if __name__ == '__main__':
json_file = arg.json_path # COCO Object Instance 类型的标注
ana_txt_save_path = arg.save_path # 保存的路径
data = json.load(open(json_file, 'r'))
if not os.path.exists(ana_txt_save_path):
os.makedirs(ana_txt_save_path)
id_map = {
}
for i, category in enumerate(data['categories']):
id_map[category['id']] = i
# 通过事先建表来降低时间复杂度
max_id = 0
for img in data['images']:
max_id = max(max_id, img['id'])
img_ann_dict = [[] for i in range(max_id + 1)]
for i, ann in enumerate(data['annotations']):
img_ann_dict[ann['image_id']].append(i)
for img in tqdm(data['images']):
filename = img["file_name"]
img_width = img["width"]
img_height = img["height"]
img_id = img["id"]
head, tail = os.path.splitext(filename)
ana_txt_name = head + ".txt"
f_txt = open(os.path.join(ana_txt_save_path, ana_txt_name), 'w')
for ann_id in img_ann_dict[img_id]:
ann = data['annotations'][ann_id]
box = convert((img_width, img_height), ann["bbox"]</