当前位置: 首页 > news >正文

w~视觉~合集10

我自己的原文哦~ https://blog.51cto.com/whaosoft/12369520

# 基于Transformer的图像重建模型MST++的TRT模型推断优化

主要采用2条主线优化该网络,​​TensorRT ONNXParser​​​和​​TensorRT API​​两种方式。基于对ONNXParser用Nsight进行Profiling,并最终确定了有针对性的优化方案,包括:

  • 网络中存在大量的​​Transpose+Reshape​​操作较为耗时
  • 卷积,分组卷积和转置卷积
  • Self-Attention 冗余结构耗时

针对于上述问题我们简化网络结构通过TensorRT API重新搭建了网络结构,实现了​​L2Norm​​​,​​Self-Attention​​​,​​LayerNorm​​​,​​卷积,分组卷积,反卷积​​​和MST++的​​S_MSA​​核心结构.

  • L2Norm结构的耗时
  • LayerNorm结构耗时
  • Gelu结构耗时

针对于上述结构我们开发了一些Plugin同时借鉴已有的Plugin在TensorRT API通过合并算子引入​​Normalization Plugin​​​,​​LayerNorm plugin​​​和​​Gelu Plugin​​.

整体的优化过程如下图所示: 

我们分别对比了该模型在Pytorch(原训练框架),onnxruntime, TensorRT ONNXParser, TensorRT API的延迟,吞吐量和加速比以及衡量精度的绝对误差和相对误差的均值,最大值和中位数(将在下面给出详细说明) 最终:

  • 在延迟,吞吐量,加速比,吞吐比上基于TensorRT API和Plugin的方式在FP32和FP16上整体优于其他方式;
  • ONNXParser FP32模式下加速比维持在1.47-2.55,在FP16模式下加速比维持在2.49-2.67;
  • TensorRT API FP32模式下加速比维持在1.61-1.79,在FP16模式下加速比维持在2.36-2.99;
  • onnxruntime对此模型没有加速效果;
  • 在绝对和相对误差上,TensorRT API中因大维度的ReduceSum和Plugin的误差问题精度整体略低于ONNXParser方式;
  • FP32模式下的绝对误差:ONNXParser可控制在 10−6,TensorRT API控制在10−5;
  • FP16模式下的绝对误差:ONNXParser可控制在10−3,TensorRT API控制在10−2;
  • 相对误差有类似的结果;
  • 此外我们完成了INT8量化并分析了其速度和精度。

原始模型

模型简介

优化的模型来源于:MST++: Multi-stage Spectral-wise Transformer for Efficient Spectral Reconstruction. 它是RGB-to-HSI的图像重建方法。高光谱图像(HSI)指的是光谱分辨率在10−2λ数量级范围内的光谱图象。相交于RGB图像而言,高光谱有更多的波段(即通道数更多)来更加准确全面的描述被捕获的场景的特性。很多时候,从RGB图像无法观测到异常,但是从高光谱图像的某一个波段中确能一眼看出问题所在,举个例子,比如在深夜使用红外光谱,就可以清晰的看到发热的活物,正因如此,HSI被广泛的应用于目标检测和跟踪,图像识别,遥感,医疗影像等领域。而传统的技术采集HSI图像需要特定的设备,而这些设备又比较昂贵。因此MST++这种可以直接从RGB重建HSI图像的技术有非常大的应用场景。

✒️ 为什么选择MST++作为TensorRT的优化模型?

  • MST 被 CVPR 2022 接收,其改进版 MST++ 被 CVPRW 2022 接收,并且在 NTIRE 2022 Spectral Reconstruction Challlenge 中取得第一名。 两个模型是首个基于Transformer的高光谱图像重建方法。
  • 网络结构方面:MST和MST++基本结构单元均依赖于self-Attention,其在K, Q,V矩阵的计算上有些许的不同,网络结构上每个block采用了类似于U-Net的U型结构。其基于Self-Attention的MSAB结构和SAB结构是TensorRT性能优化的重点。
  • 网络性能方面:在原训练框架的精度和性能上,MST和MST++表现SOTA,在图像重建领域是最应该被考虑的可以作为实际应用的方案。两个网络更应该需要有成熟的TensorRT解决方案。
  • 网络是最新的Transformer在图像重建领域的应用,暂无开源TensorRT模型加速的优化方案。

首先介绍MST

MST是一个对称的U型网络

其基本组成单元为Mask-guided Self-Attention Block(MSAB), MSAB中最重要的结构是Mask-guided Spectral-wize Multi-head Self-Attention(MS-MSA)

如上图:MSAB包含2个Layer Norm(LN) ,1个MS-MSA和1个前向神经网络FFN!!!

如上图:最重要的MS-MSA结构可以拆解为2个部分,即Mask-guided Mechanism(MM)个Spectral-wize Multi-head Self-Attention(S-MSA)

S-MSA: 通常来说,之前的Transformer将一个 pixel vector 作为一个token。然而,高光谱具有空间稀疏而通道上高度相似的特性,因此,计算空间维度的 self-attention 会比计算光谱通道维度的 self-attention 更加低效。基于这样一个motivation,S-MSA 将每一个光谱通道的特征图作为一个 token 去计算 self-attention。

MM: 为了获得保真度随空间位置变化的信息,将 mask 作为输入生成 Mask Attention Map,然后作用在 S-MSA 的 value 上。

最终:通过改变 MST 中各层 block 的数量 (N1, N2, N3)来得到一簇 MST family,他们是 MST-S (2, 2, 2), MST-M (2, 4, 4), MST-L (4, 7, 5).

2.1.2 其次介绍MST++

MST++是MST的后续工作,其全称为Multi-stage Spectral-wize Transformer,顾名思义就是将MST中的MM去掉,然后改成首尾串联的多阶段网络,输入变成了RGB图像,输出还是HSI.

  • MST++由N个SST级联得到
  • SST中由原来MST中的MSAB替换为SAB,SAB中将原来的MS-MSA替换为了S-MSA
  • MST++input是一个RGB的图像,output是HSI

综上两个网络结构的介绍,MST和MST++基本结构单元均依赖于self-Attention,其在K,Q,V矩阵的计算上有些许的不同,网络结构上每个block采用了类似于U-Net的U型结构。

上图可以发现,MST,MST++在精度和性能上的均衡上表现SOTA,在图像重建领域是最应该被考虑的可以作为实际应用的方案。

模型优化难点

该模型的优化难点如下:

  • 模型在导出ONNX过程中比较顺利,但是如果使用ONNXParser的方式优化模型,需要对模型做simplifier,否则无法进行正常序列化。
  • 针对于ONNXParser加速比低的原因,模型结构中存在一些比较耗时的OP可以通过Plugin和TensorRT API的方式进一步优化网络。
  • FP16模式下精度相关的问题
  • INT8量化相关的精度和速度等问题。

优化过程

整体的优化方案可以参考第一部分给出的优化的流程图,我们主要基于TensorRT ONNXParser和TensorRT API两种方案进行优化,下面我们将详细介绍具体的优化细节。

FP32,FP16下的具体优化细节

首先基于MST++的模型结构和ONNX模型的可视化结构我们发现,整体的模型是由​​S_MSA block​​​按照类似于UNet的方式堆叠而成,整个网络包含15个​​S_MSA block​​​,关于​​S_MSA block​​其结构如下图所示:

​S_MSA​​​是由上图中的三个部分按照节点拼接而成。上述结构中不难发现其主要包含如下重要的结构: ​​L2Norm​​​, ​​Self-Attention​​​, ​​Gelu​​​,​​LayerNorm​​等,下面我们通过Nsight进行Profiling,并进行针对性的优化。

我们发现网络中的​​L2Norm​​​,​​Self-Attention​​​,​​Gelu​​​,​​LayerNorm​​​这些结构的耗时,并发现网络中存在大量的​​Transpose+Reshape​​结构和基于卷积,分组卷积和转置卷积的操作。为了解决这些优化问题我们给出的解决方案是通过TensorRT API的方式搭建网络进行TensorRT的优化同时使用Plugin融合部分算子进行进一步的优化,其优化的细节如下:

◾ L2Norm

每个​​S_MSA block​​​包含2个​​L2Norm​​​结构,整个网络共30个​​L2Norm​​​结构出现,基于ONNXParser,在Nsight下发现​​L2Norm​​的耗时情况如下图所示:

其在一个block中的一个​​L2Norm​​​的耗时为 26.164μs,而经过我们TensorRT API和Plugin的优化方案后,相同位置的​​L2Norm​​结构的Nsight如下:

优化后的同位置的​​L2Norm​​​ Profiling的耗时为:20.551μs,缩短了 5.613μs. 综上针对​​L2Norm​​的优化方案为:开发了L2Norm Plugin同时用TensorRT API实现了L2Norm,对比发现TensorRT API方式更快,最终选择TensorRT API方式。过程中我们还发现了TensorRT 官方Plugin中的Normalize Plugin的Bug,关于该Bug可以参考第五部分。

◾ Self-Attention

每个block中包含一个​​Self-Attention​​​结构,整个网络包含15个​​Self-Attention​​​结构。基于ONNXParser,在Nsight下发现​​Self-Attention​​的耗时情况如下图所示:

其在一个block中的一个​​Self-Attention​​​的耗时为 85.550μs,而经过我们TensorRT API和Plugin的优化方案后,相同位置的​​Self-Attention​​结构的Nsight如下:

优化后的同位置的​​Self-Attention​​​ Profiling的耗时为:62.127μs,缩短了 23.423μs. 综上针对​​Self-Attention​​​的优化方案为:使用TensorRT API 重新实现了​​Self-Attention​​,删除替换了不必要的操作,过程中融合了部分算子。由于时间关系我们并未针对于Self Attention进行Plugin的开发,会在未来进行(参考第六部分)。

◾ Gelu

每个block中包含三个​​Gelu​​​激活结构,整个网络包含45个​​Gelu​​​结构。基于ONNXParser,在Nsight下发现​​Gelu​​的耗时情况如下图所示:

发现在ONNXParser中​​Gelu​​​结构被合并为1个kernel进行优化,其在一个block中的一个​​Gelu​​​的耗时为 4.531μs,而经过我们TensorRT API和Plugin的优化方案后,相同位置的​​Gelu​​结构的Nsight如下:

优化后的同位置的​​Gelu​​​ Profiling的耗时为:4.048μs,缩短了 0.483μs. 综上针对​​Gelu​​​的优化方案为:使用Gelu Plugin替换了网络中的​​Gelu​​结构,通过TensorRT API的方式进行优化。该Plugin来源于TensorRT官方Plugin库。

◾ LayerNorm

每个block中包含一个​​LayerNorm​​​结构,整个网络包含15个​​LayerNorm​​​结构。基于ONNXParser,在Nsight下发现​​LayerNorm​​的耗时情况如下图所示:

其在一个block中的一个​​LayerNorm​​​的耗时为 31.854μs,而经过我们TensorRT API和Plugin的优化方案后,相同位置的​​LayerNorm​​结构的Nsight如下:

优化后的同位置的​​LayerNorm​​​ Profiling的耗时为:11.014μs,缩短了 20.84μs. 综上针对​​LayerNorm​​​的优化方案为:开发了LayerNorm Plugin替换了网络中的​​LayerNorm​​结构,通过TensorRT API的方式进行优化。

◾ 其他

除此之外我们发现网络结构中存在大量的​​Transpose+Reshape​​结构,这些结构是可以通过TensorRT API在设计网络的时候被合并的

其在ONNXParser中的profiling的耗时情况:

在使用TensorRT API搭建网络时可以一定程度的减少这些结构的出现,起到进一步的加速效果。

另外,MST++网络中在每个​​S_MSA block​​​和​​Gelu​​激活间使用了卷积,分组卷积和反卷积,而TensorRT API的实现方式相比于ONNXParser可能更高效(该观点我们在瞎说没有验证)。

综上所述,FP32和FP16下我们通过2种方式:TensorRT ONNXParser和TensorRT API, 并配合开发的TRT Plugin,对MST++模型进行一步一步的性能优化,并取得了一定的性能优化成果。关于INT8量的细节和性能优化指标的展示我们将在下文展示。

INT8量化的细节

我们实现了TensorRT ONNXParser和TensorRT API两种方式的PTQ INT8量化,对于TensorRT API, INT8量化可执行如下操作:

# 以batch_size=1为例 python3 mst_trt_api.py --batch_size=1 --mode=INT8 --calibration_table_path=./model/mst_calibration_b1.cache --plan_path=./model/mst_plus_plus_b1_int8.plan --weight_path=./model/mst_plus_plus_weights_b1.npz

执行该操作,TensorRT会创建calibration table,序列化engine,但过程中会如下错误:

通过屏蔽代码的方式,如上图所示,我们最终定位到是由于​​s_msa​​​ block中的第一个分组卷积导致的一个​​ [TRT] [E] 1: Unexpected exception​​错误。我们线下尝试了两种解决方案:

  • 通过混合精度的方式强制将该层的精度设置​​FP32​
  • 注意到分组卷积使用的​​tactic​​​为​​CuDNN​​​,强行设置​​TacticSource​

发现上述两种方式均未解决该错误。由于该错误的报错信息较少,目前我们仅定位到出现该问题的层,但是没有找到解决方案,也不确定是否为INT8量化在TensorRT API中的Bug。

最终我们仅成功运行了TensorRT ONNXParser方式的INT8量化,该方式的INT8量化可以通过如下方式实现:

# 以batch_size=1为例
python3 mst_onnxparser.py --batch_size=1 --mode=INT8 --calibration_table_path=./model/mst_calibration_onnxparser_b1.cache  --onnx_path=./model/mst_plus_plus_b1.onnx --plan_path=./model/mst_plus_plus_onnxparser_b1_int8.plan

关于INT8量化的benchmark和精度的测试,我们在下一节中进行了介绍。

精度与加速效果

⚠️ 本节测试环境和第一部分总述中的项目所需环境保持一致。

性能测试

本项目对比了MST++在PyTorch, onnxruntime, TensorRT ONNXParser和TensorRT API这4种方式下的FP32和FP16模式下的延迟(Latency),吞吐量(Throughput),加速比(Latency Speedup), 吞吐比(Throughput Speedup)的差异,其对比结果如下表所示。这里需要注意的是下表提供的对比数据是保证了在各框架input数据的一致性的情况下的随机生成的数据(这一点和精度测试是不同的,精度测试使用了真实的测试数据),统计数据仅包含模型推断部分而不包含模型的前后处理部分,每一个统计数据的模拟次数是1050次,其中前50次推断不作为统计数据计入。

