《基于 YOLO 的实体识别入门实践:从原理到 Python 代码实现》

基于 YOLO 的实体识别入门实践:从原理到 Python 检测代码实现


一、什么是 YOLO?

YOLO 的全称是 You Only Look Once,中文可以理解为“只看一次”。

它是一种非常典型的 目标检测算法

目标检测主要完成两件事:

  1. 判断图像中有哪些目标;
  2. 找出目标在图像中的具体位置。

例如,在一张街景图片中,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 可视化检测系统等内容。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值