Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network

论文标题:Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network

github: https://github.com/leftthomas/ESPCN

2016年的文章。在此之前使用CNN进行SR的方法都是将LR图像先用一个single filter(通常是bicubic)upscale至HR的尺寸,再进行reconstruction的。所有SR的操作都再HR空间进行。  而本文提出在LR空间进行特征提取。并引入sub-pixel convolution layer用于学习一组upscaling filter,用这些针对特征图训练得到的更复杂的filter代替手工bicubic filter。可以降低计算成本,实现实时SR。直接将LR图像输入一个l层的CNN中,之后通过一层sub-pixel卷积层upscaleLR特征图生成对应的HR图像。

这篇论文提出了一种亚像素卷积的方法来对图像进行超分辨率重建,速度特别快。虽然论文里面称提出的方法为亚像素卷积(sub-pixel convolution),但是实际上并不涉及到卷积运算,是一种高效、快速、无参的像素重排列的上采样方式。由于很快,直接用在视频超分中也可以做到实时。其在Tensorflow中的实现称为depthtospace ,在Pytorch中的实现为PixelShuffle

这种上采样的方式很多时候都成为了上采样的首选,经常用在图像重建领域,如后续有在降噪领域中的FFDNet

论文的主要创新点为:

1. 只在模型末端进行上采样,可以使得在低分辨率空间保留更多的纹理区域,在视频超分中也可以做到实时。
2.模块末端直接使用亚像素卷积的方式来进行上采样,相比于显示的将LR插值到HR,这种上采样方式可以学习到更好、更为复杂的方式,可以获得更好的重建效果。

可以看到,相比于其他的一些超分算法,这里实际上只改动了最后的上采样方式。在模型倒数第二层学习对应的通道数( r2c )的卷积,其中c为最终的通道数,如输出是RGB图,则c为3,如输出是灰度图或者Y通道的图,则c为1;r为需要进行的上采样倍数,为正整数倍,不同的上采样倍数只需要调整这一层卷积的通道数即可。

由于带计算的操作都是在低分辨率空间中进行的,所以速度相对会快很多。

这里给出的示例为r=3,c=1,即单通道图的3倍上采样图。结合超像素的思想来看,以第一张特征图进行的3×3宫格的像素重排列,行优先地按顺序将不同深度的特征依次重排列到宫格上。

这里给出的示例图是简单场景,像素重排列的方式为:

从公式可以看出,对于多通道的图,以通道数作为一个整体,即将特征图通道数中连续的c个通道作为一个整体,再然后进行像素重排列,得到多通道的上采样图。

论文的核心创新点就在于这里的像素重排列的方式。

整体的效果上来说,也是非常的惊人。从模型的角度上而言,其主干模型可以采样其他SOTA的主干结构。由于上采样的差异,可以学习到更好、更复杂的上采样方式,所以最终的重建效果是要稍好于SOTA的模型的。并且由于上采样特别高效,速度非常的快。从PSNR的角度来看,ESPCN比TNRD(TNRD发表于TPAMI2015,是DnCNN的前身)稍好,但是速度却相差一个数量级左右。

结论

这篇论文提出了一种亚像素卷积层,在低分辨率空间中可以学习到更好、更复杂的上采样方式,对于不同的重建倍数,只需要对应地更改低分辨率空间中的卷积通道数,非常灵活。其最终的重建PSNR效果也是SOTA,速度上具有很巨大的优势,视频超分也能做到实时。这种上采样方式也广泛地应用于其他的重建领域中。

mmediting 中文文档

MMEditing: 多任务图像视频编辑工具箱

这是一个图像和视频编辑的工具箱,它目前包含了常见的编辑任务,比如图像修复,图像抠图,超分辨率和生成模型。在编辑图像或者视频的时候,我们往往是需要组合使用以上任务的,因此将它们整理到一个统一的框架下,方便大家使用。

基于 PyTorch 的图像&视频编辑开源工具箱, 提供修复/抠图/超分辨率/生成等任务最先进的算法。

github: https://github.com/open-mmlab/mmediting

中文文档: https://mmediting.readthedocs.io/zh_CN/latest/

目前 MMEditing 支持下列任务:

主分支代码目前支持 PyTorch 1.5 以上的版本。

MMEditing 的优势:

1. 统一的框架:我们设计了先进的框架来统一最常见的图像修复,图像抠图,超分辨率和生成模型这几个任务。用户可以在一个框架中方便地调用不同的算法和模型。

2. 灵活的模块化设计:用户能够基于这套框架灵活地增加新的功能和算法。

3. 丰富的模型和文档:下图中展示了我们支持的算法数目,要知道其中有不少算法是首次有完整的复现哦~我们也完善了文档(文档覆盖率高达90%以上)和入门材料,方便用户上手。

4. 高效的实现:MMEditing所有的训练包括 GAN 的对抗训练都是基于高效的分布式训练框架部署的,对于一些基础的操作单元,我们也相应地进行了优化。

主要特性

  • 模块化设计MMEditing 将编辑框架分解为不同的组件,并且可以通过组合不同的模块轻松地构建自定义的编辑器模型。
  • 支持多种编辑任务MMEditing 支持修复抠图超分辨率生成等多种主流编辑任务。
  • SOTAMMEditing 提供修复/抠图/超分辨率/生成等任务最先进的算法。

需要注意的是 MMSR 已作为 MMEditing 的一部分并入本仓库。 MMEditing 缜密地设计新的框架并将其精心实现,希望能够为您带来更好的体验。

安装

MMEditing 依赖 PyTorch 和 MMCV,以下是安装的简要步骤。

步骤 1. 依照官方教程安装PyTorch

步骤 2. 使用 MIM 安装 MMCV

pip3 install openmim
mim install mmcv-full

步骤 3. 从源码安装 MMEditing

git clone https://github.com/open-mmlab/mmediting.git
cd mmediting
pip3 install -e .

模型库

支持的算法:图像修复

图像抠图

图像超分辨率

视频超分辨率

图像生成

视频插帧

请参考模型库了解详情。

Super-Resolution 超分辨率

超分辨率(简称超分),是将低分辨率图像放大到高分辨率图像,如下图,一只小狒狒经过 SR网络后,可以得到放大,变成一只“大”狒狒。

随着深度学习的兴起,早在2014年,香港中文大学多媒体实验室就提出了首个使用卷积神经网络解决超分辨率的模型——SRCNN。作为图像超分辨率工作,SRCNN 对后续计算机视觉的底层算法研究产生了重要影响。后续,各种各样的网络结构如雨后春笋般地冒了出来,比如VDSR,EDSR,SRResNet 等等; 还有追求视觉效果的 SRGAN, ESRGAN。

