利用YOLOv8在COCO128数据集上的目标检测

1.作者介绍

贾晓莉,女,西安工程大学电子信息学院,2025级研究生

研究方向:水下目标定位

电子邮件:2823488372@qq.com

2. 关于理论方面的知识介绍

2.1 目标检测任务介绍

目标检测是计算机视觉中的重要任务。普通图像分类只需要判断一张图片中有什么目标,例如人、汽车或动物;而目标检测不仅要判断图片中有什么,还要进一步标出目标在图像中的具体位置。

因此,目标检测通常会输出三类信息:第一是目标类别,也就是目标属于哪一类;第二是边界框,也就是目标在图像中的位置;第三是置信度,也就是模型对检测结果的确定程度。

例如,在检测结果中出现"person 0.83",表示模型判断该检测框内的目标是人的置信度为0.83。

2.2 YOLOv8 模型介绍

YOLO的全称是You Only Look Once,意思是"只看一次"。YOLO系列模型属于目标检测算法,其核心思想是将整张图像输入模型后,直接预测图像中的目标类别、目标位置和置信度。

YOLOv8是Ultralytics推出的YOLO系列模型之一,具有使用方便、检测速度较快、支持训练、验证和预测等特点。本实验使用的是YOLOv8n模型,其中n表示nano版本。YOLOv8n参数量较小,运行速度较快,更适合在普通电脑和CPU环境下进行课堂实验。

YOLOv8属于单阶段目标检测模型。相比需要先生成候选区域的两阶段检测方法,YOLOv8直接从图像中预测目标类别和位置,因此流程更加简洁,推理速度也较快。

2.3 YOLOv8 模型原理

YOLOv8目标检测过程可以概括为图像输入、图像预处理、特征提取、特征融合、检测头预测、后处理和结果输出几个步骤。

首先,输入图像会经过预处理,包括Resize、Normalize和Padding等操作。Resize用于调整图像尺寸,Normalize用于对像素值进行归一化,Padding用于补边,使图像能够以统一格式输入模型。

其次,图像进入Backbone主干网络。Backbone的主要作用是提取图像特征,包括边缘、纹理、颜色、形状以及更高层次的语义信息。

然后,模型通过Neck特征融合网络整合不同尺度的特征。不同尺度的特征可以帮助模型同时检测大目标、中目标和小目标。

接着,Detection Head检测头会根据融合后的特征预测目标类别、检测框坐标和置信度。最后,模型通过置信度过滤、NMS非极大值抑制和坐标解码等后处理步骤,去除低置信度框和重复框,得到最终检测结果。

最终输出结果包括Bounding Box、Class Label和Confidence Score,也就是检测框、类别标签和置信度分数。

2.4 COCO128 数据集介绍

COCO数据集是计算机视觉领域常用的数据集,完整名称为Common Objects in Context,意思是"上下文中的常见物体"。COCO数据集包含大量真实生活场景图像,常用于目标检测、图像分割和关键点检测等任务。

本实验使用的是COCO128数据集。COCO128可以理解为COCO数据集的小型子集,由COCO train2017中的前128张图片组成,主要用于快速测试、调试和验证目标检测流程。

COCO128包含多种常见生活目标,例如person、bicycle、car、motorcycle、airplane、bus、train、truck、cat、dog、bowl、pizza、zebra、giraffe等。本实验结果中出现的person、bowl、broccoli、car、bus、train等类别都属于COCO常见目标类别。

由于COCO128数据量较小,下载和训练速度较快,因此适合在CPU环境下进行课堂实验。但它不适合用于严格评估模型的泛化能力,更适合用于跑通YOLOv8训练、验证和预测的完整流程。

2.5 数据集格式与划分说明

COCO128在YOLO训练中通常包含图像文件和标签文件。图像一般存放在images/train2017目录下,标签一般存放在labels/train2017目录下。

YOLO格式的标签一般为:class_id x_center y_center width height。

其中,class_id表示类别编号,x_center和y_center表示目标中心点坐标,width和height表示目标框的宽度和高度。需要注意的是,这些坐标通常是归一化后的相对坐标。

在COCO128默认配置中,训练集和验证集通常指向同一批128张图片,测试集没有独立划分。因此,本实验主要用于流程验证,而不是严格的训练集、验证集、测试集泛化性能评估。

