入门实践工程二:基于 YOLOv8 的日常物品目标检测|附:环境依赖环境及工程源码

🔥 别再死磕枯燥理论了!AI 时代,拿实战作品说话才是硬道理!(原创不易哈,希望可以帮到还有些许学习劲儿的同学们) 🔥

【进阶版还在创作中,耗费精力中......】

跳转到专栏目录,你学习更有方向和思路......

入门实践工程二:基于 YOLOv8 的日常物品目标检测|附:环境依赖环境及工程源码

1. 项目简介

本项目基于Ultralytics官方提供的YOLOv8预训练模型,实现对图片或摄像头画面中常见物体(如人、车、杯子等)的实时检测与标注。通过这个实践工程,你可以:

  • 零训练直接推理:使用预训练模型,无需标注数据或训练过程
  • 完整流程体验:从模型加载、推理、后处理到可视化全流程
  • 多种输入支持:支持单张图片、摄像头实时视频流
  • 开箱即用:提供完整工程源码,一键运行

2. 核心原理与技术栈

2.1 目标检测基础

目标检测的核心任务是定位 + 识别,即在图像中找出目标物体的位置(边界框)并识别其类别。YOLO(You Only Look Once)系列作为单阶段检测器的代表,以其速度快、精度高的特点成为工业界和学术界的首选。

2.2 YOLOv8优势

YOLOv8是Ultralytics公司发布的最新版本,相比前代具有以下改进:

  • 更高的精度与速度平衡
  • 更友好的API设计(一行代码即可完成检测)
  • 更丰富的任务支持(检测、分割、分类、姿态估计)
  • 更完善的生态支持(支持ONNX、TensorRT等格式导出)

2.3 技术栈选择

  • 深度学习框架:PyTorch + Ultralytics
  • 模型:YOLOv8n(nano版本,体积最小,适合快速验证)
  • 编程语言:Python 3.8+
  • 依赖管理:pip + requirements.txt

3. 工程结构

复制代码
02_yolov8_detect/
├── main.py            # 检测主程序(支持图片/摄像头)
├── requirements.txt   # Python依赖包列表
└── runs/              # 检测结果输出目录(自动创建)

4. 环境配置与安装

4.1 基础环境安装

bash 复制代码
# 安装Ultralytics包(会自动安装PyTorch等依赖)
pip install ultralytics

# 或者使用requirements.txt安装所有依赖
pip install -r requirements.txt

4.2 注意事项

  • 首次运行:会自动下载YOLOv8n预训练权重(约6MB),需要网络连接
  • GPU加速:如需使用GPU加速,请根据PyTorch官网指引安装对应CUDA版本的PyTorch
  • Python版本:建议使用Python 3.8及以上版本

5. 使用方式详解

5.1 快速体验(默认示例)

bash 复制代码
# 最简单的方式:直接运行,程序会自动下载示例图片并检测
python main.py

5.2 检测自定义图片

bash 复制代码
# 检测自己的图片
python main.py --image path/to/your_image.jpg

# 示例:检测项目目录下的test.jpg
python main.py --image test.jpg

5.3 摄像头实时检测

bash 复制代码
# 使用默认摄像头(0表示第一个摄像头)
python main.py --source 0

# 使用视频文件
python main.py --source video.mp4

# 使用RTSP流
python main.py --source rtsp://username:password@ip:port/stream

操作提示 :摄像头模式下按 q 键退出检测。

5.4 高级参数配置

bash 复制代码
# 指定模型(支持yolov8n/s/m/l/x不同尺寸)
python main.py --model yolov8s.pt

# 调整置信度阈值(默认0.25,值越高检测越严格)
python main.py --conf 0.5

# 指定结果保存目录
python main.py --save-dir ./my_results

6. 代码解析

6.1 主程序架构

python 复制代码
"""
入门实践工程二:基于YOLOv8的日常物品目标检测
=====================================
使用Ultralytics提供的YOLOv8预训练模型,对图片中的常见物体进行检测并标注,
输出带检测框的结果图。无需训练,直接推理即可看到效果。

运行方式:
    python main.py                         # 默认对一张示例图片推理
    python main.py --image path/to/img.jpg # 指定自己的图片
    python main.py --source 0             # 调用摄像头实时检测(按q退出)

模型yolov8n.pt会在首次运行时自动下载到当前目录。
"""

6.2 核心函数说明

6.2.1 参数解析模块
python 复制代码
def parse_args():
    """解析命令行参数"""
    parser = argparse.ArgumentParser(description="YOLOv8目标检测Demo")
    parser.add_argument(
        "--image", type=str, default=None,
        help="待检测图片路径;不指定时使用内置示例图片",
    )
    parser.add_argument(
        "--source", type=str, default=None,
        help="实时检测源:0表示默认摄像头;或视频/RTSP地址",
    )
    # ... 其他参数
    return parser.parse_args()
6.2.2 图片检测函数
python 复制代码
def detect_image(model: YOLO, image_path: str, conf: float, save_dir: str):
    """对单张图片执行检测并保存结果"""
    if not os.path.exists(image_path):
        print(f"[错误] 图片不存在: {image_path}")
        sys.exit(1)

    print(f"正在检测图片: {image_path}")
    # 核心检测代码:一行调用完成推理
    results = model(image_path, conf=conf, save=True, 
                    project=save_dir, name="runs", exist_ok=True)
    
    # 结果解析与统计
    res = results[0]
    boxes = res.boxes
    names = res.names
    
    # 统计各类别数量
    cls_counts = {}
    for c in boxes.cls.tolist():
        label = names[int(c)]
        cls_counts[label] = cls_counts.get(label, 0) + 1
    
    # 输出检测结果
    print(f"\n检测到 {len(boxes)} 个目标:")
    for label, count in cls_counts.items():
        print(f"  - {label}: {count}")
6.2.3 实时流检测函数
python 复制代码
def detect_stream(model: YOLO, source: str, conf: float):
    """对摄像头/视频流执行实时检测(按q退出)"""
    print(f"开始实时检测,源={source}(按q退出)")
    # stream=True启用流式处理,show=True实时显示
    results = model(source, conf=conf, stream=True, show=True)
    for _ in results:
        pass  # 持续处理直到用户退出

6.3 示例图片下载

python 复制代码
def download_sample_image() -> str:
    """下载一张示例图片到当前目录"""
    import urllib.request
    
    url = "https://ultralytics.com/images/bus.jpg"
    save_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "sample.jpg")
    
    if not os.path.exists(save_path):
        print(f"下载示例图片: {url}")
        try:
            urllib.request.urlretrieve(url, save_path)
        except Exception as e:
            print(f"[错误] 下载示例图片失败:{e}")
            print("请用--image指定本地图片路径,或将任意图片重命名为sample.jpg放入目录。")
            sys.exit(1)
    return save_path

7. 运行结果与效果展示

7.1 控制台输出

运行程序后,控制台会显示类似以下信息:

复制代码
加载模型: yolov8n.pt ...
下载示例图片: https://ultralytics.com/images/bus.jpg
正在检测图片: sample.jpg

检测到 4 个目标:
  - person: 2
  - bus: 1
  - stop sign: 1

标注结果已保存到: ./runs/detect/runs/sample.jpg

7.2 可视化结果

检测结果会自动保存到 runs/ 目录下,图片上会标注出:

  • 边界框:用矩形框出检测到的物体
  • 类别标签:显示物体类别(如person、car等)
  • 置信度分数:显示检测的置信度(如0.85)

8. 进阶扩展方向

8.1 模型替换与对比

bash 复制代码
# 尝试不同尺寸的YOLOv8模型
python main.py --model yolov8s.pt  # small版本,精度更高
python main.py --model yolov8m.pt  # medium版本
python main.py --model yolov8l.pt  # large版本
python main.py --model yolov8x.pt  # extra large版本,精度最高

对比维度

  • 模型大小:从6MB到几十MB
  • 推理速度:从快到慢
  • 检测精度:从低到高

8.2 自定义数据集训练

