精华内容
下载资源
问答
  • 简单分为三个阶段:种子用户阶段、活动促销阶段、烧钱砸市场份额阶段。看你公司处在什么阶段合适什么样的推广方案: 第一阶段:种子用户阶段 对于初创企业(种子/天使轮)来说资金有限,第一批种子用户的定位一定...

    APP推广线上推广固然重要,但是也离不开地推,尤其是在当下依靠地推不进能带来更精准的用户,而且适合任何大多数公司执行,下面是整理的地推方案:

    【地推的三个阶段】

    简单分为三个阶段:种子用户阶段、活动促销阶段、烧钱砸市场份额阶段。看你公司处在什么阶段合适什么样的推广方案:

    第一阶段:种子用户阶段

    对于初创企业(种子/天使轮)来说资金有限,第一批种子用户的定位一定要足够精准,这样后期运营才能成为核心用户,这个时间阶段用户获取成本可以稍微昂贵一些,一是为了给你的用户初体验和接受会有一个比较高逼格的期待值,另一方面高成本挖取用户比较容易。

    根据行业的不同,京东前一段时间按照消费频率来分类,大致分为5层。第一层外卖,第二层休闲食品和生鲜,第三层为家政类,第四层为药类,第五层为频率低的(教育、鲜花等等)。

    按照你的消费频率去择选你第一批种子用户,当用户量达到预定目标的时候停止地推,把这批种子用户运营成核心用户(死忠粉),快速优化你的产品或平台。

    第二阶段:活动促销阶段

    第一个阶段完了之后当你的融资(A轮、Pre-B轮)的时候,这个阶段应该是主靠活动来吸引用户的阶段,根据活动主题做事件营销,针对某个地点进行地推,这个阶段的地推成本整体上也不会太高。

    第三个阶段:烧钱砸市场份额阶段

    这是拿到更多的钱的阶段,你要和你的竞争对手拼市场份额,这个时候就是要根据前期的经验进行优化,迅速把模式复制到全市-全省-全国。

    【上线准备】

    一个地推方案在推之前就应该把问题想全面,这次地推的目的是什么,关注,下载,激活等,地推时间,地推地点,地推网络环境,奖品,人员等。我们详细说一下:

    一、地推的目的是什么?

    带来用户量的深度(日活、订单、下载...)

    向用户展示产品的功能属性

    推广产品,牛皮癣式地推

    跟风营销,借势吸引眼球(重大事件、节日)

    明确目的后,还要有更多的思考,来保证活动能够达到相应的目标

    投入多少精力资源?

    活动预期带来什么效果?

    这样的效果是否有实际意义?

    考虑短期/长期效益如何?

    爆点是什么?

    二、从用户的角度思考?

    这是什么活动?怎么参与?下载 激活成本?

    奖品是否足以吸引用户去下载或者关注 激活等

    用户是否愿意自发性的去分享到朋友圈等社群

    用户哪里奖品下载之后会不会卸载 怎么去留住用户

    有没有二次营销

    三、地推活动结束统计?

    发出去的奖品能不能达到预期值

    是不是要在短时间内对此次活动的用户进行二次营销

    问题描述:

    当你的App上线之后,我们接下来面临的是推广,但是很多时候我们去做地推、业务员的推广效果都没法进行一个有效的统计,导致业务员的推广绩效无法准确的考核。

    问题解决:

    采用Shareinstall的方案,地推统计,业务员个人推广业绩都可以进行精确的统计,为App推广统计提供有力的保障。

    【地推几大类】

    校园地推、小区地推、商场地推、商业区广场地推、工业园科技园地推。

    校园渠道是最有效的线下推广方式之一,常用推广渠道:

    1、基础手段:宣传册、海报、传单、卡片、楼栋号、日历、课程表、标尺、友情提示等,这些属于基础设施建设。楼栋号用来提醒大家到了几楼,友情提示一般为:“请保持安静、中午休息时间请勿打扰、保护环境等”。

    2、活动策划:比如校内网曾经成功策划了免费包车送学生到火车站的活动,再比如有的SNS网站在大学校园举办娱乐活动、爱心活动等等。

    3、冠名活动:与策划活动不同的是,冠名活动不是自己举办的。一般形式为:“**网预祝*****活动圆满成功”。

    4、网络宣传:比如通过学校论坛、百度贴吧、QQ群发等。

    5、软文推广:每个学校都有自己的杂志、报刊、网络媒体等,为了让网站有更多的宣传机会,校园大使通常会选择写一些软文发表在相关媒体上。

    6、班级演讲:一个班一个班巡回演讲的方式,虽然比较累,但是效果往往很好。一是受益面广,而是具有直接性。

    7、行政手段:部分校园大使在学校人脉很广,或者自己本身就是团委学生会、社团主要干部,所以采用行政手段,强制他人注册。

    8、口碑宣传:见到人就提起该网站,比如,有的校园大使在重要会议、演讲要展示幻灯片的时候,往往附带宣传网站。

    9、炒作宣传:校园大使有条件的,往往喜欢在特定条件下制作炒作事件。这样的情况往往以事件为标志。

    10、促销手段:即注册送礼品、或者注册可以获得优惠之类。很多人都知道,校内网当初是用鸡腿和可乐换来的用户。

    11、横幅宣传:横幅不是每个校园大使都有这个关系可以挂好,但是还是有不少人采用这个手段。主要在于横幅的宣传效果往往很大,尤其挂在主干道路上的横幅,更是能吸引人群的目光。

    12、校园通勤车宣传:比较大的学校往往有专门的通勤车或者校车,主要供学生上下课乘坐。在车体做广告往往能够收到不错的效果。因为通勤车每天都在学校穿梭。

    13、注意力宣传:比如,校内网有专门的T恤,学校里面经常可以看到穿着校内网服装的人在校园里面逛来逛去。由于服装的特殊性,所以很容易吸引人的注意力。

    14、网吧宣传:通常的手段为海报、制作临时上机卡、友情提示、电脑号、设为浏览器主页等。

    15、其他特色手段:

    图书馆杂志厅插书签。图书馆里面的杂志厅通常比较火爆。插入一张精美的书签往往能够起到不错的效果。

    学校周末放电影,中途插入FLASH宣传片。此手段收益面广,而且刺激性很大。

    发展院系大使。每个校园大使下面又发展了院大使、系大使。此手段实践性很强。

    学校举办报告报告会、演讲、大型活动,在活动开始前,每张桌子上放上一张精美的广告。通常,在这种环境下,大家有更充分的时间。

    学校餐厅开餐前,放上一张小广告,让大家吃完饭小憩时刻有个东西可以阅读。

    黑板宣传,在教室黑板上写宣传标语。

    商场地推、商业区广场

    地推门槛相对是最高的,场地入驻困难,资源 “匮乏”。采用的很少。一般都是和商场提前协商。中间牵扯到费用就不用多说了。还有人力资源成本,场地成本等等

    小区和工业园科技园:

    相对们肯就会降低很多,小区要分析人流的情况,选择交通要道,做进一步的地推方案优化。而且从人流里,要了解到,人群结构、男女比例、等,比如母婴类软件很适合在妈妈的群体里推广,而O2O软件很适合在写字楼下面做活动 。

    现场宣传物料的准备

    一场活动最基础的就是懂得如何造势,易拉宝、海报、单页通通做起来!现场拉人参加活动,到哪都能看见该旅游APP的宣传。如果你有小蜜蜂,那就更好了!

    保证现场人气(造势)

    有没有发现 用户都有跟风心态 地推只要送的礼品不是很差 一堆人围在那里就有想去了解的欲望。如果这样你还担心没人参加?表怕!要知道人都是群居性动物,总喜欢往人多的地方走,担心现场冷清就让工作人员排队当托吧,总会有好奇心强的人过来一探究竟的!

    礼品的选择保证一定的量

    关于礼品,谁说礼品就一定高大上,如果你觉得3元的礼品太Low没法做活动礼品,那只能说明你并非一个优秀的推广人员!我是不会告诉你那些精美礼袋里都是放有3块钱的小礼品的!一句“扫码送礼品!”一定有人来!

    优质体验

    人多了,稳定的网速自然也要跟上,这直接关乎到用户体验!试想一下,如果当时网络卡顿,不知要流失多少想要下载的用户,又会引发怎样的骚乱,这画面太血腥了,我不敢想。

    展开全文
  • 目前经典的目标检测方法主要包括单阶段(YOLO、SSD、RetinaNet,还有基于关键点的检测方法等)和多阶段方法(Fast RCNN、Faster RCNN、Cascade RCNN等)。下面主要介绍单阶段目标检测方法(SSD、YOLO系列、RetinaNet等...

    随着深度学习的发展,基于深度学习的目标检测方法因其优异的性能已经得到广泛的使用。目前经典的目标检测方法主要包括单阶段(YOLO、SSD、RetinaNet,还有基于关键点的检测方法等)和多阶段方法(Fast RCNN、Faster RCNN、Cascade RCNN等)。下面主要介绍单阶段的目标检测方法(SSD、YOLO系列、RetinaNet等)、多阶段目标检测方法(RCNN系列)以及其他方法(FPN、关键点等)。分析粗中有细,适合小白入门学习(需要多看代码)以及大佬回顾。

    一、单阶段

    单阶段目标检测方法是指只需一次提取特征即可实现目标检测,其速度相比多阶段的算法快,一般精度稍微低一些。

    1、YOLO v1

    YOLO目标检测算法是2016年CVPR《You Only Look Once: Unified, Real-Time Object Detection》,其直接完成从特征到分类、回归的预测,分类和回归使用同一个全连接层实现,其框架图如下:
    在这里插入图片描述

    1. 输入
      输入图像448×448×3通道。
    2. Backbone
      采用类似GoogLeNet的网络结构用24层Conv+2层FC,用1×1的reduction layer(将某一通道通过sum、mean等操作降成1维度,类似于Conv 1×1)跟着3×3的Conv替代inception模块,在ImageNet上将前20层网络+maxpooling+FC进行预训练(预训练224×224,目标检测训练448×448)。
    3. 输出
      输出是7×7×30的检测结果,7×7表示最后一层特征层大小,30表示2两个检测尺度×5个检测结果(x,y,w,h,score)+20类,其中score表示框的置信度,即该位置是否包含目标以及包含目标的准确性(IoU),表示为:
      P r ( C l a s s i ∣ O b j e c t ) ∗ P r ( O b j e c t ) ∗ I o U p r e d t r u t h = P r ( C l a s s i ) ∗ I o U p r e d t r u t h Pr(Class_i|Object)*Pr(Object)*IoU^{truth}_{pred}=Pr(Class_i)*IoU^{truth}_{pred} Pr(ClassiObject)Pr(Object)IoUpredtruth=Pr(Classi)IoUpredtruth
      训练时,当该位置不在目标的中心点时,值为0(Pr_class为0);当位置在目标的中心点时置信度为IoU(Pr_class为1)。
      在这里插入图片描述
    4. 损失函数
      损失函数设计时考虑以下几个方面:
      (1)由于包含目标中心位置的cell较少,因此需要增大置信度损失的权重(λ_coord=5);对于不包含目标中心位置的cell,降低置信度损失的权重(λ_noobj=0.5);
      (2)避免大小目标损失的差异,对长宽求平方根,减小差异
      (3)每个cell可以预测B个目标框,为了提高训练的稳定性,每个cell预测时指定IoU最高的Ground Truth。
      注意:预测中心位置是预测的是中心位置相对所在grid左上角的x、y偏差;预测长宽是相对于原图的目标长宽。
      在这里插入图片描述
      其中 1 i o b j 1_i^{obj} 1iobj表示目标出现在此cell中, 1 i j o b j 1_{ij}^{obj} 1ijobj表示第i个cell负责第j个目标框。
    5. 缺陷分析
      (1)每个cell只能预测一个类别和几个框
      (2)对于小目标检测效果不好;
      (3)用全连接层预测丢失了位置信息
      (4)只能检测与训练时固定尺度的图像(后面全连接层的限制)。

    2、YOLO v2

    YOLO v2来源于这篇论文《YOLO9000: Better, Faster, Stronger》。这篇论文介绍很多涨点的方法,同时也是针对YOLO v1的改进。

    1. Better
      (1)Batch Normalization
      BN可以对每一层输出的特征进行归一化,提高模型的鲁棒性。在每一层Conv之后加上BN可以涨2个点。
      (2)High Resolution Classifier
      采用更高分辨率的图像作为输入。YOLO v1输入224,这里输入448进行微调,可以提高4个点。
      (3)Convolutional With Anchor Boxes
      移除后面的FC层,引入Anchor预测目标与Ground Truth的偏差,输入416×416,输出特征13×13。YOLO v1只能预测98个目标,引入anchor之后可以预测上千个,mAP下降0.3,但是召回率明显提高
      (4)Dimension Clusters
      引入anchor时,用k-means聚类的方式找到合适的anchor尺度和比例,避免手工设计的不足。具体思想是利用ground truth和anchor的IoU进行聚类,避免目标尺度大小的影响。最终聚类之后每个位置5个anchor可以达到9个anchor的性能。
      (5)Direct location prediction
      利用Anchor进行训练时,预测中心点与长宽的偏差,刚开始训练时没有约束会导致训练不稳定。因此,将预测边框的中心约束固定在特定的网格内,即对中心点的预测利用Sigmoid进行处理
      b x = σ ( t x ) + c x b y = σ ( t y ) + c y b w = p w e t w b h = p h e t h b_x=σ(t_x)+c_x\\ b_y=σ(t_y)+c_y\\ b_w=p_we^{t_w}\\ b_h=p_he^{t_h} bx=σ(tx)+cxby=σ(ty)+cybw=pwetwbh=pheth
      其中 t x t_x tx t y t_y ty是预测的值,然后 σ ( ) σ() σ()表示Sigmoid,这样处理之后,预测结果都会在Grid中; p w p_w pw p h p_h ph是anchor的宽和长。涨5个点。
      在这里插入图片描述
      (6)Fine-Grained Features
      由于图像中目标大小不一,经过下采样过后小目标可能会丢失。这里提出passthrough,即在最后特征经过pooling之前,先将特征图进行拆成4份,然后将其与pooling之后的特征进行通道维度的拼接。涨1个点。
      在这里插入图片描述
      (7)Multi-Scale Training
      多尺度训练,在320-608之间中随机选择32的倍数作为训练尺度,以适应不同尺度的目标大小。最后以512尺度进行测试,可以达到78.6mAP。
      (8)不同tirck得到的性能对比实验:
      在这里插入图片描述
    2. Faster
      为了让速度更快提出新的BackBone,Darknet-19。采用3×3的小卷积核、每次池化之后通道倍数增加、BN,共有19层Conv、5层maxpooling,采用全局平均池化,在ImageNet上先进行1000类的预训练。在检测时用3×3、1024通道的卷积后跟1×1卷积替换掉之前的最后一层卷积。
      在这里插入图片描述
    3. Stronger
      COCO数据集有80类,ImageNet有1000类,如何来预测更多类别的目标呢?YOLO9000提出结合分类和检测的数据集进行层级预测。构建WordTree:
      在这里插入图片描述
      类似于决策树一样,把相同或者属于同一类别的放在同一个节点多个节点层次连接到根结点上。损失函数设计:如果有目标框,同时进分类和回归损失计算;如果没有目标,只进行分类的损失计算;分类的损失采用Softmax,即对同一层次的目标进行Softmax操作;最终某一个类别的概率为此节点的概率与所有根结点的概率乘积。分类头由1000变成1369,而标签是以同一层级进行Softmax计算,一个目标假如是狗,同级还存在猫、猴等;那么父节点假如是动物,同级还有植物等。而类别标签设置时,将叶子到根节点所有的路径都设置为1,其余为0(不同于one-hot编码,可能会有多个1)。
      在这里插入图片描述
      此部分有参考博文。

    3、YOLO v3

    YOLO v3来自此论文《YOLOv3: An Incremental Improvement》(论文看起来像实验报告,细节说的不清楚,还是需要看代码)。YOLO v3主要提出新的BackBone,特征金字塔结构用于不同尺度目标检测、采用Leaky ReLU等。

    1. DarkNet-53
      BackBone是DarkNet-53,没有FC和池化层
      在这里插入图片描述
      注意每一个模块都加入了残差结构通过卷积核实现特征尺度的缩小(通道增加)。最终图像尺度缩小32倍,而DarkNet-19(YOLO v2)里面用池化操作实现的特征图的缩小。
    2. FPN
      YOLO v3这里采用FPN自顶向下的特征融合结构,用于融合的三层特征尺度分别是32×32×256、16×16×512、8×8×512,特征融合时采用concat的方式(区别于Resnet相加的结构),最终用于检测的特征尺度是32×32×255、16×16×255、8×8×255。小尺度特征上采样时采用最近邻插值的方式实现。
    3. 检测头
      最终输出的通道数是255,即W×H×[3×(4+1+80)],其中3表示三种anchor尺度(仍然采用YOLO v2的方案进行K-means聚类实现的),4表示(x,y,w,h),1表示score,80表示coco数据集的所有类别。
    4. 损失函数
      损失函数仍然是分类损失+回归损失,其中分类损失采用Sigmoid替代了YOLO v2中的Softmax,更加灵活并且避免了类间互斥(YOLO v2用Softmax是同一类别层级的)。
    5. 样本筛选策略
      正样本即为anchor与目标的最大IoU的(即使IoU没有大于阈值),并且每个anchor唯一匹配一个ground truth;忽略样本即为IoU大于阈值的,但是不是正样本的;负样本即为IoU小于阈值并且不是正样本的。负样本只训练置信度,即objectness,标签为0.

    4、YOLO v4

    YOLO v4《YOLOv4: Optimal Speed and Accuracy of Object Detection》并不是之前YOLO的作者了。作者用了各种trick在YOLO v3的基础上进行改进,主要从**Bag of freebies(改变训练过程,不改变计算量)Bag of specials(稍微增加一点计算量)**两个方面进行分析,基本把目标检测上面的trick都用了一遍。

    1. 数据增强
      数据增强有旋转、裁剪、翻转、混淆(多张图像混淆在一起)、复制粘贴(将目标抠出来贴在别的位置)、拼接(多张图像拼接在一起)、局部模糊等。
      在这里插入图片描述
    2. BackBone
      论文中有提到CSPDarknet53相比CSPResNext50在检测上的效果好,但是后者在分类效果更好。其中CSP结构看这个,就是在每一个block之前,把通道拆分为两部分,一部分进行卷积的计算到之后再把前一部分concat一起,在降低计算量的同时能够保证精度不下降(会涨一点)。
      在这里插入图片描述
    3. 激活函数
      激活函数考虑ReLU、leaky-ReLU、parameter-ReLU、ReLU6、SELU、Swish、Mish
      (1) R e L U ( x ) = m a x ( 0 , x ) ReLU(x)=max(0,x) ReLU(x)=max(0,x),这个很好理解,即当x>0时,梯度为1,其余为0;
      (2)LeakyReLU相比ReLu而言在x<0时仍然还有一定的梯度(α,一般设置比较小,如0.1)。
      L e a k y R e L U = { x ; i f x > 0 α x ; o t h e r w i s e LeakyReLU=\left\{\begin{array}{c} x; if x>0\\ αx ; otherwise\end{array}\right. LeakyReLU={xifx>0αxotherwise
      (3)ReLU6就是ReLU,限制最大输出是6,理由是在移动设备采用低精度float16,限制6也能保证很好的精度如果不加限制,数值太大float16无法进行精确表示
      (4)parameter-ReLU(PReLU),计算公式与LeakyReLU,区别在于α是学习的参数
      (5)SELU中计算如下,其中α≈1.67326324…,λ≈1.050900987。SELU的作用主要是使输出归一化(不同于BN进行归一化),这里主要是使神经网络能够输出归一化的特征。
      S E L U ( x ) = λ { x ; i f x > 0 α e x − α ; i f x ≤ 0 SELU(x)=λ\left\{\begin{array}{c}x; if x>0\\ αe^x-α; if x≤0 \end{array}\right. SELU(x)=λ{x;ifx>0αexαifx0
      下面引用此博客的翻译解释SELU
      SELU 允许构建一个映射 g,其性质能够实现 SNN(自归一化神经网络)。SNN 不能通过(扩展型)修正线性单元(ReLU)、sigmoid 单元、tanh 单元和 Leaky ReLU 实现。
      这个激活函数需要有:
      负值和正值,以便控制均值
      饱和区域(导数趋近于零),以便抑制更低层中较大的方差
      大于 1 的斜率,以便在更低层中的方差过小时增大方差
      ④连续曲线。后者能确保一个固定点,其中方差抑制可通过方差增大来获得均衡。我们能通过乘上指数线性单元(ELU)来满足激活函数的这些性质,而且 λ>1 能够确保正值净输入的斜率大于 1。
      (6) S w i s h ( x ) = x ∗ s i g m o i d ( x ) Swish(x)=x*sigmoid(x) Swish(x)=xsigmoid(x);
      (7) M i s h ( x ) = x ∗ t a n h ( l n ( 1 + e x ) ) Mish(x)=x*tanh(ln(1+e^x)) Mish(x)=xtanh(ln(1+ex)).
      水平有限,哎!这些激活函数无法进行理论分析。
      可以参考这些讲解1讲解2.
    4. 损失函数
      损失函数对比MSE、IoU、GIoU、CIoU、DIoU,这里分析见此文结尾部分。
    5. 正则化方法
      正则化方法这里用了DropOut、DropPath、Spatial DropOut、DropBlock。
      (1)DropOut简单说来就是在网络训练的时候按照一定的概率(0.2-0.5)随机丢掉一部分的神经元(失活),让网络在训练的过程中避免依赖于极少数的神经元,而在测试的时候所有的神经元都是激活状态的
      (2)Spatial DropOut按通道随机扔;
      (3)DropBlock在每个特征图上按照spatial块随机扔。
      这部分还没有详细研究。
    6. 归一化方法
      归一化方法用了BN、CBN、FRN等,都是BN的变体,简单说下BN的细节吧!BN(Batch Normalization),就是在一个Batch内计算均值和方差进行归一化处理,学习两个参数对归一化之后的数据进行复原。
      训练阶段,均值和方差是该批次内的相应维度的均值和方差(比如N个图像特征中同一通道的数据)。测试阶段,均值和方差是基于所有的Batch求期望和方差的。
      均值 u = 1 / m ∑ i x i u=1/m∑_ix_i u=1/mixi,方差 σ = 1 / m ∑ i ( x i − u ) 2 σ=1/m∑_i(x_i-u)^2 σ=1/mi(xiu)2,数据经过均值和方差计算之后变成 x ′ = ( x − u ) / s q r t ( σ 2 + ε ) x'=(x-u)/sqrt(σ^2+ε) x=(xu)/sqrt(σ2+ε)其中ε是避免除数为0。然后再经过γ和β进行反归一化。 y = γ x ′ + β y=γx'+β y=γx+β,如果γ和β分别是方差和均值,可以发现y=x,通过γ和β可以避免数据被归一化的太严重,防止网络无法学习到准确的特征。
    7. skip-connection
      这里是指一些残差用了Residual connections(常规残差), Weighted
      residual connections(不是直接残差相加,进行加权)
      , Multi-input weighted residual
      connections(多层加权残差融合)
      , or Cross stage partial connections (见上文Backbone)。
    8. 特征融合
      尝试了不少特征融合方法,FPN、PAN、ASFF、BiFPN等,此部分分析见下文中的FPN。
      实验的结果就贴一部分,有兴趣可以看下论文中的数据,实验数据相当丰富。
      在这里插入图片描述
      在这里插入图片描述

    5、SSD

    SSD来源于此篇论文《SSD: Single Shot MultiBox Detector》,整个网络是全卷积网络,即经过VGG16进行特征提取后,提取38×38、19×19、10×10、5×5、3×3、1×1共六层不同尺度特征用于分类和回归。每一个特征层输出为: H×W×(N×(classes+4)),其中N表示这一层中的Anchor数量、classes表示类别数目、4表示(x,y,w,h)相对于Anchor的四个偏移量。下图表示整个网络的结构。
    在这里插入图片描述

    1. 训练匹配原则
      匹配Ground Truth时,选择IoU最大的Anchor;这样会导致很多Anchor都是负样本,因此对于剩余未匹配的Anchor,如果IoU>0.5,也会进行匹配最后每个Ground Truth会匹配多个Anchor。
    2. 损失函数
      损失函数即为分类损失Softmax loss和回归损失Smooth L1 loss(定位的中心点和长宽偏差与Faster RCNN相似)。
    3. Anchor的尺度选择
      每一层预测时选择的anchor的尺度不同,这里作者给出一个计算方式:
      s k = s m i n + ( k − 1 ) ( s m a x − s m i n ) / m − 1 s_k=s_{min}+(k-1)(s_{max}-s_{min})/m-1 sk=smin+(k1)(smaxsmin)/m1
      其中 s m i n = 0.2 , s m a x = 0.9 s_{min}=0.2,s_{max}=0.9 smin=0.2,smax=0.9,即anchor最小尺度为0.2/2*300=30;长宽比例设置为 1 , 2 , 3 , 1 / 2 , 1 / 3 , 1 ′ {1,2,3,1/2,1/3,1'} 1,2,3,1/2,1/3,1,其中 1 ′ 1' 1表示尺度为 √ s k √ s k + 1 √s_k√s_{k+1} sksk+1,长宽比为1;长宽的计算方式分别是: w k a = s k √ a r ; h k a = s k √ a r w^a_k=s_k√a_r;h^a_k=s_k√a_r wka=skar;hka=skar,这样操作之后一个anchor的大小没有变,但是长宽的比例变了。
      这些anchor分布在各个特征图中所有特征点的中心,计算方式为: ( ( i + 0.5 ) / ∣ f k ∣ , ( j + 0.5 ) / ∣ f k ∣ ) ((i+0.5)/|f_k|,(j+0.5)/|f_k|) ((i+0.5)/fk,(j+0.5)/fk)
      最终,整个网络预测的结果总个数为8732个,即:
      38 × 38 × 4 + 19 × 19 × 6 + 10 × 10 × 6 + 5 × 5 × 6 + 3 × 3 × 4 + 1 × 1 × 4 = 8732 38×38×4+19×19×6+10×10×6+5×5×6+3×3×4+1×1×4=8732 38×38×4+19×19×6+10×10×6+5×5×6+3×3×4+1×1×4=8732,其中×6、×4表示使用几个尺度的anchor,如果是×6即为{1,2,3,1/2,1/3,1’},×4表示{1,2,1/2,1’}。
    4. 先验框匹配
      先验框匹配的原则是,对于每个Ground Truth,先找到最大IoU的先验框进行匹配;保证每个Ground Truth都有先验框匹配;对于剩余未匹配的先验框,如果和Ground Truth的IoU大于阈值(0.5),则也进行匹配;即一个Ground Truth可能匹配多个先验框,但是一个先验框最多匹配一个Ground Truth。为了保证正负样本均衡,对负样本进行抽样,即选取误差最大的top-k作为训练的负样本,保证负样本的比例接近1:3。
    5. 数据增强
      数据增强就是普通的旋转、翻转、随机裁剪+颜色扭曲等。

    6、RetinaNet

    RetinaNet来源于《Focal Loss for Dense Object Detection》这篇论文。主要提出的问题是单阶段目标检测相比多阶段目标检测算法性能较差的原因在于正负样本的筛选不均衡。多阶段目标检测过程中,通过Selective Search、RPN等方式可以过滤掉大量的背景框,然后通过筛选正负样本(如1:3)的方式进行训练。但是单阶段的目标检测算法无法过滤这些背景框,导致正负样本严重不均衡(SSD上面提到了,选择loss最大的top-k,使得正负样本比例1:3左右)!因此提出Focal loss在训练的时候自适应调整损失权重,使得模型关注难样本的训练,同时提出RetinaNet目标检测框架。

    1. Focal loss提出用于解决分类中的正负样本不均衡问题,基于Cross Entropy loss进行改进的。交叉熵损失是这个,进行分类时采用one-hot编码形式可以进一步化简
      L o s s ( y k , p k ) = − y k l o g ( p k ) − ( 1 − y k ) l o g ( 1 − p k ) o n e − h o t − l a b e l : L o s s ( y k , p k ) = − l o g ( p k ) Loss(y_k,p_k)=-y_klog(p_k)-(1-y_k)log(1-p_k)\\ one-hot-label:Loss(y_k,p_k)=-log(p_k) Loss(yk,pk)=yklog(pk)(1yk)log(1pk)onehotlabel:Loss(yk,pk)=log(pk)
      提出的Focal loss损失是这个:
      F o c a l L o s s ( p k ) = − ( 1 − p k ) γ l o g ( p k ) Focal Loss(p_k)=-(1-p_k)^γlog(p_k) FocalLoss(pk)=(1pk)γlog(pk)
      Cross Entropy Loss存在的问题主要就是,当分类的准确率很高的时候,仍然会产生很大的loss,使得模型训练中那些很难的样例(hard negative)被淹没在简单样本产生的损失中。而Focal 正是解决这个问题,即分类误差较低时,给予较低的权重分类误差较大时,给予较高的损失权重;使得模型能够更加关注难分的样本(这一部分对比分析可见最后损失分析部分)。
      在这里插入图片描述
    2. RetinaNet
      RetinaNet可以看成是一个RPN网络,经过Backbone进行特征提取之后,接FPN然后进行分类和回归的检测。
      在这里插入图片描述
      (1)在FPN中,采用的特征是P3、P4、P5,然后在P5上面进行一次卷积得到P6、在P6上进行一次卷积得到P7,最终特征为P3、P4、P5、P6、P7相对于图像下采样了8、16、32、64、128倍。
      (2)关于Anchor,这里P3-P7对应的Anchor的基本尺度是32、64、128、256、512;三种尺度比例分别是{1,1/2,2};在每一个anchor的基础上,进行三种尺度缩放 2 0 , 2 1 / 3 , 2 2 / 3 {2^0,2^{1/3},2^{2/3}} 20,21/3,22/3,所以每个位置(不同位置之间会有步长)共有9个anchor。
      (3)分类头经过几层卷积操作最后输出为W×H×KA,其中A表示anchor的数量(这里是9,K表示类别的数量),即每个anchor都预测所有类别。
      (4)回归头同样经过几层卷积操作,最后输出为W×H×4A,4表示 x , y , w , h {x,y,w,h} x,y,w,h相对于anchor的偏差。
      (5)正负样本匹配,Anchor与Ground Truth的IoU>0.5视为正样本,小于0.4视为负样本,[0.4,0.5)是忽略样本。

    二、多阶段RCNN系列

    1、RCNN

    RCNN是比较早的利用CNN进行目标检测的算法。其思想是使用selective search提取2000个左右的预选框,然后resize到统一的尺度(因为后面接FC分类)进行CNN特征提取,最后用FC进行分类。具体流程如下:
    在这里插入图片描述

    1. 预训练模型
      选取图像分类的预训练模型,然后用图像中的目标(通过selective search筛选的预选框,选择与Ground Truth 的IoU>0.5)对最后的全连接层(N+1类)进行重新训练;
      这里简单介绍下Selective Search算法。
      (1)先通过计算近邻区域的像素之间相似度,划分为一块块小的区域;
      (2)再计算近邻区域之间的相似度,这里有用到颜色相似纹理相似尺寸相似填充相似(所谓填充相似是指两个不规则区域的外接矩形差不多,也就是你中有我我中有你的这种情况)等。
    2. 提取预选框特征
      利用Selective Search算法提取2000个预选框,并调整成固定的大小,以满足CNN的输入(最后全连接层限制),最后将pool层的特征保存下来(保存到本地,后面用SVM进行分类和回;正样本与Ground Truth的IoU>0.5,最大IoU;负样本IoU<0.3);
    3. 训练SVM分类器
      使用SVM进行分类训练,这里每个类别都训练一个二进制SVM(此类和其它,其它包含其它类别);
    4. 边界框回归
      边界框回归,训练一个具有校正因子的线性回归分类器(FC),损失函数是L2损失。
      回归分类器预测的是Ground Truth相对于预选框的中心点、长宽的偏差,其中G表示Ground Truth,P表示预选框(Proposal)。中心点使用相对坐标便于优化(区间在0~1),并且可以很好的应对不同尺度的目标、图像大小;长宽用log,是因为G=P exp(dP),反过来就是log了。
      在这里插入图片描述
      在这里插入图片描述
      参考:《Rich feature hierarchies for accurate object detection and semantic segmentation

    2、Fast RCNN

    Fast RCNN相比RCNN而言只需要对整幅图像进行一次特征提取,并且直接利用FC进行分类和回归,实现end-to-end的多任务协同优化。具体过程是图像先经过Backbone网络提取图像的feature map;利用selective search搜索的预选框到特征上提取RoI的特征;通过RoI Pooling将RoI的特征转化为固定的大小;最后输入到分类和回归头分别进行分类和回归。
    在这里插入图片描述

    1. RoI(Region of Interest)
      RoI仍然是通过Selective Search进行搜索得到的一个个预选框

    2. RoI Pooling
      (1)RoI Pooling的有两个输入,一个是feature map,即整个图像经过Backbone提取的特征;另一个是RoI的坐标5维,[idx,x1,y1,x2,y2]表示左上角和右下角的坐标。坐标尺度是相对原图的尺度,而在feature上根据图像下采样的比例(即feature/原图尺度)找到对应的坐标。
      (2)将映射后的区域划分为相同大小的区间(比如7×7),这样就可以从不同大小的RoI中获得固定大小的feature map,最终输出[H,W,C]维度的特征图,C表示通道个数,然后进行分类和回归处理。
      值得注意的是: 当proposal在特征图上的尺度大于7×7时(比如RoI Pooling输出的是7×7),比较好理解,直接计算特征图到7×7映射的每个bin的最大值;当proposal小于7×7咋办呢?其实还是一样的,仍然这样强行处理,只不过会有一部分值是重复的。参考 在Mask RCNN中对RoI Pooling进行了修改,采用线性插值的方式来做的。

    3. 损失函数
      损失函数分为分类回归损失函数,与RCNN不同的是这里直接用FC进行分类和回归,分类损失函数Cross Entropy和Smooth L1
      分类共有N+1类,+1表示背景类
      回归用Smooth L1损失,对[x,y,w,h]进行回归,其中回归的约束目标仍然是中心点和长宽的相对值,与RCNN相似。Smooth L1损失:
      在这里插入图片描述
      当回归损失较大时,梯度是1,将回归损失较小时梯度是x;这样损失较大梯度大,下降快;损失较小,梯度小,损失下降慢。
      参考:《Fast R-CNN

    3、Faster RCNN

    Fast RCNN的RoI仍然是通过Selective Search的方式进行搜索,其速度较慢。Faster RCNN在Fast RCNN的基础上提出RPN(Region Proposal Network)自动生成RoI,极大的提高了预选框生成的效率。RPN过程如下:
    在这里插入图片描述
    图像经过Backbone网络之后得到feature map;将feature map输入到RPN网络中获得预选框(proposal);后续过程处理与Fast RCNN一致。

    1. RPN网络是什么?
      RPN网络是用于预测RoI的,输入是feature map,输出是RoI及分类结果(二分类,前景和背景);其中RoI是anchor的偏差(加上anchor之后就形成了RoI),分类头和回归头均采用卷积结构。
      (1)分类头输入W×H×C的特征,输出为W×H×(K×Cls),K表示anchor的个数,Cls表示类别数,一般就是两类,前景背景;这样就获得了每个anchor的类别了;
      (2)回归头输入W×H×C的特征,输出为W×H×(K×4),其中K表示anchor的个数,4表示RoI相对于anchor的中心点和长宽的偏差。
    2. anchor是什么?
      anchor是在特征图上画密集的框,如下所示:
      在这里插入图片描述
      在特征图上,每一个位置(或有间隔)都按照一定的长宽、尺度比例画出N个框,比如3种尺度、3种长宽比例共9个框;假如特征图大小是H×W,则有H×W×9个框,这些框基本可以包括所有的目标。
    3. RPN整体流程
      (1)生成anchor,并利用RPN网络计算所有的RoI(anchor的偏差)和分类结果
      (2)正负样本划分,RPN网络中,选取RoI与Ground Truth的IoU>0.7作为正样本,IoU<0.3作为负样本(区别于最后的检测头,最后的检测头一般选取IoU>0.5作为正样本,<0.5作为负样本),正负样本选取的比例大概是1:3;
      (3)对分类结果进行分数排序,获得前N个预选框(比如2000个);
      (4)边界框处理,避免超出特征边界;
      (5)进行NMS,对重叠的框的IoU>阈值(比如0.5)进行剔除
      (6)最后将RPN网络预测的RoI送入到RoI Pooling中进行特征提取,此特征与输入RPN网络的特征图是同一个,后续接分类头和回归头(与Fast RCNN类似,损失也一样)。
    4. 损失函数
      损失函数是RPN的分类损失+RPN的回归损失+最终检测头的分类和回归损失
      RPN中分类损失采用Cross Entropy,回归损失采用Smooth L1损失。
      参考:《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

    4、Cascade RCNN

    Cascade RCNN可以说是基于Faster RCNN进行改进的版本。Faster RCNN是通过RPN网络预测出Proposal然后利用分类头和回归头完成分类和定位,但是存在一个问题,训练时我们知道Ground Truth,可以直接筛选高质量的Proposal用于最后的分类和回归,但是在测试阶段,我们并不知道Ground Truth,导致所有的Proposal都进行最后的分类和定位,这就是训练和测试阶段的不匹配问题。直接暴力提高IoU的阈值,则会导致性能下降(召回率),经过实验发现当训练和测试时Proposal自身的阈值与训练的阈值接近时(就是训练和测试时后面检测头接收的proposal差不多),效果才会好。Cascade RCNN提出级联多个检测头来解决这个问题,如下图:
    在这里插入图片描述

    1. 整体流程
      级联多个检测头,每个检测头的IoU呈现递增的情况,比如0.5、0.6、0.7,并不是采用相同的阈值(区别于Iterative BBox)。低级检测头采用低IoU阈值可以提高召回率,避免目标丢失;后续的高级检测头在前一阶段的基础之上提高阈值可以提高检测精度。
    2. 损失函数
      损失函数就是多个检测头的分类损失+回归损失,与Faster RCNN检测头的损失一样。分类用Cross Entropy,回归用Smooth L1 Loss。
      参考:《Cascade R-CNN: Delving into High Quality Object Detection

    5、Mask RCNN

    Mask RCNN是一个实例分割的算法,是在Faster RCNN目标检测+FCN的基础上进行分割。过程图如下:
    在这里插入图片描述

    1. 流程介绍
      图像先经过BackBone进行特征提取;然后经过RPN网络预测Proposal;再利用RoI Align进行特征提取;然后接分类和检测头;最后接Mask检测头,即每一个类别都预测一个Mask。
    2. RoI Align
      RoI Align的作用于RoI Pooling的作用一样,都是提取Proposal在原特诊图上的特征。前面的介绍中我们知道RoI Pooling通过取整在feature map上进行池化操作提取固定尺度的特征(比如7×7×C),但是这里有两次取整操作会导致误差较大。
      (1)第一次取整是RPN的Proposal在映射到feature map进行取整;
      (2)第二次取整是feature map映射到原图上时由于图像下采样导致坐标的偏差;
      (3)这两次取整会导致像素点在特征图上的偏移很大,假如特征下采样32次,那么RoI Pooling就会导致32像素的偏差,对于小目标的检测极其不友好
      因此RoI Align通过两种方式解决这个问题;
      (1)保留proposal映射到feature map位置的小数部分;
      (2)采用双线性插值的方式对proposal所在的feature map进行处理,避免边界导致的特征不准确(RoI Pooling会进行重复采样);
      (3)每个proposal到feature map映射的bin中,由4个(如2×2、3×3)周围的值进行加权得到。
      如图所示,虚线表示特征图,实线表示采样的proposal,利用双线性插值的方法计算每个黑点的值,然后每个bin(2×2)内的四个值(四个黑点)再求最大值或者均值,实现RoI Align。
      在这里插入图片描述
      因此在目标检测时使用RoI Align效果要比RoI Pooling好,尤其是对于小目标的精度影响。
    3. 损失函数
      损失函数计算就是分类损失+回归损失+mask损失,其中分类和回归损失参考Faster RCNN,mask损失是每个类别的mask二进制损失(用sigmoid处理之后,binary entropy loss)。
    4. 结果输出/损失计算
      (1)结果输出:经过backbone提取到roi align特征之后,缩放成指定维度的特征,比如14×14,28×28,然后经过mask head进行上采样回原图像尺度比例(upsample,反卷积),再进行sigmoid进行映射,设定大于阈值为1,否则为0.
      (2)损失计算:采用cross entropy损失等,计算的特征以mask head输出进行计算(比如28×28,并不是upsample回原图),最后进行均值化。
      参考《Mask R-CNN

    三、旋转目标检测

    旋转目标检测这里只介绍一个RoI Transformer吧!《Learning RoI Transformer for Oriented Object Detection in Aerial Images旋转目标检测与水平目标检测不同的是需要检测目标的方向,在遥感图像目标检测、文字检测等任务中比较常见。预测的结果包含类别、位置坐标、长宽、角度。
    RoI Transformer基于Faster RCNN检测算法,加上一个旋转RoI特征提取模块(Rotated RoI),整个过程分为两个阶段:
    (1)第一阶段,即Faster RCNN算法,经过RPN、水平RoI预测一个粗略的旋转框(利用水平RoI特征预测{x,y,w,h,θ},这里θ表示一个旋转角度);
    (2)第二阶段,基于第一阶段的粗略旋转框,提取旋转RoI的特征,再进行精确的{x’,y’,w’,h’,θ’},即在第一阶段的结果上进行修正
    整个思路过程大致如下:
    在这里插入图片描述
    (3)旋转RoI,旋转RoI特征提取是基于RoIAlign实现的,即在水平RoIAlign的基础上,每一个采样点(x,y)都根据角度θ进行坐标偏移得到(x’,y’),最终实现旋转RoI特征提取。偏移计算公式如下:
    在这里插入图片描述
    (4)预测目标,这里预测的坐标需要考虑角度的偏差,即:
    t x ′ = 1 / w r ( ( x ′ − x r ) c o s θ r + ( y ′ − y r ) s i n θ r ) t y ′ = 1 / h r ( ( y ′ − y r ) c o s θ r + ( x ′ − x r ) s i n θ r ) t w ′ = l o g ( w ′ / w r ) ; t h ′ = l o g ( h ′ / h r ) t θ ′ = ( ( θ ′ − θ r ) m o d 2 π ) / 2 π t'_x=1/w_r((x'-x_r)cosθ_r+(y'-y_r)sinθ_r)\\ t'_y=1/h_r((y'-y_r)cosθ_r+(x'-x_r)sinθ_r)\\ t'_w=log(w'/w_r);t'_h=log(h'/h_r)\\ t'_θ=((θ'-θ_r)mod2π)/2π tx=1/wr((xxr)cosθr+(yyr)sinθr)ty=1/hr((yyr)cosθr+(xxr)sinθr)tw=log(w/wr);th=log(h/hr)tθ=((θθr)mod2π)/2π
    分类损失函数是Cross Entropy Loss,回归损失是Smooth L1 Loss。最终的损失由RPN(分类、回归)+水平框损失(分类、回归)+选择框损失(分类、回归)。
    (5)这里旋转目标检测有一点不一样的是需要计算旋转目标的IoU,计算的时候用shapely这个包计算的多边形IoU。

    四、其他

    1、FPN及其变体

    这一部分介绍一下FPN的一些变体结构吧(FPN、PAFPN、ASFF、CARAFE)!今年的一篇CVPR2021论文《You Only Look One-level Feature》提到FPN网络提高检测性能的主要原因在于不同尺度的分治,对于自顶向下的特征融合对于性能影响不大!(其实这个也比较好理解,分治的作用肯定比融合特征性能提升的多)。

    1. FPN
      FPN由这篇论文提出《Feature Pyramid Networks for Object Detection》,思路就是由BackBone网络提取出不同层级的特征用于多尺度目标检测。在提取多尺度特征的同时,浅层特征位置信息准确(下采样的倍数较小)、深层特征语义信息更加丰富(网络结构更深,语义信息更准确),因此采用自顶向下的特征融合方法,提升浅层特征表达的准确性。
      在这里插入图片描述
      由上图可见,左边表示经过BackBone网络提取出的不同层级的特征,然后经过右边的FPN网络进行自顶向下的特征融合,最终将融合之后的特征用于预测。
      (1)由于不同层级的特征经过BackBone网络提取时,通道不一样(深层特征通道深、浅层特征通道浅)。因此,先进行Conv1×1的卷积,进行通道降维,使得不同层级的特征能够进行融合
      (2)深层特征尺度小,浅层特征尺度大,进行融合时通过上采样操作保持特征尺度一致
      (3)特征融合时直接进行相加,然后再对融合之后的特征进行Conv3×3操作,最终进行预测。
    2. PANet
      FPN是进行自顶向下的特征融合,而PANet提出用于自底向上的特征融合。论文《Path Aggregation Network for Instance Segmentation》,具体结构图如下:
      在这里插入图片描述
      (1)上图可见(a)部分是常规的FPN及自顶向下的特征融合结构,增加了底层到深层的融合分支(红色虚线);
      (2)经过左边的FPN特征融合之后,进行(b)所示的自底向上的特征融合,另外将底层特征再次融合到深层特征中;
      (3)经过特征融合之后,对于任意一个Proposal,提取其在不同特征层上的特征经过MaxPooling或SUM操作进行融合,最终得到新的RoI特征,最终用于分类和回归(同时对于语义分割的mask预测同理,用过全卷积实现)。
    3. ASFF
      前面的FPN及PANet通过自顶向下、自顶向下再向上等方式进行特征融合,而ASFF则提出更加复杂的融合方法。论文《Learning Spatial Fusion for Single-Shot Object Detection
      在这里插入图片描述
      (1)从上图可以看到,ASFF同时融合多层特征并加上权重进行自适应的融合;
      (2)每个层级的特征权重之和为1,经过Softmax进行计算,权重预测也是有卷积实现;
      (3)权重预测结构中,输入为FPN的特征,分别是三个H×W×C(三个H、W不同),输出为三个H×W×C’,这里C’为通道;然后进行concat拼接,最后再经过卷积输出H×W×3得到3通道的权值特征,最终通过Softmax进行权重归一化
    4. CARAFE
      这个来源于论文《CARAFE: Content-Aware ReAssembly of FEatures》,所提出的问题在FPN进行特征融合时,深层特征尺度小需要进行上采样使得和低层特征尺度一致,但是普通的方法采用线性插值或者最近邻插值的方式,导致局部特征不准确。主要包括两个结构,核预测结构(Kernel Prediction Module)和语义信息重组结构(Content-aware Reassembly Module)。整体结构如下:
      在这里插入图片描述
      (1)KPM
      先说上一个模块。输入特征,经过Conv1×1进行通道压缩;接着进行特征编码,也就是把不同通道的特征经过重组形成新的大尺度特征;最后在每一个通道进行Softmax正则化。
      (2)CRM
      下一个是将上一个模块学习到的权重模块按照通道对每一个位置特征进行近邻加权融合,即每一个特征点及其周围特征乘以这个加权的结果;最后得到新的大尺度的特征,用以将深层特征融合到低层特征中。
      (为什么要讲个呢?之前的FPN融合都是各种尺度特征排列组合式的融合,这个主要解决融合过程中的特征偏差,并且经过实验,确实能涨点哦)。
    5. 关于FPN的先讲这么多吧!其实还有很多经典的FPN魔改结构,比如BiFPN、NAS-FPN等。可以看看这些大佬讲的,链接1链接2.

    2、Anchor Free

    本人研究Anchor Free相关的算法比较少(YOLO v1是比较早的Anchor Free算法了),这里主要介绍几篇关于关键点检测的算法。FCOS、CenterNet等。

    1. FCOS
      FCOS来源于此篇论文《FCOS: Fully Convolutional One-Stage Object Detection》主要的思想是预测目标的中心点(不一定是中心)和上下左右四个距离,表示中心点到边界的距离。如下图:
      在这里插入图片描述
      (1)整体结构经过FPN之后,到分类头、检测头、center-ness头。分类头输出H×W×C,C表示类别,其中C=0表示背景类,这里采用多个二分类器,使用Focal Loss;检测头即输出H×W×4,表示预测中心点到四个边的距离,用IoU Loss;Center ness的目的是使中心点尽可能的居中,目的是为了过滤掉低质量的样本(比如一个目标的中心点处于目标区域内的很多,但是处于边缘的中心点质量就比较低),这里用binary cross entropy。
      在这里插入图片描述
      (2)上文提到,位置落在目标内部即可视为中心点,如果一个位置处于多个目标内部怎么办呢(二义性样本)?这里只选择面积最小的目标(因为面积大的目标可以有更多的位置选择,另外还进行多标签预测,也可以避免漏检问题)。如果确定一个位置 ( x , y ) (x,y) (x,y)是目标的中心点,关联的目标框是 B i B_i Bi为:
      l ∗ = x − x 0 ( i ) , t ∗ = y − y 0 ( i ) , r ∗ = x 1 ( i ) − x , b ∗ = y 1 ( i ) − y l^*=x-x_0^{(i)},t^*=y-y_0^{(i)},r^*=x_1^{(i)}-x,b^*=y_1^{(i)}-y l=xx0(i),t=yy0(i),r=x1(i)x,b=y1(i)y并且这里用exp(x)将映射到(0,∞)
      (3)采用FPN主要从两个角度考虑,一方面是预测不同尺度的目标;另一方面是避免目标重叠时一个中心点无法预测多个目标。为了使不同尺度目标在对应合适的特征层上进行预测,按照 m a x ( l ∗ , t ∗ , r ∗ , b ∗ ) > m i max(l^*,t^*,r^*,b^*)>m_i max(l,t,r,b)>mi或者 m a x ( l ∗ , t ∗ , r ∗ , b ∗ ) > m i − 1 max(l^*,t^*,r^*,b^*)>m_{i-1} max(l,t,r,b)>mi1即按照预测的目标尺度映射到对应的特征层上。
      (4)Center-ness主要的目的是使目标位置尽可能处于中心点。
      c e n t e r n e s s ∗ = s q r t ( m i n ( l ∗ , r ∗ ) / m a x ( l ∗ , r ∗ ) × m i n ( t ∗ , b ∗ ) / m a x ( t ∗ , b ∗ ) ) centerness^*=sqrt(min(l^*,r^*)/max(l^*,r^*)×min(t^*,b^*)/max(t^*,b^*)) centerness=sqrt(min(l,r)/max(l,r)×min(t,b)/max(t,b))用binary cross entropy loss,可见当损失越小,centerness越接近于1,也就是回归框的中心接近于Ground Truth。
    2. CenterNet
      CenterNet来源于这篇论文《Objects as Points》,直接检测目标的中心点和目标长宽,即可获得检测结果,速度比较快。
      在这里插入图片描述
      (1)关键点预测:输入为H×W×3的图像,输出为 Y ∈ [ 0 , 1 ] W / R × H / R × C Y∈[0,1]^{W/R×H/R×C} Y[0,1]W/R×H/R×C的热点图(C表示目标的类别),即表示该点为某类目标的中心点。当 Y x , y , c = 1 Y_{x,y,c}=1 Yx,y,c=1时表示对应的关键点;当 Y x , y , c = 0 Y_{x,y,c}=0 Yx,y,c=0表示为背景。关键点的坐标即为中心点的坐标 p = ( ( x 1 + x 2 ) / 2 , ( y 1 + y 2 ) / 2 ) p=((x_1+x_2)/2,(y_1+y_2)/2) p=((x1+x2)/2,(y1+y2)/2),图像经过下采样之后对应到特征上的坐标为下取整的坐标 p ′ = f l o o r ( p / R ) p'=floor(p/R) p=floor(p/R)需要注意的是,这里关键点的Ground Truth并不是一个点,而是经过高斯核处理之后变成了一个高亮的区域,高斯核为 Y x y c = e x p ( − ( ( x − p x ) 2 + ( y − p y ) 2 ) / 2 σ p 2 ) Y_{xyc}=exp(-((x-p_x)^2+(y-p_y)^2)/2σ^2_p) Yxyc=exp(((xpx)2+(ypy)2)/2σp2)。其中 2 σ p 2 2σ^2_p 2σp2是一个与目标长宽相关的标准差。如果多个目标的热点图重叠,那么取最大值。
      (2)关键点预测的损失函数是
      L k = − 1 / N ∑ x y c { ( 1 − Y x y c ′ ) α l o g ( Y x y c ′ ) ) ; i f Y x y c = 1 ( 1 − Y x y c ) β ( Y x y c ′ ) α l o g ( 1 − Y x y c ′ ) ; o t h e r w i s e L_k=-1/N∑_{xyc}\left\{ \begin{array}{c} (1-Y'_{xyc})^αlog(Y'_{xyc})); if Y_{xyc}=1\\ \\ (1-Y_{xyc})^β(Y'_{xyc})^αlog(1-Y'_{xyc});otherwise\end{array}\right. Lk=1/Nxyc(1Yxyc)αlog(Yxyc));ifYxyc=1(1Yxyc)β(Yxyc)αlog(1Yxyc);otherwise其中α和β是Focal loss的超参数,N是图像的关键点个数,实验中设置α=2,β=4。这里的思想也就是降低易检测样本的权重,提升难检测样本的权重。(这里用focal loss我感觉也是因为正负样本不均衡的问题,即关键点相对于整个图像来说占据很少的一部分)。下面一个公式,即预测结果不在中心点时,当预测结果越大,权重越大 ( Y x ′ y c ) α (Y'_xyc)^α (Yxyc)α,但是标签值又对权重进行调整 ( 1 − Y x y c ) β (1-Y_{xyc})^β (1Yxyc)β,即标签值越大,权重越小;这样做的目的即靠近中心点的损失权重大,标签权重小;远离中心点的,损失权重小,标签权重大。
      (3)目标位置偏差预测由于下采样,关键点的位置是有一定偏差的,因此用L1 Loss作为中心点偏差的损失计算。其中 p ′ = f l o o r ( p / R ) p'=floor(p/R) p=floor(p/R)这里主要预测的偏差就是下采样取整导致的偏差
      L o f f = 1 / N ∑ p ∣ O p ′ − ( p / R − p ′ ) ∣ L_off=1/N∑_p|O'_p-(p/R-p')| Loff=1/NpOp(p/Rp)
      (4)目标长宽预测,即采用目标在特征图上缩放之后的长宽进行预测。
      L s i z e = 1 / N ∑ k = 1 ∣ S p k − s k ∣ L_{size}=1/N∑_{k=1}|S_{pk}-s_k| Lsize=1/Nk=1Spksk最终的损失是由 关键点预测损失+目标位置偏差损失+目标长宽预测损失 加权。
      L d e t = L k + λ s i z e L s i z e + λ o f f L o f f L_{det}=L_k+λ_{size}L_{size}+λ_{off}L_{off} Ldet=Lk+λsizeLsize+λoffLoff这里 λ s i z e = 0.1 , λ o f f = 1 λ_{size}=0.1,λ_{off}=1 λsize=0.1,λoff=1,网络输出共有C+4个维度,其中C表示类别,4表示中心点和长宽
      (5)在测试阶段,为了找到中心点,找到当前值比近邻8个最大的点作为特征点

    五、目标检测中的损失函数

    目标检测中的损失函数主要分为分类损失函数和回归损失函数。在检测任务中用的分类损失函数基本都是Cross Entropy Loss,关于分类任务这方面的变体比较多;在回归任务中,基本都是L1、L2、Smooth L1以及IoU相关的损失。下面就简单介绍下相关的损失函数。

    1、分类损失(图像分类、目标检测中分类)

    1. Softmax Loss(Cross Entropy Loss)
      分类中,为了保证所有的类别预测结果求和是1,用Softmax进行处理,Softmax计算公式如下:
      p ( z k ) = e z k / ∑ j e z j p(z_k)=e^{z_k}/∑_je^{z_j} p(zk)=ezk/jezj
      上式表示预测第k个类别的概率。通过Softmax进行计算时,会分配给较大的值高概率、较小的值低概率。而Cross Entropy Loss是对Softmax处理时候的概率进行损失计算。下式中y表示标签,z表示预测概率,第k个类别的损失(所有损失是对所有类别求和):
      L o s s ( y k , p k ) = − y k l o g ( p k ) − ( 1 − y k ) l o g ( 1 − p k ) Loss(y_k,p_k)=-y_klog(p_k)-(1-y_k)log(1-p_k) Loss(yk,pk)=yklog(pk)(1yk)log(1pk)
      在很多分类任务中标签是one-hot编码的形式,因此对于标签为1和0可以换算为(也就是只对有标签的分类概率进行惩罚,其他的损失全部为0):
      L o s s o n e − h o t ( 1 , p ) = − l o g ( p ) ; L o s s o n e − h o t ( 0 , p ) = − l o g ( 1 ) = 0 Loss_{one-hot}(1,p)=-log(p);\\ Loss_{one-hot}(0,p)=-log(1)=0 Lossonehot(1,p)=log(p);Lossonehot(0,p)=log(1)=0
      不感兴趣可以不看: 这里简单说下Cross Entropy的推导过程吧!Cross Entropy是由信息熵演化过来的,用于衡量两种概率分布的相似性。信息熵是随机变量不确定性的度量,也就是混乱程度越大、包含信息越大(可以这样理解,感觉不咋准确,因为信息是一个相对值),信息熵就越大。公式如下:
      H ( X ) = − ∑ k ∈ K p ( k ) l o g p ( k ) H(X)=-∑_{k∈K}p(k)logp(k) H(X)=kKp(k)logp(k)
      那么如何衡量两种信息的相似性呢?下面引入了KL散度,也就是计算两个分布之间的不同。下面给出KL散度的计算方式:
      D K L ( A ∣ ∣ B ) = ∑ k P A ( x k ) l o g ( P A ( x k ) / P B ( x k ) ) = ∑ k P A ( x k ) l o g ( P A ( x k ) ) − P A ( x k ) l o g ( P B ( x k ) ) D_{KL}(A||B)=∑_kP_A(x_k)log(P_A(x_k)/P_B(x_k))\\ =∑_kP_A(x_k)log(P_A(x_k))-P_A(x_k)log(P_B(x_k)) DKL(AB)=kPA(xk)log(PA(xk)/PB(xk))=kPA(xk)log(PA(xk))PA(xk)log(PB(xk))
      从上式可以看到,P_A的某一属性概率越大,那么给予P_B上的权重越大,就是偏向于信息量大的属性(可以这样理解KL(A||B)就是以A作为参考,KL(B||A)就是以B作为参考)。那么这样来看,KL散度不是对称的(也就是参考系不一样),即
      D K L ( A ∣ ∣ B ) ≠ D K L ( B ∣ ∣ A ) D_{KL}(A||B)≠D_{KL}(B||A) DKL(AB)=DKL(BA)
      那么扯了这么多,交叉熵是什么呢?聪明的小伙伴已经看出来了,交叉熵就是A与B的KL散度-A的熵。
      C ( A , B ) = D K L ( A ∣ ∣ B ) − H ( A ) = ∑ k P A ( x k ) l o g ( P B ( x k ) ) C(A,B)=D_KL(A||B)-H(A)=∑_kP_A(x_k)log(P_B(x_k)) C(A,B)=DKL(AB)H(A)=kPA(xk)log(PB(xk))
      参考知乎回答
    2. Balanced Cross Entropy
      Cross Entropy无法解决正负样本不均衡的问题,因此在上面加一个权重系数,对于正样本为α,负样本为(1-α),其中(α∈[0,1]),下面只给出了正样本的加权交叉熵损失:
      B C E = − α k l o g ( p k ) BCE=-α_klog(p_k) BCE=αklog(pk)
    3. Focal Loss
      Focal loss是在RetinaNet中提出来用于解决正负样本不均的情况。在训练过程中负样本过多、正样本较少,导致模型优化并不很均衡,而交叉熵损失对所有样本权重都一样。因此在交叉熵损失的基础上提出Focal Loss,可以根据预测的概率,自适应调整损失的权重
      F o c a l L o s s ( p k ) = − ( 1 − p k ) γ l o g ( p k ) Focal Loss(p_k)=-(1-p_k)^γlog(p_k) FocalLoss(pk)=(1pk)γlog(pk)
      γ是调制系数,当γ=0时就是交叉熵损失;当γ>0时,p_k的值越大(接近1)表明此样本越简单(分类正确的情况下),所以给的权重就越小;p_k的值越小(接近0),说明样本分类的置信度不高,需要加大权重(权重接近1)。最后再加上权重系数:
      F o c a l L o s s ( p k ) = − α k ( 1 − p k ) γ l o g ( p k ) Focal Loss(p_k)=-α_k(1-p_k)^γlog(p_k) FocalLoss(pk)=αk(1pk)γlog(pk)
      在论文中γ取2,α取0.25效果最好。

    2、回归损失

    关于回归损失主要是L1、L2、Smooth L1和IoU的变体,下面逐一介绍。

    1. L1、L2、Smooth L1系列
      L 1 ( x ) = ∣ x ∣ ; L 2 = x 2 ; S m o o t h L 1 = { 0.5 x 2 ; i f ∣ x ∣ < 1 ∣ x ∣ − 0.5 ; o t h e r w i s e L_1(x)=|x|;L_2=x^2;\\ Smooth_{L1}=\left\{ \begin{array}{c} 0.5x^2 ; if|x|<1\\ |x|-0.5 ; otherwise \end{array}\right. L1(x)=x;L2=x2;SmoothL1={0.5x2ifx<1x0.5otherwise
      通过公式可以直观的看到,L1损失无论何时梯度都是1,当损失较小时,如果学习率不变会在ground truth附近震荡;L2损失的梯度一直是2x,当损失较大值,梯度较大,可能会导致梯度爆炸;而Smooth L1当损失较大梯度是1,加快收敛速度;当损失较小时梯度是x,可以减缓收敛,趋近于ground truth。由此可见,Smooth L1可以很好的避免以上缺点。
    2. IoU系列损失
      IoU系列损失是考虑到目标检测中mAP的依据IoU进行计算,那么如果直接以IoU作为监督条件,可以很好的提升回归的准确性
      (1)IoU损失 相比L1、L2、Smooth L1损失具有一定的尺度不变性,即和目标大小无关,其IoU都是在[0,1]区间内。
      I o U = ( A ∩ B ) / ( A ∪ B ) I o U L o s s = 1 − I o U IoU=(A∩B)/(A∪B)\\ IoULoss = 1-IoU IoU=(AB)/(AB)IoULoss=1IoU
      IoU损失有一个致命的缺点,当IoU为0时,梯度无法回传。(很多人都这样说,但是其实是悖论,既然IoU为0时,proposal就不会当做 正样本。)
      (2)GIoU损失 IoU损失是以IoU作为衡量目标,但是当目标倾斜或者偏差时,不能衡量目标框的质量。如下图:
      在这里插入图片描述
      因此GIoU提出:
      G I o U ( A , B ) = ( A ∩ B ) / ( A ∪ B ) − ( C − A ∪ B ) / C G I o U L o s s ( A , B ) = 1 − G I o U ( A , B ) GIoU(A,B)=(A∩B)/(A∪B)-(C-A∪B)/C\\ GIoULoss(A,B)=1-GIoU(A,B) GIoU(A,B)=(AB)/(AB)(CAB)/CGIoULoss(A,B)=1GIoU(A,B)
      其中C表示A和B的最小外接矩形面积。可见-1≤GIoU≤1,当A和B不想交时,GIoU(A,B)=-1,当A和B重合时GIoU(A,B)=1,因此损失合理。从宏观角度来看,损失可以理解为:1-IoU+外接矩形中背景/外接矩形。
    3. DIoU损失 GIoU Loss解决IoU Loss中当两个目标IoU为0时损失为0的问题,但是当两个目标距离很近或者嵌套出现时,无法进行有效约束,如下图所示,这种情况下GIoU退化到和IoU一样的情况,但是对于质量不同的样本(比如中心点位置)无法形成有效的约束:
      在这里插入图片描述
      因此提出DIoU Loss
      D I o U L o s s ( A , B ) = 1 − I o U ( A , B ) + ρ 2 ( A , B ) / C 2 DIoULoss(A,B)=1-IoU(A,B)+ρ^2(A,B)/C^2 DIoULoss(AB)=1IoU(AB)+ρ2(A,B)/C2
      其中,ρ2表示A和B的中心点的欧氏距离,C2表示A、B最小外接矩形的对角线欧氏距离。通过这样的约束方式,使得DIoU在IoU约束的同时对两个框的中心点距离进行约束,使得两个目标尽可能靠近
    4. CIoU损失 与DIoU损失来自同一篇论文,提出目标框的回归需要考虑中心点和边框,但是DIoU损失并没有很好的对目标的长宽进行直接约束(通过面积进行间接约束的)。因此在DIoU的基础上增加了影响因子αv,把预测框的纵横比一致性考虑进行,增加约束项:
      α = v / [ ( 1 − I o U ) + v ] v = 4 / π 2 ( a r c t a n ( w g / h g ) − a r c t a n ( w / h ) ) 2 α=v/[(1-IoU)+v]\\ v=4/π^2(arctan(w^g/h^g)-arctan(w/h))^2 α=v/[(1IoU)+v]v=4/π2(arctan(wg/hg)arctan(w/h))2
      完整的CIoU损失如下,具体推导见论文,这里不进行推导
      C I o U L o s s ( A , B ) = 1 − I o U ( A , B ) + ρ 2 ( A , B ) / C 2 + α v CIoULoss(A,B)=1-IoU(A,B)+ρ^2(A,B)/C^2+αv CIoULoss(A,B)=1IoU(AB)+ρ2(A,B)/C2+αv
    5. EIoU损失是最近新出的,在DIoU损失的基础上进行改进,也就是替换掉了CIoU损失中对于长宽的约束项,直接对目标的长宽进行约束:
      E I o U L o s s ( A , B ) = 1 − I o U ( A , B ) + ρ 2 ( A , B ) / C 2 + ρ 2 ( w A , w B ) / C w 2 + ρ 2 ( h A , h B ) / C h 2 EIoULoss(A,B)=1-IoU(A,B)+ρ^2(A,B)/C^2+ρ^2(w^A,w^B)/C_w^2+ρ^2(h^A,h^B)/C_h^2 EIoULoss(AB)=1IoU(AB)+ρ2(A,B)/C2+ρ2(wA,wB)/Cw2+ρ2(hA,hB)/Ch2
      其中 ρ 2 ( w A , w B ) 、 C w 、 C h ρ^2(w^A,w^B)、C_w、C_h ρ2(wA,wB)CwCh分别表示A和B两框中心点的欧氏距离、A和B的最小外接矩形的宽、A和B最小外接矩形的高。考虑到目标框回归的样本不均衡问题(可以理解为高质量目标框少、低质量样本少),结合Focal Loss提出Focal EIoU Loss:
      F o c a l E I o U L o s s = I o U γ E I o U L o s s Focal EIoU Loss=IoU^γEIoU_Loss FocalEIoULoss=IoUγEIoULoss
      这里和分类中的Focal Loss相反,给IoU高的样本更大的损失权重,即提高样本回归的质量。
      此部分有参考此篇博文

    最后强烈安利mmdetection目标检测框架,由pytorch开发,目前很多经典算法都有集成,可以快速上手,成为一个快乐的调包侠。

    最后对所有引用的论文、博客、知乎等各位大佬们表示衷心的感谢!你们是推动科研进步的主力军!

    未完待续
    应该写的差不多了,若有错误,欢迎各位大佬批评指正!感谢!

    展开全文
  • 最近做一些关于Faster R-CNN、SSD和YOLO模型选择和优化的项目,之前只了解Faster R-CNN系列目标检测方法,于是抽空梳理一下这几检测模型。先上两张简单的精确度和运算量...传统目标检测方法大致分为如下步: ...

            最近做一些关于Faster R-CNN、SSD和YOLO模型选择和优化的项目,之前只了解Faster R-CNN系列目标检测方法,于是抽空梳理一下这几个检测模型。先上两张简单的精确度和运算量的对比图,有个粗略的了解,虽然图中缺了YOLO,参考价值仍然很大:

    下面开始分别详述吧~

    Faster R-CNN架构

     

     

    传统目标检测方法大致分为如下三步:

    深度学习特别是CNN的出现使得上述第二三步可以合并在一起做。Faster R-CNN步骤:

    (1)由输入图片产生的区域候选         

    (2)最后一层卷积输出的所有通道

    (2)最后一层卷积输出的所有通道

    pooling=>        

    +

    (3)ROI pooling

    候选区的产生

    RPN的核心思想是使用卷积神经网络直接产生region proposal,使用的方法本质上就是滑动窗口。RPN的设计比较巧妙,RPN只需在最后的卷积层上滑动一遍,因为anchor机制和边框回归可以得到多尺度、多长宽比的region proposal,3*3滑窗对应的每个特征区域同时预测输入图像3种尺度(128,256,512),3种长宽比(1:1,1:2,2:1)的region proposal,这种映射的机制称为anchor:

    RPN利用基网络对图像用一系列的卷积和池化操作进行特征提取,得到原始的feature maps(灰色区域),然后在原始的feature maps后面再接一个con+relu层,得到将要用于生成region proposal的feature maps。将feature maps中的每个点映射回原图回原图中心,得到一个基准点。根据设置好的尺度大小和长宽比,并围绕基准点,生成k个anchors。Feature maps的每个点都有关于k个anchors的输出,包括是否有目标,以及回归k个region proposal的坐标值。

    平移不变anchors:在feature maps上的每个点都可以预测得到k个region proposal。具体操作:将feature maps上的每个点映射到原图,得到一个基准点,然后围绕该基准点,通过设置好的固定的尺度大小和长宽比,生成k个anchors。在论文中,使用了3种尺度和3种长宽比的anchors,所以k=3*3=9,对于一个大小为W*H的feature map,将会产生W*H*k个anchors。而通过这种不同尺度和不同长宽比的设置,同样实现了anchors的平移不变性。

    RPN的损失函数:在训练RPN的时候,先需要对得到的W*H*k个anchors进行正负样本的划分。将与gt box具有最大IOU的anchor以及与任何一个gt box的IOU大于0.7的anchor作为正样本将剩余的与gt box的IOU小于0.3的anchor作为负样本,其余anchors均被忽略。对于每个anchor,后面会再接上一个用于二分类的softmax与用于bbox回归器。二分类softmax用于判断anchor是否为目标概率,bbox回归器用于调整anchor的4个坐标值。因此RPN的损失函数可定义为:

    不带*为预测值,带*为真实值,其中,

    其中x,y,h,w分别表示box的中心坐标,高度与宽度。

    ROI 池化:因为 Fast R-CNN 使用全连接层,所以我们应用 ROI 池化将不同大小的 ROI 转换为固定大小。简洁示例,我们先将8×8特征图转换为预定义的 2×2 大小。

    下图左上角:特征图。

    右上角:将 ROI(蓝色区域)与特征图重叠。

    左下角:将 ROI 拆分为目标维度。例如,对于 2×2 目标,我们将 ROI 分割为 4 个大小相似或相等的部分。

    右下角:找到每个部分的最大值,得到变换后的特征图。

    按上述步骤得到一个 2×2 的特征图块,可以馈送至分类器和边界框回归器中。

    Train

    整个Faster RCNN训练过程可分为4步:

    第一步:用在ImageNet数据集上训练好的model初始化模型,训练一个RPN网络;

    第二步:用在ImageNet数据集上训练好的model初始化模型,同时用第一步中训练好的RPN网络生成的region proposal作为输入,训练一个Fast RCNN;

    第三步:用第二步训练好的Fast RCNN的网络参数初始化RPN网络,但是将RPN与Fast RCNN共享的网络层的learning rate设置为0,仅微调RPN独有的网络层。

    第四步:固定共享的网络层,仅微调Fast RCNN所独有的fc层。

     

    SSD架构

     

    SSD使用VGG-16-Atrous作为基础网络,其中黄色部分为在VGG-16基础网络上填加的特征提取层。SSD与yolo不同之处是除了在最终特征图上做目标检测之外,还在之前选取的5个特特征图上进行预测。可以看出,检测过程不仅在填加特征图(conv8_2, conv9_2, conv_10_2, pool_11)上进行,为了保证网络对小目标有很好检测效果,检测过程也在基础网络特征图(conv4_3, conv_7)上进行。

    SSD 方法的核心就是 predict object(物体),以及其归属类别的 score(得分);同时在feature map上使用小的卷积核去 predict 一系列 bounding boxes 的 box offsets,为了得到高精度的检测结果在不同层次的 feature maps 上去 predict object、box offsets,同时,还得到不同 aspect ratio 的 predictions。

    相对于那些需要 object proposals 的检测模型,SSD 方法完全取消了 proposals generation、pixel resampling 或者 feature resampling 这些阶段,为了处理相同物体的不同尺寸的情况,SSD 结合了不同分辨率的 feature maps 的 predictions,SSD将输出一系列离散化(discretization) 的 bounding boxes,这些 bounding boxes是在不同层次(layers)上的feature maps上生成的,并且有着不同的 aspect ratio。要计算出每一个 default box 中的物体其属于每个类别的可能性,即score,得分如对于一个数据集,总共有20类,则需要得出每一个 bounding box中物体属于这20个类别的每一种的可能性,同时,要对这些 bounding boxes 的shape进行微调以使得其符合物体的外接矩形。

    先弄清楚 default map cell以及 feature box是什么:

    1、feature map cell就是将feature map切分成n*n的格子。

    2、default box就是每一个格子上,生成一系列固定大小的 box,即图中虚线所形成的一系列 boxes。

    3、和faster R-CNN相似,SSD也提出了anchor的概念。卷积输出的feature map,每个点对应为原图的一个区域的中心点以这个点为中心,构造出6个宽高比例不同,大小不同的anchor(SSD中称为default box)每个anchor对应4个位置参数(x,y,w,h)和21个类别概率(voc训练集为20分类问题,在加上anchor是否为背景,共21分类)。

    Training

    在训练时,SSD与那些用region proposals + pooling方法的区别是,SSD训练图像中的 groundtruth 需要赋予到那些固定输出的 boxes 上在前面也已经提到了,SSD输出的是事先定义好的,一系列固定大小的 bounding boxes。如下图中,狗狗的groundtruth是红色的bounding boxes,但进行label标注的时候,要将红色的groundtruth box赋予图(c)中一系列固定输出的 boxes 中的一个,即 图(c)中的红色虚线框。

    像这样定义的groundtruth boxes不止在SSD中用到。在 YOLO中、 Faster R-CNN中的 region proposal阶段,以及在 MultiBox中都用到了,当这种将训练图像中的groundtruth与固定输出的boxes对应之后,就可以end-to-end的进行loss function的计算以及back-propagation的计算更新了。

    损失函数

    SSD训练的目标函数(training objective)源自于 MultiBox 的目标函数,但是将其拓展,使其可以处理多个目标类别。总的目标损失函数(objective loss function)就由localization loss(loc)与 confidence loss(conf)的加权求和,其中:localization loss(loc)是 Fast R-CNN中 Smooth L1 Loss,用在 predict box,confidence loss(conf)是Softmax Loss,输入为每一类的置信度。SSD的损失函数由每个默认框的定位损失与分类损失构成(每个默认框的位置为(x, y, w, h)四个值):

    训练中会遇到一些问题:

    1、如何将 groundtruth boxes 与 default boxes 进行配对,以组成 label 呢?

    在开始的时候,用MultiBox中的best jaccard overlap 来匹配每一个ground truth box与default box,这样就能保证每一个groundtruth box与唯一的一个default box 对应起来。但是又不同于 MultiBox ,SSD又将default box与任何的 groundtruth box配对,只要两者之间的jaccard overlap 大于一个阈值,这里的阈值一般设置为0.5。

    2、多尺寸feature map上进行目标检测

    每一个卷积层,都会输出不同大小感受野的feature map。在这些不同尺度的feature map上,进行目标位置和类别的训练和预测,从而达到多尺度检测的目的可以克服yolo对于宽高比不常见的物体,识别准确率较低的问题。yolo v1只在最后一个卷积层上做目标位置和类别的训练和预测,这是SSD相对于yolo能提高准确率的一个关键所在。SSD在每个卷积层上都会进行目标检测和分类,最后由NMS进行筛选,输出最终的结果。多尺度feature map上做目标检测就相当于多了很多宽高比例的bounding box,可以大大提高泛化能力。

    3、Choosing scales and aspect ratios for default boxes

    大部分 CNN 网络在越深的层,feature map的尺寸(size)会越来越小。这样做不仅仅是为了减少计算与内存的需求,还有个好处就是,最后提取的 feature map 就会有某种程度上的平移与尺度不变性。同时为了处理不同尺度的物体,一些文章将图像转换成不同的尺度,将这些图像独立的通过CNN网络处理,再将这些不同尺度的图像结果进行综合,但是其实,如果使用同一个网络中的、不同层上的feature maps,也可以达到相同的效果,同时在所有物体尺度中共享参数,可以用 CNN前面的layers来提高图像分割的效果,因为越底层的layers保留的图像细节越多。因此,SSD同时使用lower feature maps、upper feature maps 来predict detections,上图展示了SSD中使用的两种不同尺度的feature map。

    一般来说,一个CNN网络中不同的layers有着不同尺寸的感受野(receptive fields)。这里的感受野指的是输出的feature map上的一个节点,其对应输入图像上尺寸的大小。所幸的是,SSD结构中default boxes不必要与每一层layer的 receptive fields 对应,而是采用feature map中特定的位置来负责图像中特定的区域以及物体特定的尺寸,设置每一个default box的中心结合在feature maps上,所有不同尺度、不同aspect ratios的default boxes进行预测 predictions 之后,我们得到许多个predictions,包含了物体的不同尺寸、形状。

    4、Hard negative mining

    训练集给定了输入图像以及每个物体的真实区域(ground true box),将default box和真实box最接近的选为正样本然后在剩下的default box中选择任意一个与真实box IOU大于0.5的,作为正样本,而其他的则作为负样本。在生成一系列的predictions之后,会产生很多个符合ground truth box的predictions boxes,但同时,不符合ground truth boxes也很多,而且negative boxes远多于 positive boxes这会造成negative boxes、positive boxes之间的不均衡,训练时难以收敛因此,SSD先将每一个物体位置上对应 predictions(default boxes)是negative的boxes进行排序,按照default boxes的confidence的大小选择最高的几个出来,SSD将正负样本比例定位为1:3,这样可以更快的优化,训练也更稳定。

    5、既想利用已经训练好的模型进行fine-tuning,又想改变网络结构得到更加 dense的score map。

    这个解决办法就是采用 Hole 算法。如下图 (a) (b) 所示,在以往的卷积或者 pooling中,一个filter中相邻的权重作用在feature map上的位置都是物理上连续的。如下图 (c) 所示,为了保证感受野不发生变化,某一层的 stride 由 2 变为 1 以后,后面的层需要采用 hole 算法,具体来讲就是将连续的连接关系是根据 hole size 大小变成 skip 连接的(图 (c) 为了显示方便直接画在本层上了)。不要被(c)中的padding为2吓着了,其实2个 padding不会同时和一个 filter 相连。pool4的stride由2变为1,则紧接着的conv5_1conv5_2 和 conv5_3中hole size 为2。接着pool5由2变为1 ,则后面的fc6中 hole size 为4。 

    6、SSD使用的VGG-16作为基础网络,VGG-16虽然精度与darknet-19相当,但运算速度慢。

    Result

    SSD模型对bounding box的size非常的敏感。也就是说,SSD对小物体目标较为敏感,在检测小物体目标上表现较差。其实这也算情理之中,因为对于小目标而言,经过多层卷积之后,就没剩多少信息了。虽然提高输入图像的size可以提高对小目标的检测效果,但是对于小目标检测问题,还是有很多提升空间的同时,积极的看,SSD 对大目标检测效果非常好SSD对小目标检测效果不好,但也比YOLO要好。另外,因为SSD使用了不同aspect ratios的default boxes,SSD 对于不同aspect ratios的物体检测效果也很好使用更多的 default boxes,结果也越好。Atrous使得SSD又好又快 通常卷积过程中为了使特征图尺寸保持不变,会在边缘打padding,但人为加入的padding值会引入噪声,使用atrous卷积能够在保持感受野不变的条件下,减少padding噪声SSD训练过程中并没有使用atrous卷积,但预训练过程使用的模型为VGG-16-atrous,意味着作者给的预训练模型是使用atrous卷积训练出来的。使用atrous版本VGG-16作为预训模型比较普通VGG-16要提高0.7%mAP。

    因为 COCO 数据集中的检测目标更小,我们在所有的layers上,使用更小的default boxesSSD一开始会生成大量的bounding boxes,所以有必要用 Non-maximum suppression(NMS)来去除大量重复的 boxes。 

     

    YOLO架构

     

     

    YOLO之前的物体检测方法主要是通过region proposal产生大量的可能包含待检测物体的potential bounding box,再用分类器去判断每个bounding box里是否包含有物体,以及物体所属类别的probability或者confidence,通过post-processing来改善bounding boxes,消除重复的检测目标,如R-CNN,Fast-R-CNN,Faster-R-CNN等,YOLO不同于这些物体检测方法,它将物体检测任务当做一个regression问题来处理,使用一个神经网络,直接从一整张图像来预测出bounding box的坐标、box中包含物体的置信度和类别probabilities,由于YOLO的物体检测流程是在一个神经网络里完成的,所以可以end to end来优化物体检测性能。不像其他物体检测系统使用了滑窗或region proposal,分类器只能得到图像的局部信息,YOLO在训练和测试时都能够看到一整张图像的信息,因此YOLO在检测物体时能很好的利用上下文信息,从而不容易在背景上预测出错误的物体信息,和Fast-R-CNN相比,YOLO的背景错误不到Fast-R-CNN的一半。虽然相较于其他的state-of-the-art 物体检测系统,YOLO在物体定位时更容易出错,但是在背景上预测出不存在的物体(false positives)的情况会少一些。而且,YOLO比DPM、R-CNN等物体检测系统能够学到更加抽象的物体的特征,这使得YOLO可以从真实图像领域迁移到其他领域,如艺术。YOLO对小物体的检测效果不好(尤其是密集的小物体,因为一个栅格只能预测2个物体),由于损失函数的问题,定位误差是影响检测效果的主要原因,尤其是大小物体的处理上,还有待加强。

    使用YOLO来检测物体,其流程是非常简单明了的,主要分为三个部分:卷积层,目标检测层,NMS筛选层: 
    1、将图像resize到448 * 448作为神经网络的输入 
    2、运行神经网络,得到一些bounding box坐标、box中包含物体的置信度和class probabilities 
    3、进行非极大值抑制,筛选Boxes

    YOLO网络结构由24个卷积层与2个全连接层构成,网络入口为448x448(v2为416x416),图片进入网络先经过resize,网络的输出结果为一个张量,维度为:

    其中,S为划分网格数,B为每个网格负责目标个数,C为类别个数。该表达式含义为:

    (1)每个小格会对应B个边界框,边界框的宽高范围为全图,表示以该小格为中心寻找物体的边界框位置。

    (2) 每个边界框对应一个分值,代表该处是否有物体及定位准确度:

    (3)每个小格会对应C个概率值,找出最大概率对应的类别P(Class|object)P(Class|object),并认为小格中包含该物体或者该物体的一部分,虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。从上面可以看出整个图像只是被计算了一次,真正做到了降低计算量,提高了检测实时性。

    YOLO将输入图像分成SxS个格子,若某个物体Ground truth的中心位置的坐标落入到某个格子,那么这个格子就负责检测中心落在该栅格中的物体。代码中side∗side即为原图中S∗S的小格。为什么side位置的输出会对应到原图中小格的位置呢?因为训练过程中会使用对应位置的GT监督网络收敛,测试过程中每个小格自然对应原图小格上目标的检测。

    每个格子预测B个bounding box及其置信度(confidence score),以及C个类别概率。bbox信息(x,y,w,h)为物体的中心位置相对格子位置的偏移及宽度和高度,均被归一化。置信度反映是否包含物体以及包含物体情况下位置的准确性,定义为Pr(Object)×IOUtruthpred,其中Pr(Object)∈{0,1}。

    YOLOv1网络借鉴了GoogLeNet分类网络结构。不同的是,YOLO未使用inception module,而是使用1x1卷积层(此处1x1卷积层的存在是为了跨通道信息整合)+3x3卷积层简单替代。YOLO能够做到在输出中同时包含图片bounding box(检测框)的分类信息和位置信息,试着想象这样的情况,我们用1*1的卷积小方格去卷积一张7*7的图片,显然,卷积的输出也是7*7,但是我们可以做一些神奇的事情,卷积窗口filter出了被窗口过滤后的类别 ! 我们可以为每个过滤后的小窗口(cell)赋予一个类别,比如下图,是自行车Bicycle的类别中的像素过滤为上图紫色。当然,也有可能一些小方格输入多个类别,比如,可能属于猫同时属于自行车,这样,我们自然地在卷积的同时, 把类别信息和位置信息同时包含进去了。

    上述是便于理解的例子,大家不要真的以为YOLO第一层卷积就使用了1*1的卷积窗口!事实上,YOLO原理是这样,但每一层窗口是大一点3*3的卷积核。

    损失函数

    YOLO全部使用了均方和误差作为loss函数。由三部分组成:坐标误差、IOU误差和分类误差。

     

    几点解释:

    1、YOLO将输入图像划分为S*S的栅格,每一个栅格预测B个bounding boxes,以及这些bounding boxes的confidence scores。confidence scores反映了模型对于这个栅格的预测,该栅格是否含有物体,以及这个box的坐标预测的有多准:

    每一个栅格还要预测C个conditional class probability(条件类别概率):Pr(Classi|Object)。即在一个栅格包含一个Object的前提下,它属于某个类的概率。

     

    2、在测试阶段,将每个栅格的conditional class probabilities与每个 bounding box的confidence相乘,这样可得到每个bounding box的具体类别的confidence score,乘积既包含了bounding box中预测的class的 probability信息,也反映了bounding box是否含有Object和bounding box坐标的准确度:

    论文使用的 S=7,即将一张图像分为7×7=49个栅格,每一个栅格预测B=2个boxes(每个box有 x,y,w,h,confidence,5个预测值),同时C=20(PASCAL数据集中有20个类别)。 因此,最后的prediction是7×7×30 { 即S * S * ( B * 5 + C) }的Tensor。

    3、在 YOLO中,每个栅格预测多个bounding box,但在网络模型的训练中,希望每一个物体最后由一个bounding box predictor来负责预测。因此,当前哪一个predictor预测的bounding box与ground truth box的IOU最大,这个predictor就负责predict object,这会使得每个predictor可以专门的负责特定的物体检测。随着训练的进行,每一个predictor对特定的物体尺寸、长宽比的物体的类别的预测会越来越好。

    4、卷积层的输出可能是对同一个检测目标的许多个检测框,我们有高效的非极大值抑制算法来选择最好的检测框。

    5、anchor机制。yolov2为了提高精度与召回率,使用了Faster-RCNN中的anchor机制。解释:在每个网格设置k个参考anchor,训练以GT anchor作为基准计算分类与回归损失,测试时直接在每个格子上预测k个anchor box,每个anchor box为相对于参考anchor的offset与w,h的refine,这样把原来每个格子中边界框位置的全图回归(yolov1)转换为对参考anchor位置的精修(yolov2),至于每个格子中设置多少个anchor(即k等于几),作者使用了k-means算法离线对voc及coco数据集中目标的形状及尺度进行了计算,发现当k = 5时并且选取固定5比例值时,anchors形状及尺度最接近voc与coco中目标的形状,并且k也不能太大,否则模型太复杂,计算量很大。

    升级版YOLO v2

    yolov1基础上的延续,新的基础网络,多尺度训练,全卷积网络,Faster-RCNN的anchor机制,更多的训练技巧等等改进使得yolov2速度与精度都大幅提升。相比YOLO,YOLO v2在识别种类、精度、速度、和定位准确性等方面都有大大提升。

    YOLO v2改进之处:

    1、Batch Normalization: v1中大量用了Batch Normalization,同时在定位层后边用了dropout,v2中取消了dropout,在卷积层全部使用Batch Normalization。

    2、高分辨率分类器:v1中使用224 × 224训练分类器网络,扩大到448用于检测网络。v2将ImageNet以448×448 的分辨率微调最初的分类网络,迭代10 epochs。

    3、Anchor Boxes:v1中直接在卷积层之后使用全连接层预测bbox的坐标,v2借鉴Faster R-CNN的思想预测bbox的偏移,移除了全连接层,并且删掉了一个pooling层使特征的分辨率更大一些,另外调整了网络的输入(448->416)以使得位置坐标是奇数只有一个中心点(yolo使用pooling来下采样,有5个size=2,stride=2的max pooling,而卷积层没有降低大小,因此最后的特征是416/(2^5)=13),v1中每张图片预测7x7x2=98个box,而v2加上Anchor Boxes能预测超过1000个,检测结果从69.5mAP,81% recall变为69.2 mAP,88% recall。

    YOLO v2对Faster R-CNN的手选先验框方法做了改进,采样k-means在训练集bbox上进行聚类产生合适的先验框,由于使用欧氏距离会使较大的bbox比小的bbox产生更大的误差,而IOU与bbox尺寸无关,因此使用IOU参与距离计算,使得通过这些anchor boxes获得好的IOU分值。距离公式:

    D(box,centroid)=1−IOU(box,centroid)D(box,centroid)=1−IOU(box,centroid),使用聚类进行选择的优势是达到相同的IOU结果时所需的anchor box数量更少,使得模型的表示能力更强,任务更容易学习,k-means算法过程是:将每个bbox的宽和高相对整张图片的比例(wr,hr)进行聚类,得到k个anchor box,由于darknet,代码中需要配置文件中region层的anchors参数是绝对值大小,因此需要将这个比例值乘上卷积层的输出特征的大小。如输入是416x416,那么最后卷积层的特征是13x13。

    4、细粒度特征(fine grain features):在Faster R-CNN 和 SSD 均使用了不同的feature map以适应不同尺度大小的目标。YOLOv2使用了一种不同的方法,简单添加一个 pass through layer,把浅层特征图(26x26)连接到深层特征图(连接新加入的三个卷积核尺寸为3 * 3的卷积层到最后一层的输入)。通过叠加浅层特征图相邻特征到不同通道(而非空间位置),类似于Resnet中的identity mapping。这个方法把26x26x512的特征图叠加成13x13x2048的特征图,与原生的深层特征图相连接,使模型有了细粒度特征。此方法使得模型的性能获得了1%的提升。

    5、Multi-Scale Training: 和YOLOv1训练时网络输入的图像尺寸固定不变不同,YOLOv2(在cfg文件中random=1时)每隔几次迭代后就会微调网络的输入尺寸。训练时每迭代10次,就会随机选择新的输入图像尺寸。因为YOLOv2的网络使用的downsamples倍率为32,所以使用32的倍数调整输入图像尺寸{320,352,…,608}。训练使用的最小的图像尺寸为320 x 320,最大的图像尺寸为608 x 608。 这使得网络可以适应多种不同尺度的输入。

    6、网络结构:YOLOv2对v1的基础网络做了更改,如下

    分类网络

    YOLOv2提出了一种新的分类模型Darknet-19。借鉴了很多其它网络的设计概念。主要使用3x3卷积并在pooling之后channel数加倍(VGG);global average pooling替代全连接做预测分类,并在3x3卷积之间使用1x1卷积压缩特征表示(Network in Network);使用 batch normalization 来提高稳定性,加速收敛,对模型正则化。Darknet-19的结构如下(Darknet-19-arch:包含 19 conv + 5 maxpooling。):

    训练:使用Darknet框架在ImageNet 1000类上训练160 epochs,学习率初始为0.1,以4级多项式衰减,weight decay=0.0005, momentum=0.9。使用标准的数据增广方法:random crops,rotations,(hue,saturation),exposure shifts。之后将输入从224放大至448,学习率调整为0.001,迭代10 epochs。结果达到top-1 accuracy 76.5% ,top-5 accuracy 93.3%。

    检测网络

    在分类网络中移除最后一个1x1的层,在最后添加3个3x3x1024的卷积层,再接上输出是类别个数的1x1卷积。对于输入图像尺寸为Si x Si,最终3x3卷积层输出的feature map是Oi x Oi(Oi=Si/(2^5)),对应输入图像的Oi x Oi个栅格,每个栅格预测anchors种boxes大小,每个box包含4个坐标值,1个置信度和classes个条件类别概率,所以输出维度是Oi x Oi x anchors x (5 + classes)。添加跨层跳跃连接(借鉴ResNet等思想),融合粗细粒度的特征:将前面最后一个3x3x512卷积的特征图,对于416x416的输入,该层输出26x26x512,直接连接到最后新加的三个3x3卷积层的最后一个的前边。将26x26x512变形为13x13x1024与后边的13x13x1024特征按channel堆起来得到13x13x3072。从yolo-voc.cfg文件可以看到,第25层为route层,逆向9层拿到第16层26 * 26 * 512的输出,并由第26层的reorg层把26 * 26 * 512 变形为13 * 13 * 2048,再有第27层的route层连接24层和26层的输出,堆叠为13 * 13 * 3072,由最后一个卷积核为3 * 3的卷积层进行跨通道的信息融合并把通道降维为1024。

    升级版YOLO v3

    YOLO的V1和V2都不如SSD的算法,主要原因是V1的448尺寸和V2版本的416尺寸都不如SSD的300,以上结论都是实验测试的,V3版本的416跟SSD512差不多好,但速度快很多。yolov2有个毛病就是对小物体的检测不敏感,而增加了多尺度预测之后,yolov3在对小物体检测方便有了好转,但是现在的毛病是对中、大size的物体表现的不是那么好。

    YOLO v3改进之处:

    1、Loss不同:YOLO V3替换了V2中的Softmax loss为Logistic loss,而且每个GT只匹配一个先验框。YOLOv3不使用Softmax对每个框进行分类,主要考虑因素有两个:Softmax使得每个框分配一个类别(score最大的一个),而对于Open Images这种数据集,目标可能有重叠的类别标签,因此Softmax不适用于多标签分类;Softmax可被独立的多个logistic分类器替代,且准确率不会下降,分类损失采用binary cross-entropy loss.

    2、预测方式不同:V2用了5个anchor,V3用了9个anchor,提高了IOU。yolov3在三个(num=3)不同的尺度预测boxes,yolov3使用的特征提取模型通过FPN(feature pyramid network)网络上进行改变,最后预测得到一个3-d tensor,包含bounding box信息,对象信息以及多少个类的预测信息。尺度1: 在基础网络之后添加一些卷积层再输出box信息;尺度2: 从尺度1中的倒数第二层的卷积层上采样(x2)再与最后一个16x16大小的特征图相加,再次通过多个卷积后输出box信息。相比尺度1变大两倍;尺度3:与尺度2类似,使用了32x32大小的特征图。yolov3使用这样的方式使得模型可以获取到更多的语义信息,模型得到了更好的表现。yolov3依然使用k-Means聚类来得到bounding box的先验(参数anchors是kmeans计算出来的anchor box的长宽的绝对值(与网络输入大小相关)),选择9个簇以及3个尺度,然后将这9个簇均匀的分布在这3个尺度上。

    3、Detection策略和backbone不同:V2只有一个detection,V3设置有3个,分别是一个下采样的,Feature map为13*13,还有2个上采样的eltwise sum,Feature map分别为26*26和52*52,也就是说,V3的416版本已经用到了52的Feature map,而V2把多尺度考虑到训练的data采样上,最后也只是用到了13的Feature map,这应该是对小目标影响最大的地方。yolov3的特征提取模型是一个杂交的模型,它使用了yolov2,Darknet-19以及Resnet,这个模型使用了很多有良好表现的3*3和1*1的卷积层,也在后边增加了一些shortcut connection结构,其中,3*3的卷积增加channel,而1*1的卷积在于压缩3*3卷积后的特征表示,这波操作很具有实用性,最终它有53个卷积层。没有继续增加层数是因为作者认为Resnet模型后边有太多层并且不是很有效。Darknet-53如下:

    YOLO V2是一个纵向自上而下的网络架构,随着通道数目的不断增加,FLOPS是不断增加的,而V3网络架构是横纵交叉的,看着卷积层多,其实很多通道的卷积层没有继承性,另外,虽然V3增加了anchor centroid,但是对GT的估计变得更加简单,每个GT只匹配一个先验框,而且每个尺度只预测3个框,V2预测5个框,这样的话也降低了复杂度。

    边界框的预测

    作者尝试了常规的预测方式(Faster R-CNN),然而并不奏效: x,y的偏移作为box的长宽的线性变换:

    与之前yolo版本一样,yolov3的anchor boxes也是通过聚类的方法得到的,仍采用之前的logistic方式。yolov3对每个bounding box预测四个坐标值(tx, ty, tw, th),对于预测的cell(一幅图划分成S×S个网格cell)根据图像左上角的偏移(cx, cy),以及预设的anchor box的宽和高pw,ph可以对bounding box按如下的方式进行预测:

    在训练这几个坐标值的时候采用了sum of squared error loss(平方和距离误差损失),因为这种方式的误差可以很快的计算出来。yolov3对每个bounding box通过逻辑回归预测一个物体的得分,如果预测的这个bounding box与真实的边框值大部分重合且比其他所有预测的要好,那么这个值就为1如果overlap没有达到一个阈值(yolov3中这里设定的阈值是0.5),那么这个预测的bounding box将会被忽略,也就是会显示成没有损失值

    Result

    相比RCNN系列物体检测方法,YOLO具有以下缺点:识别物体位置精准性差;召回率低,在每个网格中预测两个bbox这种约束方式减少了对同一目标的多次检测(R-CNN使用的region proposal方式重叠较多),从而减少了候选框的数量,相比R-CNN使用Selective Search产生2000个proposal(RCNN测试时每张超过40秒),YOLO仅使用7x7x2个。YOLO v1吸收了SSD的长处(加了 BN 层,扩大输入维度,使用了 Anchor,训练的时候数据增强),进化到了YOLO v2;吸收SSD和FPN的长处, 仿ResNet的Darknet-53,仿SqueezeNet的纵横交叉网络,又进化到YOLO v3。

    每个网格只对应两个bounding box,当物体的长宽比不常见(也就是训练数据集覆盖不到时),效果很差。原始图片只划分为7x7的网格,当两个物体靠的很近时,效果很差,最终每个网格只对应一个类别,容易出现漏检(物体没有被识别到)。对于图片中比较小的物体,效果很差。这其实是所有目标检测算法的通病,SSD和YOLO v3对它有点优化。YOLO v3的测试表现:

    本人亲测,三大目标检测方法中,虽然Faster R-CNN已经出来两年了,但它对小目标的检测效果还是最好,SSD检测的速度是最快的,尤其是SSD mobilenet,YOLO v3吸取了前两者的一些优点,比Faster R-CNN快、比SSD检测小目标准,效果中规中矩,但个人还是觉得Faster R-CNN用起来更舒服,毕竟是rgb做出来的,不过这也只是我的数据集上跑出的经验,仅作参考罢了。

     

    以前没写过CSDN博客,还不太熟悉怎么去用那些格式工具,格式有些简单,先这样子吧,能看就行~

    参考文档

    https://www.cnblogs.com/makefile/p/YOLOv3.html

    http://blog.51cto.com/gloomyfish/2095418

    https://blog.c

    sdn.net/bigbug_sec/article/details/79739133

    https://blog.csdn.net/gzq0723/article/details/79936613

    https://blog.csdn.net/hrsstudy/article/details/70305791

    https://www.cnblogs.com/fariver/p/7446921.html

    http://nooverfit.com/wp/%E6%9C%BA%E5%99%A8%E8%A7%86%E8%A7%89-%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E8%A1%A5%E4%B9%A0%E8%B4%B4%E4%B9%8Byolo-you-only-look-once/

    http://nooverfit.com/wp/%E6%9C%BA%E5%99%A8%E8%A7%86%E8%A7%89%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E8%A1%A5%E4%B9%A0%

    E8%B4%B4%E4%B9%8Br-cnn%E7%B3%BB%E5%88%97-r-cnn-fast-r-cnn-faster-r-cnn/

    https://yq.aliyun.com/articles/598428?spm=a2c4e.11153940.bloghomeflow.53.384b291atAvOnV

    https://blog.csdn.net/qq_31050167/article/details/79190887

    https://mp.weixin.qq.com/s/M_i38L2brq69BYzmaPeJ9w?

    https://blog.csdn.net/qq_31050167/article/details/79190887

    展开全文
  • 数字化矿山的三个阶段

    千次阅读 2012-03-05 11:05:19
    在此,我综合国外矿山信息化建设的各种战略设想,还有一些学者对数字化矿山的理解,将数字化矿山分为三个层次。  第一个层次是矿山数字化信息管理系统,这是初级阶段。第二个阶段是虚拟矿山,是把真实矿山的整体...

    http://blog.vsharing.com/IT_hermit/A1042318.html


        “数字化矿山”的名词听来日久,而其真正的含义是什么?它又包涵了哪些内容?矿山企业该如何朝着真正的数字化方向发展,以实现我国矿业企业现代化管理与国际先进管理方式的接轨?带着这些问题,记者日前采访了我国工程院院士于润沧。

      记者:请您介绍一下什么是数字化矿山?

      于润沧:数字化矿山现在是一个热门话题,国家科技部的中长期科学发展规划里边也有了这样的内容。但是到目前为止,关于数字化矿山还没有一个准确的定义。在此,我综合国外矿山信息化建设的各种战略设想,还有一些学者对数字化矿山的理解,将数字化矿山分为三个层次。

      第一个层次是矿山数字化信息管理系统,这是初级阶段。第二个阶段是虚拟矿山,是把真实矿山的整体以及和它相关的现象整合起来,以数字的形式表现出来,从而了解整个矿山动态的运作和发展情况。第三个阶段是远程遥控和自动化采矿的阶段。就是说坐在办公室里边就可以操纵很远的地方,比方说几十千米以外的井下设备运转。

      总体来讲,数字化矿山就是矿山地面和井下的、人类从事矿产资源开采的各种动态、静态的信息都能够数字化,而且用计算机网络来管理,同时利用空间技术、自动定位和导航技术实现远程遥控和自动化采矿。

      记者:矿山数字化信息系统包括哪些内容?

      于润沧:矿山数字化信息系统包括很多的子系统,比如矿山地表和矿床模型的三维可视化系统,工程地质、水文地质、岩石力学等方面的数据采集、处理、传输、储存、显示系统,设备运转状态的信息系统,环境变化和安全监测系统,矿山的规划、开采方案系统,矿山的经营管理和经济活动分析系统等等。

      记者:数字化矿山有哪些好处?

      于润沧:首先它可以提高劳动生产率。根据发达国家示范采区的资料介绍,劳动生产率可以提高90%以上。另外成本可以降低。随着时间的推移,高品位的、容易开采的矿石越来越少,剩下的就是低品位的矿石和深部的矿石,越来越难以开采。有了数字化矿山以后,就可以在这方面提供有效的途径。还有一个好处就是可以真正实现安全生产。因为深部开采温度很高,有的矿井是30度、40度,甚至50多度。它们在地面都设有制冷站,就是给井下送冷气降温。我去过一个南非3000米深的矿井,是金矿。它的地面制冷站规模相当庞大,但进去以后,也是浑身淌汗。如果可以实行远程遥控采矿的话,就不需要在这种环境下工作了。应该说,数字化矿山是矿业发展的一个目标,而不是一个具体的工程。

      记者:示范采区是什么概念?

      于润沧:就是在整个矿山里划出一小块采区,做到远程遥控和自动化采矿。据我了解,像加拿大、智利、澳大利亚、瑞典、芬兰、南非等国家基本上都有自己的示范采区。我到过智利一个日采矿石13.5万吨的铜矿,就是实现了远程遥控和自动化采矿。他们有两个示范采区,一个采区一天出1万吨矿石,另一个采区一天出2.8万吨矿石。那个一天出1万吨矿石的采区里没有工人,只是在控制室里边有6个人。

      记者:您认为什么时候才能实现真正的数字化矿山,也就是您说的“第三阶段”?我国数字化矿山的建设情况如何?

      于润沧:有专家这样预测,再过25年到30年,就会出现整个矿山实现远程遥控和自动化采矿。这大概就是真正的数字化矿山。我国现在已经有一些比较现代化的矿山,在做初级阶段的工作。有些科研单位也在研究第二阶段的虚拟矿山的工作。从我们国家的情况来看,第三个层次的工作基本上还没有开始,但是也有的企业提出来希望要做。比如去年我到了云南的一个铅锌矿,他们公司的老总跟我讲,希望能划分出一个采区来搞远程遥控和自动化采矿。

      记者:我们都希望尽快实现矿业自动化,达到数字远程遥控这个层次,这样我们的矿难就会大幅度地减少,矿工的生命会更加有保障。

      于润沧:从我们国家来讲,从什么地方切入,从什么地方入手来发展数字化矿山更好?我认为,还是从建立安全监控系统,开采方案决策优化系统以及生产调度系统等方面入手,向数字化矿山方向发展。这是比较现实的,也是能够很快收到实效的。

    友情提示:转载本人原创作品,烦请保留原始链接http://blog.vsharing.com/IT_hermit 。查询本人更多原创,搜索“IT拓荒人”。 
    IT拓荒人--专注能源信息化管理模式创新研究和售前咨询

    展开全文
  • 软件开发一般分为个阶段: 1.问题的定义及规划 此阶段是软件开发与需求放共同讨论,次要确定软件的开发目标及其可止性。 2.需求剖析 在确定软件开发可止性的情况下,对软件需要实现的各个功能进止具体需求剖析...
  • Darknet-53骨干网络进行特征提取,网络分为5个阶段,经过每个绿色的res是一个2倍的下采样,最多是32倍 32倍的下采样再经过特征提取后输出为y1的特征图 32倍到输出中间的特征图拿出来和上一次的16倍下采样进行拼接...
  • 首先,设备从缺陷到故障的过程并不只服从同一分布,因此,基于三阶段时间延迟模型,将设备故障分为初始缺陷、严重缺陷和故障3状态,不同阶段定义不同的分布函数以模拟设备的劣化过程;其次,分析设备缺陷、故障发生的时刻...
  • 软件开发一般分为个阶段: 1.问题的定义及规划 此阶段是软件开发与需求放共同讨论,主要确定软件的开发目标及其可行性。 2.需求分析在确定软件开发可行性的情况下,对软件需要实现的各个功能进行详细需求分析。...
  • 软件开发的五个阶段

    千次阅读 2018-10-16 18:24:00
    软件开发一般分为个阶段: 1、问题的定义及规划  此阶段是软件开发和需求方共同讨论,主要是确定软件的开发目标及可行性。 2、需求分析  在确定软件开发可行性的情况下,对软件需要实现的各个功能进行详细...
  • 睿智的目标检测11——Keras搭建yolo3目标检测平台

    万次阅读 多人点赞 2019-11-27 17:33:51
    睿智的目标检测11——Keras搭建yolo3目标检测平台学习前言yolo3实现思路一、预测部分1、主题网络darknet53介绍2、从特征获取预测结果3、预测结果的解码4、在原图上进行绘制二、训练部分计算loss所需参数1、y_pre2、y...
  • 软件的生命周期可以分为定义阶段、开发阶段、维护阶段 下面给出具体的分类以及在这些阶段里各自的任务 1、定义阶段 问题的定义及规划: 此阶段是软件开发方与需求方共同讨论,主要确定软件的开发目标及其可行性。 2...
  • 睿智的目标检测30——Pytorch搭建YoloV4目标检测平台

    万次阅读 多人点赞 2020-05-24 14:14:13
    睿智的目标检测30——Pytorch搭建YoloV4目标检测平台学习前言什么是YOLOV4代码下载YOLOV4改进的部分(不完全)YOLOV4结构解析1、主干特征提取网络Backbone2、特征金字塔3、YoloHead利用获得到的特征进行预测4、预测...
  • 项目经理成长的五个阶段

    千次阅读 2019-11-16 17:48:41
    我将这一过程分为个阶段,每个阶段实际上也代表了一种类型的项目经理,以及项目管理的一层境界。 混沌阶段 他们刚刚从程序员岗位上提拔为项目经理,也没有学习过项目管理知识,对项目管理完全处于是懵懂无.....
  • 目标检测综述

    万次阅读 多人点赞 2019-07-09 21:36:26
    而今天我们要了解构建神经网络的另一问题,即目标检测问题。这意味着,我们不仅要用算法判断图片中是不是一辆汽车, 还要在图片中标记出它的位置, 用边框或红色方框把汽车圈起来, 这就是目标检测问题。 其中...
  • 鉴于每环节都可以做为一专题来进行探讨,所以受篇幅和时间限制,本文对有关问题未做深入剖析,只做一宏观上的介绍。一般而言,软件测试从项目确立时就开始了,前后要经过以下一些主要环节: 需求分析→测试...
  • 睿智的目标检测27——Pytorch搭建Faster R-CNN目标检测平台学习前言什么是FasterRCNN目标检测算法源码下载Faster-RCNN实现思路一、预测部分1、主干网络介绍2、获得Proposal建议框3、Proposal建议框的解码4、对...
  • 目标跟踪算法的分类(

    万次阅读 2016-08-22 15:57:56
    目标跟踪的任务是获得目标在连续图像序列中位置随时间变化的轨迹。 目标的表达用的都是形状或外观模型。选择的表达模型限制了其可以使用的运动模型或分解方法。比如点表达的目标只能体现平移运动。几何形状表达仿射...
  • PDCA循环的四个阶段、八个步骤 PDCA循环,也称戴明环,是由美国著名质量管理专家戴明(W、E、Deming)首先提出的。这个循环主要包括四个阶段:计划(Plan)、实施(Do)、检查(Check)和处理(Action),及八个步骤,八个...
  • 软件生命周期的八个阶段

    万次阅读 多人点赞 2018-04-25 16:07:47
    我们在软件的开发和维护过程中会遇到一系列严重的问题,比如软件开发的成本和进度估计的不准,用户对已经完成开发的软件不满意、用户需求变更、软件产品...软件开发主要分为以下几个阶段1、问题定义确定好要解决的问...
  • 目标检测()--DPM

    千次阅读 2017-08-27 10:19:54
    分为三个阶段。英语方面我就不班门弄斧了,直接上截图。 下面稍稍提下各阶段的工作,主要是论文中没有的Latent 变量分析: Phase1:是传统的SVM训练过程,与HOG算法一致。作者是随机将正样本...
  • 软件生命周期划分为8主要阶段

    千次阅读 2019-09-23 15:48:13
    这8个阶段又可以归纳为3个时期:计划期、开发期和运行期。 软件测试中系统测试时需要以软件需求规格为依据,软件需求规格为软件需求分析阶段的产物,所以软件需求分析阶段定义的规划将成为软件测试中的系统测试...
  • 工程师职业发展的四个阶段

    千次阅读 2016-11-04 17:00:53
    工程师职业发展的四个阶段
  • 程序编译的几个阶段

    千次阅读 2017-03-14 13:07:01
    程序编译的过程中就是将用户的文本形式的源代码(c/c++)...3、链接,由链接器将代码在执行过程用到的其他目标代码和库文件链接成为一可执行程序也就是目标程序。1、编译编译的过程就是将源代码文件以字符流的形式进
  • 一个程序员的成长的六个阶段

    千次阅读 2008-04-04 09:04:00
    到达这个阶段后,也就相当于可以进行真实散打对练了,可以真正地在实践中做些应用。第阶段此阶段能深入地了解某个平台系统的底层,已经具有了初级的内功的能力,也就是“手中有剑,心中无剑”。第四阶级此阶段能直
  • 目标跟踪

    千次阅读 2019-11-27 19:54:52
    本篇是基于单目标跟踪的论述 ... 1,单目标,即在给定的视频中只跟踪一个目标 2,在第一帧中会通过矩形的bounding box将目标给出。给定后,使用tracker找出每一帧的目标。 3,短期 1.2 目标跟踪面临的挑战有:...
  • 分析阶段是一很重要的阶段,这一阶段做得好,将为整个软件开发项目的成功 打下良好的基础。"唯一不变的是变化本身。"同样需求也是在整个软件开发过程 中不断变化和深入的,因此我们必须制定需求变更计划来应付...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 84,465
精华内容 33,786
关键字:

总体目标分为三个阶段