3. 关于实验过程的介绍、完整实验代码和测试结果

3.1 实验环境与训练参数

本实验在VS Code中完成,Python版本为3.9,目标检测框架为Ultralytics YOLOv8,深度学习框架为PyTorch CPU版本。

由于实验电脑没有使用GPU加速,因此运行设备设置为CPU。为了使实验能够顺利完成,模型选择YOLOv8n,数据集选择COCO128,训练轮数设置为20 epochs,输入图片尺寸设置为320,batch size设置为2。

这些参数设置能够降低计算量,使实验可以在普通电脑CPU环境下完成。

3.2 实验流程

本实验流程主要包括以下几个步骤。

第一步,配置Python 3.9和Ultralytics YOLOv8运行环境。

第二步,加载YOLOv8n预训练模型yolov8n.pt

第三步,自动下载并读取COCO128数据集。

第四步,在CPU环境下训练模型20轮。

第五步,保存训练过程中效果最好的best.pt权重文件。

第六步,使用验证过程输出Precision、Recall、mAP50和mAP50-95等指标。

第七步,使用训练后的模型进行图片预测,并保存带检测框、类别和置信度的结果图。

3.3 安装依赖

实验中需要安装Ultralytics YOLOv8。由于普通pip下载可能受到网络或代理影响,可以使用国内镜像源进行安装。

安装命令如下。

& "E:\anaconde\envs\yolov8\python.exe" -m pip --isolated install ultralytics -i https://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com --no-cache-dir

安装完成后,可以通过导入YOLO和torch进行测试。

& "E:\anaconde\envs\yolov8\python.exe" -c "from ultralytics import YOLO; import torch; print('YOLOv8安装成功'); print(torch.version)"

3.4 完整实验代码

以下代码完成了数据集说明、模型加载、训练、验证和预测全过程。代码中包含较详细的注释,便于理解每一步的作用。

python 复制代码
from pathlib import Path

from ultralytics import YOLO



# =========================================================

# 1. 实验基础设置

# =========================================================



# 本实验使用CPU运行。如果有GPU,可以将device改为0。

device = "cpu"



# 设置项目根目录,用于保存训练和预测结果。

base_dir = Path(r"C:\Users\28234\Desktop\AIcase")



# 设置20轮训练结果保存位置。

train_project = base_dir / "runs_train_epoch20"

train_name = "yolov8n_cpu_epoch20"



# 设置20轮预测结果保存位置。

predict_project = base_dir / "runs_predict_epoch20"

predict_name = "coco128_result_epoch20"



print("=" * 60)

print("YOLOv8 在 COCO128 数据集上的目标检测实验")

print("=" * 60)

print("当前运行设备:", device)

print("项目根目录:", base_dir)



# =========================================================

# 2. 数据集说明

# =========================================================



print("\n【数据集说明】")

print("数据集名称:COCO128")

print("数据集来源:COCO train2017 前 128 张图片")

print("数据集用途:快速测试、调试和验证 YOLOv8 目标检测流程")



print("\n【数据集格式】")

print("images/train2017:存放图片文件")

print("labels/train2017:存放 YOLO 格式标签文件")

print("YOLO 标签格式:class_id x_center y_center width height")

print("说明:坐标均为归一化后的相对坐标")



print("\n【数据集划分】")

print("训练集 train:128 张图片")

print("验证集 val:默认与训练集相同,使用同一批 128 张图片")

print("测试集 test:COCO128 默认无独立测试集")

print("注意:COCO128 主要用于流程验证,不适合严格评估模型泛化能力")



# =========================================================

# 3. COCO常见类别说明

# =========================================================



coco_classes = [

    "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train",

    "truck", "boat", "traffic light", "fire hydrant", "stop sign",

    "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep",

    "cow", "elephant", "bear", "zebra", "giraffe", "backpack",

    "umbrella", "handbag", "tie", "suitcase", "frisbee", "skis",

    "snowboard", "sports ball", "kite", "baseball bat", "baseball glove",

    "skateboard", "surfboard", "tennis racket", "bottle", "wine glass",

    "cup", "fork", "knife", "spoon", "bowl", "banana", "apple",

    "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza",

    "donut", "cake", "chair", "couch", "potted plant", "bed",

    "dining table", "toilet", "tv", "laptop", "mouse", "remote",

    "keyboard", "cell phone", "microwave", "oven", "toaster", "sink",

    "refrigerator", "book", "clock", "vase", "scissors", "teddy bear",

    "hair drier", "toothbrush"

]



