第39篇:目标检测技术入门——让AI不仅“看到”更能“定位”(概念入门)
文章目录背景引入核心概念什么是目标检测类比解释从“认人”到“找人”技术演进从“两步走”到“一步到位”两阶段Two-Stage检测器单阶段One-Stage检测器基于Transformer的检测器简单示例用YOLOv8快速体验小结背景引入做了几年AI项目我发现一个挺普遍的现象很多刚入门的同学一提到计算机视觉第一反应就是图像分类。比如让AI判断一张图里有没有猫这确实是基础。但实际业务场景中老板和产品经理的需求往往更“贪婪”。他们不光想知道“有没有猫”更想知道“猫在图片的哪个位置”甚至“图片里有几只猫分别在哪”。我早期就遇到过这种需求变更临时从分类模型转向研究目标检测当时真是踩了不少坑。今天我们就来系统聊聊这个让AI从“看到”进化到“定位”的关键技术——目标检测。核心概念什么是目标检测简单来说目标检测Object Detection是一项在数字图像或视频中定位并识别出特定类别物体如人、车、动物的计算机视觉任务。它需要完成两个核心子任务定位Localization找出物体所在的位置通常用一个矩形框Bounding Box标出来。分类Classification判断这个矩形框里的物体属于什么类别。所以目标检测模型的输出不再是单一的标签而是一个列表列表中的每个元素都包含了一个物体的类别标签和其对应的边界框坐标通常是[x_min, y_min, x_max, y_max]或[x_center, y_center, width, height]。这带来的信息量是指数级增长也让应用场景大大拓宽。类比解释从“认人”到“找人”我们可以用一个生活中的场景来类比图像分类就像你在一个拥挤的广场上闭上眼睛听声音然后判断“广场上有没有我的朋友小李在说话”。你只能给出“有”或“没有”的结论。目标检测则是你睁开眼睛不仅要在人群中认出小李分类还要用手指指出他具体站在哪个位置定位。如果小王也在你需要同时指出他们俩。这个“睁眼”和“同时指出多人”的过程就是目标检测比分类复杂得多的地方。模型需要在整张图片的“茫茫像素海”中找到可能是物体的区域并对这些区域进行精细判断这涉及到对图像不同尺度和区域的密集计算。技术演进从“两步走”到“一步到位”目标检测算法的发展清晰地反映了深度学习在CV领域的演进思路。主要分为两大流派两阶段Two-Stage检测器顾名思义这类方法分两步走生成候选区域Region Proposal首先在图像中生成大量可能包含物体的候选框比如1k-2k个。经典的R-CNN系列R-CNN, Fast R-CNN, Faster R-CNN就是代表。早期我们用Selective Search算法生成这些框计算慢且不准。对候选区域分类与微调将每个候选区域送入卷积神经网络CNN进行特征提取然后判断其类别并对其边界框坐标进行微调使其更精准。我的踩坑体会两阶段方法精度通常很高尤其是在早期但速度慢结构复杂。我在一个对实时性要求不高的工业质检项目中使用过Faster R-CNN虽然检测准但部署上线时为了提升帧率在模型优化上花了大量精力。单阶段One-Stage检测器为了追求速度YOLOYou Only Look Once和SSDSingle Shot MultiBox Detector等单阶段方法被提出。它们摒弃了独立的候选区域生成步骤将“定位”和“分类”两个任务合并在一个神经网络中直接完成。模型将输入图像划分成网格如SxS。每个网格单元直接预测多个边界框以及这些框内包含各类别物体的概率。我的主观判断单阶段方法是目前工业界的绝对主流尤其是在需要实时处理的场景如自动驾驶、视频监控。YOLO系列v3, v5, v8因其在速度和精度间的优秀平衡几乎成了实战项目的首选。从我个人的项目经历看90%以上的新项目都会从YOLO开始尝试。基于Transformer的检测器近年来随着Vision TransformerViT的兴起DETR等模型将目标检测视为一个**集合预测Set Prediction**问题。它使用Transformer编码器-解码器架构直接输出一组固定数量的物体预测集合。优点结构新颖避免了传统方法中需要设计锚框Anchor等复杂手工组件后处理如非极大值抑制NMS也更简单。现状这类方法精度很高但训练收敛较慢计算资源消耗大。目前更多见于前沿研究和刷榜在普通工业部署中还不像YOLO那样“接地气”。简单示例用YOLOv8快速体验理论说了这么多我们直接上代码感受一下。这里我们用Ultralytics公司出品的YOLOv8来演示因为它封装得非常好几行代码就能跑起来。首先安装必要的库建议在虚拟环境中进行pipinstallultralytics opencv-python然后准备一张待检测的图片比如test_image.jpg运行以下Python脚本fromultralyticsimportYOLOimportcv2# 1. 加载一个预训练的YOLOv8模型这里用中等尺寸的模型# 首次运行会自动从官网下载模型权重modelYOLO(yolov8n.pt)# 也可以选择 yolov8s.pt, yolov8m.pt 等更大模型# 2. 在图像上进行预测resultsmodel(test_image.jpg)# 直接传入图片路径# 3. 可视化结果并保存forrinresults:# 使用OpenCV读取原图以便在其上绘制im_arrayr.plot()# plot()方法返回一个绘制了检测框的BGR图像数组cv2.imwrite(result.jpg,im_array)print(检测结果已保存至 result.jpg)# 4. 打印详细的检测信息forrinresults:boxesr.boxes# 边界框信息print(f检测到{len(boxes)}个物体)forboxinboxes:# 获取坐标 (xyxy格式), 置信度, 类别IDx1,y1,x2,y2box.xyxy[0].tolist()confbox.conf[0].item()cls_idint(box.cls[0].item())cls_namemodel.names[cls_id]print(f - 类别:{cls_name}, 置信度:{conf:.2f}, 位置: [{x1:.1f},{y1:.1f},{x2:.1f},{y2:.1f}])代码解读我们加载了预训练的yolov8n.ptnano版本最小最快。model(test_image.jpg)这一行就完成了所有检测工作。r.plot()提供了便捷的可视化功能。我们通过r.boxes获取了每个检测框的坐标、置信度和类别ID并打印出来。运行后你会得到一张画好框的result.jpg并在控制台看到类似这样的输出检测到 3 个物体 - 类别: person, 置信度: 0.89, 位置: [120.5, 80.3, 250.1, 400.7] - 类别: dog, 置信度: 0.95, 位置: [300.2, 150.8, 450.9, 350.4] - 类别: chair, 置信度: 0.75, 位置: [50.1, 200.5, 180.3, 320.9]看AI不仅认出了人、狗和椅子还精准地给出了它们的位置小结目标检测是计算机视觉从“感知”走向“理解”和“交互”的关键一步。我们从其定位分类的双重任务本质出发梳理了从两阶段精度优先到单阶段速度优先再到Transformer-based结构创新的技术演进脉络。目前以YOLO系列为代表的单阶段检测器因其优异的平衡性是绝大多数工业应用的首选起点。理解目标检测是后续学习更复杂任务如实例分割、姿态估计的基石。在接下来的文章中我们会深入YOLOv5/v8的网络结构、损失函数并手把手教你如何为自己的数据集训练一个定制化的检测模型。记住先跑通上面的示例代码获得直观感受是学习任何新技术最好的第一步。如有问题欢迎评论区交流持续更新中…