🔥 别再死磕枯燥理论了!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 性能优化建议
- 批处理推理:对多张图片使用批处理提高GPU利用率
- TensorRT加速:使用TensorRT引擎获得极致推理速度
- 量化压缩:使用INT8量化减少模型大小,提升推理速度
- 多线程处理:摄像头模式下使用多线程处理帧读取与显示
9. 常见问题与解决方案
Q1: 运行时提示"ModuleNotFoundError: No module named 'ultralytics'"
解决方案:
bash
pip install ultralytics
# 或
pip install -r requirements.txt
Q2: 摄像头无法打开或显示黑屏
解决方案:
- 检查摄像头权限
- 尝试不同的摄像头索引(0, 1, 2...)
- 使用
--source video.mp4测试视频文件是否正常
Q3: 检测结果不准确或漏检
解决方案:
- 调整置信度阈值:
--conf 0.1(更敏感)或--conf 0.5(更严格) - 更换更大模型:
--model yolov8s.pt - 确保输入图片质量(分辨率、光照、角度)
Q4: 运行速度太慢
解决方案:
- 确认是否使用GPU:
torch.cuda.is_available() - 使用更小模型:
--model yolov8n.pt - 减小输入图片尺寸(修改代码中的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. 总结与学习建议
通过本实践项目,你已经掌握了:
- YOLOv8基础使用:模型加载、推理、结果解析
- 完整项目搭建:从环境配置到结果可视化的全流程
- 多种应用场景:图片检测、摄像头实时检测
- 扩展方向:模型替换、自定义训练、模型导出
下一步学习建议:
- 深入原理:阅读YOLOv8论文,理解网络结构设计
- 数据标注:尝试使用LabelImg等工具标注自己的数据集
- 模型训练:在自己的数据集上微调YOLOv8
- 工程优化:学习模型量化、TensorRT加速等部署技术
- 应用开发:将检测功能集成到Web或移动端应用中