前言

YOLO(全称:You Only Look Once)是一种高效的目标检测算法,主要用于识别和定位图像或视频中的物体。其核心优势在于能够通过单次网络前向传播完成检测,实现高速处理,同时保持较高的准确率。‌

下载安装YOLO及环境配置

一、安装YOLO源代码

1.下载ultralytics源代码以及下载需要的预训练模型(以YOLO11为例):

官方下载渠道:https://github.com/ultralytics/ultralytics

2.点击code--Download ZIP,即可下载最新版本(或者点击main,搜索v8.3.xxx,即可下载对应的8.3.xxx版本)

https://github.com/ultralytics/assets/releases地址(8.3.0版本)中找到Assets,所有官方预训练好的模型都可以在这里面找到。

二、安装Anaconda,熟悉Anaconda Prompt,设置conda和pip镜像

1.搜索清华大学开源软件镜像站官网地址(Anaconda软件仓库):https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/

2.进入Anaconda安装包链接直接下载Anaconda

3.下载完成后计算机搜索Anaconda Prompt,设置conda和pip镜像

在Anaconda Prompt中输入notepad .condarc(作用是使用记事本打开名为xxx的文件)

4.回到清华大学开源软件镜像站,在记事本中输入以下代码:

channels:
  - defaults
show_channel_urls: true
default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

5.搜索清华大学开源软件镜像站官网地址(PyPI 软件仓库):

https://mirrors.tuna.tsinghua.edu.cn/help/pypi/

6.找到以下代码并输入到Anaconda Prompt中(设置pip镜像):

pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple

三、安装YOLO环境

1.输入conda create -n yolo python=3.11创建一个名为yolo的环境,python版本为3.11;

2.打开Anaconda Prompt,输入conda env list检查所有环境及保存路径;

3.输入conda activate yolo激活(进入)名为yolo的环境。

4.以电脑为英伟达显卡(非50系列)安装PyTorch版本(2.5.0+CUDA11.8)为例:

输入nvidia-smi检查CUDA Version是否大于11.8,符合要求后,进入PyTorch官网:

https://pytorch.org/

点击:Previous versions of PyTorch查看PyTorch版本下载命令,在Anaconda Prompt中输入下载指令即可开始下载

四、下载PyCharm

1.进入PyCharm官网:

https://www.jetbrains.com/

2.下载对应版本:分为专业版和社区版,直接下载安装

二、YOLO推理入门

一、YOLO模型的五种任务类型

YOLO模型支持五种任务,分别是目标检测、旋转目标检测、姿态估计、实例分割和图像分类。

二、模型可预测的类型

YOLO模型本身没有固定的可预测种类数量,其可预测的种类数量取决于训练时所使用的数据集和任务需求。

YOLO是一系列用于目标检测的深度学习模型,它通过一个单一的神经网络在一张图像上完成目标定位和分类的任务。模型的分类能力取决于训练过程中使用的数据集,如果训练数据集包含猫、狗、沙发等类别,那么模型就可以同时输出这些类别的标签。因此,YOLO模型可以预测的种类数量是灵活的,可以根据实际应用需求进行调整和扩展。

三、如何预测一张图片

预测一张图片=预处理+推理+后处理

1.新建一个Python文件命名为mypredict.py

from ultralytics import YOLO

model = YOLO(r"文件名路径1")
model.predict(
    source=r"文件名路径2",
    save=True,
    show=False,
)

其中文件名路径1表示需要用到的模型;’文件名路径2表示需要用路径1的预测数据预测路径2中的文件;save表示是否保存预测结果,show表示是否(当场)展示预测结果

官方提供的预测入门指导地址:(其中inference sources中列举了所有的支持的预测目标)

https://docs.ultralytics.com/modes/predict/

2.新建一个Python文件命名为mytest.py(以模型yolo11m-seg.pt为例)

from ultralytics import YOLO

model = YOLO(r"yolo11m-seg.pt")
print(model.task)
print(model.names)
print(sum(p.numel() for p in model.parameters()))

3.新建一个Python文件命名为mytcam.py

from ultralytics import YOLO

import cv2
from sympy.multipledispatch.dispatcher import source

model = YOLO(r"yolo11n.pt")
results = model(
    source=0,
    stream=True,
)

for result in results:
    plotted = result.plot()
    cv2.imshow("yolo inference",plotted)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

通过mypredict.py、mytest.py、mytcam.py三个Python文件,我们可以利用YOLO数据库中的预测数据去预测大部分生活中的物品。

四、如何预测一个视频

视频本质上就是由一系列图片构成的。