print("\n【COCO类别信息】")

print("COCO目标检测任务常用类别数:", len(coco_classes))

print("部分类别示例:")

print(", ".join(coco_classes[:20]))

print("本实验结果中常见类别包括:person、bowl、broccoli、car、bus、train、truck等")



# =========================================================

# 4. YOLOv8模型原理说明

# =========================================================



print("\n【YOLOv8模型原理】")

print("1. 输入图像并进行预处理:Resize、Normalize、Padding")

print("2. Backbone主干网络提取图像特征")

print("3. Neck特征融合网络融合多尺度信息")

print("4. Detection Head检测头预测类别、检测框和置信度")

print("5. 后处理阶段进行置信度过滤、NMS和坐标解码")

print("6. 最终输出Bounding Box、Class Label和Confidence Score")



# =========================================================

# 5. 加载YOLOv8n预训练模型

# =========================================================



print("\n【模型加载】")

print("加载模型:YOLOv8n")

print("权重文件:yolov8n.pt")

print("说明:YOLOv8n是轻量级模型,适合CPU环境和课堂实验")



model = YOLO("yolov8n.pt")



# =========================================================

# 6. 模型训练

# =========================================================



print("\n【开始训练】")

print("数据集:COCO128")

print("训练轮数:20 epochs")

print("输入尺寸:320")

print("Batch size:2")

print("运行设备:CPU")



model.train(

    data="coco128.yaml",

    epochs=20,

    imgsz=320,

    batch=2,

    device=device,

    workers=0,

    project=str(train_project),

    name=train_name,

    exist_ok=True

)



# =========================================================

# 7. 获取训练后的best.pt

# =========================================================



save_dir = Path(model.trainer.save_dir)

best_model_path = save_dir / "weights" / "best.pt"



print("\n【训练完成】")

print("训练结果保存位置:", save_dir)

print("最佳模型权重best.pt:", best_model_path)



if not best_model_path.exists():

    print("错误:未找到best.pt,训练可能未正常完成。")

    exit()



# =========================================================

# 8. 模型验证

# =========================================================



print("\n【模型验证】")

print("开始计算Precision、Recall、mAP50、mAP50-95等指标")



best_model = YOLO(str(best_model_path))



metrics = best_model.val(

    data="coco128.yaml",

    imgsz=320,

    device=device,

    workers=0

)



print("验证完成。")



# =========================================================

# 9. 查找COCO128图片路径

# =========================================================



possible_paths = [

    base_dir / "datasets" / "coco128" / "images" / "train2017",

    base_dir.parent / "datasets" / "coco128" / "images" / "train2017",

    Path(r"C:\Users\28234\Desktop\datasets\coco128\images\train2017"),

    Path.home() / "datasets" / "coco128" / "images" / "train2017"

]



image_path = None



for path in possible_paths:

    if path.exists():

        image_path = path

        break



if image_path is None:

    print("未找到COCO128图片路径,请检查数据集是否下载成功。")

    exit()



print("\n【预测数据路径】")

print("COCO128图片路径:", image_path)



# =========================================================

# 10. 图片预测

# =========================================================



print("\n【开始预测】")

print("使用训练后的best.pt对COCO128图片进行目标检测")



best_model.predict(

    source=str(image_path),

    imgsz=320,

    conf=0.25,

    device=device,

    save=True,

    project=str(predict_project),

    name=predict_name,

    exist_ok=True

)



# =========================================================

# 11. 实验结果输出

# =========================================================



print("\n【实验完成】")

print("预测结果保存位置:", predict_project / predict_name)

print("输出内容包括:检测框Bounding Box、类别Class Label、置信度Confidence Score")

print("YOLOv8在COCO128数据集上的20轮CPU目标检测实验完成!")

3.5 运行方法

保存代码后,在VS Code终端中进入项目目录。

cd C:\Users\28234\Desktop\AIcase

然后使用yolov8环境中的Python解释器执行程序。

& "E:\anaconde\envs\yolov8\python.exe" ".\yolov8\train_coco128.py"

需要注意的是,不建议直接点击VS Code右上角运行按钮,因为它可能调用错误的Python环境。

3.6 训练过程与验证结果