从上表可知,标红数据为相同模型精度下加速比的最大值出现位置,以原训练框架PyTorch为基准,onnxruntime-gpu整体没有加速效果,TensorRT ONNXParser FP32模式下加速比可以维持在 1.47−1.76, 整体在FP32模式下,TensorRT API的方式加速比可以维持在 1.61−1.79为FP32最优的方案。Throughput Speedup指标有相似的对比结果。

FP16模式下,在​​batch size=1​​的情况下,TensorRT ONNXParser的加速效果最好,其加速比为2.55,而TensorRT API为2.36;但其他batch size下,TensorRT API方式的加速效果均要优于TensorRT ONNXParser方式,FP16模式下整体TensorRT API的加速效优于TensorRT ONNXParser。Throughput Speedup指标有相似的对比结果。

除此之外,我们绘制了Latency和Throughput的关系折线图,如上图所示,我们可以直观的看到不同框架的加速情况,并可以根据该图在不同batch size下选择不同的加速方式实现。比如FP16下,如果推断的batch size为1,则我们建议使用ONNXParser的加速方式,FP32和其他batch size设定下的FP16模式,我们建议使用TensorRT API方式做模型加速。

精度测试

关于精度测试的验证采取的方式是绝对误差和相对误差的均值,中位数和最大值,因该任务是图像重建类型的的模型, 我们采用预测结果图像的子图(这里的方式和MST++测试代码,NTIRE 2022 Spectral Reconstruction Challlenge的比赛评估保持一致),为了消除异常值的影像并去掉了最大值和最小值,然后再去统计对应的绝对误差和相对误差的均值,中位数和最大值。

项目基于1000张真实的测试集测试数据,测试了onnxruntime,TensorRT ONNXParser和TensorRT API的推断的精度,最终的测试结果如下图所示。

上图展示了几种推断框架的绝对误差的均值,最大值和中位数的分布情况,我们发现FP32模式下,onnxruntime和TensorRT ONNXparser的绝对误差基本在 10−6,而TensorRT API的绝对误差基本维持在 10−5,精度相比于ONNXParser稍低(我们将在本节最后给出具体原因)。FP16模式下有相似的结果,TensorRT ONNXparser绝对误差维持在 10−3,而TensorRT API的绝对误差维持在 10−2,精度稍低(我们将在本节最后给出具体原因)。

对于相对误差的计算结果,如下图所示:

上图展示了几种推断框架的相对误差的均值,最大值和中位数的分布情况,我们发现FP32模式下,onnxruntime和TensorRT ONNXparser的相对误差基本在 10−5,而TensorRT API的相对误差基本维持在 10−4,精度相比于ONNXParser稍低(我们将在本节最后给出具体原因)。FP16模式下有相似的结果,TensorRT ONNXparser相对误差维持在 10−2,而TensorRT API的相对误差维持在 10−1,精度稍低(我们将在本节最后给出具体原因)。

综上我们计算对比了不同框架下的绝对误差和相对误差的均值,中位数和最大值,并发现TensorRT API的方式在相对误差和绝度误差的精度上均比ONNXparser的方式稍低。我们依此分析了产生该结果的原因,我们通过TensorRT的工具​​onnx graphsurgeon​​获取了MST++的子图(该过程代码仓库未体现),基于该子图进行TensorRT ONNXParser和TensorRT API方式的搭建,我们找到了产生该结果的原因。之所以TensorRT API整体误差稍大,我们在代码层面上找到了具体原因,其原因如下:

  • TensorRT API实现的大维度的​​ReduceSum​​​和ONNXParser是不同的,我们在对比结果的时候发现有偏差, TensorRT API的方式精度稍低,其具体代码位置在​​mst_trt_api.py​​中
#=============mst_trt_api.py: 66-93行==========================
def torch_normalize(network,inputs,weights=None,name="L2Norm"):'''inputs : input list, 1 elementweights: weights list, 0 elemnt'''pow_shape = inputs[0].shapepow_data = np.ones(pow_shape,dtype=np.float32)*2pow_val = network.add_constant(pow_shape, pow_data)pow2_0 = network.add_elementwise(input1 = inputs[0],input2=pow_val.get_output(0),op=trt.ElementWiseOperation.POW)pow2_0.name = f"{name}_pow2"# >>>-----------------------reduce_sum---------------------------------------# 对于s_msa第一个bloack来说,相当于249856个数值相加# 此时的add_recude输出的output在某些维度上的某些值上与ONNXParser误差较大reduce_l2_0 = network.add_reduce(input=pow2_0.get_output(0),op=trt.ReduceOperation.SUM,axes=1<<3, keep_dims=1)  # 第4个维度规约?reduce_l2_0.name = f"{name}_ReduceL2"

  • TensorRT API中使用了Gelu plugin, 该plugin与ONNXParser输出结果有一定的误差
  • TensorRT API中使用了LayerNorm plugin,该plugin与ONNXParser输出结果有一定的误差

上述3个原因累积导致TensorRT API方式的整体的相对误差和绝对误差要比ONNXParser的方式稍大。

关于INT8量化的精度和加速效果

这里仅进行了TensorRT ONNXParser的INT8量化的精度和加速效果的计算,和FP32,FP16的参数设置保持一致,延迟相关的测试采用随机生成数据,且模拟次数是1050次其中前50次不作为统计数据; 精度相关的计算采用真实的1000张测试图像,其中性能测试如下表所示:

精度测试如下图所示:

通过TensorRT的分析工具​​polygraphy​​​ debug INT8量化相关层的精度问题,我们首先定位模型的第一个​​s_msa block​​的的输出:

经过​​polygraphy​​:

polygraphy run /target/MST-plus-plus-TensorRT/model/mst_plus_plus_b1.onnx --onnxrt --trt --workspace 1000000000 --save-engine=/target/MST-plus-plus-TensorRT/model/mst_plus_plus_onnxparser_b1_int8.plan --atol 1e-3 --rtol 1e-3  --int8 --verbose --onnx-outputs onnx::Transpose_551 --trt-outputs onnx::Transpose_551 --input-shapes 'input:[1,3,512,482]' --calibration-cache /target/MST-plus-plus-TensorRT/model/mst_calibration_onnxparser_b1.cache >> int8_layer.txt

ONNX和TensorRT的输出为:

该层的绝对和相对误差为:

此时的平均相对误差和绝对误差已经比较大,经过15次的累积之后,其精度差异就比较大。

综上,我们针对于MST++模型分别在不同模型精度下对onnxruntime, ONNXParser, TensorRT API进行了速度和精度分析,并细致分析了产生精度差异的原因。

Bug报告

🐛 BUG名称

issue

是否被官方确认

说明

SkipLayerNorm Plugin

​​NVIDIA/TensorRT#1919​​

官方暂未修复

Normalize Plugin

​​NVIDIA/TensorRT#2020​​

官方暂未修复

未来工作

基于TensorRT API和Plugin我们已经对MST++模型做了一定的优化,并提供了基于ONNXParser和TensorRT API的两条优化路径和基于PTQ的INT8量化,由于时间关系,未来希望持续进一步的优化,未来工作:

  •  目前我们实现的TensorRT API的方式暂不支持Dynamic shape,针对于目前实现可以容易修改为Dynamic shape,将在未来实现。
  •  Gelu Plugin和LayerNorm Plugin的精度问题以及大维度(求和维度为249856维)的ReduceSum的精度问题导致目前的TensorRT API方式精度略低于ONNXParser方式,未来将进一步优化。
  •  因Normalize Plugin参考了官方Plugin,目前还存在问题,将来会修复。
  •  TensorRT API的INT8还存在问题以及ONNXParser的INT8的精度问题将会通过混合精度的方式进一步的优化

参考文献

# MST
@inproceedings{mst,title={Mask-guided Spectral-wise Transformer for Efficient Hyperspectral Image Reconstruction},author={Yuanhao Cai and Jing Lin and Xiaowan Hu and Haoqian Wang and Xin Yuan and Yulun Zhang and Radu Timofte and Luc Van Gool},booktitle={Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR)},year={2022}
}# MST++
@inproceedings{mst_pp,title={MST++: Multi-stage Spectral-wise Transformer for Efficient Spectral Reconstruction},author={Yuanhao Cai and Jing Lin and Zudi Lin and Haoqian Wang and Yulun Zhang and Hanspeter Pfister and Radu Timofte and Luc Van Gool},booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR) Workshops},year={2022}
}# MST Github
https://github.com/caiyuanhao1998/MST/# MST++ Github
https://github.com/caiyuanhao1998/MST-plus-plus# TensorRT Github
https://github.com/NVIDIA/TensorRT# TensorRT API
https://docs.nvidia.com/deeplearning/tensorrt/api/index.html
https://docs.nvidia.com/deeplearning/tensorrt/api/python_api/index.html# TensorRT Cookbook_CN
https://github.com/NVIDIA/trt-samples-for-hackathon-cn
https://github.com/TRT2022/trt-samples-for-hackathon-cn/tree/master/cookbook# 本项目涉及到的模型相关的百度云盘下载地址
链接:https://pan.baidu.com/s/1aYQjWd2WK7_Bix7TVrA6VA?pwd=1234  提取码:1234

 延庆川北小区45孙老师 东屯 收卖废品垃圾破烂炒股 废品孙

来来来 还是基于nvidia大干一场哦 广大车企还是认nvidia哦~

这是  MST++ TensorRT模型加速优化 ,

MST++: Multi-stage Spectral-wise Transformer for Efficient Spectral Reconstruction for TensorRT Hackathon 2022

# Agent Attention

清华黄高团队提出Agent Attention:无缝集成Softmax和Linear的注意力机制

本文介绍了一种新型的注意力机制Agent Attention,它结合了Softmax Attention和Linear Attention的优点。Agent Attention通过引入Agent token来平衡Query token与Key-value对之间的关系,提高了Transformer模型的效率和性能。 

有趣的是,本文展示了 Agent attention 等效于 Linear attention 的广义形式。因此,代理注意力无缝集成了强大的 Softmax attention 和高效的 Linear attention。

作者通过大量实验表明,Agent attention 在各种视觉任务中证明了有效性,包括图像分类、目标检测、语义分割和图像生成。而且,代理注意力在高分辨率场景中表现出显着的性能,这得益于其线性注意力性质。例如,当应用于 Stable Diffusion 时,Agent attention 会加速生成并显着提高图像生成质量,且无需任何额外的训练。

图1:Softmax Attention,Linear Attention 以及 Agent Attention

1 Agent Attention:集成 Softmax 和 Linear 注意力机制

论文名称:Agent Attention: On the Integration of Softmax and Linear Attention (Arxiv 2023.12)

论文地址:​​https://arxiv.org/pdf/2312.08874​​

代码链接:​​https://github.com/LeapLabTHU/Agent-Attention​​

1.1 Agent Attention 集成 Softmax Attention 和 Linear Attention 的优势

将 Transformer 和 Self attention 引入视觉领域会带来巨大的挑战。现代 Transformer 模型通常采用 Softmax attention,计算每个 Query 和 Key 之间的相似度,导致计算复杂度随 token 数量呈二次方关系。为了解决这个问题,现有的工作通过设计高效的注意力机制来降低计算复杂度。比如,Swin Transformer[1]减少了感受野,将 Self-Attention 的计算限制在局部窗口上。PVT[2]采用稀疏 Attention,通过减少 Key 和 Value 的数量来减轻计算负担。尽管这些方法很有效,但它们不可避免地损害了对远程关系进行建模的能力,并且仍然不如全局 Self-Attention。

由于全局 Self-Attention 的内在冗余,Agent token 的数量可以设计为远小于 Query token 的数量。作者发现简单地汇集原始 Query token 来当做 Agent token 的效果就非常好。这个做法可以将 Softmax Attention 的二次复杂度降低到线性复杂度,同时保留了全局上下文建模能力。有趣的是,如图 1 所示,Agent Attention 可以看作是广义的线性注意力。换句话说,Agent Attention 集成了 Softmax 和线性注意力,并享受二者的优势。

1.2 Softmax Attention 和 Linear Attention 计算范式

1.3 Agent Transformer

Softmax 和 Linear 注意力要么计算复杂度过高,要么模型表达能力不足。以前的研究通常将这两种注意力范式视为不同的方法,并尝试降低 Softmax Attention 的计算成本或提高 Linear Attention 的性能。Agent Attention 集成了 Softmax Attention 和 Linear Attention,同时享受线性复杂度和高表现力的好处。

首先将 Softmax 和 Linear Attention 缩写为:

多样性恢复模块

尽管 Agent Attention 受益于低计算复杂度和高模型表达能力,但它也受到特征多样性不足的影响。作为补救措施,作者遵循[5]的做法并采用深度卷积 (DWC) 模块来保留特征多样性。

在这些设计的基础上,作者提出了一种新的 Agent Attention 模块,其可以表述为:

Agent Attention 模块的优势

1) 高效计算和强表达能力: 之前的工作通常将 Softmax Attention 和 Linear Attention 视为两种不同的注意力范式,旨在解决它们各自的局限性。作为这两种注意力形式的无缝集成,Agent Attention 继承了两者的优点,同时具有较低的计算复杂度和高模型表达能力。

2) 大感受野: Agent Attention 可以在保持相同数量的计算量的同时采用较大的感受野。得益于线性复杂度,Agent Attention 可以在保持线性计算量的同时享受大甚至全局感受野的优势。

1.4 感知任务实验结果

ImageNet-1K 实验结果

如图3所示,在各种模型中将 Softmax Attention 替换为 Agent Attention 可以显着提高性能。例如,Agent-PVT-S 在仅使用 30% 的参数和 40% 的 FLOPs 时超过了 PVT-L。Agent-Swin-T/S 在保持相似 FLOPs 的同时比 SwinT/S 高出 1.3% 和 0.7%。这些结果明确证明 Agent Attention 方法具有优势,且能够适应不同的架构。

图3:ImageNet-1K 实验结果

作者通过在各种设备上部署模型来进一步进行实际速度测量。图4说明了本文模型在 CPU 上实现了 1.7 到 2.1 倍的推理速度,同时提高了性能。在 RTX3090 GPU 和 A100 GPU 上,本文模型也实现了 1.4 倍到 1.7 倍的推理速度。

图4:ImageNet 上的 Accuracy-Runtime 曲线。运行时使用图像分辨率 224×224 进行测试

COCO 目标检测实验结果

