FashionSearchNet
(写了一半,现在认为,这种方法就是在AMNet的基础上添加了属性定位)
针对于图像检索中替换属性的问题,一个难点就在于如何表示产品中每个属性的特征。FSNet使用了一种弱定位的方法提取属性区域。通过这种方式,能够使不相关的部分不再对图像检索产生影响。
1. FSNet使用背景
有部分学者已经对如何替换图像中的属性做出了自己的研究,如AMNet。但是这些方法都没有从属性定位的方面进行探索。属性定位其实是由Learning Deep Features for Discriminative Localization这篇论文提出的,在本文中也得到了很好的使用。
2. FSNet核心要点
1. 属性定位
首先使用类似Alexnet的结构对图像进行属性定位。属性定位的方法来自于Learning Deep Features for Discriminative Localization。属性定位就是为了更好的表示一种属性。在神经网络中输入一张图片,通过Alexnet进行卷积,但将Alexnet的两个全连接层换成卷积层,并进行GAP操作,GAP公式如下:
∑
k
(
x
I
(
k
)
=
∑
i
,
j
c
o
n
v
7
k
(
I
,
i
,
j
)
)
\sum_{k}(x_{I}(k)=\sum_{i,j}conv7_{k}(I,i,j))
k∑(xI(k)=i,j∑conv7k(I,i,j))
这里的
x
I
(
k
)
x_{I}(k)
xI(k)是图像
I
I
I中的第
k
k
k个通道,
c
o
n
v
7
k
(
I
,
i
,
j
)
conv7_{k}(I,i,j)
conv7k(I,i,j)是第七卷积层中的第k个特征图的
(
i
,
j
)
(i,j)
(i,j)这个位置。进而我们可以定义属性激活图AAMs为:
M
a
c
(
I
,
i
,
j
)
=
∑
k
W
a
(
k
,
c
)
c
o
n
v
7
K
(
I
,
i
,
j
)
M_{a_{c}}(I,i,j)=\sum_{k}W_{a_{(k,c)}}conv7_{K}(I,i,j)
Mac(I,i,j)=k∑Wa(k,c)conv7K(I,i,j)
这里的c是类别,
W
a
(
k
,
c
)
W_{a_{(k,c)}}
Wa(k,c)就是属性a在第k个特征图里属于类别c的权重。
W
a
W_{a}
Wa使用下述的分类损失函数进行更新:
L
c
=
−
∑
I
=
1
N
∑
a
=
1
A
l
o
g
(
p
(
g
I
a
∣
x
I
w
a
)
)
L_{c}=-\sum_{I=1}^{N}\sum_{a=1}^{A}log(p(g_{I_{a}}|x_{I}w_{a}))
Lc=−I=1∑Na=1∑Alog(p(gIa∣xIwa))
这里
g
I
a
g_{I_{a}}
gIa代表第
I
I
I张图里第
a
a
a个属性的ground truth(参考标准)。
x
I
w
a
x_{I}w_{a}
xIwa计算了
a
a
a属性在
I
I
I图像中的权重。
N
N
N是训练样本的数目,
A
A
A是属性的数量。概率
p
p
p也就描述了
x
I
w
a
x_{I}w_{a}
xIwa被分类成
g
I
a
g_{I_{a}}
gIa的概率。
在特征激活图中,像素值高于最大值20%的部分被分割出来,放入bounding box中,作为一种属性的表示。分类之后,我们可以得到每个bbox的标签表示,也就是初步的属性分类。
2. 属性确认
我们得到bbox后,利用bbox,对conv5进行ROI pooling操作,就可以很好的表达出属性了。这里可能会有同学问,那我直接对conv5的整张特征图进行ROI pooling不行吗?来看下面一种情况:
如果直接进行ROI pooling,因为anchor图像和neg图像在整体颜色上会更相近,所以dis(anchor,neg)可能会小于dis(anchor,pos).但是实际上anchor和pos的袖口属性才是一致的。所以将属性进行定位,选出最能表示属性的区域进行训练才是最有效的。并且个人认为,这样的解释性会更强。
对于图像中不同属性代表的不同区域,采用与softmax思路相似的triplet ranking loss进行排序,softmax function定义如下:
d
+
(
h
(
I
^
)
,
h
(
I
+
)
,
h
(
I
−
)
)
=
e
x
p
(
∣
∣
h
(
I
^
)
−
h
(
I
+
)
∣
∣
2
)
e
x
p
(
∣
∣
h
(
I
^
)
−
h
(
I
+
)
∣
∣
2
)
+
e
x
p
(
∣
∣
h
(
I
^
)
−
h
(
I
−
)
∣
∣
2
)
d^{+}(h(\hat I),h(I^{+}),h(I^{-}))=\frac {exp(||h(\hat I)-h(I^{+})||_{2})}{exp(||h(\hat I)-h(I^{+})||_{2})+exp(||h(\hat I)-h(I^{-})||_{2})}
d+(h(I^),h(I+),h(I−))=exp(∣∣h(I^)−h(I+)∣∣2)+exp(∣∣h(I^)−h(I−)∣∣2)exp(∣∣h(I^)−h(I+)∣∣2)
d
−
(
h
(
I
^
)
,
h
(
I
+
)
,
h
(
I
−
)
)
=
e
x
p
(
∣
∣
h
(
I
^
)
−
h
(
I
−
)
∣
∣
2
)
e
x
p
(
∣
∣
h
(
I
^
)
−
h
(
I
+
)
∣
∣
2
)
+
e
x
p
(
∣
∣
h
(
I
^
)
−
h
(
I
−
)
∣
∣
2
)
d^{-}(h(\hat I),h(I^{+}),h(I^{-}))=\frac {exp(||h(\hat I)-h(I^{-})||_{2})}{exp(||h(\hat I)-h(I^{+})||_{2})+exp(||h(\hat I)-h(I^{-})||_{2})}
d−(h(I^),h(I+),h(I−))=exp(∣∣h(I^)−h(I+)∣∣2)+exp(∣∣h(I^)−h(I−)∣∣2)exp(∣∣h(I^)−h(I−)∣∣2)
其中
I
^
\hat I
I^表示ref 图像,
I
+
I^{+}
I+表示pos图像,
I
−
I^{-}
I−表示neg图像.
h
(
I
)
h(I)
h(I)就是第
I
I
I层中的图像表示。因为
d
−
d^{-}
d−可以用
d
+
d^{+}
d+表示,同时当
h
=
f
c
10
_
a
h=f_{c_{10\_a}}
h=fc10_a时(第10层中c类别代表的是a属性),排序损失函数可以写做:
L
T
=
∑
I
=
1
N
∑
a
=
1
A
d
+
(
f
c
10
_
a
(
I
^
)
,
f
c
10
_
a
(
I
+
)
,
f
c
10
_
a
(
I
−
)
)
L_{T}=\sum_{I=1}^{N}\sum_{a=1}^{A}d^{+}(f_{c_{10\_a}}(\hat I),f_{c_{10\_ a}}(I^{+}),f_{c_{10\_a}}(I^{-}))
LT=I=1∑Na=1∑Ad+(fc10_a(I^),fc10_a(I+),fc10_a(I−))
这里A是属性数量。我们通过rank loss最小化
∣
∣
f
c
10
_
a
(
I
^
)
,
f
c
10
_
a
(
I
+
)
∣
∣
2
||f_{c_{10\_a}}(\hat I),f_{c_{10\_a}}(I^{+})||_{2}
∣∣fc10_a(I^),fc10_a(I+)∣∣2,最大化
∣
∣
f
c
10
_
a
(
I
^
)
,
f
c
10
_
a
(
I
−
)
∣
∣
2
||f_{c_{10\_a}}(\hat I),f_{c_{10\_a}}(I^{-})||_{2}
∣∣fc10_a(I^),fc10_a(I−)∣∣2。最终得到训练好的
f
c
10
_
a
f_{c_{10\_a}}
fc10_a
3. 属性修改器
有了不同的属性表示方法,想要修改一些属性就很直接了。在训练后,将有相同attribute value的图片提取特征并取平均,需要替换的时候,这些averaged features就可以直接将不需要的特征进行替换(与AMNet的思路相同)
4. 进一步优化
通过ROI Pooling层,我们可以得到一系列的图像特征向量。如果直接将这些向量连接,虽然结果会好一点,但是会导致向量处理起来过于庞大。为了让整个网络速度更快,作者使用了权重矩阵
W
a
W^{a}
Wa让全连接层的特征向量减少到4096个。同时,由于一些属性会更重要,一些属性会不那么重要,比如,当人们选择衣服的时候,大多数人还是会更关注衣服的颜色,而不是衣服的材质。所以使用附加的的loss function来对权重矩阵
W
a
∗
W_{a^{*}}
Wa∗进行训练也是有必要的。融合全连接层的表达式如下:
F
(
I
,
a
∗
)
=
[
f
c
10
_
1
(
I
)
λ
1
,
a
∗
,
.
.
.
,
f
c
10
_
1
(
I
)
λ
a
,
a
∗
]
W
a
∗
F(I,a^{*})=[f_{c_{10\_1}}(I)\lambda _{1,a^{*}},...,f_{c_{10\_1}}(I)\lambda_{a,a^{*}}]W_{a^{*}}
F(I,a∗)=[fc10_1(I)λ1,a∗,...,fc10_1(I)λa,a∗]Wa∗
相应的全局排序损失函数定义为:
L
G
=
∑
I
=
1
N
∑
a
∗
=
1
A
+
1
d
+
(
F
(
I
^
,
a
∗
)
,
F
(
I
+
,
a
∗
)
,
F
(
I
−
,
a
∗
)
)
L_{G}=\sum_{I=1}^{N}\sum_{a^{*}=1}^{A+1}d^{+}(F(\hat I,a^{*}),F(I^{+},a^{*}),F(I^{-},a^{*}))
LG=I=1∑Na∗=1∑A+1d+(F(I^,a∗),F(I+,a∗),F(I−,a∗))
这里的
a
∗
a^{*}
a∗,就是经过属性修改器,替换了不需要的属性后的属性。
通过最终的优化,我们就可以得到图像的F向量。
3. FSNet 流程

