机器视觉YOLO v11 学习笔记

前言

Ultralytics 基于计算机视觉和 AI 的多年基础研究,创建了尖端、最先进的 (SOTA) YOLO 模型。我们的模型不断更新性能和灵活性,快速、准确且易于使用。他们擅长对象检测跟踪实例分割图像分类姿势估计任务。

一、官方源码下载

github代码地址:https://github.com/ultralytics/ultralytics

可以使用git clone指令下载,也可以下载压缩包解压再打开项目

二、环境配置

创建属于YOLO V11单独的conda环境。

1.创建环境名称并指定Python版本

conda create -n yolov11 python=3.8

2.激活环境

conda activate yolov11

3.安装项目所需依赖(在yolov11环境已经已经激活的条件下)

pip install ultralytics

三、VSCODE打开项目,并配置python解释器

1.打开项目

在项目根路径外面一层“cmd” 

使用指令

code ultralytics

2.配置python解释器

在VSCODE搜索栏输入">python",选择"Select interpreter"

选择我们刚刚创建的conda环境 

四、推理模型下载和编写代码

1.模型下载

模型下载和项目链接一个地址:https://github.com/ultralytics/ultralytics

下拉滚动条

里面有各个模型分类,和不同大小的模型,我选择的是检测模型的第一个模型  YOLO11n,点击蓝色字体就能下载。

建议项目文件夹建立个模型文件夹,把模型下载到里面。 

2.编写代码

项目根目录新建detect.py文件

复制下面代码粘贴进文件

# -*- coding: utf-8 -*-

from ultralytics import YOLO

if __name__ == '__main__':

    # Load a model
    model = YOLO(model=r'{替换自己的模型文件的路径}')  
    model.predict(source=r'替换自己的视频或图片文件夹的路径',
                  save=True,
                  show=True,
                  )

没有自己的图片可以用ultralytics\ultralytics\assets文件夹里面的图片,路径填到这个文件夹就行

3.程序运行

VSCODE启动程序,不过多赘述.

4.输出路径

控制台打印

Results saved to runs\detect\predict

输出路径在runs\detect\predict

五、训练自己的数据集

1.准备数据集

可以在网上找标注好的,也可以自己标注。

标注软件 labelimg ,在自己的python环境可以使用  pip install labelimg 命令安装。

使用的话需要在conda终端里面的所在环境里启动 ,输入 labelimg回车就可以。

程序启动后在View里勾选这两项,分别是自动保存标注的文件和展示标签。

2.数据集格式 

标注选择yolo模式不用转换,如果使用VOC模式要转换,voc格式标注转换yolo格式标注的代码如下:

import xml.etree.ElementTree as ET
import os, cv2
import numpy as np
from os import listdir
from os.path import join

classes = []

def convert(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = (box[0] + box[1]) / 2.0 - 1
    y = (box[2] + box[3]) / 2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return (x, y, w, h)


def convert_annotation(xmlpath, xmlname):
    with open(xmlpath, "r", encoding='utf-8') as in_file:
        txtname = xmlname[:-4] + '.txt'
        txtfile = os.path.join(txtpath, txtname)
        tree = ET.parse(in_file)
        root = tree.getroot()
        filename = root.find('filename')
        img = cv2.imdecode(np.fromfile('{}/{}.{}'.format(imgpath, xmlname[:-4], postfix), np.uint8), cv2.IMREAD_COLOR)
        h, w = img.shape[:2]
        res = []
        for obj in root.iter('object'):
            cls = obj.find('name').text
            if cls not in classes:
                classes.append(cls)
            cls_id = classes.index(cls)
            xmlbox = obj.find('bndbox')
            b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
                 float(xmlbox.find('ymax').text))
            bb = convert((w, h), b)
            res.append(str(cls_id) + " " + " ".join([str(a) for a in bb]))
        if len(res) != 0:
            with open(txtfile, 'w+') as f:
                f.write('\n'.join(res))


if __name__ == "__main__":
    postfix = 'png'    # 图像格式
    imgpath = r'D:\example\images'    # 替换实际图像文件路径
    xmlpath = r'D:\example\annotations'   # 替换实际xml文件文件路径
    txtpath = r'D:\example\labels'      # 替换生成的txt文件路径
    
    if not os.path.exists(txtpath):
        os.makedirs(txtpath, exist_ok=True)
    
    list = os.listdir(xmlpath)
    error_file_list = []
    for i in range(0, len(list)):
        try:
            path = os.path.join(xmlpath, list[i])
            if ('.xml' in path) or ('.XML' in path):
                convert_annotation(path, list[i])
                print(f'file {list[i]} convert success.')
            else:
                print(f'file {list[i]} is not xml format.')
        except Exception as e:
            print(f'file {list[i]} convert error.')
            print(f'error message:\n{e}')
            error_file_list.append(list[i])
    print(f'this file convert failure\n{error_file_list}')
    print(f'Dataset Classes:{classes}')

代码需要修改的地方如下:
1.postfix参数填图片的后缀,需要注意图片格式要统一,是png格式就写png,是jpg格式就写jpg
2.imgpath参数填图片所在的路径
3.xmlpath参数填标注文件的路径
4.txtpath参数填生成的yolo格式的文件

3.数据集划分

划分训练集和验证集代码如下:

import os, shutil
from sklearn.model_selection import train_test_split


val_size = 0.2
#test_size = 0.2
postfix = 'jpg'
imgpath = r'datasets\images'
txtpath =  r'datasets\labels'



output_train_img_folder =r'datasets\dataset_kengwa\images/train'
output_val_img_folder =  r'datasets\dataset_kengwa\images/val'
output_train_txt_folder =  r'datasets\dataset_kengwa\labels/train'
output_val_txt_folder =  r'datasets\dataset_kengwa\labels/val'

os.makedirs(output_train_img_folder, exist_ok=True)
os.makedirs(output_val_img_folder, exist_ok=True)
os.makedirs(output_train_txt_folder, exist_ok=True)
os.makedirs(output_val_txt_folder, exist_ok=True)


listdir = [i for i in os.listdir(txtpath) if 'txt' in i]
train, val = train_test_split(listdir, test_size=val_size, shuffle=True, random_state=0)

#todo:需要test放开

# train, test = train_test_split(listdir, test_size=test_size, shuffle=True, random_state=0)
# train, val = train_test_split(train, test_size=val_size, shuffle=True, random_state=0)

for i in train:
    img_source_path = os.path.join(imgpath, '{}.{}'.format(i[:-4], postfix))
    txt_source_path = os.path.join(txtpath, i)

    img_destination_path = os.path.join(output_train_img_folder, '{}.{}'.format(i[:-4], postfix))
    txt_destination_path = os.path.join(output_train_txt_folder, i)

    shutil.copy(img_source_path, img_destination_path)
    shutil.copy(txt_source_path, txt_destination_path)

for i in val:
    img_source_path = os.path.join(imgpath, '{}.{}'.format(i[:-4], postfix))
    txt_source_path = os.path.join(txtpath, i)

    img_destination_path = os.path.join(output_val_img_folder, '{}.{}'.format(i[:-4], postfix))
    txt_destination_path = os.path.join(output_val_txt_folder, i)

    shutil.copy(img_source_path, img_destination_path)
    shutil.copy(txt_source_path, txt_destination_path)


#
# for i in train:
#     shutil.copy('{}/{}.{}'.format(imgpath, i[:-4], postfix), r'E:\1-cheng\4-yolo-dataset-daizuo\multi-classify\bird-boat-horse-aeroplane-sheep\dataset20231219/images/train/{}.{}'.format(i[:-4], postfix))
#     shutil.copy('{}/{}'.format(txtpath, i), r'E:\1-cheng\4-yolo-dataset-daizuo\multi-classify\bird-boat-horse-aeroplane-sheep\dataset20231219/labels/train/{}'.format(i))
#
# for i in val:
#     shutil.copy('{}/{}.{}'.format(imgpath, i[:-4], postfix), r'E:\1-cheng\4-yolo-dataset-daizuo\multi-classify\bird-boat-horse-aeroplane-sheep\dataset20231219/images/val/{}.{}'.format(i[:-4], postfix))
#     shutil.copy('{}/{}'.format(txtpath, i), r'E:\1-cheng\4-yolo-dataset-daizuo\multi-classify\bird-boat-horse-aeroplane-sheep\dataset20231219/labels/val/{}'.format(i))

#todo:需要test则放开