作者将本文模型应用于 RetinaNet、Mask R-CNN 和 Cascade Mask R-CNN 框架来评估本文方法的性能。使用具有不同检测头的 1x 和 3x schedules 进行了一系列实验。如图5所示,本文模型在所有配置中都表现出一致的增强。Agent-PVT 优于 PVT 模型,box AP 从 +3.9 增加到 +4.7,而 Agent-Swin 超过 Swin 模型高达 +1.5 box AP。这些实质性的改进可以归因于大感受野,证明了 Agent Attention 在高分辨率场景的有效性。

图5:COCO 目标检测实验结果

ADE20K 语义分割实验结果

作者将本文模型应用于2个分割模型,SemanticFPN 和 UperNet。结果如图6所示。值得注意的是,Agent-PVT-T 和 Agent-Swin-T 比 PVT-T 和 Swin-T 高 +3.61 和 +2.17 的 mIoU。结果表明本文模型与各种分割 Backbone 兼容,并且都实现了改进。

图6:ADE20K 语义分割实验结果

1.5 生成任务实验结果

扩散模型的出现使得生成高分辨率和高质量的图像成为可能。然而,当前的扩散模型主要使用具有全局感受野的 Softmax Attention,导致计算成本大,且生成速度慢。作者将 Agent Attention 应用于 Stable Diffusion[6],希望提高模型的生成速度。经过简单的调整,使用 Agent Attention (称为 AgentSD) 的 Stable Diffusion 的生成速度展示出显着改进,并且在没有任何额外训练的情况下产生了更好的图像质量。

作者实际上将 Agent Attention 应用于 ToMeSD 模型[7]。ToMeSD 在 Stable Diffusion 的注意力计算之前减少了 token 的数量,提高了生成速度。尽管如此,合并后的 token 数量仍然很大,导致持续的复杂度和延迟。因此,作者将 ToMeSD 模型中的 Softmax Attention 替换为 Agent Attention,以进一步提高速度。作者通过实验发现,通过 token merging[8]生成 Agent token 时,Agent Attention 可以直接应用于 Stable Diffusion 和 ToMeSD 模型,而不需要任何额外的训练。除此之外,作者通过在早期扩散生成步骤中应用 Agent Attention 并保持后面的步骤不变来获得显着提升。

作者定量比较了 AgentSD 与 Stable Diffusion 和 ToMeSD。如图7所示,ToMeSD 在保持相似图像质量的同时加速了 Stable Diffusion。AgentSD 不仅进一步加速了 ToMeSD,而且显著提高了图像生成质量。具体而言,在保持卓越的图像生成质量的同时,与 Stable Diffusion 和 ToMeSD 相比,AgentSD 的生成速度提高了 1.84 倍和 1.69 倍。在等效的生成速度下,与 ToMeSD 相比,AgentSD 生成 FID 分数低 0.9。

图7:Stable Diffusion, ToMeSD 和 AgentSD 的定量结果

作者在图8中展示了一些可视化结果。与 Stable Diffusion 和 ToMeSD 相比,AgentSD 显著地减少了歧义和生成错误。例如,在第1列中,Stable Diffusion 和 ToMeSD 产生一条腿和两个尾巴的鸟类,而 AgentSD 的样本没有表现出这个问题。在第3列中,当提供 "A high quality photo of a mitten" 的 prompt 时,Stable Diffusion 和 ToMeSD 错误地生成猫,而 AgentSD 产生了正确的图像。

图8:由 Stable Diffusion、ToMeSD (r = 40%) 和 AgentSD (r = 40%) 生成的样本

用于微调的 AgentSD

作者将代理注意力应用于基于 SD 的 Dreambooth[9],以验证其在微调下的性能。当微调时,Agent Attention 可以集成到所有扩散生成步骤中,与原始 Dreambooth 相比,生成速度提高了 2.2 倍。

1.6 大感受野和高分辨率

现代视觉 Transformer 通常将 Self-Attention 的计算限制在局部窗口上,以降低计算复杂度,比如 Swin。如下图9所示,作者逐渐扩展 Swin 的窗口大小从 7^27^2 到 56^256^2 。显然,随着感受野的扩展,模型的性能不断提高。这表明,虽然窗口注意力范式是有效的,但它不可避免地损害了 Self-Attention 的远程建模能力,仍然不如全局注意力机制。由于 Agent Attention 的线性复杂度,可以从全局感受野中受益,同时仍然保持相同的计算复杂度。

图9:基于 Agent-Swin-T 的窗口大小消融实验结果

受 Softmax attention 的二次复杂度的限制,当前的视觉 Transformer 通常通过增加模型深度和宽度来扩大。作者也尝试了 EfficientNet 中提出的提升输入分辨率的方法,结果如图10所示。

图10:通过增加分辨率来缩放模型

与 DeiT-B 相比,Agent-DeiT-B 实现了 0.2 的精度增益,而 448^2448^2 分辨率下的 Agent-DeiT-S 仅用四分之一的参数达到了 83.1% 的精度。作者在缩放 Agent-PVT-M 和 Agent-Swin-S 时观察到了类似的趋势,在图11中,作者逐渐增加 Agent-Swin-S、Swin-S 和 Swin-B 的分辨率。在高分辨率场景中,本文模型性能始终比较优越。

图11:增加分辨率到 256×256, 288×288, 320×320, 352×352, 384×384 的结果

1.7 与其他线性注意力机制的对比

作者使用 DeiT-T 和 Swin-T 将本文的 Agent Attention 与其他 Linear Attention 方法进行比较。如图12所示,各种 Linear Attention 方法替换 DeiT-T 和 Swin-T 所采用的 Softmax Attention 通常会导致显著的性能下降。值得注意的是,本文模型优于其他方法以及 Softmax 基线模型。

图12:不同线性注意设计的比较

Agent token 数量的消融实验结果

模型的计算复杂度可以通过改变 Agent token 的数量来加以调节。如图13所示,可以观察到减少浅层中的 agent token 数量对性能没有不利的影响。但是,在更深层中减少 agent token 的数量导致性能下降。

图13:Agent token 数量的消融实验结果

# 谷歌全面转向JAX

哪个也没学完 永远技术都更新这么快 谷歌放弃TensorFlow? 
TensorFlow 大概已经成为了谷歌的一枚「弃子」。 
015 年,谷歌大脑开放了一个名为「TensorFlow」的研究项目,这款产品迅速流行起来,成为人工智能业界的主流深度学习框架,塑造了现代机器学习的生态系统。 

七年后的今天,故事的走向已经完全不同:谷歌的 TensorFlow 失去了开发者的拥护,因为他们已经转向了 Meta 推出的另一款框架 PyTorch。 

曾经无处不在的机器学习工具 TensorFlow 已经悄悄落后,而 Facebook 在 2017 年开源的 PyTorch 正在成为这个领域的霸主。 

近日,外媒 Business Insider 采访了一系列开发人员、硬件专家、云供应商以及与谷歌机器学习工作关系密切的人,获得了同样的观点。TensorFlow 已经输掉了这场战争,其中有人用了一个鲜明的比喻:「PyTorch 吃掉了 TensorFlow 的午餐。」 

专家们表示,鉴于战术失误、开发决策和 Meta 在开源社区中的一系列智取策略,谷歌引领互联网机器学习未来的机会正在逐渐消失。 

在 PyTorch 的阴影下,谷歌正在悄悄地开发一个机器学习框架,就是 JAX(曾是「Just After eXecution」的首字母缩写,但官方说法中不再代表任何东西),许多人将其视为 TensorFlow 的继承者。 

图片 

接近该项目的人士告诉 Insider,谷歌大脑和 DeepMind 在很大程度上放弃了 TensorFlow,转而使用 JAX。这为谷歌的其他部门铺平了跟随的道路,一位谷歌内部人士向 Insider 证实,JAX 现在几乎已在谷歌大脑和 DeepMind 中被全球采用。 

接近谷歌机器学习工作的人士表示,最初 JAX 面临着来自内部的强烈反对,一些人认为谷歌员工已经习惯了使用 TensorFlow。尽管它可能很难用,但它一直是谷歌员工中的统一因素。他们说,JAX 方法是要简单得多,但它会改变 Google 内部构建软件的方式。 

熟悉该项目的人士表示,Jax 现在有望成为未来几年所有使用机器学习的谷歌产品的支柱,就像 TensorFlow 在 2015 年之后几年所做的那样。 

「JAX 是一项工程壮举,」Julia 编程语言创建者 Viral Shah 说。「我认为 JAX 是一种通过 Python 实例化的独立编程语言。如果你遵守 JAX 想要的规则,它就可以发挥它的魔力,这真是令人惊叹。」 

现在,谷歌希望在这场竞赛中再次获得金牌,同时也从开发 TensorFlow 时所犯的错误中吸取教训,但这将是一个巨大的挑战。 

TensorFlow 的暮光,PyTorch 的崛起 

根据提供给 Insider 的数据,PyTorch 在一些必读开发者论坛上的帖子正在迅速赶超 TensorFlow。Stack Overflow 的参与度数据显示,以论坛问题份额衡量, TensorFlow 受欢迎程度近年来停滞不前,而 PyTorch 的参与度继续上升。 

图片 
TensorFlow 起步强劲,推出后受欢迎程度不断提高。Uber 和 Airbnb 等公司以及 NASA 等机构很快就开始将其用于一些复杂的项目,这些项目需要在大量数据集上训练算法。截至 2020 年 11 月,TensorFlow 已被下载 1.6 亿次。 

但谷歌持续及增量的功能更新使得 TensorFlow 变得笨拙,且对用户不友好,即使是谷歌内部的那些人、开发人员和与项目关系密切的人都认为如此。随着机器学习领域以惊人的速度发展,谷歌不得不经常使用新工具更新其框架。接近该项目的人士表示,该项目已经在内部传播开来,越来越多的人参与其中,不再专注最初是什么让 TensorFlow 成为首选工具。 

专家告诉 Insider,对于许多拥有引领者身份的公司来说,这种疯狂的猫鼠游戏是一个反复出现的问题。例如,谷歌并不是第一家建立搜索引擎的公司,它能够从 AltaVista 或 Yahoo 等前辈的错误中吸取教训。 

2018 年,PyTorch 推出了完整版。虽然 TensorFlow 和 PyTorch 都建立在 Python 之上,但 Meta 在满足开源社区的需求方面投入了大量资金。熟悉 TensorFlow 项目的人士说,PyTorch 还受益于专注做一些 TensorFlow 团队错过的事情。 

「我们主要使用 PyTorch,它拥有最多的社区支持,」机器学习初创公司 Hugging Face 的研究工程师 Patrick von Platten 说。「我们认为 PyTorch 可能在开源方面做得最好,他们能确保在线回复问题,所有示例都能 work。」 

一些最大的组织机构开始在 PyTorch 上运行项目,包括那些曾经依赖 TensorFlow 的机构。不久之前,特斯拉、Uber 等公司就在 PyTorch 上运行了他们最艰巨的机器学习研究项目。 

TensorFlow 的新增功能有时会复制使 PyTorch 流行的元素,使得 TensorFlow 对于其最初的研究人员和用户受众来说越来越臃肿。一个这样的例子是它在 2017 年增加了「敏锐执行」,这是 Python 的原生特性,使开发人员可以轻松分析和调试他们的代码。 

尝试用 JAX 自救 

随着 PyTorch 和 TensorFlow 之间竞争日益激烈,谷歌内部的一个小型研究团队开发了一个新框架 JAX,该框架将更容易访问张量处理单元(TPU)——一种谷歌专门为机器学习和 TensorFlow 定制的芯片。 

团队研究人员 Roy Frostige、Matthew James Johnson 和 Chris Leary 在 2018 年发表了一篇名为《Compilation of machine learning software through high-level traceability》的论文,介绍了这个新框架 JAX。PyTorch 的原始作者之一 Adam Paszky 于 2020 年初全职加入 JAX 团队。 

图片 

论文地址:https://cs.stanford.edu/~rfrostig/pubs/jax-mlsys2018.pdf 

JAX 提出了一种直接的设计来解决机器学习中最复杂的问题之一:将一个大问题的工作分散到多个芯片上。JAX 不会为不同的芯片运行单段代码,而是自动分配工作,即时访问尽可能多的 TPU,以满足运行需要。这解决了谷歌研究人员对算力的巨大需求。 

PyTorch 和 TensorFlow 都是以同样的方式开始的,首先是研究项目,然后成为机器学习研究的标准化工具,从学界扩散到更多地方。 

然而,JAX 在很多方面仍然依赖于其他框架。开发人员表示:JAX 没有加载数据和预处理数据的简单方法,需要使用 TensorFlow 或 PyTorch 进行大量数据处理。 

JAX 基础框架 XLA 也针对谷歌 TPU 设备做了很大的优化。该框架还适用于更传统的 GPU 和 CPU。了解该项目的人称:该项目仍有办法对 GPU 和 CPU 进行优化,以达到 TPU 同等水平。 

谷歌发言人表示,2018 年至 2021 年谷歌内部对 GPU 的支持策略欠优,缺乏与大型 GPU 供应商英伟达的合作,因此谷歌转而关注 TPU,谷歌自己内部的研究也主要集中在 TPU 上,导致缺乏良好的 GPU 使用反馈循环。从这个意义上说,谷歌对 TPU 的重视和专注也属迫不得已。 

然而,如 Cerebras Systems 的 CEO Andrew Feldman 所说:「任何以一种设备优于另一种设备的行为都是不良做法,会遭到开源社区的抵制。没有人希望局限于单一的硬件供应商,这就是机器学习框架应运而生的原因。机器学习从业者希望确保他们的模型是可移植的,可以移植到他们选择的任何硬件上,而不是被锁定在一个平台上。」 

如今,PyTorch 快 6 岁了,TensorFlow 在这个年纪早已出现衰落的迹象。也许 PyTorch 有一天也会被新框架取代,这尚未可知。但至少,新框架出现的时机已经成熟。 

延庆川北小区45孙老师 东屯- 收卖废品破烂垃圾炒股 废品孙 技术更新太快了 

抓紧每天学习把。。。 

# MambaVision

英伟达也对 Mamba下手了 ,视觉 Transformer 与 Mamba 的完美融合 !

在ImageNet-1K数据集上的图像分类中,MambaVision模型变体在Top-1准确率和图像吞吐量方面达到了新的最先进(SOTA)性能。在MS COCO和ADE20K数据集上的下游任务,如目标检测、实例分割和语义分割中,MambaVision超越了同等大小的架构,并展示了更优的性能。

作者提出了一种新颖的混合Mamba-Transformer架构,称为MambaVision,这是专门为视觉应用量身定制的。作者的核心贡献包括重新设计Mamba公式,以增强其高效建模视觉特征的能力。此外,作者还对将视觉Transformer(ViT)与Mamba集成的可行性进行了全面的消融研究。作者的结果表明,在Mamba架构的最后几层配备几个自注意力块,大大提高了捕获长距离空间依赖关系的建模能力。基于作者的发现,作者引入了一系列具有分层架构的MambaVision模型,以满足各种设计标准。在ImageNet-1K数据集上的图像分类中,MambaVision模型变体在Top-1准确率和图像吞吐量方面达到了新的最先进(SOTA)性能。在MS COCO和ADE20K数据集上的下游任务,如目标检测、实例分割和语义分割中,MambaVision超越了同等大小的架构,并展示了更优的性能。

代码:https://github.com/NVIabs/MambaVision。

1 Introduction

在近年来,Transformers [1] 已成为包括计算机视觉、自然语言处理、语音处理和机器人技术在内的不同领域的实际架构。此外,Transformer架构的多功能性,主要归功于其注意力机制,以及它的灵活性,使其非常适合多模态学习任务,在这些任务中集成和处理来自不同模态的信息至关重要。尽管这些好处,但注意力机制相对于序列长度的二次复杂度使得Transformers在训练和部署上的计算成本很高。最近,Mamba [2] 提出了一种新的状态空间模型(SSM),该模型具有线性时间复杂度,并在不同的语言建模任务中超越或匹配Transformers [2]。Mamba的核心贡献是一种新颖的选择机制,该机制使得在考虑硬件感知的情况下,能够有效地处理依赖于输入的长序列。

图1:ImageNet-1K数据集上的Top-1准确性与图像吞吐量。 所有测量均在A100 GPU上进行,批量大小为128。MambaVision达到了新的SOTA帕累托前沿。

最近,还提出了几个基于Mamba的 Backbone 网[3; 4],以利用其在视觉任务中的SSM公式的优势,例如图像分类和语义分割。然而,Mamba的自回归公式虽然在需要顺序数据处理的任务中有效,但在从完整感受野中受益的计算机视觉任务中面临限制:(1)与序列数据不同,图像像素不具有相同的顺序依赖性。相反,空间关系通常是局部的,需要以更并行和综合的方式考虑。因此,这导致处理空间数据时的效率低下(2)像Mamba这样的自回归模型逐步处理数据,限制了其在一次前向传递中捕获和利用全局上下文的能力。相比之下,视觉任务通常需要理解全局上下文以对局部区域做出准确预测。

Vision Mamba (Vim) [3] 等人提出了修改措施,例如双向SSM来解决全局上下文和空间理解的不足。尽管双向SSM有潜力捕获更全面的上下文,但由于需要在做出预测之前处理整个序列,它们引入了显著的延迟。此外,复杂度的增加可能导致训练困难、过拟合的风险,并且不一定能带来更高的准确度。由于这些缺陷,带有Vision Transformer (ViT) 和卷积神经网络 (CNN) 架构的 Backbone 网在不同的视觉任务上仍然优于最佳的基于Mamba的视觉模型。

在这项工作中,作者系统地重新设计Mamba块,使其更适合视觉任务。作者提出了一种混合架构,包括作者提出的公式(即MambaVision混合器和MLP)以及Transformer块。具体来说,作者研究不同的集成模式,例如以等参数方式将Transformer块添加到早期、中期和最终层以及每隔层。作者的分析显示,在最后阶段利用几个自注意力块可以显著增强捕获全局上下文和长距离空间依赖的能力。如第5节所示,使用混合架构也比纯Mamba或基于ViT的模型在图像吞吐量方面有更好的表现。

作者引入了MambaVision模型,该模型由多分辨率架构组成,并利用基于CNN的残差块快速提取较大分辨率特征。如图1所示,MambaVision在ImageNet-1K Top-1准确性和图像吞吐量方面达到了新的SOTA帕累托前沿,超过了Mamba、CNN和基于ViT的模型,有时幅度还很大。在如下游任务目标检测和实例分割以及语义分割中,带有MambaVision Backbone 网的模型在MS COCO和ADE20数据集上分别优于同等大小的对应模型。因此,这验证了MambaVision作为有效 Backbone 网的有效性和多功能性。

据作者所知,MambaVision是首次研究和开发同时包含Mamba和Transformers的混合架构以用于计算机视觉应用。

作者在这项工作中的主要贡献总结如下:

  • 作者引入了一个重新设计的面向视觉的Mamba块,提高了原始Mamba架构的准确性和图像吞吐量。
  • 作者系统地调查了Mamba和Transformer块的集成模式,并证明在最后阶段整合自注意力块显著提高了模型捕获全局上下文和长距离空间依赖的能力。
  • 作者介绍了MambaVision,这是一个新颖的混合Mamba Transformer模型。分层的MambaVision在ImageNet-1K数据集上实现了Top-1和图像吞吐量折衷的新SOTA帕累托前沿。

2 Related work

ViT(视觉 Transformer ): 视觉 Transformer (ViT)[5]作为一种替代CNN的有前景的选择出现,利用自注意力层提供更大的感受野。然而,最初ViT缺乏CNN的一些固有优势,例如归纳偏置和平移不变性,并且需要大规模的训练数据集才能达到有竞争力的性能。为了解决这些限制,数据高效图像 Transformer (DeiT)[6]引入了一种基于蒸馏的训练策略,显著提高了分类精度,即使是在较小的数据集上。在此基础上,LeViT[7]模型提出了一种混合方法,融入了重新设计的MLP和自注意力模块,这些模块针对快速推理进行了优化,提高了效率和性能。此外,跨协方差图像 Transformer (XCiT)[8]引入了一种转置自注意力机制,有效地建模了特征通道之间的交互,提高了模型捕捉数据中复杂模式的能力。金字塔视觉 Transformer (PVT)[9]采用了一种分层结构,在每个阶段的开始处使用块嵌入和空间尺寸减小,从而提高了计算效率。同样,Swin Transformer [10]提出了一种分层架构,其中自注意力在局部窗口内计算,这些窗口会移动以实现区域间的交互,平衡局部和全局上下文。Twins Transformer [11]具有空间可分离的自注意力,显著提高了效率。此外,焦点 Transformer (Focal Transformer)[12]利用焦点自注意力捕捉长距离空间交互的细粒度细节。

Mamba: 自从Mamba被引入以来,已经提出了许多努力来利用其在视觉应用中的能力。具体来说,Vim[3]提出使用双向SSM公式,与相同的Mamba公式相同,在这种公式中,标记在前后两个方向上处理,以捕捉更多的全局上下文并提高空间理解。然而,双向编码增加了计算负载,可能会减慢训练和推理时间。此外,有效结合来自多个方向的信息形成一个连贯的全局理解是具有挑战性的,因为在过程中可能会丢失一些全局上下文。与Vim相比,作者提出的MambaVision使用单一的前向传播和重新设计的Mamba块,可以捕捉到短距离和长距离的信息,并且在ImageNet Top-1准确性和吞吐量方面显著优于Vim。

EfficientV Mamba[4]提出了一种基于扩张的选择性扫描和跳过采样方法,以高效提取全局空间依赖关系。EfficientVLambda还使用了由SSM和基于CNN的块组成的分层架构,其中SSM用于更大的输入分辨率以更好地捕捉全局上下文,而CNN用于较低的分辨率。与EfficientV-Mamba相比,MambaVision在较高分辨率下使用CNN进行更快特征提取,同时在较低分辨率下使用SSM和自注意力捕捉短距离和长距离空间依赖关系的细粒度细节。作者提出的MambaVision在Top-1准确性和图像吞吐量方面也显著优于EfficientVMamba。

此外,V Mamba[13]引入了一种基于Mamba的通用视觉 Backbone 网络,并配备了交叉扫描模块(CSM),该模块实现了一维选择性扫描,并具有扩大的全局感受野。具体来说,CSM模块采用四向选择性扫描方法(即左上和右下向相反方向)以整合来自所有周围标记的信息并捕捉更多的全局上下文。此外,V Mamba在架构上进行了更改,如使用深度卷积和分层多分辨率结构。尽管CSM模块的设计更适合视觉任务,但其感受野仍然受到跨扫描路径的限制。与V Mamba相比,作者提出的MambaVision混合器的设计更简单,可以捕捉短距离和长距离依赖关系。MambaVision还使用基于CNN的层进行快速特征提取,而不是在所有阶段使用相同的块结构。此外,MambaVision模型在具有显著更高图像吞吐量的同时,性能也优于V Mamba对应模型。

3 Methodology

Macro Architecture

注意:表格内容在翻译中已调整为适应中文语境的顺序。公式和引用编号保持不变。

Micro Architecture

在本节中,作者首先回顾了Mamba和SSMs的基础知识。然后作者分阶段展示了第3和第4阶段的微架构设计,并详细讨论了MambaVision的公式化表述。

3.2.1 Mamba Preliminaries

然后方程式2可以用离散参数表示为:

图3:MambaVision块的架构。除了用它们的常规对应物替换因果卷积层外,作者还创建了一个没有SSM的对称路径作为标记混合器,以增强全局上下文的建模。

算法1 类似PyTorch的伪代码用于MambaVision混合器

选择性Mamba通过引入选择机制进一步扩展了S4公式,该机制允许进行输入相关的序列处理。这使得模型的参数,和可以根据输入动态调整,并过滤掉不相关的信息。进一步的离散化细节在[2]中提供。

3.2.2 Layer Architecture

4 Experiments

图像分类实验是在ImageNet-1K数据集[19]上进行的。作者遵循了先前工作的标准训练方法[10; 12; 29],以便对不同模型的性能进行比较分析。具体来说,所有模型都经过300个周期的训练,使用余弦衰减调度器,并分别使用额外的20个周期进行预热和冷却阶段。此外,作者使用了LAMB优化器[30],全局批量大小为4096,初始学习率为0.005,权重衰减为0.05。作者注意到,使用LAMB优化器相比于传统的AdamW[31]可以获得更好的结果,特别是由于它对较高学习率的鲁棒性。作者在分类任务中使用了32个A100 GPU。

为了评估下游任务的性能,作者将预训练的模型作为目标检测和实例分割以及语义分割任务的 Backbone 网络,并分别使用了MS COCO数据集[32]和ADE20K数据集[33]。具体来说,对于目标检测和实例分割,作者使用了Mask-RCNN[34] Head ,并设置了如 LR计划、初始学习率为0.0001、批量大小为16、权重衰减为0.05等超参数。对于语义分割,作者使用了UperNet网络[35] Head 和Adam-W[31]优化器,初始学习率为6e-5,全局批量大小为16。作者在所有下游任务中使用了8个A100 GPU。

5 Result

Image classification

在表1中,作者展示了ImageNet-1K分类的结果。具体来说,作者与不同类型的模型家族进行了比较,如基于卷积的、基于Transformer的、卷积-Transformer混合的以及基于Mamba的模型,并展示了作者的模型在ImageNet Top-1准确率和图像吞吐量方面超过了此前的成果。例如,与流行的模型如ConvNeXt和Swin Transformers相比,MambaVision-B(84.2%)分别超过了ConvNeXt-B(83.8%)和Swin-B(83.5%),同时在图像吞吐量上也有显著优势。与基于Mamba的模型相比,作者也观察到了类似的趋势。具体来说,MambaVision-B(84.2%)尽管图像吞吐量明显更高,但性能还是超过了V Mamba-B(83.9%)。作者还想指出,虽然作者主要的设计目标是准确性与吞吐量的权衡,但MambaVision模型变体与同等大小的模型相比,FLOPs要低得多。例如,MambaVision-B的GFLOPs比MaxViT-B少了。

Object Detection and Segmentation

作者在表2中展示了在MS COCO数据集[32]上的目标检测和实例分割结果。特别地,作者训练了不同检测尺寸的模型,以进一步验证MambaVision在不同场景下的有效性。作者还注意到,作者的目标并非要在这些任务上达到最先进水平,而是要比较作者的主干网络与同尺寸的流行视觉主干网络的表现,并验证其有效性。使用简单的Mask-RCNN检测Head,作者预训练的MambaVision-T主干网络在box AP和mask AP方面分别达到了46.4和41.8,超过了ConvNeXt-T [20]和Swin-T [10]模型。使用级联Mask-RCNN网络,MambaVision-T、MambaVision-S和MambaVision-B均超过了竞争模型。具体来说,在box AP和mask AP方面,MambaVision模型分别比ConvNeXt-T高出+0.2和0.2,比ConvNeXt-B高出+0.1和0.1。同样,在box AP和mask AP方面,MambaVision分别比Swin-T高出+0.6和0.6,比Swin-S高出+0.1和0.2,比Swin-B高出+0.9和0.7。

作者在表3中展示了在ADE20K数据集[33]上的语义分割基准。在这些实验中,作者使用了UPerNet [35],以便与其他模型进行比较。作者观察到,MambaVision模型在各个变体中均超过了同样尺寸的竞争模型。例如,在mIoU方面,MambaVision-T、MambaVision-S和MambaVision-B分别比Swin-T、Swin-S和Swin-B高出+0.6、+0.6和+1.0。尽管作者没有针对下游任务的超参数调整进行大量优化,但这些结果证明了MambaVision作为一个不同视觉任务的有前景的主干网络是可行的,尤其是在高分辨率设置下。

Ablation

6 Conclusion

在本文中,作者引入了MambaVision,这是首个专门为视觉应用设计的Mamba-Transformer混合骨架。

作者提出了重新设计Mamba公式的方法,以增强全局上下文表示的学习能力,并进行了混合设计集成模式的综合研究。

MambaVision在Top-1准确性和图像吞吐量方面达到了新的SOTA帕累托前沿,大幅超越了基于Transformer和Mamba的模型。

作者希望这些研究成果能够成为新型混合视觉模型的基础。

-------

# Battle-of-the-Backbones

尽管Vision Transformer(ViTs)和自监督学习(SSL)越来越受欢迎,但在大多数任务中,文章发现在大型训练集上以监督方式预训练的卷积神经网络仍然表现最好。

paper:https://arxiv.org/pdf/2310.19909

code:https://github.com/hsouri/Battle-of-the-Backbones

要解决的问题:

距离深度学习的突破之作AlexNet已过去10年之久,期间各种网络架构层出不穷,那么作为研究者和实践者,该如何选择网络架构?

解决方案:

通过对各种预训练模型(包括视觉-语言模型、自监督学习模型等)在多种计算机视觉任务(如分类、对象检测等)上的性能进行大规模比较,来帮助研究者和实践者更好地选择合适的模型。这就像是在各种预训练模型中进行一场“角逐”,看看哪个模型的性能最好。

结论:

1、尽管Vision Transformer(ViTs)和自监督学习(SSL)越来越受欢迎,但在大多数任务中,文章发现在大型训练集上以监督方式预训练的卷积神经网络仍然表现最好。

2、在相同的架构和类似大小的预训练数据集上进行比较,文章发现SSL BackBone具有很高的竞争力,这表明未来的工作应该使用先进的架构和更大的预训练数据集进行SSL预训练。

关键词:

BoB:Battle of the Backbones

ID:In-Distribution

OOD:Out-of-Distribution

影响BackBone网络性能的三个主要因素是其架构预训练算法预训练数据集。在这三个设计维度上,都有许多选择,为从业者构建计算机视觉系统提供了无数的组合。尽管有这么多的选择,但是从业者却没有可参考的资源,只能自己测试各个BackBone网络。

文章在“BackBone网络之战”中将这些BackBone网络进行对比。文章比较了许多流行的公开可用的预训练模型,还有随机初始化的基线模型,在各种下游任务上进行评估,包括图像分类、对象检测、图像检索等。为了全面考察BackBone网络的能力,文章评估它们在不同任务上的表现,这些任务分属以下几大类:

  • 分类:文章测量BackBone在各种下游分类任务上的微调和线性探测性能,包括自然图像、医学和卫星图像数据集。图像分类任务需要BackBone网络提取识别图像前景内容的特征,而不需要定位对象在图像中的具体数量和位置。
  • 对象检测和分割:不同于图像分类,密集预测任务需要BackBone提取包含对象精确位置的特征,在分割任务中需要像素级别定位,在检测任务中需要足够细致地绘制边界框。文章在这两个任务上评估BackBone网络。
  • 域外泛化:在实际应用中,计算机视觉系统通常会被部署在不同于训练数据分布的新数据上。即使是高性能模型,在域变化下也已知会失败。因此,文章评估模型在新下游域的泛化能力。
  • 图像检索:图像检索需要BackBone网络通过特征空间中的相似度来匹配相似的图像。文章探索需要根据语义内容、视觉相似度等不同标准匹配图像的任务。

除了协助从业者构建计算机视觉系统之外,这个基准测试的另一个核心目标是帮助引导研究界朝着寻求设计更好的BackBone网络的有益研究方向前进。BoB揭示了预训练例程和架构的优势和劣势,揭示了常见的误解和基本限制,以及改进的有希望的方向。下面,文章总结了几个主要的研究结果,并讨论了以前比较BackBone网络的努力。

文章的后续部分包含了大量的实验细节。因此,文章在下面提炼出几个关键的发现:▷ 在BoB的一系列全面评估中,涵盖了任务、数据集和设置(包括ID和OOD),在监督学习下,ConvNeXt-Base、SwinV2-Base(使用ImageNet-21k进行训练)和CLIP ViT-Base表现最好。在较小的规模上,ConvNeXt-Tiny和SwinV2-Tiny获胜,其次是DINO ViT-Small。▷ 尽管最近关注的焦点放在基于Transformer的架构和自监督学习上,但在文章考虑的大多数任务中,通过监督学习预训练的高性能卷积网络优于Transformer。▷ 观察到监督预训练的优越性是因为这些模型在更大的数据集上进行了训练。在相同数据集规模上的比较中,自监督学习模型胜过其监督学习的对应模型。▷ ViT对预训练数据量和参数数量的敏感性高于CNN。▷ 在任务间的性能存在强相关性 - 在BoB中表现最好的BackBone网络往往在各种任务和设置中都表现出色。请参见图1。

BoB指南

文章比较的BackBone之间的区别主要来自于它们的架构预训练算法预训练数据集。表1总结了文章要比较的BackBone,包括预训练算法、粗略分类、预训练数据集和架构。文章附录B中详细描述了每个算法、预训练数据集和架构。

大小和公平比较的注意事项。许多从业者有限的计算资源,而且在自己的数据集上需要调优超参数而不超过计算预算。为了模拟这种场景,文章进行适度的超参数网格搜索,不允许特别长的训练计划,并且不考虑比ConvNeXt-Base更大的架构,除了Stable DiffusionBackBone,因为它只有一个尺寸。具体的超参数网格在后续章节详细说明。此外,文章仅使用公开可用的checkpoint,这些checkpoint对从业者也是可访问的。可用的checkpoint进行了不同程度的超参数调优,不同的预训练算法在不同的数据集和架构上进行了训练,所以精确的公平比较是不可行的。尽管如此,这种现有checkpoint的比较对从业者是相关的,因为它代表着现实的条件。文章在下游任务上为每个BackBone使用相同大小的超参数扫描。

任务

为了全面检验BackBone网络的能力,文章评估它们在许多下游任务上的表现,这些任务分属以下几类:

  • 分类:在3.1节中测量BackBone在各种下游分类任务上的微调和线性探测性能,包括自然图像、医学和卫星图像数据集。图像分类任务需要BackBone网络提取识别图像前景内容的特征,而不需要定位对象在图像中的具体数量和位置。
  • 对象检测和分割:不同于图像分类,3.2节中的密集预测任务需要BackBone提取包含对象精确位置的特征,在分割任务中需要像素级别定位,在检测任务中需要足够细致地绘制边界框。文章在这两个任务上评估BackBone网络。
  • 域外泛化:3.3节中,除了评估BackBone在各种下游任务上的域内性能,文章还考察这种性能如何转换到域外设置。
  • 图像检索:图像检索需要BackBone网络通过特征空间中的相似度来匹配相似的图像。在3.4节中探索需要根据语义内容、视觉相似度等不同标准匹配图像的任务。

实验设置

文章现在描述每个任务的实验设置。具体来说,文章列出学习方案、数据集和评估指标。完整的实验和实现细节请见附录C。

分类

学习方案。文章使用两个微调方案评估预训练BackBone在各种数据集上的性能:端到端微调(包括只使用少量标记样本的实验)和线性探测。在前一种情况下,文章在给定的数据集或它的一部分上端到端微调整个模型,并在测试分割上测量准确率。在线性探测场景中,文章从冻结的预训练BackBone中提取特征,并仅在这些预训练表示上学习一个线性分类器。这两种方案在之前的工作中被广泛使用来评估自监督学习等预训练方法,如在自监督视觉表示学习[12, 30, 8, 10]和视觉语言预训练[1, 105]中。

数据集和评估指标。文章在6个常见的图像分类数据集上进行实验,涵盖自然图像(ImageNet-1K [17], CIFAR-100 [46], Flowers-102 [64], Aircraft [60])、卫星图像(EuroSAT [31])和医学X射线数据(CheXpert [37]),展示预训练BackBone的泛化性和迁移性。文章使用的所有数据集都是公开可用的,文章在附录C中列出了它们的详细信息,包括大小和类别数。在只使用训练集的一部分进行微调的实验中,文章随机采样1%和10%的训练样本进行微调。在采样子集时,文章保持原始数据集的标签分布。注意,文章这里只考虑域内泛化,其中训练和测试集来自同一来源。

评估时,文章使用分类准确率和ROC曲线下面积(AUC)作为单标签和多标签分类任务的性能指标。除了超参数向量之间最佳的得分之外,文章还绘制前几个时期的准确率,以显示不同预训练BackBone的收敛率。此外,文章在同一设备上基准测试每个BackBone的延迟和内存使用情况。

对象检测和分割

学习方案。对于对象检测和实例分割的评估,文章采用Cascade Mask R-CNN框架[5]。文章使用三种方案进行实验:(1)从随机初始化进行端到端训练,(2)使用预训练BackBone进行端到端微调,(3)使用冻结的BackBone进行微调。虽然用冻结的BackBone进行微调在检测和分割中不典型,但后一种方案允许文章探测预训练模型的特征中包含的定位信息,并与线性探测分类实验互补。参见附录C.1关于ViT,尤其是大型ViT,在更昂贵的训练方案下可能超过其他模型性能的讨论。

数据集和评估指标。文章在流行的COCO数据集[53]上进行对象检测和实例分割评估。文章遵循COCO式的平均精度(AP)指标,该指标在各种Intersection over Union(IoU)阈值上进行平均。文章报告边界框平均精度(box AP)、box AP@50和AP@75用于对象检测,以及掩膜平均精度(mask AP)、mask AP@50和mask AP@75用于实例分割[54]。

域外泛化

尽管现代网络在它们训练的数据分布上可能展示出强大的性能,但大量的以前的工作[70, 32]发现,这种模型的性能在分布发生变化时可能会显著下降。除了评估BackBone在各种下游任务上的域内性能之外,文章还研究这种性能如何转换到域外(OOD)设置。

学习方案。几个特定任务的数据集和基准已被提出来评估模型对其训练分布偏差的稳健性。具体来说,文章研究经过训练的BackBone在两个任务上的泛化性能,即(1)图像分类和(2)对象检测,以及两种类型的分布转移,(A) ImageNet内部的结构和样式变化以及(B) 从合成到真实的泛化。

数据集和评估指标。文章考虑以下广泛的OOD评估基准:

(A)对结构和样式的变化的稳健性。文章测量在ImageNet上训练或微调的模型在以下基准上的OOD泛化:

(i) ImageNet-A [34]。ImageNet-A(dversarial)包含ImageNet测试图像的200个类别的策略性子集,这些图像对训练好的深度模型具有特定挑战性。

(ii) ImageNet-V2 [75]。ImageNet-V2是在原始数据集收集后10年按照完全相同的收集方案构建的额外的与ImageNet类似的测试集。

(iii) ImageNet-R [33]。ImageNet-R(endition)包含200个来自ImageNet的类别的艺术Rendering,包括卡通、涂鸦、刺绣、折纸、雕塑等。

(iv) ImageNet-S [92]。ImageNet-S(ketch)是从ImageNet类别中网络爬取并人工清理的黑白素描图像集合。

(B) 从合成到真实的泛化。文章还测量在合成数据上训练并在真实数据上测试的模型的性能。合成数据已成为一种流行的替代方法,用于在采集真实世界中可靠注释的数据很难或很贵的情况下。文章在以下两个流行基准上测量从合成到真实的泛化,用于图像分类和对象检测:

(i) VisDA Syn→Real。VisDA分类基准由约152k张合成图像和约55k张真实图像组成,跨12个类别。VisDA中的合成图像是对象从多个视点在不同照明条件下的3D渲染。真实图像是从COCO数据集中裁剪的12个类别的作物。

(2) Sim10k→Cityscapes。对于对象检测,文章使用Sim10k作为合成训练数据集,使用Cityscapes作为真实评估数据集。Sim10k由来自GTAV的约10k张街景图像组成。Cityscapes由约5k张密集注释的街景图像组成,这些图像是从车辆视角拍摄的现实世界图像。遵循以前的工作[13],文章在整个Sim10k上进行训练,以检测“汽车”的实例,并在Cityscapes的验证分割上测量检测性能。

对于图像分类,文章报告在OOD测试集上的分类准确率;对于对象检测,文章报告mAP@50的泛化性能。

图像检索

文章在各种图像检索数据集上进行评估,包括基于内容的图像检索和分类数据集,文章将它们改造为语义检索任务。对于地理地标检索,文章利用牛津数据集[68]和巴黎数据集[69]。为确保准确性,文章使用这些数据集的修正标签版本[71]。INSTRE数据集[94]由放置在不同位置和条件下的玩具和形状不规则的产品组成。为了检验细粒度的检索,文章采用Caltech-UCSD Birds-200数据集(CUB-200)[90],其中包含在不同背景、姿势和照明条件下拍摄的各种鸟类。对于多样化的自然图像,文章使用iNaturalist数据集[87]。这个数据集提供了一个广泛的细粒度类别,被分类到13个超类,包括植物、昆虫、鸟类和哺乳动物。为了评估真实场景下的检索性能,文章采用Objectnet数据集[2]。该数据集由313个对象类组成,具有随机变化的背景、旋转和成像视角。对于大规模地标识别,文章利用谷歌地标V2数据集[98],其中包含约20万个独特地标。最后,文章采用INRIA Copydays数据集[19],其中包含一小部分度假照片。

在上述数据集中,iNaturalist、Objectnet和CUB-200可以分类为语义检索数据集,而其余数据集属于基于内容的检索数据集。

文章使用平均精度或mAP[67]来评估模型性能。文章首先计算给定查询图像的平均精度,然后计算所有查询的平均值以找到mAP。文章还测量Recall@k,它测量返回第一个正确匹配之前的结果数量,并计算这些未命中值的倒数的平均值MRR(平均互反等级)。对于所有指标,值越高越好。

从业者。应该选择哪个BackBone网络?

如今的从业者可以从各种大小、训练方法和预训练数据的大量BackBone网络中进行选择:从业者应该为某项特定任务或一般情况选择哪个BackBone网络?为了回答这个问题,在BoB中,文章系统地比较了各种公开可用的BackBone网络(参见表1),横跨多个任务、数据集和设置。为了进行这些比较,文章使用以下排名方案:

使用排名,文章不仅可以报告每个任务的最佳表现BackBone,还可以报告跨任务、数据集和设置的整体表现最佳的BackBone(见表2摘要)。

特定任务的BackBone网络

分类。在多个数据集和实验设置(微调、线性探测、完整和低样本训练)中,文章发现“在IN-21k上监督训练的SwinV2-Base(在IN-1k上微调)”是表现最佳的BackBone网络,其次是“CLIP ViT-Base”和“在IN-21k上监督训练的ConvNeXt-Base”(见第1行,表2)。

对象检测和分割。对于对象检测和实例分割,文章发现“在IN-21K上监督训练的ConvNeXt-Base” > “在IN-21k上监督训练的SwinV2-Base(在IN-1k上微调)” > “在IN-1k上监督训练的ConvNeXt-Base”。

图像检索。对于图像检索,文章发现“在IN-21k上监督训练的ConvNeXt-Base”是最佳选择,其次是“在IN-21k上监督训练的SwinV2-Base(在IN-1k上微调)”和“在LAION-2B上训练的CLIP ViT-B”。

(OOD)分类。在各种OOD评估中,文章发现“在IN-21k上监督训练的ConvNeXt-Base” > “在IN-21k上监督训练的SwinV2-B(在IN-1k上微调)” > “在LAION-2B上训练的CLIP ViT-Base”。

(OOD)对象检测。对于从合成到真实的对象检测,文章发现“在IN-1k上监督训练的ConvNeXt-Base”是最佳BackBone,其次是“在IN-1k上监督训练的ConvNeXt-Tiny”和“在IN-21k上监督训练的ConvNeXt-Base”。

整体最佳的BackBone网络

