文章目录
- 基础相关
- RCNN:使用cnn做目标检测
- SPPNet:
- Fast R-CNN:以更快的速度进行分类和目标框回归的端到端
- Faster R-CNN:不适用ss算法,以更快的速度进行特征提取、提取候选框、分类和目标框回归的总体端到端
- Cascade R-CNN
- YOLO:you only look once,看一眼就能检测到目标的类别和位置:首个单阶段检测模型
基础相关
selective search算法
根据颜色、纹理、尺寸、形状相似性,获取Region Proposal候选区域
端到端=end to end=joint learning共同学习
end-to-end 的本质是你要解决的问题是多阶段的或多步的 (跟所谓的 raw feature 没啥关系):如目标检测,有类别和目标框两步。
如果分阶段学习的话,第一阶段的最优解不能保证第二阶段的问题达到最优。
end-to-end 把他们堆在一起来优化,确保最后阶段的解达到最优。
FPN 多尺度金字
3部分:自下而上+自上而下+横向连接
自下而上:特征提取过程
根据feature map的大小分为5个stage,
RPN(Region Proposal Networks):取代ss算法获取候选框(速度更快)
anchors:一组矩形框,3*3卷积核滑动窗口时生成anchors,其坐标是backbone之前图像(M,N)尺寸上的坐标(x1,y1,x2,y2)
(P,Q)统一尺寸为(M,N)后,经过backbone提取特征成(c,M/16,N/16)。
经过backbone提取特征feature map后,在feature map上使用33的卷积核以sliding window滑动窗口的方式划过一遍,窗口滑动时,生成anchor,anchor位于滑动窗口的中心,并与并与一个anchor_scale和一个anchor_ratio相关联。默认3个anchor_scale和3个anchor_ratio,每个滑动的窗口上有9个anchors,每个anchor都处于滑动窗口的中心【滑动时,每个点都会是一个滑动窗口的中心】,并与一个proposal关联(共9个proposals:由3个scale和3个aspect_ratio组成。ratio=w/h)。对于wh的feature map,共有whk个anchor。
base_size,anchor_scale,anchor_ratio
def generate_anchors(base_size=16, ratios=[0.5, 1, 2],
scales=2**np.arange(3, 6)):
"""
ratio=h/w
anchor的表示形式有两种,一种是记录左上角和右下角的坐标,一种是记录中心坐标和宽高
base_size为经过 backbone 网络特征提取之后图像缩小的倍数,也是feature map上每一点的感受野对应backbone之前图像(M,N)尺寸的宽、高
"""
#base_anchor为feature map上每一点感受野对应backbone之前图像的坐标范围,其area=base_size*base_size,如feature map上的第一个点在backbone之前的坐标表示为[0,0,base_size-1,base_size-1]
base_anchor = np.array([1, 1, base_size, base_size]) - 1
# 根据base_anchor和高宽比,得到面积不变的不同形状的k种anchors,其坐标为在backbone之前图像(M,N)尺寸上的坐标 (x1,y1,x2,y2)
# 保持base_size*base_size面积不变的基础上:h*w=area h=(area*ratio)^0.5 w=(area/ratio)*0.5 h/w=ratio
ratio_anchors = _ratio_enum(base_anchor, ratios)
#在anchors中心坐标不变的基础上,将高、宽分别都放大scale倍,得到新的anchors,其坐标为在backbone之前的图像(M,N)尺寸上的坐标:(x1,y1,x2,y2)
anchors = np.vstack([_scale_enum(ratio_anchors[i, :