YOLO(You Only Look Once)是一种广泛使用的目标检测模型,近年来也逐渐应用于图像分割和姿态估计任务。本篇文章将详细讲解YOLO模型在目标检测、图像分割及姿态估计中的应用,通过代码和预测结果分析帮助您更好地理解和使用YOLO模型。
Ultralytics库的所有预测结果都放在Result
对象中,适用于目标检测、图像分割和姿态估计等任务,本文也将详细介绍如何处理不同任务的预测结果。
任务概述与对比
YOLO支持三种主要视 觉任务,每个任务都有其独特的输出结构和应用场景:
-
目标检测(Object Detection)
- 输出:边界框(boxes)和类别标签
- 特点:定位物体位置并进行分类
- 应用场景:物体识别、车辆检测、人脸检测等
-
图像分割(Image Segmentation)
- 输出:像素级别掩码(masks)和类别标签
- 特点:提供物体精确的轮廓信息
- 应用场景:医学图像分析、场景理解等
-
姿态估计(Pose Estimation)
- 输出:人体关键点坐标(keypoints)和骨架连接
- 特点:识别人体姿态和动作
- 应用场景:运动分析、姿态追踪、行为监控等
YOLO模型的预测结果对象结构
所有任务的预测结果都封装在Results
对象中,Results
对象包含以下通用属性:
- orig_img: 原始图像数据
- orig_shape: 原始图像尺寸(高, 宽)
- path: 输入图像路径
- save_dir: 结果保存路径
- speed: 预测耗时信息
这些属性帮助我们在不同任务中标准化处理预测结果。
目标检测
目标检测的代码实现
下面的代码演示了如何使用YOLO进行目标检测,识别图像中的物体,并将检测结果(包括边界框和类别标签)绘制在原始图像上。
import os
from ultralytics import YOLO
import cv2
import os
import glob
import shutil
OBJECT_DETECTION_MODEL_PATH = './models/object_detection.onnx'
TASK_NAME = 'detect'
def generate_colors(names):
colors = {}
for name in names:
hash_object = hashlib.md5(name.encode())
hash_int = int(hash_object.hexdigest(), 16)
b = (hash_int & 0xFF0000) >> 16
g = (hash_int & 0x00FF00) >> 8
r = hash_int & 0x0000FF
colors[name] = (b, g, r) # OpenCV 使用 BGR 顺序
return colors
# 单张图像目标检测预测
def predict_single_image_by_detect(image_path, out_image_file):
# 获取输出文件`out_image_path`文件所在的目录
out_dir = os.path.dirname(out_image_path)
os.makedirs(out_dir, exist_ok=True)
image_list = [image_path]
results = model(image_list)
for result in results:
boxes = result.boxes
if boxes is None:
cv2.imwrite(out_image_file, result.orig_img)
continue
boxes_data = boxes.data.cpu().numpy()
names = result.names
class_names = list(names.values())
color_map = generate_colors(class_names)
img = result.orig_img
for box in boxes_data:
x1, y1, x2, y2, score, class_id = box
x1, y1, x2, y2 = map(int, [x1, y1, x2, y2])
class_name = names[int(class_id)]
color = color_map[class_name]
cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)
label = f'{class_name} {score:.2f}'
cv2.putText(img, label, (x1, max(y1 - 10, 0)),
cv2.FONT_HERSHEY_SIMPLEX, 0.9, color, 2)
print(f"图像 写入路径: {out_image_file}")
cv2.imwrite(out_image_file, img)
if __name__ == '__main__':
# 预测单张图像
image_path = 'bus.jpg'
out_image_path = image_path + '_predicted.jpg'
predict_single_image_by_detect(image_path, out_image_path)
目标检测结果分析
在目标检测任务中,Results
对象中最重要的字段是:
- boxes:包含边界框的坐标、置信度和类别ID。
- names:类别标签映射。
- orig_img