MMEditing把一些基本的超分算法,比如 SRCNN,EDSR,SResNet,SRGAN还有视频的 EDVR 算法都包括进去。之前 OpenMMLab 中的 MMSR 也有类似的功能,相比之下,MMEditing 使用了更好的框架设计,用上了 MMCV 和 MMDetection 在发展过程中的经验积淀。整个 MM 系列都采用了类似的框架,只要掌握了一种,就能够轻而易举地掌握其他任务的代码库。

Inpainting修复

Inpainting(图像修复)是图像编辑领域里面一项基础的任务,其主要目标是修复图像中的受损(污染)区域。如下图中,左边是原图,中间是受损区域示意图,你可以去除图像中的不想要的人物,或者是图像中杂乱的不规则的受损区域。然后经过 Inpainting 修复算法就得到最右边的图啦。

Inpainting 作为一项基础任务,现如今已经被广泛的应用到各种各样的场景,比如面部修复,背景填充以及视频编辑中。

之前传统的 Patch-Matching 算法可以通过图中已知区域的纹理来快速填补当前受损区域。随着深度学习的发展,越来越多的工作利用深度神经网络实现更好的图像修复效果。深度图像修复领域中,有许多经典的开创性的工作像 Global&Local、Partial Conv 以及 DeepFill 系列,他们作为深度图像修复的经典模型被广泛地应用到后来的研究工作当中。可是这些方法都没有官方的 PyTorch 实现,为了方便大家更好的研究和深入了解这些模型,我们在 MMEditing 中集成了这些算法的训练和测试功能。同时,我们对其中一些重要的模块进行了代码上的优化,以使其更加符合 PyTorch 的风格,甚至是更快的 GPU 计算,从而能够有更好的训练速度。

Matting抠像

抠像(Matting)问题是一个在计算机视觉研究领域有重要价值的研究课题,其在工业界也有非常重要的应用。

抠像是将前景从图片或者视频中与背景分离开来的问题,比如下图中,输入是左图,一位超级可爱的小姐姐在秀丽的风景前中,我们希望得到右边的小姐姐的抠像结果(b)。它和 segmentation分割的不同之处在于,matting 需要得到更精准的边缘(如头发)以及与背景的组合系数。

为了降低求解的难度,一种最常见的方式是引入用户输入的 trimap(如下图),来对图片进行简单的三分类。其中,图中的黑色为背景,白色为前景,灰色为未知区域。给定 trimap 后,我们只需要求解未知区域的抠图结果,这大大降低了求解的难度。

在 MMEditing 中,我们首次完整复现了 DIM(Deep Image Matting)在原论文中的性能。除此之外,MMEditing 还包含当前开源 Matting 模型中性能最好的 GCA Matting 模型,以及速度最快的 IndexNet Matting。

Generation生成模型

Generation,中文含义为“生成”。所谓生成,不同于其他图像编辑的任务,旨在创造新的图像。我们试图通过深度学习的方式,让神经网络成为创造者,产生新的信息。生成任务一般分为两种,非条件(unconditional)和条件(conditional)的生成。所谓非条件生成,主要是从潜在空间(latent space)中的噪声(noise)往图像域(image domain)进行转换,并试图近似相关边缘概率分布,产生逼真的图像;所谓条件生成,主要是从一个图像域映射到潜在空间,并进一步转换到另一个图像域。目前的MMEditing主要支持后者,即从一个图像域映射到另一个图像域,如分割的mask转换到真实图像、马转换到斑马等。后者的条件生成也更加符合目前图像编辑的主题。

而目前 MMEditing 支持的条件图像生成,又可以分为两种不同的设定。其中一种生成模型的训练数据中,包含成对的训练数据,被称为“成对图像到图像转换(paired image-to-image translation)”。这种设定一般生成任务的难度比较低,但对数据本身的要求比较高,生成效果一般比较良好。最经典的成对图像到图像转换的方法,名为 pix2pix。 它也是图像到图像转换领域开山鼻祖的文章,因此我们在这个版本中首先考虑对它进行实现,获得了与作者官方实现一致的结果。

另一种生成模型的训练数据中,仅包含非成对的训练数据,被称为“非成对图像到图像转换(unpaired image-to-image translation)”。这种设定一般对数据要求较低,很容易构建两个明确的图像域,但生成难度较大,生成效果会略微降低。提出非成对图像到图像转换问题,并首先给出解决方案(cycle-consistency)的方法,名为 CycleGAN。CycleGAN 作为最经典的非成对图像到图像转换的生成方法,我们在这个版本中同样首先考虑对它进行实现和效果对齐。

生成(Generation)任务通常比较困难,但向人们展示出了惊人的效果和广阔的研究前景。在未来 MMEditing 代码库的版本中,我们会考虑加入更多不同的生成设定,以及多种生成方法,让我们的代码库更加全面、丰富、强大。

AlphaFold2蛋白质结构预测

摘自 机器学习算法工程师

科学界已知的几乎所有蛋白质结构,都在这里了。蛋白质是生命的基础构件,它们由氨基酸链组成,折叠成不同的复杂形状。蛋白质的功能通常由其 3D 结构决定。如果我们了解蛋白质的折叠方式,就可以开始探索它们是如何工作的,并尝试改变它们的功能。尽管 DNA 提供了制造氨基酸链的指令,但预测它们如何相互作用以形成蛋白质的 3D 结构是一个巨大的挑战。
一年前,DeepMind 发布了 AlphaFold2,以原子水平的准确度预测了 2/3 的蛋白质结构,并与 EMBL-EBI 共同发布了开放可搜索的蛋白质结构数据库 AlphaFold DB,与世界共同分享这一技术。
7 月 28 日,DeepMind 宣布 AlphaFold DB 已从 100 万个结构扩展到超过 2 亿个结构,扩大超过 200 倍,这一进展将极大地提升人们对于生物学的理解。
几乎涵盖所有已知蛋白质
「你可以认为它基本涵盖了所有蛋白质结构。包括植物、细菌、动物和许多其他生物的预测结构,这为 AlphaFold 开辟了巨大的新机会,可以对环保、粮食安全和被忽视疾病等重要问题产生影响,」DeepMind 创始人、首席执行官杰米斯 · 哈萨比斯在介绍 AlphaFold DB 这次扩展时说道。

这一更新包括植物、细菌、动物和其他生物的蛋白质预测结构。

这一更新意味着蛋白质数据库 UniProt 都将带有蛋白质预测结构(UniProt 是一个全面的,高质量的,免费使用的蛋白质序列与功能信息数据库,它还包含了大量来自研究文献的关于蛋白的生物学功能信息)。研究者可以通过 Google Cloud Public Datasets 批量下载,让世界各地的科学家更容易访问 AlphaFold。
斯克里普斯转化研究所创始人 Eric Topol 表示:「AlphaFold 是生命科学领域独一无二的重大进步,展示了 AI 的力量。过去确定蛋白质的 3D 结构需要数月或数年,现在只需几秒钟。AlphaFold 已经加速并实现了大规模发现,包括破解核孔复合体的结构。新的蛋白质结构不断增加,几乎照亮了整个蛋白质宇宙,我们可以期待每天都有更多的生物谜团被解开。」
AlphaFold 的影响
自发布至今,AlphaFold 已产生令人难以置信的影响。它是 DeepMind 构建的最复杂的人工智能系统,需要多项关键创新,并已应用到多种下游任务中。
AlphaFold2 可以在原子精度上准确地预测蛋白质的结构,它不仅为生物学中 50 年来的重大挑战提供了解决方案,也证明了:人工智能可以极大地加速科学发现,进而推动人类进步,这一点意义重大。
DeepMind 已经开源了 AlphaFold 的代码,并在《自然》杂志上发表了两篇深度论文,引用量已超过 4000。此外,DeepMind 还与 EMBL-EBI 合作设计了一种帮助生物学家使用 AlphaFold 的工具,并共同发布了 AlphaFold DB。
在发布 AlphaFold 之前,DeepMind 征求了 30 多名生物学研究专家的意见,使得他们以最大化潜在利益和最小化潜在风险的方式与世界分享 AlphaFold 。

迄今为止,来自 190 个国家 / 地区的超过 500000 名研究人员访问了 AlphaFold DB,查看了超过 200 万个结构。一些免费提供的蛋白质结构也已集成到其他公共数据集中,例如 Ensembl、UniProt 和 OpenTargets,被数百万用户访问。

在与其他机构合作时,DeepMind 优先考虑那些最具积极社会效益的应用,重点关注那些资金不足或被忽视的计划。
拼凑核孔复合体
在最新一期《科学》杂志特刊上,几个研究团队描述了 AlphaFold 帮助拼凑核孔复合体——生物学中最具挑战性的难题之一。这个巨大的结构由数百个蛋白质部分组成,控制着进出细胞核的一切。

人们通过使用现有的实验方法揭示它的轮廓,结合 AlphaFold 预测完成和解释其中不清楚的区域,最终揭示了它的微妙结构。《科学》将其称为实验结构生物学的胜利,这种新研究方式现在正成为实验室的常规做法,开启了新的科学研究道路。
结构搜索工具
Foldseek、Dali 等结构搜索工具允许用户非常快速地搜索与给定蛋白质相似的结构。这将是为实际有用的蛋白质(例如分解塑料的蛋白质)挖掘大型序列数据集的第一步,它可以提供有关蛋白质功能的线索。
对人类健康的影响
AlphaFold 已经对人类健康产生了重大而直接的影响。与欧洲人类遗传学会的合作证明 AlphaFold 对于解开罕见遗传疾病的原因至关重要。此外,AlphaFold 还通过更好地了解新发现的可能成为药物靶点的蛋白质,帮助科学家更快地找到与其结合的潜在药物来加速药物发现。
参考内容:https://www.science.org/doi/10.1126/science.add2210https://www.theverge.com/2022/7/28/23280743/deepmind-alphafold-protein-database-alphabethttps://www.deepmind.com/blog/alphafold-reveals-the-structure-of-the-protein-universehttps://www.nature.com/articles/d41586-022-02083-2

YOLOv7-Pose 基于YOLOv7的关键点模型

目前人体姿态估计总体分为Top-down和Bottom-up两种,与目标检测不同,无论是基于热力图或是基于检测器处理的关键点检测算法,都较为依赖计算资源,推理耗时略长,今年出现了以YOLO为基线的关键点检测器。玩过目标检测的童鞋都知道YOLO以及各种变种目前算是工业落地较多的一类检测器,其简单的设计思想,长期活跃的社区生态,使其始终占据着较高的话题度。

【演变】

在ECCV 2022和CVPRW 2022会议上,YoLo-Pose和KaPao(下称为yolo-like-pose)都基于流行的YOLO目标检测框架提出一种新颖的无热力图的方法,类似于很久以前谷歌使用回归计算关键点的思想,yolo-like-pose一不使用检测器进行二阶处理,二部使用热力图拼接,虽然是一种暴力回归关键点的检测算法,但在处理速度上具有一定优势。

kapao

去年11月,滑铁卢大学率先提出了 KaPao:Rethinking Keypoint Representations: Modeling Keypoints and Poses as Objects for Multi-Person Human Pose Estimation,基于YOLOv5进行关键点检测,该文章目前已被ECCV 2022接收,该算法所取得的性能如下:

paper:https://arxiv.org/abs/2111.08557

code:https://github.com/wmcnally/kapao

yolov5-pose

今年4月,yolo-pose也挂在了arvix,在论文中,通过调研发现 HeatMap 的方式普遍使用L1 Loss。然而,L1损失并不一定适合获得最佳的OKS。且由于HeatMap是概率图,因此在基于纯HeatMap的方法中不可能使用OKS作为loss,只有当回归到关键点位置时,OKS才能被用作损失函数。因此,yolo-pose使用oks loss作为关键点的损失

相关代码在https://github.com/TexasInstruments/edgeai-yolov5/blob/yolo-pose/utils/loss.py也可见到:

 if self.kpt_label:
                    #Direct kpt prediction
                    pkpt_x = ps[:, 6::3] * 2. – 0.5
                    pkpt_y = ps[:, 7::3] * 2. – 0.5
                    pkpt_score = ps[:, 8::3]
                    #mask
                    kpt_mask = (tkpt[i][:, 0::2] != 0)
                    lkptv += self.BCEcls(pkpt_score, kpt_mask.float()) 
                    #l2 distance based loss
                    #lkpt += (((pkpt-tkpt[i])*kpt_mask)**2).mean()  #Try to make this loss based on distance instead of ordinary difference
                    #oks based loss
                    d = (pkpt_x-tkpt[i][:,0::2])**2 + (pkpt_y-tkpt[i][:,1::2])**2
                    s = torch.prod(tbox[i][:,-2:], dim=1, keepdim=True)
                    kpt_loss_factor = (torch.sum(kpt_mask != 0) + torch.sum(kpt_mask == 0))/torch.sum(kpt_mask != 0)
                    lkpt += kpt_loss_factor*((1 – torch.exp(-d/(s*(4*sigmas**2)+1e-9)))*kpt_mask).mean()

