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 在训练和推理是有一定的区别。训练时有三个分支的相加输出,部署时会将分支的参数重参数化到主分支上

YOLOv7来临:论文详读和解析+训练自己数据集

2022年7月,YOLOv7来临,

论文链接:https://arxiv.org/abs/2207.02696

代码链接:https://github.com/WongKinYiu/yolov7

文章摘自https://mp.weixin.qq.com/s/5qK1FIU7qp0Sv3IE49-t_w

在v7论文挂出不到半天的时间,YOLOv3和YOLOv4的官网上均挂上了YOLOv7的链接和说明,由此看来大佬们都比较认可这款检测器。

官方版的YOLOv7相同体量下比YOLOv5精度更高,速度快120%(FPS),比 YOLOX 快180%(FPS),比 Dual-Swin-T 快1200%(FPS),比 ConvNext 快550%(FPS),比 SWIN-L快500%(FPS)。在5FPS到160FPS的范围内,无论是速度或是精度,YOLOv7都超过了目前已知的检测器,并且在GPU V100上进行测试, 精度为56.8% AP的模型可达到30 FPS(batch=1)以上的检测速率,与此同时,这是目前唯一一款在如此高精度下仍能超过30FPS的检测器。另外,YOLOv7所获得的成果不止于此,例如:

  • YOLOv7-e6 (55.9% AP, 56 FPS V100 b=1) by +500% FPS faster than SWIN-L Cascade R-CNN (53.9% AP, 9.2 FPS A100 b=1)
  • YOLOv7-e6 (55.9% AP, 56 FPS V100 b=1) by +550% FPS faster than ConvNeXt-RCNN (55.2% AP, 8.6 FPS A100 b=1)
  • YOLOv7-w6 (54.6% AP, 84 FPS V100 b=1) by +120% FPS faster than YOLOv5-X6-v6.1 (55.0% AP, 38 FPS V100 b=1)
  • YOLOv7-w6 (54.6% AP, 84 FPS V100 b=1) by +1200% FPS faster than Dual-Swin-RCNN (53.6% AP, 6.5 FPS V100 b=1)
  • YOLOv7 (51.2% AP, 161 FPS V100 b=1) by +180% FPS faster than YOLOX-X (51.1% AP, 58 FPS V100 b=1)

本文做出的贡献如下:

  1. 设计了几种可训练的bag-of-freebies,使实时检测器可以在不提高推理成本的情况下大大提高检测精度;
  2. 对于目标检测的发展,作者发现了两个新的问题,即模块重参化如何高效替代原始模块,以及动态标签分配策略如何处理好不同输出层的分配。因此在本文中提出了方法进行解决。
  3. 作者为实时探测器提出了“扩展”和“复合缩放”(extend” and “compound scaling”)方法,可以更加高效地利用参数和计算量,同时,作者提出的方法可以有效地减少实时探测器50%的参数,并且具备更快的推理速度和更高的检测精度。(这个其实和YOLOv5或者Scale YOLOv4的baseline使用不同规格分化成几种模型类似,既可以是width和depth的缩放,也可以是module的缩放)

2.1 实时检测器

目前最先进的实时探测器主要基于YOLO和FCOS,如果需要研发更先进的实时检测器,通常需要具备以下特征:

  • (1)更快和更高效的网络架构;
  • (2)更有效的特征积分方法;
  • (3)更准确的检测方法;
  • (4)更鲁棒的损失函数;
  • (5)更有效的标签分配方法;
  • (6)更有效的训练方式。

2.2 模型重参化

模型重参化策略在推理阶段将多个模块合并为一个计算模块,可以看作是一种集成技术(model ensemble,其实笔者觉得更像是一种基于feature的distillation),可以将其分为模块级集成和模型级集成两类。对于模型级重新参数化有两种常见的操作:

  • 一种是用不同的训练数据训练多个相同的模型,然后对多个训练模型的权重进行平均。
  • 一种是对不同迭代次数下模型权重进行加权平均。

模块重参化是近年来一个比较流行的研究课题。这种方法在训练过程中将一个整体模块分割为多个相同或不同的模块分支,但在推理过程中将多个分支模块集成到一个完全等价的模块中。然而,并不是所有提出的重参化模块都可以完美地应用于不同的架构。考虑到这一点,作者开发了新的重参数化模块,并为各种架构设计了相关的应用程序策略。下图是作者使用重参化实现构建的多个module,按照分组数不同进行排列,为什么作者会选择32的分组数,应该搞过部署的佬们会清楚一些,模块参考:https://github.com/WongKinYiu/yolov7/blob/main/models/common.py~

2.3 模型缩放

模型缩放通过扩大或缩小baseline,使其适用于不同的计算设备。模型缩放方法通常包括不同的缩放因子,如:

  • input size(输入图像大小)
  • depth(层数)
  • width(通道数)
  • stage(特征金字塔数量)

从而在网络的参数量、计算量、推理速度和精度方面实现很好的权衡。网络架构搜索(NAS)也是目前常用的模型缩放方法之一

三、模型设计架构

3.1 高效的聚合网络

在大多数关于设计高效网络的论文中,主要考虑的因素是参数量、计算量和计算密度。但从内存访存的角度出发出发,还可以分析输入/输出信道比、架构的分支数和元素级操作对网络推理速度的影响(shufflenet论文提出)。在执行模型缩放时还需考虑激活函数,即更多地考虑卷积层输出张量中的元素数量。

图2(b)中CSPVoVNet是VoVNet的一个变体。除了考虑上述几个设计问题外,CSPVoVNet的体系结构还分析了梯度路径,使不同层能够学习更多样化的特征。上面描述的梯度分析方法还能使推理速度更快、模型更准确(看下图!其实和Resnext有点像,但比它复杂一些)。

  • 图2(c)中的ELAN出于以下设计考虑——“如何设计一个高效的网络?”得出结论是:通过控制最短最长梯度路径,更深的网络可以有效地进行学习并更好地收敛。
  • 因此,在本文中,作者提出了基于ELAN的扩展版本E-ELAN,其主要架构如图2(d)所示。在大规模ELAN中,无论梯度路径长度和计算模块数量如何,都达到了稳定的状态。但如果更多计算模块被无限地堆叠,这种稳定状态可能会被破坏,参数利用率也会降低。本文提出的E-ELAN采用expand、shuffle、merge cardinality结构,实现在不破坏原始梯度路径的情况下,提高网络的学习能力。

在体系结构方面,E-ELAN只改变了计算模块中的结构,而过渡层的结构则完全不变。作者的策略是利用分组卷积来扩展计算模块的通道和基数,将相同的group parameter和channel multiplier用于计算每一层中的所有模块。然后,将每个模块计算出的特征图根据设置的分组数打乱成G组,最后将它们连接在一起。此时,每一组特征图中的通道数将与原始体系结构中的通道数相同。最后,作者添加了G组特征来merge cardinality。除了维护原始的ELAN设计架构外,E-ELAN还可以指导不同的分组模块来学习更多样化的特性。(难以置信,要是在CPU上运行,分分钟可能爆)

3.2 基于连接的模型的模型缩放

缩放这个就不说了,和YOLOv5、Scale YOLOv4、YOLOX类似。要不就depth and width,要不就module scale,可参考scale yolov4的P4、P5、P5结构。

四、可训练的赠品礼包(bag-of-freebies)

4.1 卷积重参化

尽管RepConv在VGG上取得了优异的性能,但将它直接应用于ResNet和DenseNet或其他网络架构时,它的精度会显着降低。作者使用梯度传播路径来分析不同的重参化模块应该和哪些网络搭配使用。通过分析RepConv与不同架构的组合以及产生的性能,作者发现RepConv中的identity破坏了ResNet中的残差结构和DenseNet中的跨层连接,这为不同的特征图提供了梯度的多样性(题外话,之前在YOLOv5 Lite上做过此类实验,结果也是如此,因此v5Lite-g的模型也是砍掉了identity,但分析不出原因,作者也没给出具体的分析方案,此处蹲坑)。

