YOLO系列学习(一):从计算机视觉到YOLOv1——目标检测的范式革命
大家好,这是YOLO系列学习的第一篇文章。从今天开始,我们一起从头梳理目标检测领域最经典的算法系列——YOLO。如果你也对计算机视觉感兴趣,欢迎跟着我的节奏一起深入学习。一、计算机视觉与目标检测概述1. 什么是计算机视觉你有没有想过,手机是怎么识别相册里的人脸的?自动驾驶汽车是怎么“看到”路上的行人和车辆的?医院的CT影像,又是怎么辅助医生发现早期病变的?这些背后,都是同一个技术领域在发力——计算机视觉(Computer Vision)。简单来说,计算机视觉就是让计算机像人一样“看懂”图像和视频。它试图从数字图像或视频中提取有用的信息,理解其中的内容。计算机视觉有三大核心任务,我们可以用三个简单的问题来概括:任务问题例子图像分类这张图片里“是什么”?区分猫和狗目标检测图片里的物体“在哪里”,以及“是什么”?找出图中的所有人和车,并用框标出位置图像分割图片中每个像素“是什么”?精确分割出每个物体的轮廓这三个任务的难度是递进的:分类只需要判断整体,检测需要定位+分类,分割则需要精确到每个像素。目标检测处在中间位置,但它的应用场景却最为广泛——医疗成像、工业检测、自动驾驶、安防监控、智能交通,几乎所有和视觉相关的领域都离不开目标检测。2. 目标检测要解决什么问题目标检测 是一项涉及识别图像或视频流中对象位置和类别的任务。目标检测器的输出是一组包围图像中对象的边界框,以及每个框的类别标签和置信度分数。当你需要在场景中识别感兴趣的对象,但不需要知道对象的精确位置或确切形状时,目标检测是一个很好的选择。看起来很简单,但实际做起来远没有这么轻松。3. 目标检测的技术挑战目标检测之所以难,主要因为以下几个问题:第一,目标数量不确定。一张图可能什么都没有,也可能密密麻麻全是物体。你不知道会遇到什么情况。第二,目标尺度差异大。同样是“人”,近景的人可能占据图像的一半,远景的人可能只是一个小点。模型需要同时处理这种巨大的尺度差异。第三,目标可能重叠和遮挡。真实场景中,物体很少孤立存在。行人会被车辆挡住,车辆会互相遮挡。模型需要能识别出被遮挡的物体。第四,定位和分类要同时做好。你不仅要知道“这是人”,还要精确地框出他的位置。这两个任务相互关联,但优化目标不同,很难同时做好。这些挑战,让目标检测成为计算机视觉领域最具挑战性的任务之一。二、目标检测算法的演进——YOLO登场前的时代1. 传统方法时代在深度学习兴起之前,目标检测主要依靠手工特征。当时的主流范式是:滑动窗口扫描 → 手工提取特征 → 分类器判断你可以想象一下这个过程:用一个固定大小的窗口在图像上从左到右、从上到下滑动,每个位置提取特征,然后用分类器判断这个窗口里有没有目标。代表性的方法有:Viola-Jones检测器:用Haar特征和AdaBoost算法,是最早实现实时人脸检测的方法之一。HOG+SVM:方向梯度直方图(HOG)提取特征,支持向量机(SVM)分类,在行人检测上取得了不错的效果。DPM(可变形部件模型):把物体分解成多个部件,分别检测后组合起来,能处理一定程度的变形。这些方法的共同问题是什么?手工特征的表达能力有限。人类设计的特征很难捕捉到图像的复杂模式。而且滑动窗口的计算量巨大——一张图要扫描几千个窗口,每个窗口都要提取特征、做分类,速度慢得可怜。2. 深度学习革命:R-CNN系列2014年,一篇名为《Rich feature hierarchies for accurate object detection and semantic segmentation》的论文改变了一切。这就是R-CNN。R-CNN的核心思想很简单:用卷积神经网络(CNN)来提取特征,而不是手工设计特征。具体流程是:生成候选区域:用选择性搜索(Selective Search)算法从图像中找出约2000个可能包含物体的区域。提取特征:把每个候选区域缩放到固定大小,送入CNN提取特征。分类和回归:用SVM对每个区域进行分类,用线性回归器微调边界框位置。这个方法在精度上取得了巨大突破,但有一个致命问题——太慢了。每张图要处理2000个候选区域,每个区域都要单独跑一遍CNN,一张图需要几十秒才能完成检测。这显然无法用于实际场景。接下来的改进顺理成章:能不能让不同候选区域共享CNN的特征计算?2015年,Fast R-CNN问世。它的关键创新是RoI Pooling——先对整张图做一次CNN提取特征,得到特征图,然后直接在特征图上对每个候选区域提取固定大小的特征。这样就避免了重复计算,速度提升了一个数量级。但Fast R-CNN仍然依赖选择性搜索来生成候选区域,这一步本身就很慢。能不能把候选区域的生成也交给神经网络?2016年,Faster R-CNN给出了答案。它引入了RPN(区域提议网络),用一个轻量级的网络直接在特征图上预测候选区域。这样整个流程就实现了端到端训练,速度又提升了一大截。3. 两阶段方法的困境R-CNN系列代表了目标检测的**两阶段(Two-Stage)**范式:第一阶段:生成候选区域(找可能有目标的区域) 第二阶段:对每个区域进行分类和边界框回归(确定是什么、在哪里)这种方法的优点是精度高,但缺点也很明显——速度慢。Faster R-CNN在GPU上的检测速度大约是5帧/秒(FPS),离实时检测(通常需要至少30FPS)还有很大差距。这时候,一个关键问题出现了:能不能只看一次(Look Once)就完成检测?为什么非要分两步走?能不能设计一个网络,输入一张图,直接输出所有目标的位置和类别?这个看似简单的想法,催生了目标检测领域的另一个重要范式——**单阶段(One-Stage)**检测。而YOLO,就是这个范式的开创者。三、YOLO横空出世——核心思想1. YOLO的基本信息2016年,CVPR(计算机视觉领域顶级会议)上,一篇名为《You Only Look Once: Unified, Real-Time Object Detection》的论文引起了轰动。作者是Joseph Redmon等人。这篇论文提出的方法,就是我们今天要重点讲的YOLO。YOLO这个名字很有意思——You Only Look Once,翻译过来就是“只看一次”。这个名字完美地概括了它的核心思想。2. YOLO的核心思想——范式革命YOLO的革命性在于,它将目标检测重新定义为一个回归问题。传统的两阶段方法把检测看作分类问题:先找候选区域,再判断每个区域里是什么。YOLO则完全不同:它用一个神经网络,对输入图像做一次前向传播,直接回归出所有目标的边界框和类别概率。对比一下:传统/两阶段方法: 看很多次 → 找到目标位置 → 判断目标类别 YOLO(单阶段): 看一眼 → 直接输出所有目标的位置和类别就像你看一眼房间,瞬间就能知道里面有几个人、几张桌子、几把椅子,以及它们各自在什么位置。你不需要先逐个区域搜索,再逐个判断。3. YOLO vs 两阶段方法的核心差异对比维度两阶段方法(R-CNN系列)YOLO(单阶段)检测流程先提议区域→再分类回归一步到位,端到端速度慢(5fps)快(45fps)精度高略低核心思想分类问题回归问题视野局部视野(只看候选区域)全局视野(看整张图)YOLO的全局视野是它的一大优势。因为它处理的是整张图,所以能利用上下文信息,不容易把背景误检为目标。而两阶段方法只关注候选区域,容易受背景干扰。4. 目标检测算法速度比较Pascal 2007 mAPSpeedDPM v533.7.07FPS (14 s/img)R-CNN66.0.05 FPS (20 s/img)Fast R-CNN70.0.5FPS (2 s/img)Faster R-CNN73.27 FPS (140 ms/img)YOLO63.445 FPS (22 ms/img)四、YOLOv1技术详解发布时间:2015 年 6 月论文:https://arxiv.org/abs/1506.026401. 整体流程YOLOv1预测过程如图所示输入图片(任意尺寸)缩放到448×448送入CNN网络输出7×7×30的张量NMS后处理输出最终检测结果看起来很简单,但每个环节都有精心设计的细节。让我们一步步拆解。2. 核心机制:网格划分这是YOLO最核心的设计之一。YOLOv1会把输入图像划分为一个S×S的网格。在原始论文中,S=7,也就是把图像分成7×7=49个网格。每个网格负责检测什么?中心点落在该格子内的目标。比如,如果一个物体的中心点落在第25个网格里,那么第25个网格就负责预测这个物体。每个网格会预测什么?B个边界框:在YOLOv1中,B=2。每个边界框预测5个值:x, y, w, h, confidence(中心坐标、宽高、置信度)。C个类别概率:在PASCAL VOC数据集上,C=20,表示20个类别。所以,整个网络的输出张量维度是:S × S × (B × 5 + C) = 7 × 7 × 30让我们再细化一下每个边界框的5个预测值:x, y:边界框中心相对于网格左上角的坐标(归一化到0-1之间)w, h:边界框的宽度和高度(相对于整张图像的宽度和高度,归一化到0-1之间)confidence:这个边界框包含目标的置信度,计算公式是:Pr(Object) × IoU(pred, truth)这里的IoU(Intersection over Union)是预测框和真实框的交并比,表示预测框和真实框的重合程度。3. 网络结构YOLOv1的网络结构借鉴了GoogLeNet(也就是Inception v1)的设计思想,但做了简化。原始GoogLeNet用的是Inception模块,而YOLOv1用更简单的1×1卷积 + 3×3卷积的组合来替代。网络的整体结构是:输入:448 × 448 × 3 ↓ 卷积层 × 24(交替使用1×1和3×3卷积) ↓ 全连接层 × 2 ↓ 输出:7 × 7 × 30具体的网络配置如下表所示:类型滤波器数量大小步长输出尺寸卷积647×72224×224MaxPool-2×22112×112卷积1923×31112×112MaxPool-2×2256×56卷积1281×1156×56卷积2563×3156×56卷积2561×1156×56卷积5123×3156×56