目标检测作为计算机视觉的核心技术,在自动驾驶、安防监控、医疗影像等领域发挥着不可替代的作用。本文将系统讲解目标检测的概念、原理、主流模型、常见数据集及应用场景,帮助读者构建对这一技术的完整认知。
目标检测(Object Detection)是指在图像或视频中自动定位并识别出所有感兴趣的目标的技术。它需要解决两个核心问题:
与其他计算机视觉任务的区别如下:
任务类型 | 输出结果 | 核心差异 | 典型应用 |
---|---|---|---|
图像分类 | 单张图像的类别标签 | 不涉及目标位置信息 | 相册自动分类 |
目标检测 | 目标类别 + 边界框坐标 | 同时处理分类与定位 | 自动驾驶障碍物检测 |
语义分割 | 像素级类别标签 | 输出目标的完整轮廓 | 遥感图像土地类型划分 |
实例分割 | 像素级实例标签 | 区分同一类别的不同个体 | 人群计数 |
简单来说,目标检测的输出是 "带标签的边界框",例如在一张街景图中,检测结果可能是:
目标检测的核心流程可概括为 "特征提取→候选区域生成→分类与回归",不同算法的差异主要体现在这三个步骤的实现方式上。
目标检测依赖于图像的视觉特征(如颜色、纹理、形状)。传统方法使用手工设计特征(如 HOG、SIFT),而现代方法则通过卷积神经网络(CNN)自动学习特征。
HOG 特征示例(传统方法):
python
运行
import cv2
import numpy as np
def extract_hog_features(image):
# 转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 初始化HOG描述符
hog = cv2.HOGDescriptor()
# 计算HOG特征
features = hog.compute(gray)
return features
# 测试
image = cv2.imread("person.jpg")
hog_features = extract_hog_features(image)
print(f"HOG特征维度: {hog_features.shape}") # 输出(3780, 1)
CNN 特征提取(现代方法):
python
运行
import torch
import torchvision.models as models
# 使用预训练的ResNet50作为特征提取器
resnet = models.resnet50(pretrained=True)
# 移除最后一层全连接层,保留特征提取部分
feature_extractor = torch.nn.Sequential(*list(resnet.children())[:-1])
# 输入图像(3通道,224x224)
image = torch.randn(1, 3, 224, 224) # 模拟一张图像
# 提取特征
features = feature_extractor(image)
print(f"CNN特征维度: {features.shape}") # 输出(1, 2048, 1, 1)
CNN 通过多层卷积和池化操作,能自动学习从低级特征(边缘、颜色)到高级特征(纹理、形状)的层次化表示,显著优于手工特征。
目标检测需要在图像中搜索可能包含目标的区域,这一过程称为 "候选区域生成"。主要方法有:
对于每个候选区域,需要完成:
损失函数通常是分类损失(如交叉熵损失)和回归损失(如 L1 损失、IoU 损失)的加权和:
python
运行
# 简化的目标检测损失函数
def detection_loss(pred_cls, pred_bbox, true_cls, true_bbox):
# 分类损失(交叉熵)
cls_loss = torch.nn.CrossEntropyLoss()(pred_cls, true_cls)
# 回归损失(L1损失)
bbox_loss = torch.nn.L1Loss()(pred_bbox, true_bbox)
# 总损失(权重可调整)
total_loss = cls_loss + 1.0 * bbox_loss
return total_loss
目标检测算法可分为两阶段(Two-Stage) 和单阶段(One-Stage) 两大类,各有优缺点。
两阶段模型先生成候选区域,再对区域进行分类和回归,精度高但速度较慢。
核心流程:
优势:精度高,在 VOC、COCO 等数据集上表现优异;
劣势:速度较慢,难以实时应用。
代码示例(使用 MMDetection 库):
python
运行
from mmdet.apis import init_detector, inference_detector
# 配置文件和预训练权重
config_file = 'configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py'
checkpoint_file = 'checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth'
# 初始化模型
model = init_detector(config_file, checkpoint_file, device='cuda:0')
# 推理
result = inference_detector(model, 'test_image.jpg')
# 可视化结果
model.show_result('test_image.jpg', result, out_file='result.jpg')
单阶段模型直接对图像进行处理,同时预测目标类别和位置,速度快但精度略低。
核心思想:将图像划分为 S×S 网格,每个网格预测 B 个边界框和对应的类别概率。
优势:速度极快(YOLOv5 在 GPU 上可达 300+FPS),适合实时场景;
劣势:小目标检测精度较低。
代码示例(使用 YOLOv5):
python
运行
import torch
# 加载预训练的YOLOv5模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
# 推理
img = 'test_image.jpg'
results = model(img)
# 显示结果
results.show() # 显示图像和检测框
results.print() # 打印检测结果(类别、置信度、边界框)
核心思想:在不同尺度的特征图上预测目标,使用多尺度特征提升小目标检测精度。
优势:平衡精度和速度,支持多尺度目标;
劣势:对小目标的召回率仍低于两阶段模型。
模型 | 速度(FPS) | COCO [email protected] | 特点 | 适用场景 |
---|---|---|---|---|
Faster R-CNN | ~5 | 0.697 | 精度高,速度慢 | 高精度需求(医疗影像) |
YOLOv5 | ~200 | 0.562 | 速度快,精度适中 | 实时检测(监控、自动驾驶) |
SSD | ~40 | 0.512 | 多尺度检测,平衡型 | 移动端应用 |
FCOS | ~30 | 0.621 | 无锚框设计,简化流程 | 通用场景 |
RetinaNet | ~15 | 0.618 | 解决类别不平衡,精度高 | 复杂场景检测 |
目标检测模型的训练依赖大规模标注数据,以下是常用公开数据集:
数据集 | 图像数量 | 类别数 | 特点 | 适用场景 |
---|---|---|---|---|
PASCAL VOC | 约 2 万张 | 20 | 包含人、车、动物等常见类别,标注规范 | 基础模型训练与测试 |
COCO | 123 万张 | 80 | 类别多,包含小目标、复杂场景,标注精细 | 主流模型性能评估 |
ImageNet | 1400 万张 | 2000+ | 类别极多,目标检测子集含 200 类 | 通用目标检测 |
KITTI | 1.5 万张 | 8 | 专注自动驾驶场景(车、行人、交通标志等) | 自动驾驶算法研发 |
WIDER Face | 32 万张 | 1 | 专注人脸检测,包含各种姿态和光照条件 | 人脸检测模型训练 |
OCR-VOC | 1 万张 | 10 | 专注文字检测,包含多语言、复杂背景 | 文字识别前置任务 |
数据集格式:
自定义数据集标注:
可使用 LabelImg、LabelStudio 等工具手动标注,标注格式示例(COCO 格式):
json
{
"images": [{"id": 1, "width": 640, "height": 480, "file_name": "img1.jpg"}],
"annotations": [
{
"id": 1,
"image_id": 1,
"category_id": 1, # 类别ID(如1对应"person")
"bbox": [100, 200, 150, 300], # [xmin, ymin, width, height]
"area": 45000, # 边界框面积
"iscrowd": 0 # 是否为拥挤目标
}
],
"categories": [{"id": 1, "name": "person"}]
}
目标检测技术已渗透到各行各业,以下是典型应用:
目标检测是自动驾驶的 "眼睛",用于实时识别:
技术挑战:
案例:特斯拉 Autopilot 系统使用多摄像头 + 目标检测算法,实现车道保持、自动避让等功能。
目标检测在安防领域的应用包括:
技术挑战:
在工业生产中,目标检测用于:
案例:手机屏幕缺陷检测,通过高分辨率相机拍摄屏幕图像,目标检测算法识别划痕、气泡等缺陷,精度可达 99.9% 以上。
医疗影像分析中,目标检测用于:
技术挑战: