简介

图1:论文原文

论文是发表在 C V P R 2019 {\rm CVPR\ 2019} CVPR 2019上的一篇关于目标检测的论文。论文的主题是 G u i d e d A n c h o r i n g {\rm Guided\ Anchoring} Guided Anchoring,即采用某种方法指导生成 A n c h o r {\rm Anchor} Anchor。论文原文 源码


0. Abstract

当前 A n c h o r {\rm Anchor} Anchor- B a s e d {\rm Based} Based的目标检测方法会使用预先设定大小和宽高比的 A n c h o r {\rm Anchor} Anchor,然后将大量 A n c h o r {\rm Anchor} Anchor密集地铺在图像上,找出最适合的 A n c h o r {\rm Anchor} Anchor进行分类和回归。论文提出一种高效的方法用以指导 A n c h o r {\rm Anchor} Anchor的生成,同时预测目标的中心区域即大小和宽高比。此外,使用特征自适应模块缓解特征不平衡的问题。该方法可以集成到 A n c h o r {\rm Anchor} Anchor- B a s e d {\rm Based} Based的目标检测方法中。实验结果为在 M S C O C O {\rm MS\ COCO} MS COCO数据集上, F a s t R {\rm Fast\ R} Fast R- C N N {\rm CNN} CNN、 F a s t e r R {\rm Faster\ R} Faster R- C N N {\rm CNN} CNN和 R e t i n a N e t {\rm RetinaNet} RetinaNet的 m A P {\rm mAP} mAP分别提高 2.2 % {\rm 2.2\%} 2.2%、 2.7 % {\rm 2.7\%} 2.7%和 1.2 % {\rm 1.2\%} 1.2%。

本文贡献:(一)提出一种新的 A n c h o r {\rm Anchor} Anchor生成机制;(二)将 A n c h o r {\rm Anchor} Anchor的铺设公式化,即避免在图像上产生大量密集的、无用的 A n c h o r {\rm Anchor} Anchor;(三)基于特征与 A n c h o r {\rm Anchor} Anchor对齐的重要性,设计特征适配模块细化特征;(四)针对两阶段目标检测方法提出高效的区域生成方法。


1. Introduction

当前 A n c h o r {\rm Anchor} Anchor- B a s e d {\rm Based} Based的目标检测方法使用 A n c h o r {\rm Anchor} Anchor作为分类和回归的基础,而设计 A n c h o r {\rm Anchor} Anchor具有两个准则:对齐和一致。对齐是指 A n c h o r {\rm Anchor} Anchor中心与特征图像素对齐,即通常将特征图中的每个像素作为 A n c h o r {\rm Anchor} Anchor的中心。一致是指 A n c h o r {\rm Anchor} Anchor的大小和宽高比要与感受野一致,即 A n c h o r {\rm Anchor} Anchor的设计要符合数据集中目标的大小和形状。滑动窗口是一种常用的方法,通常在特征图上的每个像素位置铺设 k k k个预先指定大小和宽高比的 A n c h o r {\rm Anchor} Anchor。

作者指出,上述方法可能存在以下问题:(1)由于 A n c h o r {\rm Anchor} Anchor的大小和形状依赖预先设定,设计不当将会影响模型的速度和精度;(2)大量仅含背景的 A n c h o r {\rm Anchor} Anchor会增加计算量。论文提出一种高效的方法以指导 A n c h o r {\rm Anchor} Anchor生成。受到如下启发:目标并非均匀地分布在图像上,目标的大小和宽高比与图像内容、位置、几何场景密切相关。该方法分为两步:首先确定可能存在目标的子区域,然后确定其形状。如果将 A n c h o r {\rm Anchor} Anchor的大小和宽高比当做变量,则对于特征图上的每个像素,对应 A n c h o r {\rm Anchor} Anchor需要自适应确定。论文提出 G A {\rm GA} GA- R P N {\rm RPN} RPN方法( G u i d e d A n c h o r i n g {\rm Guided\ Anchoring} Guided Anchoring + R e g i o n P r o p o s a l N e t w o r k {\rm Region\ Proposal\ Network} Region Proposal Network)解决上述问题。


2. Related Work

相关工作部分首先介绍了滑动窗口的使用,主要涉及到 F a s t e r R {\rm Faster\ R} Faster R- C N N {\rm CNN} CNN、 S S D {\rm SSD} SSD、 D e n s e B o x {\rm DenseBox} DenseBox、 R e t i n a N e t {\rm RetinaNet} RetinaNet、 Y O L O v 2 {\rm YOLOv2} YOLOv2等。然后是论文方法同现存方法的对比:(1)后者通常需要大量密集的 A n c h o r {\rm Anchor} Anchor,论文方法舍弃了滑动窗口机制,提出一种高效的方法产生稀疏的 A n c h o r {\rm Anchor} Anchor;(2)级联式的检测方法采用多阶段逐步完善边界框,但通常会带来额外的参数和推理速度的下降;(3) A n c h o r {\rm Anchor} Anchor- F r e e {\rm Free} Free方法难以胜任复杂的场景;(4) S i n g l e {\rm Single} Single- S h o t {\rm Shot} Shot方法使用多次回归和分类逐步确定 A n c h o r {\rm Anchor} Anchor。


3. Guided Anchoring

G u i d e d A n c h o r i n g {\rm Guided\ Anchoring} Guided Anchoring的流程如下:一个 A n c h o r {\rm Anchor} Anchor可由 ( x , y , w , h ) (x,y,w,h) (x,y,w,h)确定。现假设某个目标来自图像 I I I,则其形状和位置可由如下确定: p ( x , y , w , h ∣ I ) = p ( x , y ∣ I ) p ( w , h ∣ x , y , I ) (3.1) p(x,y,w,h|I)=p(x,y|I)p(w,h|x,y,I)\tag{3.1} p(x,y,w,h∣I)=p(x,y∣I)p(w,h∣x,y,I)(3.1)

上述等式即是条件概率等式的简单变形,但其可以反映的是: p ( x , y ∣ I ) p(x,y|I) p(x,y∣I)表明目标可能只存在于图像中特定位置; p ( w , h ∣ x , y , I ) p(w,h|x,y,I) p(w,h∣x,y,I)表明目标的大小和宽高比与其位置密切相关。

基于上述结论,论文提出一种 A n c h o r {\rm Anchor} Anchor生成模块,如图:

图2:方法框架

如图所示,左边是一个特征金字塔。每个金字塔层后接一个 G u i d e d A n c h o r i n g {\rm Guided\ Anchoring} Guided Anchoring。以顶层特征图 F I F_I FI​为例说明,上面分支 N L N_L NL​产生一个标识目标位置的概率图,下面分支 N S N_S NS​预测基于密保位置的形状。然后会产生一系列的 A n c h o r {\rm Anchor} Anchor,通过阈值保留可能的结果。由于图像中的目标可能大小形状各异,采用一个特征自适应模块基于 A n c h o r {\rm Anchor} Anchor的形状自适应特征。详情步骤见后面部分。

3.1 Anchor Location Prediction

如图 2 2 2所示。首先, N L N_L NL​分支产生一个同输入特征图 F I F_I FI​等大的概率图 p ( ⋅ ∣ F I ) p(·|F_I) p(⋅∣FI​),概率图上每个像素点 p ( i , j ∣ F I ) p(i,j|F_I) p(i,j∣FI​)对应于原图的位置为 ( ( i + 1 / 2 ) s , ( j + 1 / 2 ) s ) ((i+1/2)s,(j+1/2)s) ((i+1/2)s,(j+1/2)s), s s s为步长。概率图上的值表明目标中心在此处的概率。得到概率图的具体过程为:使用 1 × 1 1×1 1×1卷积作用于特征图 F I F_I FI​,然后通过一个 s i g m o i d {\rm sigmoid} sigmoid函数将值归一化,由此得到各个位置的概率值。接着,通过阈值得到存在目标的可能位置。这个操作可以过滤掉大约 90 % 90\% 90%的低召回率区域。由于不需要考虑概率低的区域,后接掩码卷积。

掩码卷积请参考这篇文章里的 R e g i o n C o n v o l u t i o n {\rm Region\ Convolution} Region Convolution。首先针对输入特征图上的每个像素值对应的概率值设置标志,决定其是否参与下面的卷积。即在特征图上添加一个掩膜,目标区域为 1 1 1、其他区域为 0 0 0,则卷积操作只在 R o I {\rm RoI} RoI上进行。

3.2 Anchor Shape Prediction

3.1 3.1 3.1部分得到目标的大致位置后,现在开始预测可能的大小和宽高比。 N S N_S NS​分支针对特征图 F I F_I FI​上的每个位置预测合适的 ( w , h ) (w,h) (w,h)。由于目标大小和尺寸的多样性,这里不直接预测 w w w和 h h h值: w = σ ⋅ s ⋅ e d w , h = σ ⋅ s ⋅ e d h (3.2) w=σ·s·e^{dw},\ \ h=σ·s·e^{dh}\tag{3.2} w=σ⋅s⋅edw,  h=σ⋅s⋅edh(3.2)

N S N_S NS​分支预测值 d w dw dw和 d h dh dh, s s s为步长, σ = 8 σ=8 σ=8,这里将参数空间归一化到 [ − 1 , 1 ] [-1,1] [−1,1]。类似的处理在 R {\rm R} R- C N N {\rm CNN} CNN和 Y O L O {\rm YOLO} YOLO系列中经常使用,目的是将坐标的预测归一化,使其值的变化限制在某个范围,有利于网络的训练过程以及后续的边界框回归。

得到位置预测的具体过程为:使用 1 × 1 1×1 1×1卷积作用于特征图 F I F_I FI​,得到一个两通道的特征图,分别为值 d w dw dw和 d h dh dh。然后应用公式 ( 3.2 ) (3.2) (3.2)得到对应的宽和高。

3.3 Anchor-Guided Feature Adaptation

在特征图 F I F_I FI​上,不同位置的目标大小和宽高比变化可能很大。直觉上,较大的 a n c h o r {\rm anchor} anchor对应于较大的区域;较小的 a n c h o r {\rm anchor} anchor对应于较小的区域。基于此,作者提出一个特征自适应模块,根据 a n c h o r {\rm anchor} anchor的形状转化特征: f i ′ = N T ( f i , w i , h i ) (3.3) {\rm f}_i^{'}=N_T({\rm f}_i,w_i,h_i)\tag{3.3} fi′​=NT​(fi​,wi​,hi​)(3.3)

这里的 f i {\rm f}_i fi​表示特征中的第 i i i个位置, ( w i , h i ) (w_i,h_i) (wi​,hi​)为对应 a n c h o r {\rm anchor} anchor的宽和高, N T N_T NT​表示一个 3 × 3 3×3 3×3的可变卷积,最后得到相应位置的输出 f i ′ {\rm f}_i^{'} fi′​。可变卷积来自于一篇 C V P R 2017 {\rm CVPR\ 2017} CVPR 2017的文章,如下图:

图3:DCN

在 i n p u t f e a t u r e m a p {\rm input\ feature\ map} input feature map后接两个分支。上面分支通过卷积产生一个和输入特征图大小相同、通道数为 2 N 2N 2N的偏移(对应 N N N个 x x x、 y y y方向上的偏移)。将偏移作用于输入特征图上的卷积核后,卷积核变为输出特征图上的蓝框。 D C N {\rm DCN} DCN的提出致力于解决图像中目标的多尺度变化问题。

3.4 Training

损失函数定义如下: L = λ 1 L l o c + λ 2 L s h a p e + L c l s + L r e g (3.4) L=λ_1L_{loc}+λ_2L{shape}+L_{cls}+L_{reg}\tag{3.4} L=λ1​Lloc​+λ2​Lshape+Lcls​+Lreg​(3.4)

除了目标检测中常用的分类损失 L c l s L_{cls} Lcls​和定位损失 L r e g L_{reg} Lreg​外,还添加了位置预测损失 L l o c L_{loc} Lloc​和形状预测损失 L s h a p e L_{shape} Lshape​。 L c l s L_{cls} Lcls​常用的形式是 F o c a l L o s s {\rm Focal\ Loss} Focal Loss, L r e g L_{reg} Lreg​常用的形式是 I o U L o s s {\rm IoU\ Loss} IoU Loss,而 L l o c L_{loc} Lloc​和 L s h a p e L_{shape} Lshape​的具体形式见源码部分。

Anchor location targets,为了训练 N L N_L NL​分支,针对每幅图像使用一个二值标签图( 1 1 1表示有效位置、 0 0 0反之),这里使用标注框指导标签图的生成。对于标注框 ( x g , y g , w g , h g ) (x_g,y_g,w_g,h_g) (xg​,yg​,wg​,hg​),其映射到对应特征图上为 ( x g ′ , y g ′ , w g ′ , h g ′ ) (x_g^{'},y_g^{'},w_g^{'},h_g^{'}) (xg′​,yg′​,wg′​,hg′​),令 R ( x , y , w , h ) R(x,y,w,h) R(x,y,w,h)表示中心在 ( x , y ) (x,y) (x,y)、宽高为 ( w , h ) (w,h) (w,h)的矩形框。而 a n c h o r {\rm anchor} anchor要尽可能放置到邻近标注目标中心的区域,以获得更大的 I o U {\rm IoU} IoU。这里定义 3 3 3中类型的区域:

(1) C R = R ( x g ′ , y g ′ , σ 1 w ′ , σ 1 h ′ ) CR=R(x_g^{'},y_g^{'},σ_1w^{'},σ_1h^{'}) CR=R(xg′​,yg′​,σ1​w′,σ1​h′)表示框的中心区域, C R CR CR内的像素为正样本;

(2) I R = R ( x g ′ , y g ′ , σ 2 w ′ , σ 2 h ′ ) IR=R(x_g^{'},y_g^{'},σ_2w^{'},σ_2h^{'}) IR=R(xg′​,yg′​,σ2​w′,σ2​h′)是一个不包含 C R CR CR的更大的区域( σ 2 > σ 1 {σ_2>σ_1} σ2​>σ1​), I R IR IR内的像素为忽略;

(3)除去 C R CR CR和 I R IR IR区域内的像素为负样本。

基于 D e n s e B o x {\rm DenseBox} DenseBox的思想,每层特征图仅对应于特定大小范围的 a n c h o r {\rm anchor} anchor,这个问题在FCOS中也有相应的讨论。所以,论文将 C R CR CR分配到对应的特征层,而 I R IR IR被分配到相邻层的对应区域。这样, C R CR CR能够抑制 I R IR IR、 I R IR IR能够抑制 O R OR OR。(我的理解是,将相邻层对应区域置为 I R IR IR后可以改善 a n c h o r {\rm anchor} anchor分配的模糊性问题)。由于 C R CR CR往往对应特征图上的一个较小区域,而 O R OR OR区域相对较大, N L N_L NL​分支的损失函数采用 F o c a l L o s s {\rm Focal\ Loss} Focal Loss形式。

图4:3种区域

Anchor shape targets,这里分两步确定 a n c h o r {\rm anchor} anchor的形状:将 a n c h o r {\rm anchor} anchor分配到标注框和预测宽高。常用做法是通过 I o U {\rm IoU} IoU将 a n c h o r {\rm anchor} anchor分配到标注框。由于这里 w w w和 h h h的值没有确定,作者将 I o U {\rm IoU} IoU定义为一个变量: v I o U ( a w h , g t ) = max ⁡ w > 0 , h > 0 I o U n o r m a l ( a w h , g t ) (3.5) {\rm vIoU}(a{\rm _{wh},gt})={\underset {w>0,h>0}{\operatorname {max} }}{\rm IoU}_{normal}(a_{wh},{\rm gt})\tag{3.5} vIoU(awh​,gt)=w>0,h>0max​IoUnormal​(awh​,gt)(3.5)

这里可变 a n c h o r {\rm anchor} anchor为 a w h = { ( x 0 , y 0 , w , h ) ∣ w > 0 , h > 0 } a_{\rm {wh}}=\{(x_0,y_0,w,h)|w>0,h>0\} awh​={(x0​,y0​,w,h)∣w>0,h>0},标注框为 g t = ( x g , y g , w g , h g ) {\rm gt}=(x_g,y_g,w_g,h_g) gt=(xg​,yg​,wg​,hg​)。然后对于位置 ( x 0 , y 0 ) (x_0,y_0) (x0​,y0​),选择一系列 a n c h o r {\rm anchor} anchor常用的 w w w和 h h h值,遍历所有 ( w , h ) (w,h) (w,h),将与标注框的最大 I o U {\rm IoU} IoU作为 v I o U {\rm vIoU} vIoU值。实验中采用 9 9 9组 ( w , h ) (w,h) (w,h)值同 R e t i n a N e t {\rm RetinaNet} RetinaNet设置,宽高比分别为KaTeX parse error: Undefined control sequence: \< at position 1: \̲<̲font size=3>{1:…、尺寸分别为该特征层对应大小的 { 2 0 , 2 1 / 3 , 2 2 / 3 } \{2^0,2^{1/3},2^{2/3}\} {20,21/3,22/3}。

N S N_S NS​分支的损失函数采用 L 1 L_1 L1​形式: L s h a p e = L 1 ( 1 − m i n ( w w g , w g w ) ) + L 1 ( 1 − m i n ( h h g , h g h ) ) (3.6) L_{shape}=L_1\left(1-{\rm min}\left(\frac{w}{w_g},\frac{w_g}{w}\right)\right)+L_1\left(1-{\rm min}\left(\frac{h}{h_g},\frac{h_g}{h}\right)\right)\tag{3.6} Lshape​=L1​(1−min(wg​w​,wwg​​))+L1​(1−min(hg​h​,hhg​​))(3.6)

3.5 The Use of High-Quality Proposals

R P N {\rm RPN} RPN和 G A {\rm GA} GA- R P N {\rm RPN} RPN的对比,在采用不同 I o U {\rm IoU} IoU的情况下得到的建议区域数量。由图可知, G A {\rm GA} GA- R P N {\rm RPN} RPN能够得到更多高质量的建议框。

图5:RPN和GA-RPN


4. Experiments

图6:各区域建议方法的对比

图中 A R {\rm AR} AR表示平均召回率( A v e r a g e R e c a l l {\rm Average\ Recall} Average Recall), A R 100 {\rm AR_{100}} AR100​表示建议区域为 100 100 100个情况下的平均召回率。

图7:RPN和GA-RPN的可视化对比

这部分实验主要对比模型的设计,消融实验 1 1 1结果:

图8:消融实验1结果对比

图 8 8 8显示了论文中所提出的各部分模块对最终结果的影响,其中 L . {\rm L.} L.为位置预测、 S . {\rm S.} S.为形状预测、 F . A . {\rm F.A.} F.A.为特征自适应模块。这部分实验主要对比 a n c h o r {\rm anchor} anchor位置的选取(即阈值),消融实验 2 2 2结果:

图9:消融实验2结果对比

这部分实验主要对比 a n c h o r {\rm anchor} anchor形状的选取,消融实验 3 3 3结果:

图10:消融实验3结果对比

图中 G T {\rm GT} GT表示标注框, G A {\rm GA} GA表示 G u i d e d A n c h o r i n g {\rm Guided\ Anchoring} Guided Anchoring, S W {\rm SW} SW表示滑动窗口。由图可知, G A {\rm GA} GA得到的分布同 G T {\rm GT} GT更接近。


5. Conclusion

论文提出一种 a n c h o r {\rm anchor} anchor生成机制,通过 a n c h o r {\rm anchor} anchor的位置引导生成 a n c h o r {\rm anchor} anchor的形状。此外,使用一个特征自适应模块保证训练的稳定性。实验结果为在当前的区域建议方法中表现 S O T A {\rm SOTA} SOTA。

生成建议区域是两阶段目标检测算法中包含的阶段,论文实验结果也证明了 G A + R P N + F P N {\rm GA+RPN+FPN} GA+RPN+FPN的形式能够显著提升基于 R P N {\rm RPN} RPN两阶段目标检测算法的性能。论文中利用 a n c h o r {\rm anchor} anchor的位置引导生成 a n c h o r {\rm anchor} anchor的形状的思想很巧妙,同时配合 D C N {\rm DCN} DCN模块的使用也能够保证多尺度检测的问题。


参考

  1. Wang J, Chen K, Yang S, et al. Region proposal by guided anchoring[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2019: 2965-2974.


(九)论文阅读 | 目标检测之GA相关推荐

  1. 深度学习论文阅读目标检测篇(七)中英对照版:YOLOv4《Optimal Speed and Accuracy of Object Detection》

    深度学习论文阅读目标检测篇(七)中英对照版:YOLOv4<Optimal Speed and Accuracy of Object Detection> Abstract 摘要 1. In ...

  2. 深度学习论文阅读目标检测篇(四)中英文对照版:YOLOv1《 You Only Look Once: Unified, Real-Time Object Detection》

    深度学习论文阅读目标检测篇(四)中英文对照版:YOLOv1< You Only Look Once: Unified, Real-Time Object Detection> Abstra ...

  3. 深度学习论文阅读目标检测篇(一):R-CNN《Rich feature hierarchies for accurate object detection and semantic...》

    深度学习论文阅读目标检测篇(一):R-CNN<Rich feature hierarchies for accurate object detection and semantic segmen ...

  4. 深度学习论文阅读目标检测篇(三):Faster R-CNN《 Towards Real-Time Object Detection with Region Proposal Networks》

    深度学习论文阅读目标检测篇(三):Faster R-CNN< Towards Real-Time Object Detection with Region Proposal Networks&g ...

  5. 深度学习论文阅读目标检测篇(四)中文版:YOLOv1《 You Only Look Once: Unified, Real-Time Object Detection》

    深度学习论文阅读目标检测篇(四)中文版:YOLOv1<YouOnlyLookOnce:Unified,Real-TimeObjectDetection> 摘要 1.引言 2. 统一的检测 ...

  6. 深度学习论文阅读目标检测篇(二):Fast R-CNN《Fast R-CNN》

    深度学习论文阅读目标检测篇(二):Fast R-CNN<Fast R-CNN> Abstract 摘要 1. Introduction 引言 1.1 RCNN and SPPnet 1.2 ...

  7. 深度学习论文阅读目标检测篇(六)中文版:YOLOv3《 An Incremental Improvement》

    深度学习论文阅读目标检测篇(六)中文版:YOLOv3< An Incremental Improvement> 摘要 1. 引言 2. 方案 2.1. 边界框预测 2.2. Class P ...

  8. 深度学习论文阅读目标检测篇(五)中文版:YOLOv2《 YOLO9000: Better, Faster, Stronger》

    深度学习论文阅读目标检测篇(五)中文版:YOLOv2< YOLO9000: Better, Faster, Stronger> 摘要 1.引言 2. 更好 3. 更快 4. 更强 5. 结 ...

  9. 深度学习论文阅读目标检测篇(五)中英对照版:YOLOv2《 YOLO9000: Better, Faster, Stronger》

    深度学习论文阅读目标检测篇(五)中文版:YOLOv2< YOLO9000: Better, Faster, Stronger> Abstract 摘要 1. Introduction 1. ...

最新文章

  1. 2021年大数据ELK(二十五):添加Elasticsearch数据源
  2. premiere pr 视频截图
  3. C语言设计新思维分享
  4. linux sublime nodejs,Windows环境下sublime的Nodejs插件详细安装图解
  5. NTLDR is missing解决方法
  6. python自动生成宣传单_python – Matplotlib boxplot只显示最大和最小传单
  7. php+代码行数常量,php统计文件中的代码行数
  8. Linux 进程间通信 --- 信号通信 --- signal --- signal(SIGINT, my_func); --- 按键驱动异步通知(转)...
  9. tomcat绿色版及安装版修改内存大小的方法
  10. 大数据技术全解之三分虚拟化技术、七分分布式管理、十二分大数据
  11. linux最新的发布版本号,求问Linux最新内核版本以及发布日期。
  12. GMC解封秘籍:解决 Google 账户被封窘境
  13. 谷歌账号--手机号无法验证
  14. wordpress themeforest
  15. 简洁风个人主页(1) html 静态布局
  16. 教你一眼认出英语单词的意思
  17. 全球及中国雾化铜和铜合金粉末行业产销需求及发展动态分析报告2022-2028年
  18. 解决git Please use -- (and optionally --no-guess) to disambiguate
  19. oracle中日期函数
  20. 王爽汇编语言 实验10

热门文章

  1. 关于Android应用中的悬浮窗(一)——权限
  2. Screen后台编译命令
  3. 2周实现上云上市,阿里云SaaS上云工具包如何打造新云梯
  4. impdp 并行_Oracle expdp/impdp常用性能优化方法
  5. Leaflet加载百度瓦片到WGS84坐标系下
  6. 计算机量子极限,物理学家:计算机将在七八十年后穷途末路
  7. list 分批_java8 Stream 大数据量List分批处理切割
  8. 工业元宇宙:智能制造的未来形态
  9. Android 自定义曲线箭头和直线箭头
  10. flutter项目架构