对于没有具体任务需求的从业者,整体表现最好的模型是“在IN-21k上监督训练的ConvNeXt-Base”,其次是“在IN-21k上监督训练的SwinV2-Base(在IN-1k上微调)”和“在LAION-2B上训练的CLIP ViT-Base”。总体来说,文章注意到以监督方式训练的BackBone(SwinV2-Base、ConvNeXt-Base)或具有视觉语言监督的BackBone(CLIP ViT-Base)优于其他BackBone。此外,文章发现CLIP ViT-Base紧随在IN-21k上监督训练的ViT-Base(在IN-1k上微调)之后。

预算有限的BackBone网络

许多计算机视觉应用需要高效的BackBone网络以实现快速或设备端推理。在这一节中,文章对三个小BackBone进行基准测试:在ImageNet-1k上以监督方式预训练的RegNetX-400F [73]、EfficientNet-B0 [83]和ResNet-18 [28]。文章在表3中对这些小BackBone在一系列任务上的性能进行了排名。文章发现在整体和分类、检索、OOD分类方面,EfficientNet-B0的表现最好,其次是RegNetX-400MF,然后是ResNet-18。有趣的是,在检测和分割方面,新型高效架构仍不如ResNet。

观察结果和趋势

ViT和CNN的性能比较。现代架构明显优于普通ViT。文章在表2中看到,最佳性能的BackBone网络(ConvNeXt-Base)是卷积的,其次是具有分层transformer的架构(SwinV2-Base)。后者融合了强大的空间归纳偏置。这些发现表明,社区应该放弃仍在广泛使用的普通ViT。需要说明的是,文章没有评估非常大的模型,在更大的规模下,ViT可能会胜过其其他变体或卷积网络。

ViT比CNN更依赖规模。对于BoB中考虑的BackBone组,文章发现参数数量的相对性能(z分数)对ViT(斯皮尔曼相关系数 = 0.58)的正相关性高于CNN(斯皮尔曼相关系数 = 0.35)。类似地,而整体相对性能与预训练数据的规模相关,这个相关性对ViT (ρ = 0.72)也明显高于CNN (ρ = 0.33)。这个观察表明,基准测试更大的BackBone可能产生不同的赢家,可能是具有基于transformer的架构。

监督或不监督? 监督学习BackBone占主导地位,但主要是因为它们可以在更大的数据集上预训练。在相似大小的数据集上,SSLBackBone可以胜过其监督对手。文章得到每个预训练方式的前3个BackBone的平均分数,即自监督、用ImageNet-1K监督和用ImageNet-21K监督(见附录D)。在IN-21K上用监督学习预训练的ConvNeXt和SwinV2在所有任务上都优于SSLBackBone。结果表明,文章应该尝试将SSL方法与先进的架构相结合,并在大数据集上进行训练以与监督学习竞争。在这些实验中,监督预训练的checkpoint通常可在更大的数据集(ImageNet-21k)上获得。当比较在类似大小数据集上预训练的模型时,SSL或视觉语言预训练方法在分类(域内和域外)和检索任务上获得了更好的性能,这些任务高度依赖于学习的表示。然而,监督学习BackBone在检测和分割方面保持决定性优势。文章还可以比较使用相同ViT-Base架构的BackBone,发现SSL方法确实优于ImageNet-1k监督BackBone,但比ImageNet-21k训练的BackBone差。

任务之间的性能高度相关。在文章考虑的任务对中,文章发现任务对之间的性能存在高度正相关(通常ρ> 0.8)。这一发现支持通用基础模型在计算机视觉中的当前趋势。此外,这一发现也支持最近的工作,该工作认为单一的归纳偏差可以解决一系列看似不同的问题[24]。然而,值得注意的是,检索任务与分类和检索排名之间的相关性相对较低但仍具有统计意义(ρ = 0.49)。这种较低的相关性可以归因于MiDaS和MAE预训练模型在检索方面的性能限制。在删除这两个BackBone后,相关系数ρ增加到0.8,这进一步证明了上述模型对观察结果的影响。

Transformer在端到端微调下表现优异,而卷积网络在线性探测下表现优异。对于“线性探测”实验,文章冻结预训练BackBone,仅学习头部。请注意,对于检测和分割,头部不仅是一个线性层。通过检查两种微调策略之间的性能差异(图2),文章发现ViT从端到端微调中受益明显多于CNN,无论是在监督预训练还是自监督预训练下。参见图2中的在密集预测任务上的比较。

CLIP模型以及视觉语言建模中先进架构的前景。对于几乎所有任务(OOD检测除外),CLIP预训练优于普通视觉transformer,即使与在ImageNet-21k上监督训练的BackBone相比也是如此。在所有BackBone中,CLIP仅次于在IN-21k上训练的SwinV2和ConvNeXt,这显示了视觉语言预训练的力量,并再次表明,在进行自监督或弱监督学习时,文章应考虑除普通ViT之外的更多BackBone架构。

生成BackBone怎么样? 与用监督或自监督方法和对比损失训练的模型相比,用生成对抗目标训练的BackBone,如MAE或Stable Diffusion,其性能相对较差。文章建议谨慎解释这个结果,因为目前仅对Stable Diffusion在有限的任务上进行了评估。尽管如此,Stable Diffusion是一个更大的BackBone,并在一个非常大的数据集上训练,但它展示了比文章考虑的其他模型差的性能。

“小”BackBone之战。考虑到有限的资源,文章还比较了BoB中“小”BackBone的子集(参数< 30M)—— ViT-Small、ConvNeXt-Tiny、Swin-Tiny和ResNet-50架构。总体而言,文章发现在IN-1k上监督训练的ConvNeXt-T表现最好,其次是在IN-1k上监督训练的SwinV2-T,然后是在IN-1k上训练的DINO ViT-S。有趣的是,监督学习在这里再次占据主导地位,而且仅在IN-1k上预训练的BackBone胜过在考虑得多更大的数据集上训练的BackBone(MiDaS)。      

性能与速度? 文章的分析显示,在相同的NVIDIA RTX A5000上计算的吞吐量与平均性能z分数之间存在较强的负相关(ρ = -0.41)。考虑每个BackBone时,这一发现与文章之前的观察一致,即更大的模型往往具有更优越的性能。因此,为了获得增强的性能,可能需要牺牲速度。

单目深度估计作为通用预训练策略。在文章的实验中,即使在自然图像域之外,例如在卫星图像上,MiDaS也达到了与顶级传统监督和自监督学习BackBone相媲美的性能,在图像分类、对象检测和分割方面。这个观察表明,深度估计可以作为强大和通用的主要或辅助预训练任务。

校准和测试似然与准确率相关。在ImageNet测试集上,文章测量了期望校准误差(ECE)以及交叉熵损失。而测试似然与准确率高度相关(r = -0.8278),ECE的相关较弱(r = -0.4876)。在两种情况下,文章都观察到p值低于0.05。文章还注意到,自监督预训练通常会导致较差的校准。

接下来会发生什么?

每个计算机视觉模型的核心是一个BackBone网络。在文章的BackBone网络对战中,文章比较了1500多次训练运行,以发掘对计算机视觉从业者和研究人员有益的见解。

为指导从业者,文章分析了在广泛任务范围内公开可用视觉BackBone的性能,从分割和检测到分类和检索。文章发现监督ConvNext、监督SwinV2和CLIP模型在这一广泛任务范围内性能良好。对于计算资源受限的设置,在文章的“小”BackBone之战中,文章发现较小的对应的架构监督ConvNext-T和SwinV2效果好,其次是带小ViT的DINO。BoB为从业者提供了从令人眼花缭乱的选择中选择合理BackBone的指南。

对于展望未来的研究人员,文章还观察到几个显著趋势。首先,文章发现跨任务的性能高度相关,这表明从专用视觉BackBone向通用BackBone的转变,这些通用BackBone可以在各种任务上发挥良好作用。其次,文章发现吞吐量和性能之间存在反相关,这表明扩展仍然是提高BackBone的有希望途径。最后,文章发现虽然文章的实际建议包括许多监督模型,但在与标准监督训练的公平比较中,自监督学习很有前景。通过发布文章所有的实验结果以及用于测试新BackBone的代码,文章希望BoB能成为今天的从业者和研究明天问题的研究人员的有用指南。

局限性。文章指出,从BoB获得的见解取决于在此工作中考虑的任务词汇、BackBone网络和设置。文章希望通过这项研究得出的结论能够为计算机视觉研究人员提供实际的考虑因素,同时也认识到这些见解需要随着引入更多的BackBone网络、任务和设置而不断发展。最后,文章指出,BoB中的研究主要集中在与性能相关的方面,对于其他重要方面(模型中的偏见等)的探索仍然存在。

文章的基准测试不包括比ConvNext-Base更大的BackBone网络,除了稳定扩散(Stable Diffusion),一些排名可能在大规模上发生变化。例如,虽然文章发现现代经过监督学习预训练的卷积网络在大多数任务上表现最好,但文章也发现Transformer在规模上更有优势,无论是在预训练数据还是架构规模方面。在非常大的规模上,TransformerBackBone网络有可能超过卷积BackBone网络。

计算成本和碳足迹

文章中的实验总计消耗了127k GPU小时的NVIDIA RTX A100卡。假设GPU的平均碳效率为每千瓦时0.37公斤CO2当量,则总排放量估计为11792.36公斤CO2当量[48]。

# EfficientMod

微软提出视觉新主干EfficientMod:融合卷积和注意力机制

Efficient Modulation (EfficientMod) 融合了卷积和注意力机制的有利特性,同时提取空间上下文并对输入特征进行投影,然后使用简单的逐元素乘法将其融合在一起。EfficientMod的设计保证了高效性,而固有的调制设计理念则保证了其强大的表示能力。

论文地址:​​ https://arxiv.org/abs/2403.19963​​

论文代码:​​ https://github.com/ma-xu/EfficientMod​​

Introduction

视觉​​Transformer​​​(​​ViT​​​)在广泛的视觉任务中展现了令人印象深刻的成就,并为视觉网络设计贡献了创新的思路。得益于自注意力机制,​​ViTs​​​在动态特性和长距离上下文建模的能力上与传统卷积网络有所区别。然而,由于自注意力机制在视觉标记数量上具有二次复杂度,其既不具备参数效率也不具备计算效率,这阻碍了​​ViTs​​在边缘设备、移动设备和其他实时应用场景上的部署。因此,一些研究尝试在局部区域内使用自注意力,或者选择性地计算信息标记,以减少计算量。同时,一些工作尝试将卷积和自注意力结合起来,以实现理想的效果和效率的折衷。

最近的一些研究表明,纯卷积网络也能够与自注意力相比取得令人满意的结果。其中,​​FocalNet​​​和​​VAN​​​以计算效率高和易于实现而著称,展现了领先的性能且显著优于​​ViT​​​的对应模型。一般来说,这两种方法都使用大核卷积块进行上下文建模,并通过逐元素乘法调节投影输入特征(随后是一个​​MLP​​​块),如图1b所示。这种设计统称为调制机制,它表现出有前景的性能,并且从卷积的有效性和自注意力的动态性中获益。尽管调制机制在理论上是高效的(从参数和​​FLOPs​​的角度来看),但在计算资源有限时推断速度不尽如人意。造成这种情况的原因主要有两个:

  • 冗余和等效操作,如连续的深度卷积和冗余的线性投影占据了大部分操作时间。
  • 上下文建模分支中的碎片化操作显著增加了延迟,并违反了​​ShuffleNetv2​​​中的指导原则​​G3​​。

为此,论文提出了高效调制(​​Efficient Modulation​​​),可以作为高效模型的基本构建块(见图1c)。与​​FocalNet​​​和​​VAN​​​的调制块相比,高效调制块更加简单并继承了所有的优点(见图1b和图1c)。与​​Transformer​​​块相比,高效调制块的计算复杂度与图像尺寸呈线性关系,强调大规模但局部的特征交互,而​​Transformer​​​则与标记数量的立方相关并直接计算全局交互。与反向残差(​​MBConv​​)块相比,高效调制块使用更少的通道进行深度卷积,并融入了动态特性。

基于高效调制(​​Efficient Modulation​​​)块,论文提出了基于纯卷积的新型高效网络架构​​EfficientMod​​​。​​EfficientMod​​​块与传统的自注意力块正交,并且与其他设计具有良好的兼容性。通过将注意力块与​​EfficientMod​​​集成的混合架构,可以产生更好的结果。在不使用神经网络搜索(​​NAS​​​)的情况下,​​EfficientMod​​​在各种任务中展现出非常不错的性能。与最先进方法​​EfficientFormerV2​​​相比,​​EfficientMod-s​​​在​​GPU​​​上的速度比​​EfficientFormerV2-S2​​​快​​25%​​​,并且在top-1准确率上超过了​​EfficientFormerV2-S2​​​约​​0.3​​​个百分点。此外,EfficienntMod在下游任务中也显著超越了​​EfficientFormerV2​​​,在​​ADE20K​​​语义分割基准测试中,其​​mIoU​​​比​​EfficientFormerV2​​​高出了​​3.6​​个百分点,而模型复杂度相当。

Method

Revisit Modulation Design

  • Visual Attention Networks

  • FocalNets

  • Abstracted Modulation Mechanism

​VAN​​​和​​FocalNet​​均展示出了良好的表征能力,并表现出令人满意的性能。实际上,这两种方法都共享一些不可或缺的设计,可能就是性能提升的关键:

  1. 这两个并行分支是独立操作的,从不同的特征空间提取特征,类似于自注意力机制(如图1a所示)。
  2. 在上下文建模方面,两者均考虑了较大的感受野。​​VAN​​​堆叠了两个具有扩张的大核卷积,而​​FocalNet​​引入了分层上下文聚合以及全局平均池化来实现全局交互。
  3. 这两种方法通过逐元素相乘将来自两个分支的特征融合在一起,这在计算上是高效的。
  4. 在特征融合之后采用了线性投影。

与此同时,它们也存在着明显的不同设计,比如上下文建模的具体实现以及特征投影分支的设计(共享或独立投影)。基于上述相似之处并忽略特定的差异,论文将调制机制进行抽象,如图1b所示,并形式定义如下:

这个抽象的调制机制在理论上继承了卷积和自注意力的优良特性,但实际以卷积方式运算,且具有令人满意的效率。具体地,公式 4 于逐元素相乘而具有类似自注意力的动态性。上下文分支还引入了局部特征建模,但也通过大的核大小实现了较大的感受野(这对效率来说不是瓶颈)。遵循​​VAN​​​和​​FocalNet​​​,在调制后引入一个两层​​MLP​​块。

Efficient Modulation

