[EECS498/598] lecture 15: Object Detection(目标检测)

[EECS498/598] lecture 15: Object Detection(目标检测)

LeoJeshua Lv2

Course Info

lecture 15: Object Detection(目标检测)

slide: https://web.eecs.umich.edu/~justincj/slides/eecs498/498_FA2019_lecture15.pdf

  • Two-stage detectors
  • Single-stage detectors

Recap:
计算机视觉三大任务

  • 图像分类 Image Classfication(7,8讲)
  • 目标检测 Object Detection(15讲)
  • 图像分割 Image Segmentation (16讲)

目标检测

  1. 任务定义
    • Input: 一张RGB图像
    • Output: 检测到的Objects的集合。每个Object包含:
      • Category label 从已知的【固定类别集合】里选择的一个【类别标签】
      • Bounding box (x,y,width,height) 【边界框】的位置和大小
  2. 挑战:
    • 多个输出数量(每张图像objects个数不同)
    • 多种输出类型(category label + bounding box)
    • 更大的输入图像(相比分类任务)

15.0 早期探索

(直观思路)

  1. 检测单个目标:加一个output head
    • 图像分类任务中feature vector代表了提取的图像特征,连接一个【分类器】即可实现分类任务,预测category label。我们再 给feature vector加一个【回归器】,以预测bounding box。
    • 变为Multitask Loss:【分类器】的Softmax Loss + 【回归器】的L2 Loss
    • 迁移学习思想:feature vector前面的CNN叫做骨架网络(Backbone network)通常是在ImageNet上先预训练的
    • 问题:无法检测多个objects!
  2. 检测多个目标滑动窗口(Sliding Window) + 检测单个目标
    • 滑动窗口:以不同大小的box窗口,暴力遍历整个图像。


    • 问题:计算量太大。框的大小有 种可能性!

15.1 R-CNN

R-CNN: Region-Based CNN

区域提案 | Region Proposals


找到很可能覆盖所有objects的小box集合(感兴趣区域|Regions of Interest(RoI)),属于【选择性搜索】方法。

  • 通常是启发式的;
  • 通常是利用一些low-level的图像处理方法(比如边缘特征);
  • 大幅降低region数量,相对sliding window运行很快;

不用深究,后续也会被NN取代。

R-CNN步骤

  1. Region Proposals: 给出约2k个大小不同的 Regions of Interest(RoI)
  2. wraping: 把 image regions 都warp/resize成相同大小(例如224x224);
    • 得到warped image regions
  3. 对每个 warped image regions,分别输入CNN;
    • Class头:得到预测的 分类得分|Class scores
    • Bbox头:得到预测的 边界框变换|Bbox transform
  4. 输出目标检测结果,可以基于:
    • 【background类的阈值】或者【每个类设定的阈值】
    • 【最终输出的proposals个数】(比如置信度最高的前10个区域?)

关键问题

IoU

如何定义“预测正确”?框与框之间的相似度?| Comparing Boxes

答:计算 交并比|Intersection over Union (IoU)

设定一个超参【IoU阈值】(e.g. 0.7),当计算得到的 IoU 超过这个阈值时,表示预测正确。

  • IoU > 0.5 is “decent”
  • IoU > 0.7 is “pretty good”
  • IoU > 0.9 is “almost perfect”

NMS

如何解决“框的重叠问题”?| Overlapping Boxes

答:采用 非极大值抑制|Non-Max Suppression (NMS) 方法

  1. 从最高得分的框开始遍历;
  2. 消除 与这个框的IoU > 【IoU阈值】 的boxes;
  3. 重复1-2过程,直到所有框遍历完成;

eg:

  • 对最高得分的蓝色框 P(dog),消除重叠的橙色框
  • 对次高得分的紫色框 P(dog),消除重叠的黄色框
  • 最终效果

NMS的问题
当图像中的很多object重叠时,NMS很可能会消除正常的框。(截止19年,还没有很好的解决办法)

Object Detector 的评估指标:mAP

如何评估测试集上的“目标检测效果”?| Evaluating Object Detectors

答:计算 Mean Average Precision (mAP) = 每个category/class的AP取平均

前置概念:PR曲线AP

  • PR曲线|Precision vs Recall Curve:纵坐标为精度Precision,横坐标为召回率Recall。
    • precision = TP/(TP + FP) -> 表示预测的positive examples中有多少是正确的
    • recall = TP/(TP + FN) -> 表示真正的positive examples有多少被预测到
    • TP的条件:【预测的box】和【ground-truth box】的IoU > 【IoU阈值】
    • 绘制方法:遍历加入每个【预测的box】,绘制当前的(Recall, Precision)坐标。eg:
      • 对第1个预测结果
      • 对第2个预测结果
      • 对第3个预测结果
      • 对第4个预测结果
      • 对第5个预测结果
    • 意义:不同的下游任务又不同的需求,比如:
      • 自动驾驶场景希望Recall高(所有正样本都被预测出来)
      • 某些场景只是希望Precision高(预测样本正确率高)
  • 平均精度|Average Precision (AP):PR曲线与坐标轴围成的面积 | area under Precision vs Recall Curve

mAP计算步骤:

  1. (前置步骤)对所有test images进行目标检测,并对结果进行NMS;
  2. 求 【每个category的AP】:对每个category,计算 平均精度|Average Precision (AP)
  3. mAP:对 【每个category的AP】 取平均。例如:
    • Car AP = 0.65
    • Cat AP = 0.80
    • Dog AP = 0.86
    • 因此 mAP@0.5 = 0.77

常见形式:

  • mAP@{IoU threshould} 标明使用的【IoU阈值】
  • COCO mAP torch.arange(start=0.5, end=1.0, step=0.05) 集合内的【IoU阈值】的mAP 取平均

