基于 YOLO 的实体识别入门实践:从原理到 Python 检测代码实现
一、什么是 YOLO?
YOLO 的全称是 You Only Look Once,中文可以理解为“只看一次”。
它是一种非常典型的 目标检测算法。
目标检测主要完成两件事:
- 判断图像中有哪些目标;
- 找出目标在图像中的具体位置。
例如,在一张街景图片中,YOLO 可以识别出:
- 人
- 汽车
- 自行车
- 红绿灯
- 狗
- 背包
并且会用矩形框把这些目标标注出来。
简单来说,YOLO 做的事情就是:
输入一张图片 → 分析图片内容 → 输出目标类别 + 目标位置 + 置信度
二、实体识别和目标检测的关系
在很多项目中,我们会把图像中的物体识别称为“实体识别”。
例如:
| 场景 | 需要识别的实体 |
|---|---|
| 交通监控 | 汽车、行人、红绿灯 |
| 智慧校园 | 学生、书包、自行车 |
| 工业检测 | 零件、缺陷、设备 |
| 安防系统 | 人脸、人员、车辆 |
| 农业识别 | 水果、叶片、病虫害 |
从技术角度来说,基于 YOLO 的实体识别本质上属于 目标检测 Object Detection。
它和普通图像分类不同。
图像分类只回答:
这张图是什么?
目标检测回答:
这张图里有什么?
它们分别在哪里?
每个目标的置信度是多少?
三、YOLO 的核心思想
YOLO 的核心思想是:
把目标检测任务看成一个整体的回归问题。
传统目标检测算法通常需要先生成候选区域,再进行分类和定位,流程相对复杂。
而 YOLO 的思路更加直接:
整张图片输入神经网络
↓
网络直接预测目标类别、检测框位置和置信度
↓
输出最终检测结果
YOLO 的优势主要有:
| 优点 | 说明 |
|---|---|
| 速度快 | 适合实时检测 |
| 端到端 | 输入图片后直接输出检测结果 |
| 应用广 | 可用于图片、视频、摄像头 |
| 部署方便 | 可部署到服务器、边缘设备和移动端 |
四、YOLO 检测结果包含什么?
使用 YOLO 进行实体识别后,通常会得到以下信息:
类别名称:person
置信度:0.91
检测框坐标:x1, y1, x2, y2
其中:
| 参数 | 含义 |
|---|---|
| class | 目标类别 |
| confidence | 置信度 |
| x1, y1 | 检测框左上角坐标 |
| x2, y2 | 检测框右下角坐标 |
例如:
person 0.91 [120, 80, 300, 420]
表示模型认为图片中有一个人,置信度为 91%,目标框位置为 [120, 80, 300, 420]。
五、环境准备
本文以 Python 环境为例,使用常见的 YOLO 调用方式进行演示。
1. 安装 Python
建议使用 Python 3.8 及以上版本。
可以在命令行中查看 Python 版本:
python --version
2. 安装相关库
pip install ultralytics
pip install opencv-python
其中:
| 库名 | 作用 |
|---|---|
| ultralytics | 调用 YOLO 模型 |
| opencv-python | 图像读取、显示和视频处理 |
六、使用 YOLO 识别图片中的实体
下面是一个最基础的图片检测代码。
from ultralytics import YOLO
# 1. 加载 YOLO 模型
model = YOLO("yolov8n.pt")
# 2. 对图片进行目标检测
results = model("test.jpg")
# 3. 显示检测结果
results[0].show()
# 4. 保存检测后的图片
results[0].save(filename="result.jpg")
代码说明:
model = YOLO("yolov8n.pt")
表示加载一个 YOLO 模型。
results = model("test.jpg")
表示对 test.jpg 这张图片进行检测。
results[0].show()
表示显示检测结果。
results[0].save(filename="result.jpg")
表示把识别后的结果保存为图片。
七、获取识别结果中的类别和坐标
如果我们不只是想显示图片,还想拿到检测结果,可以这样写:
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
results = model("test.jpg")
for result in results:
boxes = result.boxes
for box in boxes:
# 获取检测框坐标
x1, y1, x2, y2 = box.xyxy[0]
# 获取置信度
confidence = box.conf[0]
# 获取类别编号
class_id = int(box.cls[0])
# 获取类别名称
class_name = model.names[class_id]
print("类别:", class_name)
print("置信度:", float(confidence))
print("坐标:", float(x1), float(y1), float(x2), float(y2))
print("----------------------")
运行后,控制台可能会输出类似结果:
类别: person
置信度: 0.91
坐标: 120.5 80.2 300.4 420.8
----------------------
类别: car
置信度: 0.87
坐标: 350.1 200.6 600.2 450.3
----------------------
这样就可以把 YOLO 的识别结果用于后续业务逻辑中。
八、使用 OpenCV 读取图片并检测
在实际项目中,我们经常会结合 OpenCV 使用 YOLO。
import cv2
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
image = cv2.imread("test.jpg")
results = model(image)
annotated_image = results[0].plot()
cv2.imshow("YOLO Detection", annotated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码说明:
cv2.imread("test.jpg")
用于读取图片。
results[0].plot()
用于把检测框、类别和置信度画到图片上。
cv2.imshow()
用于显示检测后的图片。
九、基于 YOLO 的视频实体识别
YOLO 不仅可以识别图片,也可以识别视频。
import cv2
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
cap = cv2.VideoCapture("test.mp4")
while True:
ret, frame = cap.read()
if not ret:
break
results = model(frame)
annotated_frame = results[0].plot()
cv2.imshow("YOLO Video Detection", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
这段代码实现的功能是:
读取视频 → 逐帧检测 → 绘制检测框 → 实时显示结果
按下键盘上的 q 可以退出视频检测窗口。
十、使用摄像头进行实时实体识别
如果想调用电脑摄像头,可以将视频路径改成摄像头编号。
import cv2
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
results = model(frame)
annotated_frame = results[0].plot()
cv2.imshow("Real-time YOLO Detection", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
其中:
cv2.VideoCapture(0)
表示调用默认摄像头。
如果电脑有多个摄像头,可以尝试:
cv2.VideoCapture(1)
cv2.VideoCapture(2)
十一、YOLO 模型文件怎么选择?
常见的 YOLO 模型通常会有不同大小的版本,例如:
| 模型 | 特点 |
|---|---|
| yolov8n | 体积小,速度快,适合入门和实时检测 |
| yolov8s | 精度和速度较均衡 |
| yolov8m | 精度更高,但速度稍慢 |
| yolov8l | 模型更大,检测能力更强 |
| yolov8x | 精度较高,但对硬件要求更高 |
对于初学者来说,推荐先使用:
yolov8n.pt
因为它运行速度快,对电脑配置要求较低。
十二、置信度 threshold 的设置
在目标检测中,置信度表示模型对识别结果的把握程度。
例如:
person 0.92
表示模型有 92% 的把握认为该目标是 person。
可以设置置信度阈值:
results = model("test.jpg", conf=0.5)
表示只保留置信度大于 0.5 的检测结果。
如果阈值设置得太低,可能会出现误检。
如果阈值设置得太高,可能会漏掉一些目标。
一般可以从下面的范围开始尝试:
0.25 ~ 0.6
十三、保存检测结果
YOLO 可以直接保存检测后的结果。
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
results = model("test.jpg", save=True)
运行后,检测结果通常会保存在项目的 runs/detect 目录下。
也可以自己指定保存文件名:
results = model("test.jpg")
results[0].save(filename="output.jpg")
十四、自定义实体识别任务
默认的 YOLO 模型通常可以识别常见物体,例如:
- person
- car
- bicycle
- dog
- cat
- bus
- truck
- chair
- bottle
但是如果我们想识别特定实体,例如:
- 安全帽
- 口罩
- 火焰
- 车牌
- 水果
- 工业零件
- 课堂学生行为
就需要训练自己的数据集。
自定义训练的大致流程如下:
收集图片数据
↓
标注目标框
↓
整理数据集格式
↓
配置 data.yaml 文件
↓
使用 YOLO 训练模型
↓
使用训练好的模型进行预测
十五、YOLO 数据集格式
YOLO 常用的数据标注格式如下:
class_id x_center y_center width height
例如:
0 0.512 0.438 0.231 0.376
含义是:
| 字段 | 含义 |
|---|---|
| class_id | 类别编号 |
| x_center | 检测框中心点 x 坐标 |
| y_center | 检测框中心点 y 坐标 |
| width | 检测框宽度 |
| height | 检测框高度 |
需要注意的是,YOLO 标注中的坐标一般是归一化后的结果,范围在 0 到 1 之间。
十六、数据集目录结构
一个常见的 YOLO 数据集目录结构如下:
dataset/
├── images/
│ ├── train/
│ └── val/
├── labels/
│ ├── train/
│ └── val/
└── data.yaml
其中:
| 文件夹 | 说明 |
|---|---|
| images/train | 训练集图片 |
| images/val | 验证集图片 |
| labels/train | 训练集标注文件 |
| labels/val | 验证集标注文件 |
| data.yaml | 数据集配置文件 |
十七、data.yaml 配置文件示例
假设我们要识别两类实体:
helmet
person
那么 data.yaml 可以这样写:
path: dataset
train: images/train
val: images/val
names:
0: helmet
1: person
也可以写成:
path: dataset
train: images/train
val: images/val
nc: 2
names: ['helmet', 'person']
其中:
| 参数 | 含义 |
|---|---|
| path | 数据集根目录 |
| train | 训练图片路径 |
| val | 验证图片路径 |
| nc | 类别数量 |
| names | 类别名称 |
十八、训练自己的 YOLO 模型
准备好数据集后,可以使用下面的命令进行训练:
yolo detect train data=data.yaml model=yolov8n.pt epochs=100 imgsz=640
参数说明:
| 参数 | 说明 |
|---|---|
| data | 数据集配置文件 |
| model | 使用的预训练模型 |
| epochs | 训练轮数 |
| imgsz | 输入图片尺寸 |
如果电脑配置一般,可以先尝试:
yolo detect train data=data.yaml model=yolov8n.pt epochs=50 imgsz=640
训练完成后,模型文件通常保存在:
runs/detect/train/weights/best.pt
其中 best.pt 就是训练过程中表现较好的模型。
十九、使用自训练模型进行检测
训练完成后,可以使用自己的模型进行检测。
from ultralytics import YOLO
model = YOLO("runs/detect/train/weights/best.pt")
results = model("test.jpg")
results[0].show()
也可以使用命令行方式:
yolo detect predict model=runs/detect/train/weights/best.pt source=test.jpg
如果要检测视频:
yolo detect predict model=runs/detect/train/weights/best.pt source=test.mp4
如果要检测摄像头:
yolo detect predict model=runs/detect/train/weights/best.pt source=0
二十、项目应用场景
基于 YOLO 的实体识别可以应用在很多场景中。
1. 智慧交通
识别道路中的车辆、行人、斑马线、交通标志等,用于交通流量分析、违章检测和自动驾驶辅助。
2. 智慧安防
识别人员、车辆、异常行为等,用于监控系统、门禁系统和区域入侵检测。
3. 工业质检
识别产品表面缺陷、零件位置、生产线异常情况,提高检测效率。
4. 医学影像辅助
在部分医学图像分析任务中,可以辅助定位病灶区域,提高医生诊断效率。
5. 农业检测
识别水果成熟度、农作物病虫害、叶片状态等,用于智慧农业管理。
6. 校园场景
识别学生、书包、课堂行为、实验设备等,可以用于校园安全和教学管理。
二十一、小白常见问题
1. 为什么运行速度很慢?
可能原因有:
- 电脑没有独立显卡;
- 使用的模型太大;
- 图片分辨率太高;
- 视频帧率较高;
- 没有使用 GPU 加速。
解决方法:
使用 yolov8n 这类小模型
降低图片尺寸
减少视频分辨率
使用 GPU 环境运行
2. 为什么识别不准确?
可能原因有:
- 图片太模糊;
- 目标太小;
- 光线太暗;
- 目标被遮挡;
- 默认模型没有该类别;
- 自定义数据集数量太少。
3. 为什么训练后效果不好?
常见原因有:
- 标注不准确;
- 数据量太少;
- 类别分布不均衡;
- 训练轮数太少;
- 数据场景过于单一;
- 图片质量不稳定。
4. 检测框很多怎么办?
可以提高置信度阈值:
results = model("test.jpg", conf=0.6)
5. 漏检严重怎么办?
可以适当降低置信度阈值:
results = model("test.jpg", conf=0.25)
同时也要检查数据集质量。
二十二、完整示例代码
下面给出一个完整的图片实体识别代码,可以直接运行。
from ultralytics import YOLO
import cv2
# 加载 YOLO 模型
model = YOLO("yolov8n.pt")
# 读取图片
image_path = "test.jpg"
image = cv2.imread(image_path)
# 判断图片是否读取成功
if image is None:
print("图片读取失败,请检查图片路径")
exit()
# 执行目标检测
results = model(image, conf=0.5)
# 获取检测结果并绘制
annotated_image = results[0].plot()
# 输出检测信息
for result in results:
boxes = result.boxes
for box in boxes:
x1, y1, x2, y2 = box.xyxy[0]
confidence = box.conf[0]
class_id = int(box.cls[0])
class_name = model.names[class_id]
print(f"识别类别:{class_name}")
print(f"置信度:{float(confidence):.2f}")
print(f"坐标:({float(x1):.1f}, {float(y1):.1f}), ({float(x2):.1f}, {float(y2):.1f})")
print("--------------------")
# 显示检测结果
cv2.imshow("YOLO Entity Detection", annotated_image)
# 保存检测结果
cv2.imwrite("result.jpg", annotated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
二十三、本文总结
本文主要介绍了如何使用 YOLO 实现基础实体识别任务。
核心流程可以总结为:
安装环境
↓
加载 YOLO 模型
↓
输入图片、视频或摄像头画面
↓
模型识别目标
↓
输出类别、置信度和坐标
↓
保存或展示检测结果
对于初学者来说,刚开始不需要直接训练复杂模型,可以先使用预训练模型完成图片和视频检测。等熟悉流程后,再尝试准备自己的数据集,训练专门面向某一场景的实体识别模型。
YOLO 的优势在于速度快、效果好、使用方便,非常适合用于计算机视觉入门、课程设计、毕业设计和实际项目开发。掌握 YOLO 的基础使用方法后,就可以进一步学习数据标注、模型训练、模型部署、边缘端推理以及 Web 可视化检测系统等内容。


5970

被折叠的 条评论
为什么被折叠?



