草庐IT

特征融合的分类和方法

橙子吖21 2023-06-25 原文

1、特征融合的定义

特征融合方法是模式识别领域的一种重要的方法,计算机视觉领域的图像识别问题作为一种特殊的模式分类问题,仍然存在很多的挑战,特征融合方法能够综合利用多种图像特征,实现多特征的优势互补,获得更加鲁棒和准确性的识别结果。

2、特征融合的分类

按照融合和预测的先后顺序,分类为早融合和晚融合(Early fusion and Late fusion)

早融合(Early fusion):就是在特征上进行融合,进行不同特征的连接,输入到一个模型中进行训练。(先融合多层的特征,然后在融合后的特征上训练预测器,只有在完全融合之后,才进行检测。)这类方法也被称为skip connection,即采用concat、add操作。这一思路的代表是Inside-Outside Net (ION)和HyperNet.

两个经典的特征融合的方法:

(1)concat:系列特征融合,直接将连个特征进行连接。两个输入特征x和y的维数若为p和q,输出特征z的维数为p+q。

(2)add:并行策略,将这两个特征向量组合成复合向量,对于输入特征x和y,z=x+iy,其中i是虚数单位。

晚融合(Late fusion):指的是在预测分数上进行融合,做法就是训练多个模型,每个模型都会有一个预测分数,我们对所有模型的结果进行融合,得到最后的预测结果。(通过结合不同层的检测结果改进检测性能,尚未完成最终融合之前,在部分融合的层上就开始检测,会有多层的检测,最终将多个检测结果进行融合)。

这一类研究思路的代表有两种:

(1)feature不融合:多尺度的feture分别进行预测,然后对预测结果进行综合,如Single Shot MultiBox Detector(SSD),Multi-scale CNN(MS-CNN).

注意:SSD,全称Single Shot MultiBox Detector,是Wei Liu在ECCV 2016上提出的一种目标检测算法,截至目前是主要的检测框架之一,相比Faster RCNN有明显的速度优势,相比YOLO又有明显的mAP优势(不过已经被CVPR 2017的YOLO9000超越)。

MS-CNN:cNN多尺度

(2)feature进行金字塔融合,融合后进行预测,如Feature Pyramid Network(FPN)等

注意:FPN全称是Feature Pyramid Network, 也就是特征金字塔网络,主要是针对图像中目标的多尺度的这个特点提出的,多尺度在目标检测中非常常见,而且对应不同的问题应该设计不同的FPN。

3、深度特征融合和高低层特征融合的方法

(1)早融合,用经典的特征融合的方法 ,在现有的网络(如VGG19)中,用concat或add融合其中的某几层。

变种:用DCA特征融合方法替代concat和add操作。

(2)晚融合,采用类似特征金字塔网络(FPN)的思想,对特征融合进行预测。(FPN一般用于目标检测,提高小目标检测能力)。

三个变种:

  • YOLO2的方法,只在金字塔的top-down路径的最后一层进行预测,此外还有 U-Net [31] and SharpMask for segmentation, Recombinator networks for face detection, and Stacked Hourglass networks for keypoint estimation;
  • YOLO3的方法,在金字塔的每一层都进行预测;
  • FSSD的方法,对 FPN进行细微改造;

feature不融合,多尺度的feature分别进行预测,然后对预测结果进行综合。

(3)用一个具有高低特征融合能力的网络代替普通的网络,如Densenet。

(4)不进行高低层特征融合,而是在高层特征预测的基础上,再用底层特征进行预测结果的调整。

4、DCA特征融合的方法

特征融合的目的,是把从图像中提取的特征,合并成一个比输入特征更具有判别能力的特征。

基于CCA(典型关联分析)的融合方法,就是使用两个输入特征间的相关关系,计算两种变换后的特征比输入的两个特征集具有更高的相关性。CCA的主要不足,在于忽略了数据集中类结构间的关系,所以将每组特征中类分开,为了解决CCA的弱点,引入了DCA。DCA最大化两个特征及中对应特征的相关关系,同时最大化不同类之间的差异。

5、改进的SSD目标检测算法(DeseNet)

改进在于使用Dense net代替原始SSD结构中的VGG,以提高目标检测准确性,改进后的SSD网络对小物体产生很好的拟合。

DeseNet(密集卷积网络)

6、FPN(特征金字塔)

特征金字塔是识别不同尺度的目标时常用的结构,但是特征金字塔需要较大的计算量和显存,所以为了解决这一问题,开发了一种构建特征金字塔的新方法,可以减少额外的对计算量和显存的消耗。

7、YOLO

YOLOv2网络结构中有一个特殊的转换层(Passthrough Layer),假设最后提取的特征图的大小是1313,转换层的作用就是将前面的2626的特征图和本层的1313的特征图进行堆积(扩充特征维数据量),而后进行融合,再用融合后的特征图进行检测。这么做是为了加强算法对小目标检测的精确度。为达更好效果,YOLOv3将这一思想进行了加强和改进。

YOLO v3采用(类似FPN)上采样和融合做法,融合了3个尺度(13x13、26X26和52x52),在多个尺度的融合特征图上分别独立做检测,最终对于小目标的检测效果提升明显。(有些算法采用多尺度特征融合的方式,但是一般是采用融合后的单一特征图做预测,比如YOLOv2,FPN不一样的地方在于其预测是在不同特征层进行的。)
 

有关特征融合的分类和方法的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  5. Ruby 方法() 方法 - 2

    我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby​​-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco

  6. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  7. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  8. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  9. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  10. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

随机推荐