yolov7-pose

上个星期,YOLOv7的作者也放出了关于人体关键点检测的模型,该模型基于YOLOv7-w6

目前作者提供了.pt文件和推理测试的脚本,有兴趣的童靴可以去看看,本文的重点更偏向于对yolov7-pose.pt进行onnx文件的抽取和推理。

【yolov7-pose + onnxruntime】

首先下载好官方的预训练模型,使用提供的脚本进行推理:

% weigths = torch.load('weights/yolov7-w6-pose.pt')
% image = cv2.imread('sample/pose.jpeg')
!python pose.py 

一、yolov7-w6 VS yolov7-w6-pose

首先看下yolov7-w6使用的检测头

二、修改export脚本

如果直接使用export脚本进行onnx的抽取一定报错,在上一节我们已经看到pose.pt模型使用的检测头为IKeypoint,那么脚本需要进行相应更改:在export.py的这个位置插入:

 # 原代码:
    for k, m in model.named_modules():
        m._non_persistent_buffers_set = set()  # pytorch 1.6.0 compatibility
        if isinstance(m, models.common.Conv):  # assign export-friendly activations
            if isinstance(m.act, nn.Hardswish):
                m.act = Hardswish()
            elif isinstance(m.act, nn.SiLU):
                m.act = SiLU()
     model.model[-1].export = not opt.grid  # set Detect() layer grid export
                
    # 修改代码:
    for k, m in model.named_modules():
        m._non_persistent_buffers_set = set()  # pytorch 1.6.0 compatibility
        if isinstance(m, models.common.Conv):  # assign export-friendly activations
            if isinstance(m.act, nn.Hardswish):
                m.act = Hardswish()
            elif isinstance(m.act, nn.SiLU):
                m.act = SiLU()
        elif isinstance(m, models.yolo.IKeypoint):
            m.forward = m.forward_keypoint  # assign forward (optional)
            # 此处切换检测头
    model.model[-1].export = not opt.grid  # set Detect() layer grid export

forward_keypoint在原始的yolov7 repo源码中有,作者已经封装好,但估计是还没打算开放使用。

使用以下命令进行抽取:python export.py –weights ‘weights/yolov7-w6-pose.pt’ –img-size 960 –simplify True

三、onnxruntime推理

onnxruntime推理代码:

import onnxruntime
import matplotlib.pyplot as plt
import torch
import cv2
from torchvision import transforms
import numpy as np
from utils.datasets import letterbox
from utils.general import non_max_suppression_kpt
from utils.plots import output_to_keypoint, plot_skeleton_kpts

device = torch.device("cpu")

image = cv2.imread('sample/pose.jpeg')
image = letterbox(image, 960, stride=64, auto=True)[0]
image_ = image.copy()
image = transforms.ToTensor()(image)
image = torch.tensor(np.array([image.numpy()]))

print(image.shape)
sess = onnxruntime.InferenceSession('weights/yolov7-w6-pose.onnx')
out = sess.run(['output'], {'images': image.numpy()})[0]
out = torch.from_numpy(out)

output = non_max_suppression_kpt(out, 0.25, 0.65, nc=1, nkpt=17, kpt_label=True)
output = output_to_keypoint(output)
nimg = image[0].permute(1, 2, 0) * 255
nimg = nimg.cpu().numpy().astype(np.uint8)
nimg = cv2.cvtColor(nimg, cv2.COLOR_RGB2BGR)
for idx in range(output.shape[0]):
    plot_skeleton_kpts(nimg, output[idx, 7:].T, 3)

# matplotlib inline
plt.figure(figsize=(8, 8))
plt.axis('off')
plt.imshow(nimg)
plt.show()
plt.savefig("tmp")

推理效果几乎无损,但耗时会缩短一倍左右,另外有几个点:

  • image = letterbox(image, 960, stride=64, auto=True)[0] 中stride指的是最大步长,yolov7-w6和yolov5s下采样多了一步,导致在8,16,32的基础上多了64的下采样步长
  • output = non_max_suppression_kpt(out, 0.25, 0.65, nc=1, nkpt=17, kpt_label=True) ,nc 和 kpt_label 等信息在netron打印模型文件时可以看到
  • 所得到的onnx相比原半精度模型大了将近三倍,后续排查原因
  • yolov7-w6-pose极度吃显存,推理一张960×960的图像,需要2-4G的显存,训练更难以想象

ParseNet: Looking Wider to See Better

论文地址: https://arxiv.org/abs/1506.04579

代码: https://github.com/weiliu89/caffe

U形的编解码结构奠定了深度学习语义分割的基础,随着基线模型的表现越来越好,深度学习语义分割关注的焦点开始由原先的编解码架构下上采样如何更好的恢复图像像素转变为如何更加有效的利用图像上下文信息和提取多尺度特征。因而催生出语义分割的第二个主流的结构设计:多尺度结构。接下来的几篇论文解读将对重在关注图像上下文信息和多尺度特征的结构设计网络进行梳理,包括ParseNet、PSPNet、以空洞卷积为核心的Deeplab系列、HRNet以及其他代表性的多尺度设计。

自从全卷积网络(Fully Convolutional Networks, FCN)和UNet提出以来,主流的改进思路是围绕着编解码结构来进行的。但又一些改进在当时看来却不是那么“主流”,其中有一些是针对如何提升网络的全局信息提取能力来进行改进的。FCN提出之后,一些学者认为FCN忽略了图像作为整张图的全局信息,因而在一些应用场景下不能有效利用图像的语义上下文信息。图像全局信息除了增加对图像的整体理解之外,还有助于模型对局部图像块的判断,此前一种主流的方法是将概率图模型融入到CNN训练中,用于捕捉图像像素的上下文信息,比如说给模型加条件随机场(Conditional Random Field,CRF),但这种方式会使得模型难以训练并且变得低效。