bash 复制代码
# 使用自定义数据集进行迁移学习
yolo segment train data=custom.yaml model=yolov8n.pt epochs=100 imgsz=640

# 关键文件结构
custom_dataset/
├── images/           # 训练图片
├── labels/           # 标注文件(YOLO格式)
└── data.yaml         # 数据集配置文件

8.3 模型导出与部署

bash 复制代码
# 导出为ONNX格式(支持跨平台部署)
yolo export model=yolov8n.pt format=onnx

# 导出为TensorRT格式(NVIDIA GPU加速)
yolo export model=yolov8n.pt format=engine

# 导出为CoreML格式(iOS/macOS部署)
yolo export model=yolov8n.pt format=coreml

8.4 性能优化建议

  1. 批处理推理:对多张图片使用批处理提高GPU利用率
  2. TensorRT加速:使用TensorRT引擎获得极致推理速度
  3. 量化压缩:使用INT8量化减少模型大小,提升推理速度
  4. 多线程处理:摄像头模式下使用多线程处理帧读取与显示

9. 常见问题与解决方案

Q1: 运行时提示"ModuleNotFoundError: No module named 'ultralytics'"

解决方案

bash 复制代码
pip install ultralytics
# 或
pip install -r requirements.txt

Q2: 摄像头无法打开或显示黑屏

解决方案

  1. 检查摄像头权限
  2. 尝试不同的摄像头索引(0, 1, 2...)
  3. 使用--source video.mp4测试视频文件是否正常

Q3: 检测结果不准确或漏检

解决方案

  1. 调整置信度阈值:--conf 0.1(更敏感)或--conf 0.5(更严格)
  2. 更换更大模型:--model yolov8s.pt
  3. 确保输入图片质量(分辨率、光照、角度)

Q4: 运行速度太慢

解决方案

  1. 确认是否使用GPU:torch.cuda.is_available()
  2. 使用更小模型:--model yolov8n.pt
  3. 减小输入图片尺寸(修改代码中的imgsz参数)

10. 工程源码

完整代码已在前文展示,这里再次提供main.py的核心部分供参考:

python 复制代码
"""
入门实践工程二:基于 YOLOv8 的日常物品目标检测
=====================================
使用 Ultralytics 提供的 YOLOv8 预训练模型,对图片中的常见物体进行检测并标注,
输出带检测框的结果图。无需训练,直接推理即可看到效果。

运行:
    python main.py                         # 默认对一张示例图片推理
    python main.py --image path/to/img.jpg # 指定自己的图片
    python main.py --source 0             # 调用摄像头实时检测(按 q 退出)

模型 yolov8n.pt 会在首次运行时自动下载到当前目录。
"""

import argparse
import os
import sys

from ultralytics import YOLO


def parse_args():
    parser = argparse.ArgumentParser(description="YOLOv8 目标检测 Demo")
    parser.add_argument(
        "--image", type=str, default=None,
        help="待检测图片路径;不指定时使用内置示例图片",
    )
    parser.add_argument(
        "--source", type=str, default=None,
        help="实时检测源:0 表示默认摄像头;或视频/RTSP 地址",
    )
    parser.add_argument(
        "--model", type=str, default="yolov8n.pt",
        help="YOLOv8 权重,默认 yolov8n.pt(nano,体积最小)",
    )
    parser.add_argument(
        "--conf", type=float, default=0.25,
        help="置信度阈值,默认 0.25",
    )
    parser.add_argument(
        "--save-dir", type=str,
        default=os.path.dirname(os.path.abspath(__file__)),
        help="检测结果保存目录",
    )
    return parser.parse_args()


def detect_image(model: YOLO, image_path: str, conf: float, save_dir: str):
    """对单张图片执行检测并保存结果。"""
    if not os.path.exists(image_path):
        print(f"[错误] 图片不存在: {image_path}")
        sys.exit(1)

    print(f"正在检测图片: {image_path}")
    results = model(image_path, conf=conf, save=True, project=save_dir, name="runs", exist_ok=True)

    # results[0] 保存标注后的图片到 runs/detect/runs/
    res = results[0]
    boxes = res.boxes
    names = res.names
    print(f"\n检测到 {len(boxes)} 个目标:")
    cls_counts = {}
    for c in boxes.cls.tolist():
        label = names[int(c)]
        cls_counts[label] = cls_counts.get(label, 0) + 1
    for label, count in cls_counts.items():
        print(f"  - {label}: {count}")

    saved_path = os.path.join(save_dir, "runs", os.path.basename(image_path))
    print(f"\n标注结果已保存到: {saved_path}")