视频的原理基于此,由于人类眼睛的特殊结构,在画面快速切换时,画面会有残留(视觉暂留),感觉起来就是连贯的动作,所以视频本质上就是由一系列图片构成的。视频技术泛指将一系列静态影像以电信号的方式加以捕捉、记录、处理、储存、传送与重现的所有技术和设备。

所以预测视频的本质就是预测图片,预测视频原理同预测图片原理。

三、YOLO训练入门

一、跑通最简单的一个YOLO训练集(以coco128为例)

1.新建一个Python文件命名为mytrain.py

from ultralytics import YOLO

if __name__ == '__main__':
    model = YOLO(r"yolo11n.pt")
    model.train(
        data=r"coco128.yaml",
        epochs=30,
        imgsz=640,
        batch=-1,
        cache=False,
        workers=1,
    )

其中epochs指的是整个训练数据集被模型完整遍历的次数,是控制模型训练时长的核心超参数。

imgsz是image size的缩写,指的是输入图像的尺寸,在 YOLO 中通常以像素为单位,格式为(宽度, 高度)或单个整数(表示宽高相等,如640代表640×640 ),是模型训练和推理时的核心参数之一。

batch指一次迭代训练中,模型同时处理的图像样本数量。

cache是一项用于提升训练速度的优化设置,核心作用是将数据集的图像、标签等预处理后的数据提前存入内存或显存,避免每一轮 epoch 重复读取和预处理数据。

workers的数值决定了开启多少个子进程来并行加载数据,避免模型在训练时因等待数据而闲置,提升整体训练效率。

二、理解数据集的概念

在计算机视觉(尤其是 YOLO 目标检测)项目中,数据集是模型训练、验证和测试的“基础原料”,本质是一组包含原始数据和对应标注信息的样本集合,模型通过学习数据集中的样本规律,实现对新数据的预测(比如检测图像中的目标)。

对于 YOLO 这类目标检测任务,数据集的核心作用是让模型学会:图像中哪些区域是目标(如行人、汽车)以及这个目标属于哪一类。

数据构成:包含训练集(train)、验证集(val),部分有测试集(test)

只有训练集和验证集的时候,训练集和验证集的比例一般为7:3

训练集、验证集和测试集都有的时候,训练集、验证集和测试集的比例一般为7:2:1

三、安装labelimg

进入Anaconda Prompt,在Anaconda Prompt中输入以下代码:

conda create -n labelimg python=3.8

在Anaconda Prompt中输入conda  env list,查看labelimg是否安装成功

输入conda activate labelimg进入labelimg环境中

最后输入pip install labelimg,在新环境中安装labelimg包

验证:输入labelimg,弹出labelimg窗口代表安装成功

四、创建自己的数据集

数据集可以根据自己的要求,去网站上下载,若没有符合自己要求的数据集,则需要自己动手创建一个数据集。

一、创建一个新的文件夹

1.创建一个新的文件夹,在PyCharm中打开,使用yolo环境

2.新建images和videos文件夹

二、制作提取图片的代码

1.新建一个Python文件命名为mytract.py

# 导入需要的库
# cv2:OpenCV库,用于处理视频读取和图片保存
import cv2
# os:用于处理文件路径、创建文件夹等系统操作
import os
# tqdm:用于生成可视化进度条,直观看到视频处理进度
from tqdm import tqdm

# 视频文件所在的文件夹路径
VIDEO_FOLDER = r"文件夹路径1"
# 提取的图片保存的文件夹路径
SAVE_FOLDER = r"文件夹路径2"
# 每秒提取的帧数(核心可调参数!比如设1=每秒1帧,设3=每秒3帧,设0.5=每2秒1帧)
FPS_EXTRACT = 6
# 图片序号的位数
FRAME_NUM_DIGITS = 4