针对如何高效利用图像的全局信息问题,相关研究在FCN结构的基础上提出了ParseNet,一种高效的端到端的语义分割网络,旨在利用全局信息来指导局部信息判断,并且引入太多的额外计算开销。提出ParseNet的论文为ParseNet: Looking Wider to See Better,发表于2015年,是在FCN基础上基于上下文视角的一个改进设计。在语义分割中,上下文信息对于提升模型表现非常关键,在仅有局部信息情况下,像素的分类判断有时候会变得模棱两可。尽管理论上深层卷积层的会有非常大的感受野,但在实际中有效感受野却小很多,不足以捕捉图像的全局信息。ParseNet通过全局平均池化的方法在FCN基础上直接获取上下文信息,图1为ParseNet的上下文提取模块,具体地,使用全局平均池化对上下文特征图进行池化后得到全局特征,然后对全局特征进行L2规范化处理,再对规范化后的特征图反池化后与局部特征图进行融合,这样的一个简单结构对于语义分割质量的提升的巨大的。如图2所示,ParseNet能够关注到图像中的全局信息,保证图像分割的完整性。

关于全局特征与局部特征的融合,ParseNet给出两种融合方式:早期融合(early fusion)和晚期融合(late fusion)。早期融合就是图6-1中所展现的融合方式,对全局特征反池化后直接与局部特征进行融合,然后在进行像素分类。而晚期融合则是把全局特征和局部特征分别进行像素分类后再进行某种融合,比如说进行加权。但无论是早期融合还是晚期融合,如果选取的归一化方式合适,其效果是差不多的。

下图是ParseNet在VOC 2012数据集上的分割效果,可以看到,ParseNet的分割能够明显关注到图像全局信息。

补充:反卷积(Deconvolution)、上采样(UNSampling)与上池化(UnPooling)

图(a)表示UnPooling的过程,特点是在Maxpooling的时候保留最大值的位置信息,之后在unPooling阶段使用该信息扩充Feature Map,除最大值位置以外,其余补0。

与之相对的是图(b),两者的区别在于UnSampling阶段没有使用MaxPooling时的位置信息,而是直接将内容复制来扩充Feature Map。从图中即可看到两者结果的不同。

图(c)为反卷积的过程,反卷积是卷积的逆过程,又称作转置卷积。最大的区别在于反卷积过程是有参数要进行学习的(类似卷积过程),理论是反卷积可以实现UnPooling和unSampling,只要卷积核的参数设置的合理。

2、FCN 全卷积网络 Fully Convolutional Networks

FCN对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation)问题。与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类(全联接层+softmax输出)不同,FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息, 最后在上采样的特征图上进行逐像素分类。

简单的来说,FCN与CNN的区别在把于CNN最后的全连接层换成卷积层,输出的是一张已经Label好的图片。

论文写作全攻略|一篇学术科研论文该怎么写

摘自: 深度学习与计算机视觉

论文通俗来说是本科和硕士的升学助力,也是学术界的硬通货,更是未来工作的加分项和敲门砖。

论文的写作对很多学生来说,是一种挑战。有些学生不知该如何对论文做选题,更多的学生则是对毕业论文写作到底有什么要求不清楚,不知从何下手,常常为毕业论文发愁。

论文写作的分为四个顺序:阅读论文→确定创新点→Coding/实验→论文写作。

1、阅读论文

发表论文的前提是大量阅读论文!!!文献阅读分为三个阶段,初期找方向,中期重点突破,后期广泛涉猎。

初期读论文需要逐字精读,方向不必严格限定,感兴趣论文涉及的论文链都可以去读。一篇论文用时一天,英文论文+中文分享,前期阅读论文数量30篇以上,可以提高学术英语阅读能力和专业术语积累。

中期读论文要重点精读,严格限定研究方向和方向涉及的论文链。重点论文时间控制在半天,泛泛论文是一小时,重点论文重复读+源码学习,论文阅读数最好为10篇以上。了解学习技术演进、学习方法创新和整理创新方法链。

后期少数精读+大量泛读,不限定方向,自己重点方向+涉猎方向。

重点论文两小时,泛泛论文半小时,跟随研究方向的最新发展,了解其他方向的大致进展,思考创新点引进嫁接。

2、确定创新点

可以从以下四个方面确定自己论文的创新点:

1. 数据集的改动:噪声、几何变换、遮挡、光照条件、场景依赖

2. 模型的问题:模型体积、推理速度、收敛困难、非端到端、后处理优化

3. 结构替换:transformer、FCN、AE、

4. 特定场景的应用:通用模型考虑泛化能力特定应用考虑专用性。比如夜间检测、水下检测、鱼眼相机检测。

另外就是要记住A+B+C/2.5法则

A:本研究方向的继承性创新点(自然演进)

B:其他方向的既有方法(嫁接到其他任务)

C:细节上的创新(数据增强/数据集/损失函数设计)

例如下面这篇CVPR2021: CutPaste,运用的就是A+B+C/2.5法则。

A:自然演进  cutout—cutpaste+B:既有方法  将自监督学习的pretask应用于异常检测+C:细节创新   高斯概率密度估计(GDE)判断异常

3、Coding/实验

原则:1篇论文代码复现(至少读懂代码实现)>>跑通多个项目demo

1. 找到baseline论文的代码;

2. 在baseline代码上实现期望功能的最小化实现;

3. 逐步实现最终的功能代码,同时做实现验证各部分设计的效果。

4、 论文写作

01:写作策略:

选择2篇左右的范文,去分析论文结构(Introduction)、重点词句(Related Work)、语言风格(Method)、实验设计(Experiment)、绘图风格(Conclusion)和故事设计(References)。

02:论文写作技巧

(1)论文写作技巧——注意标题

  • 用⼀句话概括你所做的工作
  • 考虑搜索引擎的影响,包含关键词
  • 可以新颖一些

(2)论文写作技巧——首页加图

(3)论文写作技巧—Introduction直接列贡献

  • 不用介绍各个部分如何组织的;
  • 直接说做出了哪些贡献;
  • 标明贡献位置。

Yolov7之正负样本分配策略

以下文章来源于微信公众号: 所向披靡的张大刀

作者:张大刀

原文链接:https://mp.weixin.qq.com/s/nhZ3Q1NHm3op8abdVIGmLA

本文仅用于学术分享,如有侵权,请联系后台作删文处理

导读在正负样本分配中,Yolov7的策略算是Yolov5和YoloX的结合。本文先从Yolov5和Yolov6正负样本分配策略分析入手,后引入到Yolov7的解析中,希望对大家学习Yolov7有帮助。

本文主要就Yolov7的正负样本筛选策略,并与Yolov5,Yolov6进行比对。

首先接着上一篇Yolov7系列一,网络整体结构,填几个小坑,希望对大家没有造成困扰:

如:E-ELAN层,在cat后需要要conv层做特征融合:

还有SPPCSPC层经大家勘误后,改动如下:

还有另外几个小问题:如REPconv层在Yolov7论文中将identity 层去掉,卷积后的激活函数是SiLu这些,因Yolov7网络是基于Tag0.1版本Yolov7.yaml的代码构造的,作者后续在持续优化迭代,后续大刀也会继续更新。

Yolov7因为基于anchor based的目标检测,与Yolov5相同,Yolov6的正负样本的匹配策略则与Yolox相同,Yolov7则基本集成两家之所长。下面先回顾下Yolov5,v6的正负样本匹配策略。

1. Yolov5的正负样本匹配策略

Yolov5基于anchor based,在开始训练前,会基于训练集中gt(ground truth  框),通过k-means聚类算法,先验获得9个从小到大排列的anchor框。先将每个gt与9个anchor匹配(以前是IOU匹配,Yolov5中变成shape匹配,计算gt与9个anchor的长宽比,如果长宽比小于设定阈值,说明该gt和对应的anchor匹配),

如上图为Yolov5的网络架构,Yolov5有三层网络,9个anchor, 从小到大,每3个anchor对应一层prediction网络,gt与之对应anchor所在的层,用于对该gt做训练预测,一个gt可能与几个anchor均能匹配上。所以一个gt可能在不同的网络层上做预测训练,大大增加了正样本的数量,当然也会出现gt与所有anchor都匹配不上的情况,这样gt就会被当成背景,不参与训练,说明anchor框尺寸设计的不好。

在训练过程中怎么定义正负样本呢,因为Yolov5中负样本不参与训练,所以要增加正样本的数量。gt框与anchor框匹配后,得到anchor框对应的网络层的grid,看gt中心点落在哪个grid上,不仅取该grid中和gt匹配的anchor作为正样本,还取相邻的的两个grid中的anchor为正样本。如下图所示,绿色的gt框中心点落在红色grid的第三象限里,那不仅取该grid,还要取左边的grid和下面的grid,这样基于三个grid和匹配的anchor就有三个中心点位于三个grid中心点,长宽为anchor长宽的正样本,同时gt不仅与一个anchor框匹配,如果跟几个anchor框都匹配上,所以可能有3-27个正样本,增大正样本数量。

2. Yolov6的正负样本匹配策略

Yolov6的正负样本匹配策略同Yolox,Yolox因为是anchor free,anchor free因为缺少先验框这个先验知识,理论上应该是对场景的泛化性更好,同时参见旷视的官方解读:Anchor 增加了检测头的复杂度以及生成结果的数量,将大量检测结果从NPU搬运到CPU上对于某些边缘设备是无法容忍的。Yolov6中的正样本筛选,主要分成以下几个部分:①:基于两个维度来粗略筛选;②:基于simOTA进一步筛选。

tie标签的gt如图所示,找到gt的中心点(Cx,Cy),计算中心点到左上角的距离(l_l,l_t),右下角坐标(l_r,l_b),然后从两步筛选正样本:第一步粗略筛选第一个维度是如果grid的中心点落在gt中,则认为该grid所预测的框为正样本,如图所示的红色和橙色部分,第二个维度是以gt的中心点所在grid的中心点为中心点,上下左右扩充2.5个grid步长范围内的grid,则默认该grid所预测的框为正样本,如图紫色和橙色部分。这样第一步筛选出31个正样本(注:这里单独一层的正样本,Yolov6有三个网络层,分别计算出各层的正样本,并叠加)。