# for i in test:
#     shutil.copy('{}/{}.{}'.format(imgpath, i[:-4], postfix), 'images/test/{}.{}'.format(i[:-4], postfix))
#     shutil.copy('{}/{}'.format(txtpath, i), 'labels/test/{}'.format(i))

4.创建yolo的训练配置文件 

在项目根目录下创建data.yaml文件,里面的训练集测试集填实际的路径

tarin : datasets\dataset_kengwa\images\train
val : datasets\dataset_kengwa\images\val

nc : 2   #代表有几个标签类别

#class names
names : ['person','other']

5.训练数据

在根目录新建train.py文件,将下面代码粘贴到里面。

# -*- coding: utf-8 -*-
import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO

if __name__ == '__main__':
    # model.load(r'pts\yolo11n.pt') # 加载预训练权重,改进或者做对比实验时候不建议打开,因为用预训练模型整体精度没有很明显的提升
    model = YOLO(model=r'D:\WorkSpace\Backend\PythonSpace\ultralytics\ultralytics\cfg\models\11\yolo11.yaml')
    model.train(data=r'data.yaml',
                imgsz=640,
                epochs=50, #训练次数
                batch=4,    #训练批次大小,电脑性能好的话可以大一点
                workers=0,
                device='gpu',
                optimizer='SGD',
                close_mosaic=10,
                resume=True,
                project='runs/train',
                name='exp',
                single_cls=False,
                cache=False,
                )

 6.解决训练过程中断怎么继续上次训练

# -*- coding: utf-8 -*-
import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO

if __name__ == '__main__':

    model = YOLO(model=r'{填上次中断的.pt模型}')
    model.load(r'pts\yolo11n.pt') # 加载预训练权重,改进或者做对比实验时候不建议打开,因为用预训练模型整体精度没有很明显的提升

    model.train(data=r'data.yaml',
                imgsz=640,
                epochs=50, 
                batch=4,   
                workers=0,
                device='gpu',
                optimizer='SGD',
                close_mosaic=10,
                resume=True,  #此处设置成True
                project='runs/train',
                name='exp',
                single_cls=False,
                cache=False,
                )

根据大佬挂科边缘整理而来,转载自挂科边缘

### 使用 VSCode 配置 YOLOv1 对于希望在 Visual Studio Code (VSCode) 中配置和使用 YOLOv1 的开发者而言,虽然官方文档更多关注于较新的版本如 YOLOv5 和 YOLOv8[^1],但依然可以通过一些通用的方法来设置环境。 #### 安装必要的依赖库 为了能够在 VSCode 中运行 YOLOv1,首先需要确保 Python 环境已经正确安装,并且安装了所有必需的包。通常情况下,这包括但不限于 NumPy, TensorFlow 或 PyTorch(取决于所使用的实现),以及 OpenCV 库等。可以利用 pip 工具来进行这些软件包的安装: ```bash pip install numpy opencv-python torch torchvision ``` #### 下载 YOLOv1 源码 由于 YOLOv1 并未像后续版本那样拥有活跃维护的 GitHub 仓库,因此可能需要寻找第三方提供的实现或者原始论文作者发布的资源。找到合适的 YOLOv1 实现后,通过 Git 将其克隆到本地工作空间内[^3]: ```bash git clone <YOLOv1_Repository_URL> cd <Cloned_Directory_Name> ``` 请注意替换 `<YOLOv1_Repository_URL>` 和 `<Cloned_Directory_Name>` 为实际值。 #### 创建并打开项目文件夹 建议创建一个新的项目目录结构以便更好地管理代码和其他资产。可以在终端执行如下命令完成此操作[^4]: ```bash mkdir yolov1_project cd yolov1_project/ code . ``` 最后一行 `code .` 命令将会启动 VSCode 并加载当前所在的文件夹作为新项目的工作区。 #### 设置调试器与解释器 一旦进入了编辑器界面,在左侧活动栏点击齿轮图标旁边的三角形展开“Python 解释器”,从中挑选适合项目的 Python 版本。接着按照提示配置 launch.json 文件以支持断点调试等功能。 #### 数据集准备 针对特定的数据集,应当参照相应格式准备好训练所需的图片及其标注信息。一般来讲,会有一个 YAML 格式的配置文件用来描述数据的位置以及其他细节[^5]。尽管这里提到的是 COCO 数据集的例子,但对于其他自定义数据集同样适用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值