Omni-ScaleFeatureLearningforPersonRe-Identification简记

作者提供了一个很好的reid baseline:https://github. com/KaiyangZhou/deep-person-reid.

Motivation:

有些特征不能光在一个scale上学,要在不同的scale进行区分,这里的scale指的是不同感受野,作者称为omni-scale, 提出的网络叫Omni-ScaleNetwork(OSNet),其本质就是不同支路有不同的感受野,关注到不同scale的信息,这早就有人做过,而作者为什么就脱颖而出呢?首先作者提了一个unified aggregation gate (AG)对不同scale的信息做不同的加权,其次作者将传统卷积网络利用深度可分离卷积做了分解,然后一层一层的叠加,最终网络相当轻量级,而效果也很好。一个例子说明需要多个尺度而不能仅依靠单个尺度(如全局语义)如下:
在这里插入图片描述
其中每组图中,最左边是anchor,中间是TP,右边是普通算法会判定为FP的图像,因为总体上看很像,想仔细区分开需要从不同尺度来看,比如a图从背包看,衣服颜色看都不行,必须看上衣logo才行,b图又要看背包,c图要看携带和衣服logo,d图则要看衣服logo和鞋子。因此,单个尺度是办不到的,必须多尺度,也就是本文讲的omni-scale。

当然,以前也不是没有做多尺度(multi-scale)或多流(multi-stream)的,比如Inception和ResNeXt,而这篇文章和他们都有区别。首先,这篇文章中的多尺度是严格设计过的(式2或图4b);其次,Inception是多个尺度,不同块有不同感受野,但手工mix各块特征,ResNeXt则多流,但每个流都是相同尺度;而最后,Inception和ResNeXt最后mix各块的特征时,要么concat,要么直接add,但我们时设计了AG来自动加权,让网络自己决定哪个尺度更重要。

How?

变普通卷积为深度可分离卷积----节省参数,能做成轻量级网络

深度可分离卷积:
将卷积分解为depthwise卷积和pointwise卷积,即:
在这里插入图片描述
变换成
在这里插入图片描述
这省了很多参数。而作者进行了一点修改,就是先pointwise再depthwise,即
在这里插入图片描述
也就是先增加channel,再降低feature map size。修改后的叫Lite 3*3卷积,结构如下:
在这里插入图片描述

多尺度

普通基于残差的单尺度的结构可以表示为:
在这里插入图片描述
而本文构建的多尺度版本为:
在这里插入图片描述

其中T=4。综上结构可以表示为:在这里插入图片描述这也就是一个block,然后和ResNet那样将这个block一个个的叠加起来,就是最终的网络,而网络结构为:
在这里插入图片描述

Unified Aggregation Gate

当然图4中还有一个AG模块(Unified Aggregation Gate)我们没有解释,但这其实就是一个对不同尺度的特征做加权的东西,而且各个stream的AG共享参数。加权过程公式化如下:
在这里插入图片描述
其中, x t x^t xt就是每个stream(尺度)得到的特征,而 G ( x t ) G(x^t) G(xt)就是将这个特征通过AG网络(各支路共享参数)进行前向传播,计算出一个权重,不过值得注意的是,以前的做法是把这个权重做成一个数,但作者做成了一个向量(设为c1维),对这个支路的特征(设为w1h1c1维)按channel进行加权,最后把四个支路的结果加起来,代码为:
在这里插入图片描述
而设计的该AG模块是可微的(反传),而且很简单,如下:
在这里插入图片描述
然后就是AG模块的网络结构,也就是G的部分,如下:
在这里插入图片描述

实验

在多个数据集上(大小数据集都有)的效果都相当不错
大数据集,如Market1501, CUHK03, DukeMTMC-reID, MSMT17是深度学习ReID的主流;
小数据集,如VIPeR和GRID上效果好,说明网络足够lightweight。

效果如下:
在这里插入图片描述
在这里插入图片描述
效果都相当傲人

消融

在这里插入图片描述
上面的11个模型分别是:

  1. 本文的模型
  2. 全卷积网络,比本文好一点,但参数多多了
  3. ResNeXt类似的结构,多个支路分别学习相同的尺度信息
  4. 多尺度但是不同尺度的结构不是本文这样的加权(去掉AG),代之以concat和add(其实本文去掉AG后各个特征也是add的,但每个支路特征在channel上经过了AG加权)
  5. 4中是concat,5中是add
  6. AG不共享参数
  7. 本文是对每个特征按channel进行加权,然后各个支路add起来,但6中是之前提到的,每个支路学一个权重值(而不是向量),然后add过程经过这些权重加权。
  8. 特征的各个通道经过相同的权重加权,最后再不同支路add
  9. 单尺度
  10. 双尺度
  11. 三尺度
    当然2最好,但是1效果次好,最轻量化
轻量化

在这里插入图片描述

方法的有效性可视化

下图证明本文的方法确实是各个尺度都关注了:
在这里插入图片描述

激活图展示:
在这里插入图片描述

在这里插入图片描述
左中右分别是原图,多尺度,单尺度。而单尺度主要关注脸,但reid图像分别率很低,这种不可靠,本文方法则更合适。

在属性识别上的应用

在这里插入图片描述

在分类任务上的应用

在这里插入图片描述
在这里插入图片描述

跨域

在这里插入图片描述

值得注意的是,本文的结构是softmax损失(label smooth)上训练出来的。

文章中还有两个参数,分别是beta和gamma,在表6中调过了,其中gamma决定了图像输入大小,而beta不是很理解,原文是:
在这里插入图片描述
不同的gamma和beta参数能得到不同的性能,当然参数也不同,可做trade-off。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Omni-Notes是一款开源的笔记应用程序,它使用Java语言编写,采用了Material Design风格。以下是Omni-Notes的代码分析: 1. 数据库 在Omni-Notes中,使用了SQLite作为数据库。数据库的实现在`com.github.omni.notes.db`包中。其中,`DatabaseHelper`类是SQLiteOpenHelper的子类,用于创建和更新数据库。`NotesDao`和`AttachmentsDao`类是访问数据库的接口,用于插入、更新、删除和查询数据。 2. 笔记 Omni-Notes中的笔记类是`Note`,它包含了笔记的标题、内容、创建时间、修改时间、颜色、提醒时间、是否归档、是否固定、是否被删除等属性。笔记的操作在`com.github.omni.notes.notes`包中实现,例如创建笔记、更新笔记、删除笔记、查询笔记等。 3. 图片和附件 Omni-Notes支持添加图片和附件到笔记中。图片和附件的操作在`com.github.omni.notes.attachments`包中实现,例如添加图片、添加附件、删除图片、删除附件等。Omni-Notes使用了开源库Glide来加载和显示图片。 4. UI界面 Omni-Notes的UI界面使用了Material Design风格,其中包括了笔记列表、笔记编辑、提醒设置、归档笔记等界面。UI界面的实现在`com.github.omni.notes.ui`包中,使用了开源库ButterKnife来进行View注入。 5. 其他 Omni-Notes还使用了一些开源库,例如RxJava、Dagger2、EventBus等。它还支持备份、恢复、同步等功能。整个应用程序的代码规范良好,结构清晰,易于阅读和维护。 以上是对Omni-Notes代码的简要分析,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值