2025-05-21
axis aligned bounding box:要求和坐标轴平行. 虽说这样其实肯定不是最 tight 的 bounding box. 但是在 2D 中歪着有点奇怪,不是很 necessary.
一个 Bounding Box(bbox) 可以用 \((x,y,h,w)\) 四个自由参数来描述.
如果图像里面只有单一物体,做 object detection 直接先 CNN 抽特征,然后分两个 branch 出来,一个头做 classification 得到类别,一个头做 regression 得到 \(x,y,h,w\). 后者也需要做适当的 activation 来确保在范围内,比如 sigmoid 后乘上对应最值.
classification 使用 softmax 的 CE loss,而 regression 使用 L2 loss,然后加权得到总 loss.
注:L2-loss 是 \(\sum \Delta^2\),叫 L2-loss;而 L2-norm 是 \(\sqrt{\frac{1}{n}\sum \Delta^2}\),叫 Rooted mean squared loss
L2 的好处:gradient 和 loss 成正比,收敛更快. 当然不是很鲁棒. 而 L1 更鲁棒但是在 \(0\) 处不可导,然后导数也是不变的. L1 一开始导数不至于太大,但是在 \(0\) 处就不行了. RMSE 在 \(0\) 处也不可导.
Smooth L1 Loss:\(|x|<1\) 时用 \(0.5\times x^2\) 的 L2,\(|x|\ge 1\) 时用 \(|x|-0.5\). 好处是在 \(x=1\) 导数也是连续的.
Region Proposals:找到可能有物体的区域(Regions of Interest,RoI),然后在这些区域中做 single detection. 古早时候使用 selective search.
R-CNN:先 search 出来 RoI,然后通过插值 wrap 成 \(224\times 224\) 的图,然后再过预训练过的 conv net. 这样一个问题是丢掉了全局的上下文信息. 比如如果 bbox 比 RoI 更大那么就不好修了. 而且很慢.
Fast R-CNN:不去 crop image,而是对于一个 proposal,去 crop feature map.
具体而言,先用 backbone 提取特征,然后对于一个原图上做出的 proposal,先等比算出在 feature map 上的位置,并吸附到 feature map 的格点上. 然后我们要将这样一个大小任意的 \(h\times w\times c\) 的 tensor,转化成一个大小固定的 tensor. 这个方法很粗暴,直接 roughly divide 然后 max pooling 成 \(2\times 2\times c\). 这个过程称为 RoI Pool. 由于最后 crop 出来的 tensor 会不大,所以可以塞到一个 batch 里面,会快很多很多.
现在速度瓶颈成了 region proposal.
Faster R-CNN:新增一个用来用 feature map,并用一个 network 做 regional proposal 的 RPN. 由于 feature map 的 resolution 低,而且 feature map 有充分的周遭信息,所以 sliding window 的 aspect ratio 和 scale 的可能性也不需要那么多了.
每个 cell 作为中心,去生成 \(K\) 个不同 ratio 和 scale 的 Anchor Box,然后预测每个 Anchor Box 是否有物体,以及做一个 regression 去预测 bbox 的位置的 correction(若第一个位置的 ground truth 是否否则 box correction 的 loss 不计算). 每个预测出来的 bbox,去找到所有 ground truth 中 IoU 最大的框作为自己的 ground truth 然后再通过 IoU 判断是否有物体.
一共 \(hwK\) 个 Anchor Box. 在 test time,选取置信度最高(是否有物体的输出,objectness)的若干个 box 进入到最后的 RoI Pool 和计算.
训练很复杂,有四个 loss:RPN 的 objectness loss,RPN 的 regression loss;以及最终网络的 classification loss,和 regression loss. 训练的时候先训 RPN,然后 freeze 住前面的网络,再训后面的网络. 然后再 backward 到前面,继续先训 RPN,再训后面的,循环往复.
还有很多细节:比如没物体的 anchor box 肯定会更多,所以正负样本不平衡,需要调整 objectness loss 的正负权重比例(一般是 \(1:3\)). 以及 anchor box 怎么选,也是很重要的超参. 这是一个很工程的东西,需要很多的理解.
FPS: Frame per second,一秒能处理几张图. 注意到在点云中也有一个叫 FPS 的 Furthest Point Sampling.
YOLO:210bpm16分直交互接交互楼梯. 很快,可以做到 100 FPS. 比大多相机更快!
把 Faster R-CNN 的两个 network 给捏一起. 将图片直接划分成 \(7\times 7\) 的格,每个格子预测五个五元组表示的 bbox \((x,y,h,w,c)\),\(c\) 为 置信度.
bbox 的 NMS:以 classification confidence 作为置信度. 然后设置一个 IoU threshold \(\tau\).
在 NMS 之前先丢掉一些置信度 \(<x\) 的. 然后先选置信度最高的 bbox 加入 result,然后把和自己预测的同类的且 IoU 大于 \(\tau\) 的丢掉. 然后不断这么做.
由于 NMS 的基于比较的选择不是可导的所以不能端到端.
端到端的工程量小很多,但是需要多很多的数据和算力.
Average Precision:将 Category 分开处理,每个 category 将所有检测结果按置信度从高到低排序. 然后对于每个前缀,计算其 precision 和 recall. 这样能在平面上画出一个曲线 \(P\),\(P(x)\) 表示 recall=x 的 precision.
precision 的计算方法要先设定和 ground truth 的 IoU threshold,然后 precision 就看大于这个 threshold 的比率.
然后最后的 AP 比如取 \(\frac{1}{11}\sum P(\frac{i}{10})\). 这个和 IoU threshold 有很强的关系. mAP:不同 category 不同 IoU 的 AP 平均值.
实例分割
Top-down:先 object detection 再做 binary segmentation.
Bottom-up:先做 grouping 生成 mask 再做 classsification.
在 2D 中 Top-down 表现更好.
Mask R-CNN:提出了 RoI Allign. 原本 RoI Pooling 一方面分辨率太低了,这增加分辨率就好了. 但很重要的是吸附操作有 information loss. 这也导致了实际上 bbox 也有问题.
于是直接不吸附,然后对于每个按均匀划出的格点,做双线性插值即可,然后最后再做一个 pooling. 这让每个 bbox 更加精细了. ROI Align 主要提升了精度,所以 AP75 提升很多,AP50 提升相对少一些.
还有一个 implementation 的东西就是每个位置的mask的值不是binary,而是 class, 然后再用 classification 的 result 去选.