YOLO1是怎么进行目标识别的呐?
Grid = 整体整张网格(7×7 网格)
Grid cell = 网格单元(最标准)
BBOX(Bounding Box)= 边界框
比如我们有一张448*448的图片,它会把这张图片划分成7*7的网格,每个网格都叫做一个
Grid cell(网格单元)。YOLO会检测这张图片中有没有东西,比如这张图片中有一只小狗,一个
自行车,一辆汽车。比如YOLO识别到它们了,它们的中心点就会落在一个网格里。YOLO会根据
中心点再检测出一个边界框。这个边界框就叫做BBOX。
网络结构层
输入图片:448×448×3(RGB)
Backbone(骨干网络):就是多个卷积层的部分。
Neck(颈部网络):在YOLOV1里面可以把它理解成全连接网络。
head(检测头):就是最后7*7*30的输出就可以啦。
输出是:7*7*30的矩阵
我们首先看一下最后的部分,最后是一个7*7*1024的输出,然后把它展平。进入只有两层的全
连接网络,然后把输出的1470的向量,变成为7*7*30的矩阵。S=7 就对应图片的7*7,49个网格,
30就是每个网格都是30维的向量。
前 10 个数值分为两组,每组分别对应一个边界框的中心点坐标、以及宽高、用来表示检测
框的位置。每组末尾都有一个置信度,代表该边界框存在物体的概率。后面 20 个数值为 20 个类
别的概率,数据集一共包含 20 个目标类别。每个 Grid cell 预测2 个 BBOX可以同时检测同一个
格子里的两个物体,降低漏检率。
我们先来看标签数据的设定方式。当小狗的中心点落在某个网格单元中时,我们就需要为该网
格对应的 30 维向量打上对应的标签。其余不包含物体中心点的网格单元,全部置为负样本标签,
以此实现 YOLOv1 中心点归属网格的检测规则。
中心点和边界框的坐标数值
YOLOv1 在数据集标注阶段,就是按原始图片的真实像素尺寸来标注物体位置(绝对坐标)。
图片的左上角是定位原点(0,0),假设原始图片的大小是800 × 600。你标注工具
(LabelImg/VOC 格式)打的标签是:x_abs, y_abs, w_abs, h_abs。这是完全按 800×600 的像素
来的。
YOLOv1 网络要求输入是 448×448 所以图片会被缩放到 448×448。坐标必须一起缩放!
不然位置就错位了。 所以要把像素坐标一起归一化到 0~1。直接除去图片的宽和高就可以啦。
相对坐标到网络偏移
YOLOv1会在数据预处理阶段,会用相对位置算出中心点落在那个网格中。然后再计算中心点相对
于这个网络的偏移量。此时的下x,y是相对于该网格的偏移量。w,h是相对于整张图片的偏移量。
预测阶段
| 符号 | 含义 |
| x^,y^ | 网络预测输出:当前网格内部相对偏移量(0~1),就是你上一张图里训练标签的 、 |
| gridx,gridy | 物体中心点所在的网格编号(0~6),训练阶段提前确定 |
| w^,h^ | 网络预测输出:整张图全局相对宽高(0~1),训练阶段直接归一化得到 |
| x_absolute,y_absolute | 最终还原:448×448 输入图片上,物体中心点绝对像素坐标 |
| w_absolute,h_absolute | 最终还原:448×448 输入图片上,框的绝对像素宽高 |
| YOLOv1 固定输入尺寸参数:448÷7=64 |
推理阶段
实时推理 = 依然不是原图
实时摄像头原始大图(任意尺寸) ↓ 【缩放 Resize】 网络固定输入 448×448 ↓ 【7×7 网格划分 + 网络前向推理】 输出网格内部相对偏移量 x^, y^, w^, h^ ↓ 【推理解码公式计算】 448×448 缩放图上绝对像素框 ↓ 【比例映射还原】 原始大图上最终检测显示框