def detect_stream(model: YOLO, source: str, conf: float):
    """对摄像头/视频流执行实时检测(按 q 退出)。"""
    print(f"开始实时检测,源={source}(按 q 退出)")
    results = model(source, conf=conf, stream=True, show=True)
    for _ in results:
        pass


def main():
    args = parse_args()

    print(f"加载模型: {args.model} ...")
    model = YOLO(args.model)

    if args.source is not None:
        detect_stream(model, args.source, args.conf)
    else:
        # 默认下载一张示例图片做检测
        image_path = args.image or download_sample_image()
        detect_image(model, image_path, args.conf, args.save_dir)


def download_sample_image() -> str:
    """下载一张示例图片到当前目录(如无网络会抛错,可自行替换为本地图片)。"""
    import urllib.request

    url = "https://ultralytics.com/images/bus.jpg"
    save_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "sample.jpg")
    if not os.path.exists(save_path):
        print(f"下载示例图片: {url}")
        try:
            urllib.request.urlretrieve(url, save_path)
        except Exception as e:
            print(f"[错误] 下载示例图片失败:{e}")
            print("请用 --image 指定本地图片路径,或将任意图片重命名为 sample.jpg 放入目录。")
            sys.exit(1)
    return save_path


if __name__ == "__main__":
    main()

11. 总结与学习建议

通过本实践项目,你已经掌握了:

  1. YOLOv8基础使用:模型加载、推理、结果解析
  2. 完整项目搭建:从环境配置到结果可视化的全流程
  3. 多种应用场景:图片检测、摄像头实时检测
  4. 扩展方向:模型替换、自定义训练、模型导出

下一步学习建议:

  1. 深入原理:阅读YOLOv8论文,理解网络结构设计
  2. 数据标注:尝试使用LabelImg等工具标注自己的数据集
  3. 模型训练:在自己的数据集上微调YOLOv8
  4. 工程优化:学习模型量化、TensorRT加速等部署技术
  5. 应用开发:将检测功能集成到Web或移动端应用中
相关推荐
工业设备方案笔记3 小时前
RK3588 vs RK3568:AI边缘计算项目到底应该如何选择芯片平台?
arm开发·人工智能·目标跟踪·架构·边缘计算
指尖的爷4 小时前
RKNN转化环境搭建(rknn_toolkit2新版本)
嵌入式硬件·深度学习·物联网·目标检测
探物 AI6 小时前
yolov5里面的骨干组件14:C3模块 (CSP Bottleneck with 3 Convolutions)
yolo
雪的季节9 小时前
不安装YOLO只安装 PyTorch,加载已有yolo数据,从无到有创建模型训练数据并加载使用(重要)
人工智能·pytorch·yolo
guo_xiao_xiao_9 小时前
YOLO[室内与室外多场景混凝土块目标检测]目标检测数据集
yolo·目标检测·目标跟踪
江畔柳前堤10 小时前
YOLO 目标检测全流程深度剖析
人工智能·yolo·目标检测·计算机视觉·unity·面试·vllm
guo_xiao_xiao_11 小时前
YOLO[野外溪流与人工水域][鱼]目标检测数据集
yolo·目标检测·目标跟踪
芸翳&Camellia12 小时前
2026年电赛H题钢珠识别——基于深度学习的视觉目标检测与实时速度估计系统技术分析
嵌入式硬件·深度学习·目标检测·电赛
智购科技智能售货柜12 小时前
自动售货机商品识别YOLO模型训练实战:从6万张图片到98%识别率的完整复盘~YH
运维·服务器·数据库·人工智能·redis·物联网·yolo