- 依次将所有的train图片经过7层conv,再使用GAP对图像的属性进行定位,并通过 L c L_{c} Lc分类函数,得到第一部分的输出:bbox及标签。
- 将第一部分训练得到的bbox加入到conv5中,通过ROI pooling,将输入的大小固定,并通过一系列全连接层的处理,得到多个1024维的向量,每一个向量都代表了一种属性。再对每一个向量都进行分类和排序损失,得到第二部分输出:每个属性的向量表示。注意:进行排序和分类损失计算的时候,所选的anchor和pos属性必须属于同一标签。
- 将第二部分得到的属性向量,通过权重矩阵的方式整合成一个4096维向量,再通过全局的排序损失,得到最终输出F。注意,如果用户有额外的需求,比如想把红色属性换成黄色属性,就可以直接修改第二部分得到的属性向量。进行排序计算的时候,所选的anchor和pos属性必须相同。
- 经过大量的图片训练,可以得到训练好的 W a ( k , c ) W_{a_{(k,c)}} Wa(k,c), W a ∗ W_{a^{*}} Wa∗等权重矩阵。利用这些矩阵和卷积层,对test图像进行计算得到test图像的 F F F向量,与图库中的图像的 F F F进行欧式距离计算,选出最相近的K张图像。
4. 总结
疑问
- p ( g I a ∣ x I w a ) p(g_{I_{a}}|x_{I}w_{a}) p(gIa∣xIwa)是怎么算的?
感受
属性定位的方法真的不错,我认为这样的训练是比AMNet更好的,作者的后续实验也证明了这一点。最后加了一个全局排序损失,也是有理有据的。