def extract_video_frames():
    """
    核心函数:遍历所有视频,逐视频提取帧并按指定格式保存
    """
    # 1. 自动创建图片保存文件夹(如果文件夹不存在则创建,存在则不操作)
    # os.makedirs:创建文件夹;exist_ok=True:避免文件夹已存在时报错
    os.makedirs(SAVE_FOLDER, exist_ok=True)
    print(f"图片保存文件夹已准备好:{SAVE_FOLDER}")

    # 2. 获取视频文件夹中所有的MP4视频文件
    # os.listdir(VIDEO_FOLDER):列出文件夹里的所有文件和子文件夹
    # 过滤条件:只保留以.mp4或.MP4结尾的文件(lower()统一转小写,避免大小写问题)
    video_files = [file for file in os.listdir(VIDEO_FOLDER) if file.lower().endswith(".mp4")]

    # 检查是否找到视频文件,没找到则直接退出
    if not video_files:
        print("错误:在指定的视频文件夹中未找到任何.mp4视频文件!")
        return

    print(f"\n共找到 {len(video_files)} 个MP4视频文件,开始处理...\n")

    # 3. 遍历每个视频文件,逐个处理
    for video_file in video_files:
        # 拼接视频的完整路径(文件夹路径 + 文件名)
        # 获取视频名(去掉扩展名,比如"01.mp4"变成"01","test.mp4"变成"test")
        # os.path.splitext(file):把文件名分成「名字」和「扩展名」两部分,取第一部分就是视频名
        video_name = os.path.splitext(video_file)[0]

        print(f"———————— 开始处理视频:{video_file} ————————")

        # 4. 打开视频文件(创建视频捕获对象)
        cap = cv2.VideoCapture(video_path)
        # 检查视频是否成功打开(比如文件损坏、格式不支持会导致打开失败)
        if not cap.isOpened():
            print(f"无法打开视频文件:{video_file},跳过该视频")
            continue  # 跳过这个视频,处理下一个

        # 5. 获取视频的基本信息,用于计算提取步长
        # 视频的原始帧率(每秒多少帧,比如常见的25、30、60帧)
        video_fps = cap.get(cv2.CAP_PROP_FPS)
        # 视频的总帧数(整个视频有多少帧,用于进度条和判断处理完成)
        total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

        # 6. 计算提取帧的步长(每隔多少帧提取一张图片)
        # 步长 = 视频原始帧率 / 每秒提取的帧数
        # 比如:视频帧率30,每秒提取1帧 → 步长30(每30帧提1张)
        # 比如:视频帧率30,每秒提取3帧 → 步长10(每10帧提1张)
        step = int(video_fps / FPS_EXTRACT)
        # 防止步长为0(比如视频帧率小于提取帧率时,强制步长为1,每帧都提取)
        step = max(step, 1)

        print(f"视频原始帧率:{video_fps:.2f} FPS")
        print(f"视频总帧数:{total_frames} 帧")
        print(f"提取步长:每 {step} 帧提取1张图片")

        # 7. 初始化计数器
        frame_index = 0  # 记录当前读取到视频的第几帧(从0开始)
        save_index = 1   # 记录保存的图片序号(从1开始)

        # 8. 创建进度条(tqdm库),实时显示处理进度
        # total:进度条的总长度(视频总帧数)
        # desc:进度条左侧的描述文字
        # unit:进度条的单位(这里是“帧”)
        pbar = tqdm(total=total_frames, desc=f"提取{video_name}的帧", unit="帧")

        # 9. 逐帧读取视频并提取指定帧
        while True:
            # 读取一帧视频:ret表示是否读取成功,frame是当前帧的图像数据
            ret, frame = cap.read()
            # 如果ret为False,说明视频已经读取完毕,退出循环
            if not ret:
                break

            # 每隔step帧,保存一张图片(比如步长30,就是0、30、60...帧时保存)
            if frame_index % step == 0:
                # 生成图片文件名:视频名_四位序号.jpg(比如01_0001.jpg、01_0002.jpg)
                # str(save_index).zfill(4):将序号补零到4位,比如1→0001,10→0010
                img_name = f"{video_name}_{str(save_index).zfill(FRAME_NUM_DIGITS)}.jpg"
                # 拼接图片的保存路径(保存文件夹 + 图片名)
                img_path = os.path.join(SAVE_FOLDER, img_name)

                # 保存图片到指定路径(cv2.imwrite:将图像数据写入文件)
                cv2.imwrite(img_path, frame)

                # 保存序号加1(下一张图片用下一个序号)
                save_index += 1

            # 帧计数器加1(记录当前处理到第几帧)
            frame_index += 1
            # 更新进度条(前进1帧)
            pbar.update(1)

        # 10. 处理完当前视频后,释放资源(避免内存泄漏)
        pbar.close()  # 关闭进度条
        cap.release()  # 释放视频捕获对象

        # 提示当前视频处理完成
        print(f"\n视频{video_file}处理完成,共提取 {save_index - 1} 张图片\n")

    # 11. 所有视频处理完成
    print(f"所有视频处理完毕!所有图片已保存到:{SAVE_FOLDER}")

# 主程序入口
if __name__ == "__main__":
    extract_video_frames()

2.新建文本classes.txt,输入需要检测的模型种类和名称

三、进入数据库的检测画面

1.进入Anaconda Prompt,输入conda activate labelimg进入labelimg环境中。

2.输入labelimg进入labelimg窗口

3.按[W]快速创建新的框

按[A][D]快速切换图片

类型从给定的列表里选择

到现在,就可以创建一个属于自己的数据集了!

 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