OpenMMlab–MMDetection目标检测代码学习小记
前言
大部分时间,在做算法工程落地的时候,我们并没有像研究者那样执着于算法实现是怎么回事,具体是怎么实现的,大部分我们都考虑的是算法代码为什么出现Erro,相比于后者,大概前者太消耗脑细胞了罢。局限的知识使得我们对更深层次的东西的认知显得心有余而力不足。
一、数据集
数据对于做深度学习的重要性不言而喻,通常面对开源数据不是下载数据的速度太慢就是因为是国外数据而被墙了,通常在配环境一步花费太多时间,无力吐槽。而OpenMMlab呢?是把数据收录进来了,然鹅,收录的数据整合起来建立起了网站,不注册用户登录无法下载。。。(https://opendatalab.org.cn/)就是这玩意。 重新建立了堵墙把数据墙起来了,还期待直接一键wget直接在线下载,多快好省。得,只能下载到本地,然后重新上传到服务器了,来回慢速折腾。
二、Backbone主干网络
MMDetection
最新版本的MMDetection主干网络(也可以译骨干网络)是2.28.1,里面收录了darknet这种yolo v3和4的经典主干网络,efficientnet这种神奇的组合CNN,以及swin transformer。貌似目前为止还没有收录v6和v7这些比较新的工作。
作为见证者,微软亚研的论文“Swin Transformer: Hierarchical Vision Transformer using Shifted Windows”利用滑动窗口和分层结构拿下了当时目标检测的SOTA,也是获得了ICCV2021的最佳论文,一度火出圈。各种跟风文章的主干网络都是加点swin,其中利用swin做swin-Unet的结合改进做医学图像分割的让人映像深刻。
def __init__(self,
embed_dims,
num_heads,
feedforward_channels,
window_size=7,
shift=False,
qkv_bias=True,
qk_scale=None,
drop_rate=0.,
attn_drop_rate=0.,
drop_path_rate=0.,
act_cfg=dict(type='GELU'),
norm_cfg=dict(type='LN'),
with_cp=False,
init_cfg=None):
super(SwinBlock, self).__init__()
self.init_cfg = init_cfg
self.with_cp = with_cp
self.norm1 = build_norm_layer(norm_cfg, embed_dims)[1]
self.attn = ShiftWindowMSA(
embed_dims=embed_dims,
num_heads=num_heads,
window_size=window_size,
shift_size=window_size // 2 if shift else 0,
qkv_bias=qkv_bias,
qk_scale=qk_scale,
attn_drop_rate=attn_drop_rate,
proj_drop_rate=drop_rate,
dropout_layer=dict(type='DropPath', drop_prob=drop_path_rate),
init_cfg=None)
self.norm2 = build_norm_layer(norm_cfg, embed_dims)[1]
self.ffn = FFN(
embed_dims=embed_dims,
feedforward_channels=feedforward_channels,
num_fcs=2,
ffn_drop=drop_rate,
dropout_layer=dict(type='DropPath', drop_prob=drop_path_rate),
act_cfg=act_cfg,
add_identity=True,
init_cfg=None)
Swin Transformer 相比于Vision Transformer,基于移位窗口的多头自注意力模块 (W-MSA / SW-MSA) 变成了标准多头自注意力模块 (MSA) 。Transformer作为应用到NLP任务非常成功的模型,又重新应用到CV的工作且取得了相当不错的成绩,Transformer着实够强悍能打
截至目前,paperswithcode目标检测的中,根据AP50的评测SOTA是EVA
paperswithcode
小结
无论是YOLO还是Swin Transformer,其中的构思设计值得揣摩