尽管比自注意力更高效,但抽象的调制机制在理论复杂度和推理延迟方面仍无法满足移动网络的效率要求。因此,论文提出了高效调制(​​Efficient Modulation​​),旨在为高效网络量身定制的同时保留调制机制的所有优良特性。

  • Sliming Modulation Design

  • Simplifying Context Modeling

这种设计比​​VAN​​​和​​FocalNet​​中的上下文建模要简单得多,通过一个大核的深度可分离卷积抛弃了等效的多个深度可分离卷积。这可能会在一定程度上牺牲性能以换取效率,但消融研究表明,上下文分支中的每个操作都是必不可少的。

Network Architecture

​EfficientMod​​​采用了​​4​​​个阶段的分层架构,每个阶段由一系列带有残差连接的​​EfficientMod​​​模块组成。为了简化起见,使用重叠的图像块嵌入(通过卷积层实现下采样)分别将特征减小​​4​​​倍、​​2​​​倍、​​2​​​倍和​​2​​​倍。对于每个模块,使用层归一化来对输入特征进行归一化,然后将归一化的特征输入​​EfficientMod​​模块。采用随机深度和层缩放来改善模型的鲁棒性。

需要注意的是,​​EfficientMod​​​模块与自注意机制是正交的,将​​EfficientMod​​​模块与注意力模块相结合即可得到一种新的混合设计。混合结构将原始注意力模块引入到特征尺寸相对较小的最后两个阶段,根据纯卷积型​​EfficientMod​​​对应模块的参数进行宽度和深度修改,保证进行公平比较。一共设计三个规模的混合结构,参数范从​​4M​​​到​​13M​​​,分别为​​EfficientMod-xxs​​​,​​EfficientMod-xs​​​和​​EfficientMod-s​​。

Computational Complexity analysis

除了理论计算复杂度外,论文提供了一些实际指南:

  1. 通过将更多参数移至特征分辨率较小的后期阶段来减少​​FLOPs​​​。这样做的原因在于​​EfficientMod​​​的​​FLOPs​​​基本上等于输入分辨率乘以参数数量。遵循这一指导方针,可以在后期阶段添加更多的模块或者大幅增加宽度。需要注意的是,这一指南并不仅适用于我们的​​EfficientMod​​,也可以应用于所有的全连接和卷积层。
  2. 只在最后两个阶段引入注意力模块,考虑到自注意力的计算复杂度,这是许多研究中的一种常见做法。
  3. 使用​​Repeat​​​操作来匹配通道数(两个分支的输出特征),以节省​​CPU​​​时间并仅需少量​​GPU​​​开销。​​EfficientFormer​​​观察到,对于许多模型来说,​​Reshape​​​操作通常是瓶颈。​​Reshape​​​在​​CPU​​​上运行缓慢,但在​​GPU​​​上友好。与此同时,​​Repeat​​​操作在​​CPU​​​上运行迅速,但在​​GPU​​​上耗时。如图2所示(这里应该是图标反了),选择​​Repeat​​​操作来获得最佳的​​GPU-CPU​​​延迟折衷。(这一点有点疑问,这里使用​​Repeat​​​是为了匹配少了的维度数,​​Reshape​​​应该达不到这个效果。私信了作者,这里的​​Reshape​​​实际为​​torch.broadcast_to​​函数)

Relation to Other Models

  • MobileNetV2

通过引入​​Mobile Inverted Bottleneck​​​(简称​​MBConv​​​)模块,​​MobileNetV2​​​开启了高效网络领域的新时代。与顺序排列全连接层的​​MBConv​​​模块相比,​​EfficientMod​​​模块将深度可分离卷积层分离出来,并通过逐元素乘法将其插入到两层全连接网络的中间。由于深度可分离卷积的通道数量减少,​​EfficientMod​​是一种更高效的操作,并且在性能上取得了更好的表现(由于调制操作)。

  • SENet

Experiments

对​​EfficientMod​​​在四个任务上进行验证:在​​ImageNet-1K​​​上进行图像分类, 在​​MS COCO​​​上进行目标检测和实例分割,在​​ADE20K​​​上进行语义分割。在​​PyTorch​​​中实现了所有网络,并将其转换为​​ONNX​​模型在两种不同的硬件上进行测试:

  • ​GPU​​​:选择​​P100 GPU​​​进行延迟评估,因为它可以模拟近年来大多数设备的计算能力。其他​​GPU​​可能会产生不同的基准结果,但我们观察到趋势是类似的。
  • ​CPU​​​:一些模型在不同类型的硬件上可能会产生不可预测的延迟(主要是由内存访问和零碎操作引起的),在​​Intel(R) Xeon(R) CPU E5-2680​​上的所有模型的测得延迟以进行全面比较。

对于延迟基准测试,将批处理大小分别设置为1,以模拟真实世界的应用。为了抵消方差,对每个模型重复进行​​4000​​次运行,并报告平均推理时间。遵循常见的做法,使用四个线程同时测试。

Image Classification on ImageNet-1K

​EfficientMod​​​在不同硬件上的分类精度和推理延迟方面表现出色。例如,​​EfficientMod-s​​​在​​GPU​​​上比​​EdgeViT​​​表现相同,但运行速度快了​​15​​​毫秒(约快​​73%​​​),在​​CPU​​​上快了​​11​​​毫秒(约快​​32%​​​)。此外,参数和计算复杂度也更少。​​EfficientMod-s​​​在​​GPU​​​上也比​​EfficientFormerV2-S2​​​有​​0.6​​​提升,运行速度快了​​1.8​​​毫秒(约快​​25%​​​)。需要注意的是,一些高效设计(例如​​MobileNetV2​​​和​​FasterNet​​​)注重低延迟,而其他模型则注重性能(例如​​MobileViTv2​​​和​​EdgeViT​​​),而​​EfficientMod​​​在​​GPU​​​和​​CPU​​上运行速度快且提供了最先进的性能。

为了更好地了解​​EfficientMod​​​的改进,我们以​​EfficientMod-s​​​为例,概述了每个修改的具体改进。从纯卷积基础版本到混合模型,都显示在了表2中。即使​​EfficientMod​​​的纯卷积基础版本已经以​​80.5%​​的显著结果,明显超过相关的基于卷积的网络。通过调整为混合架构,还可以进一步将性能提升至81.0%。

同时,一些方法采用了强大的训练策略,比如​​MobileOne​​​中的重新参数化和​​EfficientFormerV2​​​中的蒸馏。经过蒸馏训练,可以将​​EfficientMod-s​​​的精度从​​81.0%​​​提升到​​81.9%​​,如表3所示。

Ablation Studies

  • Compare to other Modulation models

将​​EfficientMod-xxs​​​与具有相似参数数量的​​FocalNet​​​和​​VAN-B0​​​进行比较。为了公平比较,通过减少通道或块数量的方式定制了​​FocalNet_Tiny_lrf​​​。一共测试了三种变体,选择了性能最好的一个并将其称为​​FocalNet@4M​​​。由于​​Conv2Former​​​的代码尚未完全发布,在比较中没有考虑它。从表4可以看出,​​EfficientMod​​在精度和延迟方面均优于其他调制方法。

  • Ablation of each component

在没有引入注意力和知识蒸馏的卷积​​EfficientMod-s​​​上进行实验,检验每个组件所带来的贡献。表5显示了在上下文建模分支中消除每个组件的结果。显然,所有这些组件对最终的结果至关重要,引入所有组件后获得了​​80.5%​​​的​​top-1​​​准确率。同时,还进行了一个实验来验证逐元素相乘的有效性,用求和来替代(相同的计算和相同的延迟)融合两个分支的特征。如预期一样,准确率下降了​​1%​​。显著的性能下降揭示了调制操作的有效性,特别是在高效网络中。

  • Connection to MBConv blocks

  • Context Visualization

 继承自调制机制,​​EfficientMod​​​块能够区分有信息量的上下文。在与​​FocalNet​​​相似的基础上,在​​EfficientMod-Conv-s​​​中可视化了上下文层的推理输出(沿通道维度计算均值),如图4所示。显然,​​EfficientMod​​始终捕捉到有信息量的对象,而背景受到了约束,这表明了调制机制在高效网络中的有效性。

Object Detection and Instance Segmentation on MS COCO

为验证​​EfficientMod​​​在下游任务中的性能,在​​MS COCO​​​数据集上进行了目标检测和实例分割的实验。将​​EfficientMod-s​​​应用到常用的​​Mask RCNN​​​检测器上进行验证。遵循以往研究的实现,使用调度器,即​​12​​​个​​epochs​​​来训练模型。将卷积型和混合型​​EfficientMod-s​​​与其他方法进行比较。如表7所示,​​EfficientMod​​​始终优于具有相似参数的其他方法。在没有自注意力的情况下,​​EfficientMod​​​在检测任务上比​​PoolFormer​​​高出​​4.2​​​个​​mAP​​​,在实例分割任务上高出​​3.6​​​个​​mAP​​​。当引入注意力并与混合模型进行比较时,​​EfficientMod​​在两个任务上仍然优于其他方法。

Semantic Segmentation on ADE20K

在​​ADE20K​​​数据集上进行语义分割任务的实验。考虑简单高效的设计,选择​​Semantic FPN​​​作为分割模型。遵循之前的研究,在​​8​​​个​​A100 GPU​​​上进行了​​40,000​​​次迭代训练,数据批次为​​32​​​。使用AdamW优化器对模型进行训练,使用余弦退火调度器从初始值​​2e-4​​衰减学习率。

表7中的结果表明,​​EfficientMod​​​在性能上明显优于其他方法。在没有使用注意力的情况下,卷积型​​EfficientMod-s​​​的​​mIoU​​​已经比​​PoolFormer​​​高出​​6.3​​​个百分点。此外,纯卷积型​​EfficientMod​​​甚至获得了比使用注意力方法更好的结果。在这方面,卷积型​​EfficientMod-s​​​的性能比之前的SOTA高效方法​​EfficientFormerV2​​​提升了​​1.1​​​个​​mIoU​​​。当引入​​Transformer​​​块以获得混合设计时,使用相同数量的参数甚至更少的​​FLOPs​​​也能将性能进一步提升至​​46.0​​​的​​mIoU​​​。混合型​​EfficientMod-s​​​的性能显著优于其他混合网络,分别比​​PvTv2​​​和​​EfficientFormerV2​​​高出​​3.5​​​和​​3.6​​​个​​mIoU​​。可以得出两个结论:

  1. ​EfficientMod​​的设计取得了重大进步,证明了其价值和有效性。
  2. 大的感知域对于分割等高分辨率输入任务尤为有益,而基本的注意力块(实现全局范围)可以成为高效网络的现成模块。

# 计算机视觉开发者都应掌握的10个必备工具

   计算机视觉是一个使机器能够解释和理解视觉世界的领域。其应用正在迅速扩展,从医疗保健和自动驾驶汽车到安全系统和零售。

    在本文中,我们将介绍每个计算机视觉开发人员(无论是初学者还是高级用户)都应该掌握的十个基本工具。这些工具的范围从用于图像处理的库到有助于机器学习工作流程的平台。

1. OpenCV

初级:

    OpenCV 是一个流行的开源库,专为计算机视觉任务而设计。对于初学者来说,这是一个很好的起点,因为它可以让您轻松执行图像过滤、操作和基本功能检测等任务。使用 OpenCV,您可以先学习基本的图像处理技术,例如调整大小、裁剪和边缘检测,这些技术为更复杂的任务奠定了基础。

高级:

    专家用户:随着您的进步,OpenCV 会提供各种功能,用于实时视频处理、对象检测和摄像机校准。高级用户可以将 OpenCV 用于高性能应用程序,包括将其与机器学习模型集成,或在实时系统中将其用于面部识别或增强现实等任务。

2. TensorFlow

初级:

    TensorFlow 是 Google 开发的一个功能强大的框架,用于构建和训练机器学习模型,尤其是在深度学习方面。由于其广泛的文档和教程,它对初学者友好。作为新开发人员,您可以从用于图像分类和对象检测等任务的预构建模型开始,从而了解模型如何从数据中学习的基础知识。

免费 Tensorflow 训练营

高级:

    对于高级用户,TensorFlow 的灵活性允许您构建复杂的神经网络,包括卷积神经网络 (CNN) 和用于高级图像识别任务的 Transformer。它能够从小型模型扩展到大型生产级应用程序,这使其成为任何计算机视觉专家的必备工具。此外,TensorFlow 还支持分布式训练,使其成为大规模数据集和高性能应用程序的理想选择。

3. PyTorch

初级:

    PyTorch 由 Facebook 开发,是另一个广泛用于构建神经网络的深度学习框架。其简单的 Python 性质使初学者可以轻松掌握模型创建和训练的基础知识。初学者会喜欢 PyTorch 在创建用于图像分类的简单模型方面的灵活性,而不必担心太多的技术开销。

高级:

    高级用户可以使用 PyTorch 的动态计算图,在构建复杂架构、自定义损失函数和优化器时提供更大的灵活性。对于研究人员来说,这是一个不错的选择,因为 PyTorch 提供了对视觉语言模型、生成对抗网络 (GAN) 和深度强化学习等尖端模型的无缝实验。由于其高效的内存管理和 GPU 支持,它在处理大型数据集方面也表现出色。

4. Keras

初级:

    Keras 是一个运行在 TensorFlow 之上的高级神经网络 API。它非常适合初学者,因为它抽象了构建深度学习模型所涉及的大部分复杂性。借助 Keras,您可以快速为图像分类、对象检测等任务甚至更复杂的任务(如分割)构建模型原型,而无需具备广泛的深度学习算法知识。

高级:

    专业用户:对于更有经验的开发人员来说,Keras 仍然是一个有用的工具,可以在深入研究自定义之前快速构建模型原型。Keras 不仅简化了流程,还允许用户通过直接与 TensorFlow 集成来扩展他们的项目,从而让高级用户能够控制微调模型和管理大型数据集的性能优化。

5. PaddlePaddle (用于光学字符识别的 PaddleOCR)

初级:

    PaddlePaddle 由百度开发,通过其 PaddleOCR 模块提供了一种简单的方法来处理光学字符识别 (OCR) 任务。初学者可以快速设置 OCR 模型,以最少的代码从图像中提取文本。API 的简单性使您可以轻松地将预先训练的模型应用于您自己的项目,例如扫描文档或从图像中实时读取文本。

高级:

    Professional 用户可以在自己的数据集上自定义架构和训练模型,从而受益于 PaddleOCR 的灵活性。该工具允许针对特定的 OCR 任务进行微调,例如多语言文本识别或手写文本提取。

PaddlePaddle 还可以与其他深度学习框架很好地集成,为复杂管道中的高级实验和开发提供了空间。

6. 标注工具(例如 Labelbox、Supervisely)

初级:

    标注工具对于创建带注释的数据集至关重要,尤其是对于计算机视觉中的监督学习任务。Labelbox 和 Supervisely 等工具通过提供直观的用户界面简化了图像注释过程,使初学者可以更轻松地创建训练数据集。无论您是在执行简单的对象检测还是更高级的分割任务,这些工具都可以帮助您开始进行正确的数据标记。

高级:

    处理大规模数据集的经验丰富的专业人员,Supervisely 等标记工具提供自动化功能,例如预注释或 AI 辅助标记,从而显着加快流程。这些工具还支持与您的机器学习管道集成,从而实现团队之间的无缝协作并大规模管理注释。专业人士还可以利用基于云的工具进行分布式标签、版本控制和数据集管理。

7. NVIDIA CUDA 和 cuDNN

初级:

    CUDA 是 NVIDIA 开发的并行计算平台和编程模型,而 cuDNN 是用于深度神经网络的 GPU 加速库。对于初学者来说,这些工具可能看起来很技术性,但它们的主要目的是利用 GPU 功能加速深度学习模型的训练。通过在训练环境中正确设置 CUDA 和 cuDNN,可以显著提高模型训练的速度和优化,尤其是在使用 TensorFlow 和 PyTorch 等框架时。

高级:

    专家可以利用 CUDA 和 cuDNN 的全部功能来优化高要求应用程序的性能。这包括为特定操作编写自定义 CUDA 内核、有效管理 GPU 内存以及微调神经网络训练以实现最大速度和可扩展性。这些工具对于使用大型数据集并需要模型具有顶级性能的开发人员来说是必不可少的。

8. YOLO(你只看一次)

初级:

    YOLO 是一种快速对象检测算法,在实时应用程序中特别受欢迎。初学者可以使用预先训练好的 YOLO 模型,通过相对简单的代码快速检测图像或视频中的对象。YOLO 的易用性使 YOLO 成为那些希望探索对象检测而无需从头开始构建复杂模型的用户的绝佳切入点。

高级:

    YOLO 提供了在自定义数据集上微调模型以检测特定对象的机会,从而提高了检测速度和准确性。YOLO 的轻量级特性使其能够部署在资源受限的环境(如移动设备)中,使其成为实时应用程序的首选解决方案。专业人士还可以尝试使用较新版本的 YOLO,调整参数以满足特定的项目需求。

9. DVC(数据版本控制)

初级:

    DVC 是机器学习项目的版本控制系统。对于初学者,它有助于管理和跟踪数据集、模型文件和实验,从而轻松保持一切井井有条。DVC 不是像 Git 那样仅对代码进行版本控制,而是确保持续跟踪您正在处理的数据和模型,从而减少手动管理机器学习项目数据的麻烦。

高级:

    专家用户可以将 DVC 用于大型项目,从而实现可重复性和跨团队协作。DVC 与现有工作流程完美集成,可以更轻松地管理多个实验、跟踪大型数据集中的更改以及根据以前的运行优化模型。对于复杂的机器学习管道,DVC 通过将所有内容保持在版本控制之下来帮助简化工作流程,确保从数据收集到模型部署的一致性。

10. Git 和 GitHub

初级:

    Git 和 GitHub 是版本控制和协作的重要工具。初学者会发现 Git 对于管理项目历史记录和跟踪更改很有用,而 GitHub 允许与他人轻松共享代码。如果您刚开始接触计算机视觉,学习 Git 可以帮助您维护井井有条的项目工作流程、协作处理开源项目并熟悉基本的版本控制技术。

高级:

    经验丰富的专业人员可以利用 Git 和 GitHub 来管理复杂的研究项目,处理来自多个开发人员的贡献,并确保大型存储库中的版本一致性。GitHub Actions 允许工作流程自动化,例如测试和部署模型,这对于机器学习管道中的持续集成和部署 (CI/CD) 特别有用。高级用户还可以从使用 Git LFS(大文件存储)来管理其 Git 项目中的大型数据集中受益。

综述

    OpenCV 和 Keras 等工具为初学者提供了简单的切入点,而 PyTorch、TensorFlow 和 DVC 等高级选项则帮助经验丰富的开发人员应对更复杂的挑战。

    使用 CUDA 进行 GPU 加速,使用 YOLO 进行高级对象检测,并使用标记工具进行高效数据管理,确保您可以有效地构建、训练和部署强大的模型。

# 使用姿态估计算法构建简单的健身训练辅助应用程序

    姿势估计是一个研究深入的领域,可应用于动作识别、活动跟踪、增强现实、动画、游戏等。姿势估计的目标是检测图像或视频中人体部位(如关节和四肢)的位置和方向。

    姿态估计主要有两种方法:单人姿势估计和多人姿势估计。单人姿势估计可以找出图像中一个人的姿势。它知道这个人在哪里,以及要寻找多少个关键点,这是一个回归问题。多人姿势估计则有所不同。它试图解决一个更难的问题,即图像中有多少人,他们的位置都是未知的。

    单人姿势估计可以进一步分为两种框架:基于直接回归和基于热图。基于直接回归的框架从特征图中预测关键点。基于热图的框架生成图像中所有关键点的热图,然后使用其他方法构建最终的火柴人图。

寻找正确的关键点检测模型

    目前可用的一些最佳模型(例如OmniPose)拥有令人印象深刻的准确性。同样引起我注意的是OpenMMLab 的姿势估计工具箱。它为与姿势估计相关的所有内容提供了一个全面而强大的框架,包括用于比较不同模型的基准。

    我一直在寻找一个简单而轻量级的解决方案,因此我决定使用 Google 的 MoveNet。MoveNet 是一个紧凑而高效的姿势估计模型,非常适合移动和嵌入式设备。MoveNet 只有约 4M 个参数,而 OmniPose 有约 68M(精简版约 20M)。它的小巧和简单使其成为我项目的理想选择,让我可以快速进行实验和原型设计,而无需大量计算资源。虽然它可能无法提供与某些更高级模型相同的准确度,但它是我项目的绝佳起点。

MoveNet

    MoveNet 是如何工作的呢?简而言之,MoveNet 使用热图来准确定位人体关键点。这是一个自下而上的估计模型,这意味着它首先检测一个人的人体关节,然后将这些关节组装成姿势。

    MoveNet 架构由两个主要组件组成:

    1. 特征提取器:带有附加特征金字塔网络的 MobileNetV2。MobileNetV2 是一种轻量级卷积神经网络,非常适合移动和嵌入式设备。特征金字塔网络允许 MoveNet 以多种尺度捕获特征,这对于检测距离摄像头不同距离的关键点非常重要。

    2. 预测器头:一组预测器头连接到特征提取器。这些预测器头负责预测:

  • 实例(人)的几何中心
  • 该人的完整关键点
  • 所有关键点的位置
  • 从每个输出特征图像素到每个关键点的精确子像素位置的局部偏移

图片

    MoveNet 可在 TensorFlow Hub 上使用,并附带大量教程、文档和随附代码,让我的入门尽可能顺利。但真正让我印象深刻的是,MoveNet 甚至可以在浏览器中运行,在大多数现代设备(包括智能手机)上实现 30+ FPS。这使其成为健身、健康和保健应用的理想选择,因为实时反馈和低延迟至关重要。

https://www.tensorflow.org/hub/tutorials/movenet

提取关键点

    MoveNet 可检测全身从鼻子到脚踝的 17 个关键点。该模型输出一个 17x3 的张量,其中每行代表关键点的标准化 X 和 Y 坐标以及置信度分数。

图片

    我对记录的结果进行了定性分析,对关键点检测的质量感到满意。该模型能够准确地检测出我身体上的关键点,但我的记录光线充足,角度清晰。该模型提供的置信度分数也很好地表明了检测的可靠性,让我能够过滤掉任何置信度低的关键点。

    总的来说,MoveNet 模型的性能给我留下了深刻的印象,并发现它是从我的记录中提取关键点的可靠工具。

从帧到序列——对齐记录

    虽然从单个帧中提取关键点是至关重要的一步,但这对于实际应用来说还不够。我们必须把眼光放得更远,而不仅仅是单个帧,还要考虑到记录可能不完全对齐的事实。在这种情况下,逐帧比较关键点会产生错误的结果。如果一个记录比另一个记录早几分之一秒开始,那么两个记录中的关键点就不会匹配,即使动作相同。为了让分数真正有用,我必须对齐每个记录的帧。

    为了实现这一点,我在视频编辑软件中手动完成了大部分工作。我修剪和调整了录音,以确保它们同步。为了进一步完善对齐,我使用了动态时间扭曲 (DTW)。这是一种允许比较可能具有不同长度或时间的序列的技术。DTW 有助于微调对齐,确保每个录音的关键点尽可能准确地匹配。

    在我的简单用例中,使用 DTW 细化进行手动对齐是可行的。这是一项劳动密集型工作,因此,对于实际应用来说,这不是一个可扩展的解决方案。对于此类应用,对齐记录的过程必须自动化。这是另一个挑战,也是一篇完全独立的文章的主题。自动对齐需要开发能够准确同步记录的算法,即使在存在噪声、可变性和其他现实世界复杂性的情况下也是如此。

图片

比较动作

    现在我已经对齐了序列,我需要将我的动作与专业人士的动作进行比较。为此,我使用了余弦相似度,这是姿势估计问题领域中广泛使用的度量。

    余弦相似度是两个向量之间相似度的度量,计算两个向量之间角度的余弦。在姿势估计中,它通常用于比较两组关键点(例如身体关节或面部特征点)之间的相似度。余弦相似度指标之所以被广泛使用,是因为它对比例和旋转变化具有很强的鲁棒性,非常适合比较姿势。

    这个简单的指标还有许多变体,我尝试了其中几个来查看它们的表现。结果和想法如下。

    我录了两次自己的动作——第一次我尽可能正确地做这个练习(下面 GIF 的左侧)。第二次我尝试做错(下面 GIF 的右侧)——注意在动作的第一阶段我的背部前倾太多。做这个练习的专业人士在中间(参考)。

图片

左:我正确地做运动,中:专业人士,右:我错误地做运动。

简单余弦相似度

    我能想到的最简单的衡量标准就是一次性查看整个动作。我只需将所有关键点连接成一个形状为[num_frames * 17 (num_keypoints) * 2 (coordinates)]的向量,然后计算我和专业人士之间的余弦相似度。结果是:

  • cos_sim(correct_movement, professional) = 0.8409
  • cos_sim(incorrect_movement, professional) = 0.8255

    显然,第二次运动与参考运动的相似度较低,但差异的幅度(0.0154)并不大。

逐帧计算并平均

    我的第二种方法是利用帧对齐的事实,计算相应帧上的关键点(在相应的运动阶段)的余弦相似度并取平均值。

图片

左:我正确地做运动,中:专业人士,右:我错误地做运动。

图表展示逐帧余弦相似度。

    看看上面的图表,我可以得出这样的结论:右侧的运动与参考运动不太相似(因此更糟糕)。右侧的分数一直下降到 0.79,并且(几乎)总是低于左侧的分数。

    平均分数几乎与第一种方法相同:

  • mean cos_sim(correct_movement, professional) = 0.8411
  • mean cos_sim(incorrect_movement, professional) = 0.8256
  • median cos_sim(correct_movement, professional) = 0.8399
  • median cos_sim(incorrect_movement, professional) = 0.8257

加权相似度

    我还没有利用 MoveNet 返回的第 3 个分数——关键点置信度分数。

参考记录上的关键点置信度

    一些关键点(如左肘)在参考记录中几乎看不见。当我尝试从类似的角度进行记录时,我的记录也是如此。

    在计算加权余弦相似度时,我使用置信度分数作为权重。它应该会更多地关注两个记录中清晰可见的关键点。这种方法得出了以下分数:

  • mean cos_sim(correct_movement, professional) = 0.8135
  • mean cos_sim(incorrect_movement, professional) = 0.7976

    分数可以证实,第二次动作比第一次动作差,但差别很小。对于生产用途,必须进一步调整指标。

未来的改进

    当我回顾我的项目时,我发现有两个主要方面可以改进:

    从技术角度来看,有几种方法可以增强姿势估计算法。例如,改进和调整比较指标可以更准确地评估运动形式。另一种方法可能是专注于分析骨骼或整个肢体,而不仅仅是关节,这可能会提供对运动的更全面理解。此外,确保算法不受摄像机角度、光照条件和其他环境因素的影响将使其更加稳健和可靠。

    第二个需要改进的领域是生产化。为了创造无缝的用户体验,我需要完全自动化整个过程,这需要投入更多时间进行预处理和对齐数据。这将涉及弄清楚如何简化工作流程,处理潜在的技术问题,以及设计直观的界面。此外,建立一个具有各种设置(例如不同的摄像机角度和环境)的综合练习库对于为用户提供多种练习选项和场景至关重要。


http://www.mrgr.cn/news/59501.html

相关文章:

  • vue3中计算属性的用法以及使用场景
  • 硬件设计-PCIe时钟抖动测量
  • list 的实现
  • Vue学习记录之二十二 Vue3+vite+electron 构建项目实例
  • 转录组上游分析流程(四)
  • easyui textbox onchange事件
  • 深度学习模型预测控制python tensorflow 实现
  • Rust 力扣 - 3. 无重复字符的最长子串
  • Spring Cache-基于注解的缓存
  • 以蚂蚁借呗、抖音放心借、美团借钱为例,聊聊企业如何计算期末资产收益率
  • C++和OpenGL实现3D游戏编程【连载16】——详解三维坐标转二维屏幕坐标(向量和矩阵操作实战)
  • (六)问题记录,simulink仿真出现模型碰撞后穿越
  • 【ChatGPT】如何利用ChatGPT进行复杂任务的分解
  • 100种算法【Python版】第13篇——埃拉托斯特尼素数筛法
  • 信息安全入门——网络安全威胁
  • list补充
  • apply,call,bind手写
  • 质量漫谈一
  • xss-labs靶场第十七关测试报告
  • 照片怎么转换成pdf?盘点6种图片转pdf格式有效方法,直击要点!
  • 【Spring MVC】响应结果和设置
  • linux学习笔记 常用命令记录
  • cookie 简介
  • GEE app:全球油棕,橡胶,其他树木,灌木,裸地,水的可视化界面
  • 基于STM32F103的FreeRTOS系列拓展·内存管理
  • 微信好友智能管理神器:微动RPA,重塑私域流量构建新纪元 批量自动添加好友