在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 564697 点 威望 12 点 阅读权限 255 积分 174632 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
( k4 @% w" b; P4 h 距离你解决小样本/少数据难题,只差这篇文章 : o! e, V4 I) d: E5 m
文章目录 : K7 I7 F1 v( s+ K
什么是小样本学习? " I" B$ B( s( c* g& d' _
小样本学习变体
5 ?# g! w* J6 N# T6 G" h P2 } Zero-Shot Learning (ZSL)
: ?/ \& b2 d6 {! _% ] f One-Shot和Few-Shot 3 ^+ ]5 }5 y; N/ f& `
小样本学习方法 ( P& c4 j; r5 s7 |1 z9 g* j! H
数据级方法
+ w) E& ?$ v1 ?& n+ M0 L% Q" c 参数级方法 : n' \$ R, R0 w' N
Few-Show目标检测 ; j8 r# w- N/ f5 h* v
YOLOMAML
: [2 i# W8 E* X/ ^4 F0 v 小样本解决方法进阶 3 O+ q! c5 Y. b7 ^
总结
- Q: c5 X2 O& i 如今,在使用数十亿张图像来解决特定任务方面,计算机可以做到超过人类。尽管如此,在现实世界中,很少能构建或找到包含这么多样本的数据集。
+ D3 k7 w2 s% \8 N! K " G# L8 Y6 S7 V8 H0 b
7 v$ P0 ]. T; E7 q
; s) G- s* s+ W1 `5 x! I
5 K5 p6 O, i# e' W1 x 我们如何克服这个问题? 在计算机视觉领域,我们可以使用数据增强 (DA),或者收集和标记额外的数据。DA 是一个强大的技术,可能是解决方案的重要组成部分。标记额外的样本是一项耗时且昂贵的任务,但它确实提供了更好的结果。 1 W" t) r+ [/ Y& N0 s9 N7 t/ |
7 t; Y- V- U8 @% F- z
5 a# U: e ]/ q: k3 O 如果数据集真的很小,这两种技术可能都无济于事。 想象一个任务,我们需要建立一个分类,每个类只有一两个样本,而每个样本都非常难以找到。
' q$ g: l# M7 J0 h 3 w$ l1 Y: ]# n- D! c
7 {2 X; F1 v+ ~/ F: H. @+ z
这将需要创新的方法。小样本学习(Few-Shot Learning, FSL)就是其中之一。
0 u% k! z! g0 H! F 2 d2 f C' J; N9 ~5 S6 p
0 u7 u) y; Z$ b% m4 `& l
+ l# m* k4 {& \/ U( @ 5 d3 N, F6 V) ]' E2 B0 q
& u7 u9 D$ X2 L. ]- M: m$ {6 y
- P, w; j. F4 n2 ^3 H2 J 少样本学习(few-shot learning)是一个未来 AI 的发展方向之一。 : J7 a1 I9 @. A+ O5 N) b0 [
: v8 w3 ?: }. A: H/ _0 O: m
0 s. I" Y+ |. [" h% _ ` 首先现在深度学习和人类智能有一个显著性的差异,以图片分类为例,我们人类可以: (1). 从很少的图片中抽象出一个新的概念,比如我们可以在看过几张拉布拉多和柯基图片之后(假设我们之前不知道这两种狗的特征),快速分辨后续图片中的拉布拉多和柯基。(2). 甚至可以不看图片就可以得到新的概念,比如告诉你条纹马叫做斑马;但是我们现有的常见的深度学习模型则需要大量的图片来训练模型,比如常见的 MNIST 数据集,一般训练集为 6000 张图片,但其实只分类 0-9 的图片 (我们人类需要吗?)。这一巨大的差异就导致很多人研究少样本学习中来。以上两种情况就是常见的 few-shot 和 zero-shot 的场景。
, N0 Y7 f( M2 e/ { p
8 v# |% c7 `. M8 Z; o3 b5 i1 B ( K, q$ V; E; ^& v$ s
以 MNIST 的 few-shot 为例,我们只要一个类各一张图片,也就是 10*1 = 10 张图片来训练我们的模型,就可以分类剩余的所有图片,如果可以到这一步,深度学习和人类智能的差距会缩小很大一部分。这个问题的难点在于训练样本的数量对于深度学习来说太少了,很容易过拟合。
+ c7 s" @# D9 E) {3 G ; }6 `& t# A3 F6 Q _
( o* D) h" @: U' k7 u
解决方法:
7 \ s" r4 x/ e0 I. G) h8 t( Z
3 z l* b) N; O4 V; \& L6 E# v. b# V - E7 C* t2 T1 d' g" d7 `1 i
(1) 数据增强和正则化:第一种思路很直接,既然训练数据少,那我们就增加训练数据,例如我们经常看到的 Omniglot 数据集中的图片旋转 90° 的倍数来增加数据集中训练样本的数量(虽然本意不是用于解决 few-shot 问题)。还有就是既然会过拟合,那就加一个正则化项来缓解过拟合的问题。
5 o, ^1 h0 s6 x/ H7 K5 m" P ' R( J# z$ w; q- G! s
0 Z% b' ?) S- |
(2) Meta-learning(元学习):这是现在主流的方案,元学习的目标是利用已经学到的知识来解决新的问题。这也是基于人类学习的机制,我们学习都是基于已有知识的,而不像深度学习一样都是从 0 开始学习的。如果我们已有的先验知识来帮助我们解决新的问题,那么我们对于新的问题就可以不需要那么多的样本,从而解决 few-shot 问题。但是元学习需要用一些别的数据来学习这个先验知识,例如分类 MiniImagenet,其中有 100 个类,我们用其中 60 个类来学习先验知识,20个做 validation,剩余 20 个做测试。**注意我们测试的 20 个类和前面 80 各类是完全不同的,也就是新的类、新的概念、新的问题,并且这 20 个类每个类只有很少的几张图片 (few-shot 问题)!**然后前面的 80 个类用来用来训练模型和确定超参数,也就是学习帮助我们解决新问题的先验知识。
. Z( m ^; O8 i4 ^. t( L' \: h ' u* F$ }# K* V( S/ O0 R
" O4 V4 ^5 W0 b7 p. H+ G- {$ ]6 m 我们可以发现如果我们需要解决上述的 MNIST 少样本分类问题,可以直接用方法 1,但是方法 2 不行,因为我们没有别的类来做先验知识的学习,这确实可以看成一个问题。但是元学习有自己的方法:我们可以在另一个数据集上面训练学习先验知识(前面的 MiniImagenet 中的 100 个类都是一个数据集),例如从 Omniglot 中学习先验知识,用于 MNIST 的少样本分类(因为有种说法 Omniglot 可以看做 MNIST 的一种扩展)。当然这种方法的效果和两个数据集的相似度有关,两个数据集相似度很好,那么学到的先验知识可以很好地解决新数据集的 few-shot 问题,如果差异很大,可能效果会很一般。 8 d6 |: W2 ~9 W0 T
4 }5 N+ }6 ?! u+ M. J! o
* {" z3 k/ L+ b/ p# ^+ h5 D9 w- ]: m
( i9 l5 N* B4 K% p7 z7 J
: z) F$ c7 x, }" q/ L* e8 V
9 V/ Z( ~( f. A- J6 H% j6 C * D$ n1 y( e0 H/ k8 j" L5 a
什么是小样本学习?
3 O7 J' M4 z0 j8 M
3 b0 u; m* z) ~( U4 f1 W
3 }( ^- f- c8 r* J" q1 z
+ @ n2 d8 T8 n$ I c5 m
1 [6 K; p0 m, Q1 W* u Few-Shot Learning(以下简称FSL)是机器学习的一个子领域。在只有少数具有监督信息的训练样本情况下,训练模型实现对新数据进行分类。 8 _/ q3 k- ~* F" A# S
6 j( o3 ~* w. u5 u- i: c, E ' r0 u- K8 a4 L) c
FSL 是一个相当年轻的领域,需要更多的研究和完善。计算机视觉模型可以在相对较少的训练样本下很好地工作。在本文中,我们将重点关注计算机视觉中的 FSL。
2 a+ b$ C- B9 \- S" t$ _" U9 C
9 O, w" i3 e) Y
: g* s- h t( q- j% B 例如:假设我们在医疗保健行业工作,在通过 X 射线照片对骨骼疾病进行分类时遇到问题。
3 Z8 {1 ]0 d9 Q3 _2 F : A3 B) g5 S0 k5 y8 i4 B& J
2 ~2 T3 F& `) p( V; M; s, i, g3 x 一些罕见的病理可能缺乏足够的图像用于训练集中。这正是可以通过构建 FSL 分类器解决的问题类型。
, b' Z! n/ ? }5 h( Z' B4 i $ A" ]4 b( _% a" B' \
X& z: k6 j$ \- W& b9 k 小样本学习变体
2 h$ l" s# }- \ ; N* c. ?% l9 b! u5 D) N
9 D9 g5 S ]0 m+ `* Q
0 ~( Z, t9 l5 }+ E9 R4 c # T9 ]) P) ]" B* e$ j
根据FSL的不同变化和极端情况可以分为四种类型:
, s6 t$ ^0 _: e3 R7 Z' Z
3 o- m" W* k% T3 f7 E; S4 r ) w/ S! O# a# k6 R/ Z) A
N-Shot Learning (NSL)
7 i3 D5 v, ?7 ] $ b0 h9 c; G8 Y# p; g3 |4 s
3 M5 @, ?* ] y( z$ \
Few-shot Learning (FSL) ; h X3 a6 I- V7 ^- j0 y
l/ [1 A: r. C5 p2 t7 b% I- u# M& d0 B
! n" J# V5 l, e7 ~& c/ B% v3 F* i6 Y One-Shot Learning (OSL) 5 g& j& J7 r# q" R' F
! O# V0 x/ z2 |
: ]" z* f# u" a1 ] Zero-Shot Learning (ZSL) 4 G4 K8 y5 y! f+ E. Z& A' a
2 F3 M1 g& `2 b ' q, H. |( E$ n
当我们谈论 FSL 时,我们通常指的是 N-way-K-Shot-classification。 8 w: r; ]. |. D
% w D: a: N0 j" a
) T2 E6 Q; r* r& S4 t8 v N 代表类别的数量,K 代表每个类别要训练的样本数量。 7 E8 Y" `' d9 Y$ H- f
$ P6 S. |% d8 _# L6 q u' j; e- |, k( y( M& b: I" m
N-Shot 学习被视为比所有其他概念更广泛的概念。这意味着,Few-Shot、One-Shot 和 Zero-Shot Learning 是 NSL 的子领域。
; w! m3 N! L" P 7 U; E8 ^# n) C- f9 v
9 ?- T2 |9 A% j# C1 | Zero-Shot Learning (ZSL)
5 {' Z' x( V& I8 U8 B Zero-Shot Learning 的目标是在没有任何训练样本的情况下对看不见的类进行分类。 # e4 D1 K+ @% H, {' g+ j. `9 k
1 s( V; m1 q- [9 h6 i2 h
4 N' M$ J6 U9 I; r4 `: M& m 这可能看起来有点牛逼,可以这样想:你能在没有看到物体的情况下对它进行分类吗? 如果你对一个对象、它的外观、属性和功能有一个大致的了解,那应该不成问题。这是在进行 ZSL 时使用的方法,根据当前的趋势,零样本学习将很快变得更加有效。 $ C& t8 h2 v+ H, Z
$ K1 h' u, M9 t7 H$ P
3 V: @" S3 F" w1 J/ h4 Z One-Shot和Few-Shot % [0 j- }4 x5 [7 `
在One-Shot Learning中,每个类只有一个样本。Few-Shot 每个类有 2 到 5 个样本,使其成为更灵活的 OSL 版本。 3 X, M1 J/ g; u9 U" R! h1 T7 w
: V) A0 Z0 T7 o: @( r% w' n3 I8 z
0 r4 n O4 C! o% a 当我们谈论整体概念时,我们使用Few-Shot Learning术语。但是这个领域还很年轻,所以人们会以不同的方式使用这些术语。
0 m8 A! ? Q9 f3 t5 d" l3 Q
- |& y9 s# O, F* N # {" Y. P! o' s3 f) s
小样本学习方法
- O7 t) g, c# b4 N- d [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-etTvIL89-1624719145926)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)] & j4 a# ~/ d% j1 R9 i- e
! g# a3 ?+ F& k. y* m $ b) a& u; _, t! P/ T D
首先,让我们定义一个 N-way-K-Shot-分类问题。
, V. E. L' I: w" L. P( x
0 S* h q+ {) G' S
2 X) t6 B/ U0 w 假定一个训练集,包括N 类标签,每类K个标记图像(少量,每类少于十个样本),Q张测试图片。 1 ~& _3 n2 I3 z/ H/ [! P; J
8 j" z$ T+ T8 `2 l$ P/ r+ o
! H; P/ }3 }8 D9 {% L$ y* P 我们想在 N 个类别中对 Q 张测试图片进行分类。 训练集中的 N * K 个样本是我们仅有的样本。这里的主要问题是没有足够的训练数据。 6 q* y/ Z P6 X# f4 ~, U3 L
2 e3 X2 K4 ~/ }5 v% z, X: \
9 Y- u& C, P4 Y) X [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cCXhSj92-1624719145930)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)] 7 O v/ \( t% \* u4 l
+ t, K8 Q' A3 w7 g
1 R( E/ P3 ^- q+ T3 r( T; Q FSL 任务的第一步是从其他类似问题中获得经验。这就是为什么少样本学习被描述为元学习问题的原因。
: r6 ]- N4 n; v8 |/ e; L9 _ ] ]: ~& H: t7 j
7 t3 @% y4 ^4 x8 ~, r; K! q% y3 Y
在传统的分类问题中,我们尝试从训练数据中学习如何分类,并使用测试数据进行评估。在元学习中,我们学习如何学习给定一组训练数据进行分类。 我们将一组分类问题用于其他不相关的集合。
6 R U3 ?4 B* y
% y5 D) Z5 P5 ]' ]# U 1 H( P* B( b1 w& l# p
在解决 FSL 问题时,通常考虑两种方法:
' K8 P! K8 y. g 1 T+ M/ c& I; r D
% w% y. g+ N' ?" U& Y4 W
数据级方法 (Data-level approach,DLA)
, t& z% n2 ]. Y2 o: W; u / T1 h3 b5 c/ N" B: [
, f# H6 D2 y; g 参数级方法 (Parameter-level approach,PLA) ( L, V( b i* C: c# h+ |
$ n2 P: l9 Z6 W( p7 ?, ?4 S# r* v
9 X' { y* a: X* \% b 数据级方法 - }! D! {4 }& R, Z
这个方法真的很简单。 它基于这样一个概念:如果没有足够的数据来构建可靠的模型并避免过度拟合和欠拟合,只需要简单地添加更多数据。 5 j# Y0 U4 ?4 f$ M( \/ X
" C) h" b! D; O7 g$ X/ I; O
6 I& W7 ^! W% h& p- ] K 这就是为什么通过使用来自大型基础数据集的附加信息来解决许多 FSL 问题的原因。基础数据集的关键特征是它没有在训练集中为Few-Show任务提供的类。 例如,如果想对特定鸟类进行分类,基础数据集可以包含许多其他鸟类的图像。
6 f" I* `( Y$ m* y1 ]8 B + V; h) }8 G0 L
9 D; I/ V' [: i2 J1 D6 J2 F5 M& b
我们也可以自己产生更多的数据。为了达到这个目标,我们可以使用数据增强,甚至生成对抗网络(GAN)。
4 Z% Q. W) I( n
p8 p+ w+ ?8 k/ `) ^& l 4 ?' X p6 `, B: M }' M1 d, q
参数级方法
4 u7 ] \/ U3 S! I/ D1 W5 y4 P 从参数级别的角度来看,Few-Shot Learning 样本很容易过拟合,因为它们t通常具有广泛的高维空间。
" Y6 d U0 H5 K5 `. P. Q 3 k7 |5 U+ j( d8 R. N0 Z
0 I2 K/ [+ ^/ x4 u" S5 z! I
为了克服这个问题,我们应该限制参数空间并使用正则化和适当的损失函数。 该模型将对有限数量的训练样本具有泛化能力。
5 h# M4 r; R% ?/ x4 L8 o " W" E3 S3 i$ o% G. k t: P2 g
' M3 V( I3 W3 L: _
另一方面,我们可以通过将其引导到广泛的参数空间来提高模型性能。 如果我们使用标准的优化算法,由于训练数据量很少,它可能无法给出可靠的结果。 8 c$ P c7 i7 \6 x
0 r6 n- h- Y& _# i
- U% l3 I2 X4 M0 `
这就是为什么在参数级别上训练的模型以在参数空间中找到最佳路线以提供最佳预测结果。正如我们上面已经提到的,这种技术称为元学习。
" g( ?7 M* ?* B* h) r6 U : ]; B: l# q; E* S
$ o, c: z' [( d6 v
Few-Show目标检测
4 u" u; z5 {" Q; N3 F: P* A 很明显,我们可能会在所有计算机视觉任务中遇到 FSL 问题。
( A, c* y* |0 u
' ?5 Y9 ^, b4 N; p) s# i1 h: `
% s* y" L2 C( X+ ~ 一个 N-way-K-Shot 目标检测任务包括一个训练集:N个类标签,对于每一类,包含至少一个属于该类的对象的 K 个标记图像,Q张测试图片。 2 L0 b9 ~# H8 u1 L$ i
+ C9 O$ N: O1 j N |; u5 d7 H
- @# o1 B7 I# {$ I
注意,与Few-Shot 图像分类问题有一个关键区别,因为目标检测任务存在一张图像包含属于N 个类别中的一个或多个的多个目标的情况。因此可能会面临类不平衡问题,因为算法对每个类的至少 K 个样本目标进行训练。 # I& }8 f# w% L
$ b J, C$ ]* ~ $ X' `1 ]- n( I* g# h
YOLOMAML
( \+ |, V& A0 @ Few-Shot目标检测领域正在迅速发展,但有效的解决方案并不多。这个问题最稳定的解决方案是YOLOMAML 算法。
/ Q6 `$ W: [! O% T: ] 9 ^6 w& @1 r% J- X2 M
& _& ]- |8 v$ ]1 ]& r YOLOMAML 有两个混合部分:YOLOv3 对象检测架构和 MAML 算法。 / }! g# n% Y/ N; \! O
& o# F4 x' P' I+ d 6 W% i+ E8 _# s* b
如前所述,MAML 可以应用于多种深度神经网络,这就是为什么开发人员很容易将这两部分结合起来。
( M% G$ d3 o8 R+ P- _5 y
; |7 _2 S* V- G3 v( B. h( C3 o& o $ ^8 A! \- W, a) Z8 Q# z
YOLOMAML 是 MAML 算法在 YOLO 检测器上的直接应用。如果想了解更多信息,请查看官方 Github 存储库。
% j+ u8 b4 E0 f3 `+ R, w7 H
; g' w% A0 R( C7 f+ } 6 {4 d3 s* e: Y) P3 l( m# [
https://github.com/ebennequin/FewShotVision ( A* Y8 z1 H Q; `* d" W4 z
; J2 C4 V( O5 V' B" h- W* N" U0 h& d
3 n, d+ K( J' P 3 ~# _0 h5 D* T+ B2 l" I. {
, ^8 P* g. A2 ~4 k2 G$ h L2 s % l3 U( c+ F% Z/ [5 {* H
E" S! i; p/ m. T% E" G! F7 z
小样本解决方法进阶 / T% M7 F0 ^( L) N
迁移学习如何,利用在数据集ImageNet上预训练好的模型,迁移到小样本上进行微调? ' e5 m, H+ h7 }0 N
) @ _ z8 O7 L! M/ d. N
# b; L" `1 r$ U' @1 {- L0 M" j' \ 答:仍然存在跨域问题,但考虑到ImageNet上的数据集可能包含的知识丰富,可以尝试。 P% y+ S3 Q; ]! ~" r
( i7 a6 s! v% I" D0 z
8 C( R' J. @+ X! U7 \ 方法一:针对COCO数据集中包含小目标的图片数量少的问题,使用过采样OverSampling策略。
# I2 T$ j0 e( F( x* w5 o3 D1 B6 l, \ 方法二:针对同一张图片里面包含小目标数量少的问题,在图片内用分割的Mask抠出小目标图片再使用复制粘贴的方法(当然,也加上了一些旋转和缩放,另外要注意不要遮挡到别的目标)。 $ l1 | r' r* @; o5 T$ S- \, R
j- n4 ]% H8 {, V% }
* \$ N0 \! l, ]
0 i% g$ Y# J3 k. a V
4 Q O5 |- y) M, b" I
4 }8 G0 @4 e5 o ; b9 B5 U0 P8 i3 f
2.传统的图像金字塔和多尺度滑动窗口检测 4 i5 a7 |5 z V0 W- t1 _
最开始在深度学习方法流行之前,对于不同尺度的目标,大家普遍使用将原图build出不同分辨率的图像金字塔,再对每层金字塔用固定输入分辨率的分类器在该层滑动来检测目标,以求在金字塔底部检测出小目标;或者只用一个原图,在原图上,用不同分辨率的分类器来检测目标,以求在比较小的窗口分类器中检测到小目标。著名的人脸检测器[MTCNN](Joint Face Detect ion and Alignment using Multi-task Cascaded Convolutional Networks)中,就使用了图像金字塔的方法来检测不同分辨率的人脸目标。 ! b) Q! ^. N$ Q8 \! [9 h- L
- W) j. @* k! [9 q' a; @( g3 R' w ) x# F7 T* b8 x6 x) L
% c$ _+ _6 a, Q2 S3 o ) [9 v% [' F) P
$ Z5 F+ M; T( c' i& F( P, U- E
( X. c4 e9 Z/ ?* n4 ?: v3 r 这种方式虽然一定程度上可以提升检测精度,但由于多个尺度完全并行,耗时巨大。当前的多尺度训练(Multi Scale Training,MST)通常是指设置几种不同的图片输入尺度,训练时从多个尺度中随机选取一种尺度,将输入图片缩放到该尺度并送入网络中,是一种简单又有效的提升多尺度物体检测的方法。虽然一次迭代时都是单一尺度的,但每次都各不相同,增加了网络的鲁棒性,又不至于增加过多的计算量。而在测试时,为了得到更为精准的检测结果,也可以将测试图片的尺度放大,例如放大4倍,这样可以避免过多的小物体。多尺度训练是一种十分有效的trick方法,放大了小物体的尺度,同时增加了多尺度物体的多样性,在多个检测算法中都可以直接嵌入,在不要求速度的场合或者各大物体检测竞赛中尤为常见。 ( k# _/ R7 P6 ^2 i2 Z$ r
/ ^1 n2 N# _* D5 H1 R
6 K+ W. f0 _! Q' u) b- h8 U " x( a" o L1 C2 f' u
X/ k5 H) ~/ o; m* \$ s
d) \ U' s4 @& H8 n% N
* p$ ?+ W! y2 s( h; G: f+ }% _ 总结 7 a( q, F4 u; G/ ~
在本文中,我们已经弄清楚了什么是Few-Shot Learning,有哪些 FSL 变体和问题解决方法,以及可以使用哪些算法来解决图像分类和目标检测 FSL 任务。 N7 C/ b, Z6 Q; g }
3 P" u) G; `. W% a
7 C; w4 A8 e7 q Few-Shot Learning 是一个快速发展和有前途的领域,但仍然非常具有挑战性和未经研究,还有很多工作要做、研究和开发。 5 r3 _% ]' C* P- }1 P; x V
————————————————
, O7 x9 Z7 S, I 版权声明:本文为CSDN博主「cv君」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
! ^3 t3 L6 C0 Q' y. M1 G 原文链接:https://blog.csdn.net/qq_46098574/article/details/118255956 % Z( @* Y* l# x8 x8 e9 B
) ~) G9 [% _& I1 A$ V
& U* o1 L: @3 l
zan