尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

一文讲清楚YOLO模型和CNN的区别

一文讲清楚YOLO模型和CNN的区别 很多同学第一次接触计算机视觉时都会问一句“我到底该学 CNN还是学 YOLO”这个问题之所以常见是因为两者经常被放在一起出现。你看 YOLO 的网络图里面全是卷积层你打开一个目标检测项目模型文件里也能看到Conv、BatchNorm、激活函数。于是很容易得出一个模糊结论YOLO 和 CNN 是两种并列的模型前者更先进后者更基础。实际做项目后会发现这个理解会带来很多麻烦。有人拿只有分类标签的数据硬训 YOLO有人拿分类网络去做多目标定位还有人写论文时把“使用 YOLO 替代 CNN”当成创新点。问题不在代码而在于没分清两者分别处于什么层级。先给结论CNN 是一种从图像中提取特征的网络结构YOLO 是一套完成目标检测任务的模型方案。YOLO 里面大量使用 CNN但它在 CNN 之后又增加了多尺度融合、边界框预测和结果筛选等部分。想知道该用哪个先别看模型名先看你希望模型对一张图给出什么答案。一、先看输出分类只给答案检测还要给位置假设你手里有一张工地照片画面里有三个人其中两个人戴着安全帽一个人没有戴。不同任务对这张图提出的问题完全不同。如果任务是图像分类标签可能只有“规范佩戴”“存在未佩戴”两类。模型读完整张图后最后输出一个概率例如“存在未佩戴安全帽的概率为 0.94”。这类任务关心的是整张图属于什么类别。经典 CNN 分类网络如 LeNet、VGG、ResNet常见流程就是输入图片经过多层卷积提取特征最后由分类层输出类别分数。如果任务是目标检测输出则要详细得多。模型需要指出画面中有几个人每个人的位置在哪里哪个人戴了安全帽哪个人没有戴并且给出每个判断的置信度。最后结果通常是一组框person [x1, y1, x2, y2] 0.96 helmet [x1, y1, x2, y2] 0.93 no_helmet [x1, y1, x2, y2] 0.88这就是 YOLO 更常出现的场景。它面向的是“画面里有什么、各自在哪里、每个是什么类别”这三个问题。分类只需给整张图片一个判断检测却要处理目标数量不固定、位置不固定、大小差异明显的情况难度自然更高。所以选模型的第一步很简单如果一张图只需要一个整体标签优先考虑分类模型如果需要把对象找出来、画框出来再选择 YOLO 等检测模型。很多项目一开始就选错任务后面再怎么调参也很难补救。二、CNN 到底做了什么把像素变成可用特征一张 640×640 的彩色图片本质上只是一大串像素值。人看一眼能认出“这是安全帽”“那是背景里的黄色路障”网络最开始看到的却只是数字。CNN 的工作就是逐层把这些数字整理成更有意义的特征。靠近输入的卷积层通常先学到边缘、颜色变化、局部纹理。往后几层可能开始对圆形帽檐、人体轮廓、金属划痕这类组合模式敏感。层数更深后特征图的空间尺寸变小语义信息更强模型能逐渐判断某一片区域像不像“人”或“安全帽”。卷积之所以适合图像是因为同一种局部模式会出现在不同位置。帽檐出现在画面左上角和右下角都是帽檐CNN 可以用同一组卷积核在全图滑动寻找它。相比把每个像素都和所有其他像素直接连接卷积需要学习的参数更少也更能利用图像的局部结构。不过CNN 本身不等于图像分类模型。CNN 更像一套视觉特征提取工具。它可以放在分类网络前面也可以放在检测、分割、姿态估计模型里。ResNet 可以作为分类器也经常被拿来当检测模型的 backboneMobileNet 可以做轻量分类也能接入检测头部署在移动端。把 CNN 理解成“只能分类”和把 YOLO 理解成“完全不靠 CNN”都是两个常见误区。三、YOLO 在 CNN 特征之后多做了哪些事以常见的 YOLO 结构为例可以把它拆成三个部分Backbone、Neck 和 Head。Backbone负责从图片中提取特征。这里就是 CNN 大显身手的地方。输入图片经过卷积和下采样得到不同深度的特征图。浅层特征保留了较多的空间细节适合看小目标深层特征包含更多语义信息适合判断目标类别。Neck负责把不同尺度的特征放在一起交流。实际图片里的目标大小差异很大远处的安全帽只占十几个像素近处的车辆可能占半张图。只用最深层特征远处的小物体容易在连续下采样中丢掉只用浅层特征又会缺少足够的上下文。YOLO 常见的 FPN、PAN 等结构就是让高层语义和低层细节互相补充。Head才是直接给出检测结果的部分。它根据融合后的特征预测目标类别、边界框位置和置信度。模型会在整张图的许多位置产生候选预测训练时再通过真实标注告诉它哪里应该有框、框该多大、属于什么类别。后处理也很重要。一个人可能被模型预测出好几个高度重叠的框最终通常要用 NMS也就是非极大值抑制保留最可信的那个去掉重复框。较新的端到端检测设计正在减少对这一步的依赖但对初学者来说理解“模型先给出很多候选再筛掉重复结果”依然很有必要。换句话说CNN 解决了“从图里提取什么信息”YOLO 还要解决“用这些信息同时找出多少个目标、每个目标在哪”。Ultralytics 对当前 YOLO 架构的概括也是同一条链路backbone 提取特征neck 做跨尺度融合head 预测边界框和类别。官方架构说明四、训练数据的差异决定了你能训练什么模型模型的输出不同标签格式也完全不同。图像分类通常一张图对应一个类别。例如images/train/cat_001.jpg - cat images/train/dog_002.jpg - dog有时标签写在文件夹名里有时写在 CSV 文件里。重点是模型只知道整张图的类别不知道猫或狗具体在哪个位置。即使图片里同时出现两只动物只要标签仍然只有一个类别分类模型也不会自动学会把它们分别找出来。YOLO 检测数据则需要每个目标的位置。常见标签文件中一行代表一个目标格式是class_id x_center y_center width height四个坐标会按图片宽高归一化。假如同一张图里有两个人和两个安全帽标签文件就至少有四行。检测模型训练成本更高很大一部分原因正是在这里框标注需要人把每个目标圈出来边界是否准确、类别是否一致都会影响最终结果。这也给选题提供了一个很实用的判断标准。你若只有“这张图片有没有缺陷”的标签先做分类可能更合适你若需要指出缺陷位置就必须准备框标注或者选择已经有检测标注的数据集。别因为 YOLO 热门就把一套分类数据强行改造成检测项目。五、速度、精度和部署为什么 YOLO 经常被拿来做系统YOLO 的名字来自 You Only Look Once早期核心思路是把检测看成一次前向计算完成的任务。相比先生成候选区域、再逐个分类的两阶段方法这种单阶段检测路线通常更适合实时场景。但“YOLO 快”不等于任何情况下都比 CNN 分类模型快。一个轻量级分类网络只需输出几个类别分数计算量可能远小于一个大尺寸的检测模型而 YOLO 除了提取特征还要处理多尺度预测和大量候选框。真正需要比较时要固定输入尺寸、硬件、推理精度和 batch size再看延迟、FPS、模型大小和显存占用。在实际项目里选择 YOLO 往往是因为需求本身离不开位置。例如仓库盘点需要数货物交通系统需要统计车辆质检系统需要标出缺陷区域安防系统需要在视频中圈出异常目标。只要“位置”会影响后续动作分类模型就很难替代检测模型。反过来如果摄像头每次只拍一件已经摆正的产品任务只是判断合格或不合格分类模型可能更省数据、更快、更容易解释。先把现场流程画出来再选模型通常比先找一个最热门的网络靠谱得多。六、做毕设和写论文时怎样把这件事说清楚在开题报告里可以先用任务需求来解释模型选择而不是直接写“YOLO 精度高、速度快”。例如系统需要同时识别图片中多个安全帽并定位未佩戴人员的位置因此采用目标检测而非图像分类在检测模型中选用 YOLO是因为项目还需要处理视频流并提供实时告警。如果老师追问“为什么不用 CNN”回答也不难YOLO 的 backbone 本身就使用卷积结构提取视觉特征区别在于项目任务需要输出多个目标的边界框和类别单一 CNN 分类器通常只能给整张图片一个标签无法直接提供告警所需的对象位置。这个表述有两个好处。第一它没有把 CNN 和 YOLO说成互相替代的关系第二它把模型选择和需求、标签、输出、系统功能连起来。答辩时这种解释比堆“注意力机制”“特征融合”更容易让人听懂。结语CNN 是让模型从像素中学会看图的基础结构YOLO 则是在这套视觉特征之上完成多目标定位和分类的检测方案。面对一个新项目先问清楚输出是整张图的类别还是多个对象的位置和类别答案确定后数据标注、模型选择、评价指标和部署方式都会顺着这条线变得清楚。
返回列表