i. N0 \ x; `6 \; o R7 `( O! R$ a, ]
首先,让我们定义一个 N-way-K-Shot-分类问题。 % Z( L5 D8 x; j7 E% u6 {4 f7 i: [- V# L; R, T: `7 f ~% K
. {3 b) N7 U) e' U' ^假定一个训练集,包括N 类标签,每类K个标记图像(少量,每类少于十个样本),Q张测试图片。 3 Z& V: Q% W' A - O H( W) Q& K* d4 ?$ `& v. O; f8 S- O# V( v
我们想在 N 个类别中对 Q 张测试图片进行分类。 训练集中的 N * K 个样本是我们仅有的样本。这里的主要问题是没有足够的训练数据。/ w# ?' ~) M0 z) T
) X) w& J" m/ I& z1 K0 G
6 S* X) n. T& m: j6 P$ Y8 l[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cCXhSj92-1624719145930)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)] 1 G( y0 }+ o* _$ T! F 2 e* x& ~4 M* Y! N$ f7 g 5 y( I& U- V0 o* H% v9 |FSL 任务的第一步是从其他类似问题中获得经验。这就是为什么少样本学习被描述为元学习问题的原因。, S/ w @. N0 G) v
1 r% t" C) G. F: b0 h5 y " U/ B; h9 l- Z: V在传统的分类问题中,我们尝试从训练数据中学习如何分类,并使用测试数据进行评估。在元学习中,我们学习如何学习给定一组训练数据进行分类。 我们将一组分类问题用于其他不相关的集合。9 F0 U, E6 l! y) V# t
, u+ l! v v/ a( H; g, K9 o/ |) e7 e( w; k$ L
在解决 FSL 问题时,通常考虑两种方法: ' X( c: Y. A- z" t+ v) L; |9 ~: h9 R
6 q) w) V8 V9 z7 p
数据级方法 (Data-level approach,DLA)4 e: g5 g5 w/ B. O/ T
& s3 S" o0 d1 d& C0 _: Z1 Z; T9 Y
8 _2 j, K7 @# ?, i% j* a- T0 o1 F参数级方法 (Parameter-level approach,PLA) # {/ ^. \. B1 _/ t8 x+ ^: Q# g7 m! V) M; m0 A
4 Z) ^( s) [. ]# |5 S2 h1 ]
数据级方法, M6 s: E: |! q* ?7 K
这个方法真的很简单。 它基于这样一个概念:如果没有足够的数据来构建可靠的模型并避免过度拟合和欠拟合,只需要简单地添加更多数据。 6 }7 R- _- w1 {/ l3 U( m6 z( F) b8 d5 O" W: l7 B2 y
$ K! N/ Q4 a8 T* ^
这就是为什么通过使用来自大型基础数据集的附加信息来解决许多 FSL 问题的原因。基础数据集的关键特征是它没有在训练集中为Few-Show任务提供的类。 例如,如果想对特定鸟类进行分类,基础数据集可以包含许多其他鸟类的图像。 : r, H4 F: G; N/ D 1 P2 L) G& y3 _* y $ o3 T: }2 z( h! }) i$ t我们也可以自己产生更多的数据。为了达到这个目标,我们可以使用数据增强,甚至生成对抗网络(GAN)。$ M3 x/ o7 @$ j' c% c% Z
5 X8 `; k' Y8 V3 `' y7 q+ C. C
' a( R) k' C* m% I. H
参数级方法 ; z$ }4 C, g) B' A$ g( {4 s从参数级别的角度来看,Few-Shot Learning 样本很容易过拟合,因为它们t通常具有广泛的高维空间。. Z* t" r4 ~$ u, T3 [. U
+ y* g% O. n5 K0 i" K! q1 C
1 e. n( n2 |4 ^. X: n- p0 K h, X
为了克服这个问题,我们应该限制参数空间并使用正则化和适当的损失函数。 该模型将对有限数量的训练样本具有泛化能力。 1 ^6 i3 s) r; N/ Y4 Z0 e4 `* d0 L* T3 ^, b. Y) f" _, P) _
) E: G& U. |( l x! h+ k j另一方面,我们可以通过将其引导到广泛的参数空间来提高模型性能。 如果我们使用标准的优化算法,由于训练数据量很少,它可能无法给出可靠的结果。( f3 R6 T1 F& i' _
9 G9 P: D4 \ u
6 n/ N0 u+ U2 G/ i1 G' A2 X/ ]) L$ t+ n" V( O9 e$ `" M
Few-Show目标检测 4 [: K4 N2 U9 p& Q5 P+ `很明显,我们可能会在所有计算机视觉任务中遇到 FSL 问题。 6 m+ ]2 @# O' ~, Z5 N0 s+ X1 C6 N2 Z. {* h5 Y- V4 t+ `" y
3 n$ B' B8 O: m# W$ [
一个 N-way-K-Shot 目标检测任务包括一个训练集:N个类标签,对于每一类,包含至少一个属于该类的对象的 K 个标记图像,Q张测试图片。 ' ~3 i: r1 u$ X% I# F- a - U) ~7 D6 e1 p, X6 Y' U/ A ; w ^3 u$ @- y8 `2 T0 B) {+ v注意,与Few-Shot 图像分类问题有一个关键区别,因为目标检测任务存在一张图像包含属于N 个类别中的一个或多个的多个目标的情况。因此可能会面临类不平衡问题,因为算法对每个类的至少 K 个样本目标进行训练。* f+ ~" v- c/ `% ^
' n$ A; a, o7 t. S 8 M, ^) W5 t5 ]) ], ?+ |YOLOMAML& n! I2 J" K' q5 m! q4 F3 X
Few-Shot目标检测领域正在迅速发展,但有效的解决方案并不多。这个问题最稳定的解决方案是YOLOMAML 算法。8 @7 q& S! v( I0 z: L
4 B* k- w0 j( J9 @, d! r $ I% J, i1 _$ q9 [' cYOLOMAML 有两个混合部分:YOLOv3 对象检测架构和 MAML 算法。 ' }, y& q" P2 [$ v: B: l' \( { ( n S" \4 i6 a8 d: C/ n( a' v2 ^2 v- `2 d0 Y. D) H
如前所述,MAML 可以应用于多种深度神经网络,这就是为什么开发人员很容易将这两部分结合起来。$ ?) a3 X& N; O6 |3 {
3 u; Q; D9 \# `- I0 E0 B4 H6 m7 `+ `" s" S
YOLOMAML 是 MAML 算法在 YOLO 检测器上的直接应用。如果想了解更多信息,请查看官方 Github 存储库。 " Z' X# ?. ^/ i8 k1 q, k0 x Q* m1 N( `! c: M, { x
( x- @" X9 F9 U$ `4 T5 m9 A6 T
https://github.com/ebennequin/FewShotVision 1 m. `0 p9 `( r1 U% I7 o1 [& j) b P* s* a3 e+ C
5 D2 T9 q0 M H' p l: ~& ?" e& \* ?! P0 B. k0 R, g
1 {& ^. b1 @# p' ~9 |2 o) w- q; z9 ?% v" w# Z' L9 E
; U0 P0 o! Q z. w1 k% O- S小样本解决方法进阶 ' x( Z/ z0 k, S迁移学习如何,利用在数据集ImageNet上预训练好的模型,迁移到小样本上进行微调? 1 J% E8 k [6 @3 x8 l" H & x2 F. K$ q7 @% S; g $ Q T5 ~4 Y- }8 w答:仍然存在跨域问题,但考虑到ImageNet上的数据集可能包含的知识丰富,可以尝试。 ' T m% m$ c$ V4 S' i% Q! S2 D1 B6 \$ Z7 C# M
4 C8 X1 n2 `& D, Y
方法一:针对COCO数据集中包含小目标的图片数量少的问题,使用过采样OverSampling策略。 8 `: q5 j) G- C方法二:针对同一张图片里面包含小目标数量少的问题,在图片内用分割的Mask抠出小目标图片再使用复制粘贴的方法(当然,也加上了一些旋转和缩放,另外要注意不要遮挡到别的目标)。 . h9 t! W" c+ Y) X$ o9 q5 q1 ]# d0 R5 L F3 m* e( x& m
" x( D. b$ K( p' d* C* J & Y8 z$ ~3 H8 N5 x0 _( _6 V* m7 F6 P# b o( M; C& j! @
" I: w/ O- c+ l' }0 |, M* x/ n7 y( v# p) C: ?3 |( H: g$ N/ ?
2.传统的图像金字塔和多尺度滑动窗口检测 ; C$ v, t: s' {6 c% I; R" g! S+ N最开始在深度学习方法流行之前,对于不同尺度的目标,大家普遍使用将原图build出不同分辨率的图像金字塔,再对每层金字塔用固定输入分辨率的分类器在该层滑动来检测目标,以求在金字塔底部检测出小目标;或者只用一个原图,在原图上,用不同分辨率的分类器来检测目标,以求在比较小的窗口分类器中检测到小目标。著名的人脸检测器[MTCNN](Joint Face Detect ion and Alignment using Multi-task Cascaded Convolutional Networks)中,就使用了图像金字塔的方法来检测不同分辨率的人脸目标。 M' G6 i3 v+ n. q; X2 e8 i$ k2 g / H$ D: _; z/ @% ~' @& N- Z- M- T7 p* E. |2 N, J% I: f