基于上述原因,作者使用没有identity连接的RepConv结构。图4显示了作者在PlainNet和ResNet中使用的“计划型重参化卷积”的一个示例。

4.2 辅助训练模块

深度监督是一种常用于训练深度网络的技术,其主要概念是在网络的中间层增加额外的辅助头,以及以辅助损失为指导的浅层网络权重。即使对于像ResNet和DenseNet这样收敛效果好的网络结构,深度监督仍然可以显着提高模型在许多任务上的性能(这个和Nanodet Plus相似,按笔者理解可以当成是深层局部网络的ensemble,最后将辅助头和检测头的权重做融合)。图5(a)和(b)分别显示了“没有”和“有”深度监督的目标检测器架构,在本文中,作者将负责最终的输出头称为引导头,将用于辅助训练的头称为辅助头。

接下来讨论标签分配的问题。在过去,在深度网络的训练中,标签分配通常直接指的是ground truth,并根据给定的规则生成hard label(未经过softmax)。然而近年来,以目标检测为例,研究者经常利用网络预测的质量分布来结合ground truth,使用一些计算和优化方法来生成可靠的软标签(soft label)。例如,YOLO使用bounding box预测和ground truth的IoU作为软标签。

在本文中,作者将网络预测结果与ground truth一起考虑后再分配软标签的机制称为“标签分配器”。无论辅助头或引导头,都需要对目标进行深度监督。那么,‘’如何为辅助头和引导头合理分配软标签?”,这是作者需要考虑的问题。目前最常用的方法如图5(c)所示,即将辅助头和引导头分离,然后利用它们各自的预测结果和ground truth执行标签分配。

本文提出的方法是一种新的标签分配方法,通过引导头的预测来引导辅助头以及自身。换句话说,首先使用引导头的prediction作为指导,生成从粗到细的层次标签,分别用于辅助头和引导头的学习,具体可看图5(d)和(e)。