15.2 Fast R-CNN

R-CNN的问题:先warping再卷积,非常慢!对~2k个image regions都要单独卷积计算

  • 思考:在不同的image regions中会有重复的计算
  • 解决方案:先卷积再warping,提取 image features

详细步骤

  1. 使用 【骨架网络|Backbone network】 对整个图像提取特征 -> 得到 Image features
  2. Image features 中【裁剪crop + 调整大小resize】RoI -> 得到 Crop+Resize features
  3. 每个region经过【Per-Region Network】 -> 得到每个region的 Class scoresBbox transform

Backbone和Per-Region Network

Backbone提特征,Per-Region Network用于下游任务输出

  • AlexNet
  • ResNet

Cropping features

如何根据RoI,从image feature中crop 得到 相同大小的region features?(反向传播需要该操作是可微的)

RoI池化

Girshick, “Fast R-CNN”, ICCV 2015

  1. 从原始image 投射proposal到 image features
  2. 对每个 subregion 进行 最大池化(Max-pool)

RoI对齐

He et al, “Mask R-CNN”, ICCV 2017

  1. 从原始image 投射proposal到 image features
  2. 对每个 subregion 进行 双线性插值(bilinear interpolation)



Fast R-CNN vs “Slow” R-CNN


Fast R-CNN的问题:Runtime受Region Proposal支配!

15.3 Faster R-CNN

Faster R-CNN: Learnable Region Proposals

Region Proposal Network (RPN)

代替传统方法预测Region Proposals

  • 思路:对feature map每个点为中心的,固定size的 anchor box
    • RPN classification: 判断 是否有object (二分类问题)
    • RPN regression: 预测 box transforms (框的修正,把 anchor box 转换成 proposal box)
  • 每个点对应k个 anchor box
  • 联合Loss
  • 大大加速

总结

Lots of variables!

变量太多,尽量不要尝试自己训练,尽量使用预训练模型

训练trick

Huang et al, “Speed/accuracy trade-offs for modern convolutional object detectors”, CVPR 2017

通过以下方法获得更好的模型表现:

  • 更长的训练
  • 多尺度Backbone:FPN(特征金字塔网络)
  • 更好的Backbone:ResNeXt
  • one-stage方法有提升
  • scaling up
  • Test-time增强
  • 更大的模型集成,更多的数据

从Two-Stage到One-Stage

Two-Stage

Stage 1:

  • 分类器:anchor box 是否有object
  • 回归器:box transform (anchor box -> proposal box)

Stage 2:

  • 分类器:object 之于 每个class类别/background 的得分
  • 回归器:Bbox transform (proposal box -> Bounding box)

One-Stage

两个Stage的分类器合并,回归器也合并。直接预测:

  • 分类器:anchor box 之于 每个class类别/background 的得分
  • 回归器:Bbox transform (anchor box -> Bounding box)

Two-Stage v.s. One-Stage

  • Two-Stage:更准
    • Faster R-CNN
  • One-Stage:更快
    • YOLO (You-Only-Look-Once)
    • SSD
    • RetinaNet
  • Hybrid: R-FCN

开源框架

Object detection is hard! Don’t implement it yourself
(Unless you are working on A5…)

TensorFlow Detection API:

Detectron2 (PyTorch):

*DETR (DEtection TRansformer)

[ECCV’20] End-to-End Object Detection with Transformers pdf


*常用数据集

https://paperswithcode.com/task/object-detection

PASCAL VOC

The PASCAL Visual Object Classes

  • page: http://host.robots.ox.ac.uk/pascal/VOC/index.html
  • 20个classes:
    • Person: person
    • Animal: bird, cat, cow, dog, horse, sheep
    • Vehicle: aeroplane, bicycle, boat, bus, car, motorbike, train
    • Indoor: bottle, chair, dining table, potted plant, sofa, tv/monitor
  • xyxy 标注格式:VOC的Bounding box是通过 [xmin,ymin,xmax,ymax] 标注的(框的左上角和右下角坐标)
  • to xywh 格式:YOLO的Bounding box是通过 [x, y, w, h] 标注的(框的中心坐标和宽高)
    • yolo官方转换脚本 voc_label.py
    • 使用:和数据集根目录 VOCdevkit 放在同一级,运行
    • 功能:
      1. 图片标注
        • VOCdevkit/VOC{year}/Annotations/{image_id}.xml -> VOCdevkit/VOC{year}/labels/{image_id}.txt
      2. 训练、验证、测试集划分(文件里记录了图片的绝对路径)
        • VOCdevkit/VOC{year}/ImageSets/Main/train.txt -> {year}_train.txt
        • VOCdevkit/VOC{year}/ImageSets/Main/val.txt -> {year}_val.txt
        • VOCdevkit/VOC{year}/ImageSets/Main/test.txt -> {year}_test.txt
  • 参考文章:

VOC2007

  • The PASCAL Visual Object Classes Challenge 2007
  • link: http://host.robots.ox.ac.uk/pascal/VOC/voc2007/
  • 数据统计 link
    • 数据被分成 50% (5011个样本) 用于训练/验证,50% (4952个样本) 用于测试。训练/验证集和测试集中图像和对象的类别分布大致相等。
    • 总共有 9,963 张图像,标注了 24,640 个objects

VOC2012

MS COCO

MicroSoft Common Objects in Context

COCO2014

COCO2015

COCO2017

  • Title: [EECS498/598] lecture 15: Object Detection(目标检测)
  • Author: LeoJeshua
  • Created at : 2025-01-01 08:15:00
  • Updated at : 2025-03-31 20:07:14
  • Link: https://leojeshua.github.io/Course/eecs498/eecs498-15/
  • License: This work is licensed under CC BY-NC-SA 4.0.