训练过程中,终端会显示Epoch、box_loss、cls_loss、dfl_loss、Instances和Size等信息。其中Epoch表示当前训练轮数,box_loss表示检测框位置误差,cls_loss表示类别分类误差,dfl_loss表示边界框精细定位误差。一般来说,loss数值越低,模型训练效果越好。

本实验完成20轮训练后,模型在验证阶段输出了Precision、Recall、mAP50和mAP50-95等指标。实验中,模型在128张图片和929个目标实例上进行评估,Precision约为0.752,Recall约为0.421,mAP50约为0.538,mAP50-95约为0.379。

Precision表示模型预测出的目标框中有多少是正确的,Recall表示真实目标中有多少被检测出来,mAP50和mAP50-95是目标检测中常用的综合评价指标。结果表明,模型具备基本目标检测能力,但仍存在一定漏检和定位精度提升空间。

3.7 预测结果说明

训练和验证完成后,程序会调用predict方法对COCO128图片进行目标检测,并自动保存预测结果图。预测结果图中会显示检测框、类别名称和置信度。

例如,检测结果中出现person 0.83,表示模型认为该检测框中的目标是人的置信度为0.83。出现bowl 0.93,表示模型认为该目标是碗的置信度为0.93。

本实验生成的预测结果文件夹为runs_predict_epoch20/coco128_result_epoch20,里面包含模型对COCO128图片预测后保存的jpg结果图。

3.8 实验中遇到的问题与分析

问题一:Ultralytics安装过程中出现网络或代理问题。

在安装Ultralytics时,pip下载依赖受到代理或网络配置影响,导致无法正常下载。解决方法是检查代理配置,更换阿里镜像源,并使用pip的isolated模式进行安装。

问题二:训练完成后程序一开始找不到best.pt权重文件。

造成该问题的原因是YOLOv8实际保存结果的路径与代码中手动写入的路径不一致。后续通过model.trainer.save_dir自动获取真实保存路径,解决了best.pt文件无法加载的问题。

问题三:CPU环境下训练速度较慢。

YOLOv8训练过程涉及大量矩阵计算,GPU更适合并行计算,而CPU训练速度较慢。因此本实验选择YOLOv8n轻量模型,并将imgsz设置为320、batch size设置为2,以保证实验可以顺利完成。

问题四:训练轮数增加后,部分检测结果视觉变化不明显。

这主要是因为本实验使用的是yolov8n.pt预训练模型,该模型已经在COCO数据集上学习过常见目标类别,而COCO128又是COCO的小型子集,因此模型在训练前已经具备一定检测能力。增加少量训练轮数后,部分图片的视觉效果不会发生明显变化。

4. 参考链接

Ultralytics YOLOv8模型文档:https://docs.ultralytics.com/models/yolov8/

Ultralytics COCO128数据集文档:https://docs.ultralytics.com/datasets/detect/coco128/

Ultralytics训练模式文档:https://docs.ultralytics.com/modes/train/

Ultralytics验证模式文档:https://docs.ultralytics.com/modes/val/

Ultralytics预测模式文档:https://docs.ultralytics.com/modes/predict/

相关推荐
stephon_1001 小时前
国产大模型 Agent 开发实战:用 milu 5 分钟搭一个多用户 AI Agent 服务(DeepSeek/Qwen/Kimi/GLM)
人工智能·python·ai·chatgpt
程序员三明治1 小时前
RAG 元数据的作用与管理:让知识库回答可追溯、可过滤、可维护
人工智能·llm·知识库·元数据·rag·java后端
Y学院2 小时前
Codex 在国产信创环境下的安装与适配实践
人工智能
qq3621967052 小时前
GEO执行框架:从诊断到落地的完整实施方案
人工智能·chatgpt
YOLO数据集集合2 小时前
无人机航拍光伏板状态识别数据集 | 太阳能板异常检测、智能巡检、深度学习模型训练素材第10340期
人工智能·深度学习·yolo·目标检测·无人机
總鑽風2 小时前
[特殊字符] Spring AI Alibaba企业级智能助手落地实践
java·人工智能·spring
Kobebryant-Manba2 小时前
学习卷积神经网络
人工智能·深度学习
Nile2 小时前
解密Palantir系列二:1.Foundry · 数据操作系统
大数据·人工智能·ai·ai编程·ai-native