第二步:通过SimOTA进一步筛选:SimOTA是基于OTA的一种优化,OTA是一种动态匹配算法,具体参见旷视官方解读(https://www.zhihu.com/question/473350307/answer/2021031747)SimOTA流程如下:
①计算初筛正样本与gt的IOU,并对IOU从大到小排序,取前十之和并取整,记为b。
②计算初筛正样本的cos代价函数,将cos代价函数从小到大排列,取cos前b的样本为正样本。同时考虑同一个grid预测框被两个gt关联的情况,取cos较小的值,该预测框为对应的gt的正样本。具体细节可以参考大白的知乎文章:https://www.zhihu.com/search?type=content&q=simOTA

3. Yolov7的正负样本匹配策略

Yolov7因为基于anchor based , 集成v5和v6两者的精华,即Yolov6中的第一步的初筛换成了Yolov5中的筛选正样本的策略,保留第二步的simOTA进一步筛选策略。
同时Yolov7中有aux_head 和lead_head 两个head ,aux_head做为辅助,其筛选正样本的策略和lead_head相同,但更宽松。如在第一步筛选时,lead_head 取中心点所在grid和与之接近的两个grid对应的预测框做为正样本,如图绿色的grid, aux_head则取中心点以及周围的4个预测框为正样本。如下图绿色+蓝色区域的grid.

同时在第二步simOTA部分,lead_head 是计算初筛正样本与gt的IOU,并对IOU从大到小排序,取前十之和并取整,记为b。aux_head 则取前二十之和并取整。其他步骤相同,aux_head主要是为了增加召回率,防止漏检,lead_head再基于aux_head 做进一步筛选。

4. 结语以上为Yolov7的正负样本的匹配策略,希望对大家有帮助。同时文中如果有bug,欢迎一起讨论。

参考:[1] https://github.com/WongKinYiu/yolov7(官方github代码)
[2] https://arxiv.org/pdf/2207.02696.pdf(yolov7论文)[3]https://zhuanlan.zhihu.com/p/394392992[4]YOLOv7官方开源 | Alexey Bochkovskiy站台,精度速度超越所有YOLO,还得是AB (qq.com)[5] https://www.zhihu.com/question/473350307/answer/2021031747
[6]【yolov6系列】细节拆解网络框架 (qq.com)[7] https://arixv.org/abs/2103/14259v1 (OTA for object detection)[8] https://github.com/Megvii-BasedDetection/OTA 

利用深度学习迭代自洽的蛋白序列设计

——背景——

现有的基于蛋白结构的深度学习序列设计方法,虽然在测试的计算指标上取得了很好的成果,但是还鲜有方法经过实验的考验仍然超越传统的能量函数方法。基于这一挑战,中国科学技术大学的刘海燕教授课题组,发展了名为ABACUS-R方法,相关工作名为Rotamer-free protein sequence design based on deep learning and self-consistency,于近期发表在Nature Computational Science上。

图1. ABACUS-R方法的示意图

——方法——

ABACUS-R方法包含两部分:(1)一个encoder-decoder网络被预训练用以推断给定骨架的局部环境时中心残基的侧链类型 (2)用该encoder-decoder网络连续更新每个残基的类型,最终收敛获得自洽(self-consistent)。网络的输入是中心残基与空间上最邻近(Cα间距离)k个残基组成的局部结构。邻近残基的特征包含空间层面的相对位置与取向信息(XSPA)、序列层面的相对位置信息(XRSP)以及邻近残基的残基类型(XAA)。第i个中心残基的特征包含全零的XSPA、被mask的XAA以及骨架上的15个ϕi−2ψi−2ωi−2 ⋯ ϕi+2ψi+2ωi+2,这些特征组合起来会被映射到与邻近残基特征相同的维度。以上模型输入的信息都是旋转平移不变的。局部结构中的所有残基的特征经过可学习的映射后融合后,得到每个残基总特征En。{En; n = 0, 1, 2, … , k}经过基于transformer架构的encoder-decoder,预测每个中心残基的类型以及其他辅助任务。

自洽迭代设计的方法是:对序列随机初始化,第一轮随机选择80%的残基通过encoder-decoder并行预测其残基类型,以后每轮随机选择的残基数目逐渐下降。最终的设计结果会逐渐收敛。

作者将PDB中的非冗余结构按照两种不同的方式划分了95%作为训练集、5%作为测试集,第一种划分方式确保测试集的结构不会存在训练集中出现过的CATH拓扑,训练得到的模型为Model­­eval;第二种划分方式时随机划分Modelfinal。Model­­eval可以用来评估模型能力的无偏向性的表现,而Modelfinal使用了更丰富的数据训练表现应当更好。

——表现评估——

Encoder-decoder的架构可以进行多任务学习,除了训练序列的恢复的任务以外,还可以预测二级结构、SASA、B-factor与侧链扭转角χ1、χ2。多个任务可以增强模型设计序列的能力(图2a),Model­­eval与Model­­final都可以在测试集上最好取得50%左右准确度。在测试集上的结果显示,虽然有些残基类型没有恢复正确,但是模型也学习到了替换为性质相似的残基(图2b)。

图2. Model­­eval在不同任务类型下的表现

Decoder网络输出的是每个位置上残基类型的-logP,类似于选择不同残基对应的能量,所以作者将ProTherm数据集中蛋白突变的ΔΔG与模型计算出相应的−ΔΔlogits进行了比较,发现二者有一定的相关性(图2d),说明模型一定程度上学习到了能量。

接着,作者验证了模型的自洽性,测试集中100个蛋白属于CATH的三个大类,对其中的每个蛋白从随机序列出发设计10条序列,随着迭代的次数变多,平均-logP会趋于收敛(图3a),同时未收敛的残基比例也会收敛(图3b)。不同CATH类别的骨架上取得的序列恢复率差距不大(图3c)。同一蛋白骨架设计出的序列会有很高的相似性(0.76-0.89)。设计出的序列与天然序列相比,序列的成分高度相似(图3d),Pearson相关系数达到了0.93,但GLU、ALA与LYS出现得更频繁,而Gln、His、Met出现得更少。此外,ABACUS-R设计出的序列与ABACUS设计出的序列相比,平均每个残基的Rosetta打分更低(图3e),而平均的-logP打分却更高(图3f),这意味着ABACUS-R学习到的能量与Rosetta打分函数存在正交的部分。

图3. ABACUS-R的自洽能力、设计能力以及学习到的能量与Rosetta打分的比较

相较于其他深度学习方法在单个残基恢复任务上的表现,ABACUS-R超过了除DenseCPD外的所有方法(表1),在整条序列重设计任务上ABACUS-R在两个测试集上都取得了最好的表现(表2)。

最后,作者在3种天然骨架(PDB ID: 1r26, 1cy5 and 1ubq)上通过实验验证了ABACUS-R的设计能力。设计的方法有两种:第一种采用迭代自洽的设计方法(生成序列的多样性低),第二种采用迭代时对decoder输出结果进行采样(生成序列的多样性高,但-logP能量也略高)。

第一种方法设计的27条序列有26条成功表达,体积排阻色谱与1H NMR实验结果显示所有的蛋白都以单体形式存在,示差扫描量热实验显示5条序列有很好的热稳定性( 97~117 C )。最终,1r26的3个设计与1cy5的1个设计成功解出了晶体结构,Cα RMSD位于0.51~0.88 Å,而1ubq的1个设计虽然没有解出结构,但已有的实验结果显示它折叠成了明确的三维结构。

第二种方法对同一骨架设计的序列相似度在58%左右。30条设计的序列中,25条被成功表达,23条能被可溶地纯化。所有设计同样都是单体存在并且折叠成了明确的三维结构,5个设计有很好的热稳定性(85~118 C)。最终,1r26的1个设计被成功解出了晶体结构,Cα RMSD为0.67 Å。相较方法一的自洽设计,方法二设计成功率下降,成功设计的蛋白热稳定性也略微下降,但作者认为可以接受。

最后,作者展示了所有1r26设计晶体结构核心的侧链pack(图4a,b),以及1cy5设计晶体结构的侧链的极性作用(图4c),说明了ABACUS-R学会了设计侧链的组合以pack好的结构。

——总结——

总之,作者开发的ABACUS-R方法在不需要显示地模拟侧链,可以学习到给定结构下侧链类型的能量打分。ABACUS-R不仅取得了很好的序列恢复度,还在实验上取得了很好的成功率。

CVPR2022 | 自注意力和卷积的融合(ACmix)

前言  通常convolution和self-attention被认为是表征学习的两个有力且相互对等的不用方法。在本文中,作者发掘了两者之间的潜在关系,两者的大部分计算实际上是相通的。

作者将K x K 的传统卷积分解为k方个1 x 1的卷积,然后将self-attention模块中queries、 keys等解释为多个1 x 1的卷积,然后计算注意力权重和聚合值。

该模型在图像识别和down streamtasks取得了优异的结果。

论文题目:On the Integration of Self-Attention and Convolution

论文链接:https://openaccess.thecvf.com/content/CVPR2022/papers/Pan_On_the_Integration_of_Self-Attention_and_Convolution_CVPR_2022_paper.pdf

源代码:https://github.com/LeapLabTHU/ACmix         https://gitee.com/mindspore/models.

卷积神经网络与自注意力在图像识别、语义分割等方面取得了飞速的发展。随着transformers的出现,attention-based的方法取得了更加优异的性能。尽管两种方法都取得了成功,但是两者遵循不同的设计思路。前者在特征图中共享权重,后者通过动态计算像素间的相似度函数从而能够捕获不同区域的特征进而获得更多的特征。

在一些工作中,研究人员仅使用self-attention来独立地构建视觉任务模型,这一做法的有效性在一些任务中得到了验证,其完全可以代替卷积操作。Vision Transformer表明只要给定足够的数据,就可以获得优异的结果,这一做法在点云分割等其他视觉任务上也取得了不错的效果。Hu等人提出自适应确定聚合的方法;Wang等人通过引入非局部块来增加感受野来比较全局像素之间的相似性;Conformer将transformer与独立的CNN结合来整合两个特征。

早期的工作从几个不同的角度探索了convolution和self-attention的组合,CBAM等证明self-attention可以作为convolution的增强;SAN等提出self-attention可以代替传统的convolution;AA-ResNet等在设计独立架构方面存在局限性。现有的方法仍将自注意力和卷积视为不同的部分,因此它们之间的关系并未得到充分利用。

本文主要贡献


1、揭示了self-attention和convolution之间的潜在关系,为了解两个模块间的关联和设计新的learning paradigms提供了新的视角。

2、self-attention和convolution的组合使得两者的功能得到整合,经验及实验证明混合模型的性能始终优于纯卷积或者自注意力模型。

方法


1、将self-attention和convolution关联起来

标准卷积可以分为两个部分,第一个阶段为一个特征学习模块,通过执行1 x 1的卷积共享相同的操作将特征投影到更深的空间,第二阶段对应于特征聚合的过程。作为结论,分析表明卷积和自注意力在通过1 x 1的卷积投影输入特征图实际上共享相同的操作,聚合操作是轻量级的,并不需要获取额外的学习参数。卷积和自注意力的示意图如下图所示。

2、将self-attention和convolution进行整合

作者根据上述的分析提出ACmix模型,如下图所示:

ACmix模型分为两个阶段,在阶段一,输入特征由三个1 x 1的卷积操作并被reshape成N块,由此获得丰富的3 x N的特征图;在阶段二,对于self-attention,作者将中间特征收集到N组中,每组包含三个部分特征,其中每个1 x 1卷积对应一个。通过移动和聚合生成的特征(用以下公式表达),并像传统方法一样从本地感受野中收集信息。

3、对Shift和Summation进行改进

中间特征遵循传统的卷积模块中的Shift和Summation操作,尽管这些操作在理论上是轻量级的,但是难以矢量化实现,这会极大影响计算的实际效率。作者采用了固定内核的深度卷积来解决这一问题,如下图所示。

在此基础上,作者额外引入了一些配置来增强模块的灵活性,如下图所示,作者将卷积核释放为可学习的权重,对内核初始化,这不仅改善了模型容量,而且能够保持原有的能力,同时使用多组卷积内核来匹配卷积和自注意力路径的输出通道维度。

4、ACmix的计算成本

作者总结了ACmix的FLOPS和参数量,在stage1 的训练参数与self-attention相同,并且比传统的卷积更轻,在第二阶段,引入了额外的计算开销,包含轻量级的全连接层等。

5、向其他注意力模式推广

作者所提出的ACmix独立于自注意力机制,并且很容易衍生出其他变体,注意力的权重可以表示为

实验

1、ImageNet分类

作者在4个baseline models上应用了ACmix,包括ResNet, SAN, PVT和 Swin-Transformer。

2、语义分割

作者在ADE20K上对比了Semantic-FPN、UperNet 两种方法

3、目标检测

在COCO benchmark上开展了实验,实验结果证实了ACmix的性能优于baseline

结论


在本文中,作者发掘了self-attention和convolution之间的潜在关系,两者的大部分计算实际上是相通的,所提的ACmix在目标检测、语义分割等多个任务上展示了优异的性能。

Yolo 系列之 Yolov7 基础网络结构

YOLOV7 整体结构

我们先整体来看下 YOLOV7,首先对输入的图片 resize 为 640×640 大小,输入到 backbone 网络中,然后经 head 层网络输出三层不同 size 大小的 feature map,经过 Rep 和 conv输出预测结果,这里以 coco 为例子,输出为 80 个类别,然后每个输出(x ,y, w, h, o) 即坐标位置和前后背景,3 是指的 anchor 数量,因此每一层的输出为 (80+5)x3 = 255再乘上 feature map 的大小就是最终的输出了。

  1. backbone
    YOLOV7 的 backbone 如下图所示

总共有 50 层, 我在上图用黑色数字把关键层数标示出来了。 首先是经过 4 层卷积层,如下图,CBS 主要是 Conv + BN + SiLU 构成,我在图中用不同的颜色表示不同的 size 和 stride, 如 (3, 2) 表示卷积核大小为 3 ,步长为 2。 在 config 中的配置如图。

经过 4个 CBS 后,特征图变为 160 * 160 * 128 大小。随后会经过论文中提出的 ELAN 模块,ELAN 由多个 CBS 构成,其输入输出特征大小保持不变,通道数在开始的两个 CBS 会有变化, 后面的几个输入通道都是和输出通道保持一致的,经过最后一个 CBS 输出为需要的通道。

MP 层 主要是分为 Maxpool 和 CBS , 其中 MP1 和 MP2 主要是通道数的比变化。


backbone的基本组件就介绍完了,我们整体来看下 backbone,经过 4 个 CBS 后,接入例如一个 ELAN ,然后后面就是三个 MP + ELAN 的输出,对应的就是 C3/C4/C5 的输出,大小分别为 80 * 80 * 512 , 40 * 40 * 1024, 20 * 20 * 1024。 每一个 MP 由 5 层, ELAN 有 8 层, 所以整个 backbone 的层数为 4 + 8 + 13 * 3 = 51 层, 从 0 开始的话,最后一层就是第50层。

3、head

YOLOV7 head 其实就是一个 pafpn 的结构,和之前的YOLOV4,YOLOV5 一样。首先,对于 backbone 最后输出的 32 倍降采样特征图 C5,然后经过 SPPCSP,通道数从1024变为512。先按照 top down 和 C4、C3融合,得到 P3、P4 和 P5;再按 bottom-up 去和 P4、P5 做融合。这里基本和 YOLOV5 是一样的,区别在于将 YOLOV5 中的 CSP 模块换成了 ELAN-H 模块, 同时下采样变为了 MP2 层。 ELAN-H 模块是我自己命名的,它和 backbone 中的 ELAN 稍微有点区别就是 cat 的数量不同。

对于 pafpn 输出的 P3、P4 和 P5 , 经过 RepConv 调整通道数,最后使用 1×1 卷积去预测 objectness、class 和 bbox 三部分。 RepConv 在训练和推理是有一定的区别。训练时有三个分支的相加输出,部署时会将分支的参数重参数化到主分支上