Lead head guided label assigner: 引导头引导“标签分配器”预测结果和ground truth进行计算,并通过优化(在utils/loss.py的SigmoidBin()函数中,传送门:https://github.com/WongKinYiu/yolov7/blob/main/utils/loss.py 生成软标签。这组软标签将作为辅助头和引导头的目标来训练模型。(之前写过一篇博客,【浅谈计算机视觉中的知识蒸馏】]https://zhuanlan.zhihu.com/p/497067556)详细讲过soft label的好处)这样做的目的是使引导头具有较强的学习能力,由此产生的软标签更能代表源数据与目标之间的分布差异和相关性。此外,作者还可以将这种学习看作是一种广义上的余量学习。通过让较浅的辅助头直接学习引导头已经学习到的信息,引导头能更加专注于尚未学习到的残余信息。

Coarse-to-fine lead head guided label assigner: Coarse-to-fine引导头使用到了自身的prediction和ground truth来生成软标签,引导标签进行分配。然而,在这个过程中,作者生成了两组不同的软标签,即粗标签和细标签,其中细标签与引导头在标签分配器上生成的软标签相同,粗标签是通过降低正样本分配的约束,允许更多的网格作为正目标(可以看下FastestDet的label assigner,不单单只把gt中心点所在的网格当成候选目标,还把附近的三个也算进行去,增加正样本候选框的数量)。原因是一个辅助头的学习能力并不需要强大的引导头,为了避免丢失信息,作者将专注于优化样本召回的辅助头。对于引导头的输出,可以从查准率中过滤出高精度值的结果作为最终输出。然而,值得注意的是,如果粗标签的附加权重接近细标签的附加权重,则可能会在最终预测时产生错误的先验结果。

4.3 其他可训练的bag-of-freebies

  1. Batch normalization:目的是在推理阶段将批归一化的均值和方差整合到卷积层的偏差和权重中。
  2. YOLOR中的隐式知识结合卷积特征映射和乘法方式:YOLOR中的隐式知识可以在推理阶段将计算值简化为向量。这个向量可以与前一层或后一层卷积层的偏差和权重相结合。
  3. EMA Model:EMA 是一种在mean teacher中使用的技术,作者使用 EMA 模型作为最终的推理模型。

五、实验

5.1 实验环境

作者为边缘GPU、普通GPU和云GPU设计了三种模型,分别被称为YOLOv7-Tiny、YOLOv7和YOLOv7-W6。同时,还使用基本模型针对不同的服务需求进行缩放,并得到不同大小的模型。对于YOLOv7,可进行颈部缩放(module scale),并使用所提出的复合缩放方法对整个模型的深度和宽度进行缩放(depth and width scale),此方式获得了YOLOv7-X。对于YOLOv7-W6,使用提出的缩放方法得到了YOLOv7-E6和YOLOv7-D6。此外,在YOLOv7-E6使用了提出的E-ELAN,从而完成了YOLOv7-E6E。由于YOLOv7-tincy是一个面向边缘GPU架构的模型,因此它将使用ReLU作为激活函数。作为对于其他模型,使用SiLU作为激活函数。

选择当前先进的检测器YOLOR作为基线。在相同设置下,表1显示了本文提出的YOLOv7模型和其他模型的对比。从结果中可以看出:

  • 与YOLOv4相比,YOLOv7的参数减少了75%,计算量减少了36%,AP提高了1.5%。
  • 与最先进的YOLOR-CSP相比,YOLOv7的参数少了43% ,计算量少了15%,AP高了0.4%。
  • 在小模型的性能中,与YOLOv4-tiny相比,YOLOv7-Tiny减少了39%的参数量和49%的计算量,但保持相同的AP。
  • 在云GPU模型上,YOLOv7模型仍然具有更高的AP,同时减少了19%的参数量和33%的计算量。

5.3 与sota算法的比较

本文将所提出的方法与通用GPU上或边缘GPU上最先进的的目标检测器进行了比较

  • 比较YOLOv7-Tiny-SiLU和YOLOv5-N(v6.1),YOLOv7-Tiny-SiLU在速度上快127帧,准确率提高10.7%。
  • YOLOv7在帧率为161帧时有51.4%的AP,而相同AP的PP-YOLOE-L只有78帧,且参数l少41%。
  • YOLOv7-X在114FPS时,比YOLOv5-L(v6.1)99FPS的推理速度更快,同时可以提高3.9%的AP。
  • YOLOv7-X与YOLOv5-X(v6.1)相比,YOLOv7-X的推理速度要快31fps。此外,在参数量和计算量方面,YOLOv7-X比YOLOv5-X(v6.1)减少了22%的参数和8%的计算量,但AP提高了2.2%。
  • 使用输入分辨率1280,YOLOv7与YOLOR进行比较,YOLOv7-W6的推理速度比YOLOR-P6快8FPS,检测率也提高了1%的AP。
  • 至于YOLOv7-E6和YOLOv5-X6(v6.1)比较时,前者的AP增益比后者高0.9%,但参数减少45%,计算量减少63%,推理速度提高了47%。
  • YOLOv7-D6的推理速度与YOLOR-E6接近,但AP提高了0.8%。
  • YOLOv7-E6E的推理速度与YOLOR-D6接近,但AP提高了0.3%。

六、结论

本文提出了一种新的实时检测器。在研究过程中,本文发现了重参化模块的替换问题和动态标签的分配问题。为了解决这一问题,提出了一种可训练的bag-of-freebies策略来提高目标检测的精度。基于此,本文开发的YOLOv7系列目标检测模型获得了最先进的结果。

训练自己数据:

数据集准备:准备coco类型数据 ,新建MyDataCoco.yaml

# COCO 2017 dataset http://cocodataset.org

# download command/URL (optional)
# download: bash ./scripts/get_coco.sh

# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train:yolov7/data/train.txt  # 118287 images
val:yolov7/data/val.txt  # 5000 images
test:yolov7/data/test.txt  # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794

# number of classes
nc: 10

# class names
names: ['lighthouse',
'sailboat',
'buoy',
'railbar',
'cargoship',
'navalvessels',
'passengership',
'dock',
'submarine',
'fishingboat' ]

 results: