专栏首页相约机器人使用快速密集特征提取和PyTorch加速您的CNN

使用快速密集特征提取和PyTorch加速您的CNN

作者 | Erez Posner

来源 | Medium

编辑 | 代码医生团队

早在三月份,就开放了实施“具有池化或跨越层的CNN的快速密集特征提取”,虽然未广为人知,但2017年BMVC发表的论文提供了一种高效优雅的解决方案,可以避免在使用时避免计算冗余基于补丁的卷积神经网络。因此在这篇文章中,将解释该模型的工作原理,并展示如何在实际应用程序中使用它。

将介绍两件事:第一,概述了名为“具有池化或跨越层的CNN的快速密集特征提取”的方法。其次,如何在现有训练有素的补丁网络上使用此方法来加快推理时间。

什么是基于补丁的方法?有什么问题?

基于补丁的CNN通常应用于图像的单个补丁,其中每个补丁被单独分类。当尝试在图像中相邻的重叠补丁上多次执行相同的CNN时,通常会使用此方法。这包括基于任务的特征提取,如相机校准,补丁匹配,光流估计和立体匹配。此外基于补丁的应用程序不被视为特征提取,如滑动窗口对象检测或识别。

在所有这种基于补丁的任务中,在相邻CNN的计算之间可能存在大量冗余。例如下图:

在左侧,可以看到简单的1维CNN。从底部开始,每个像素仅对输出层中的一个结果起作用而没有任何冗余。相反在右边,如果这个CNN在一个图像以创建特征中的每个像素位置执行时,许多中间层的结果网络无故之间共享。

节点中的数字表示节点共享的频率。红色连接显示红色节点的共享方式。以步幅2汇集输出分辨率。因此需要两个池化层:原始层(蓝色)和一个移动一个像素(绿色)以避免输出分辨率减半。

快速密集特征提取

这种方法的主要思想是,不是为图像中的每个补丁分别执行基于补丁的CNN Cp(对训练补丁P进行训练),让在输入中的所有补丁P(x,y)上有效地执行它。

为了保持一致性,定义具有宽度Iw和高度Ih的输入图像I,可以定义具有宽度Pw的补丁P(x,y)和以每个像素位置(x,y)为中心的高度Ph ,x∈0 ...输入图像I中的Iw -1,y∈0... Ih -1 。输出向量O(x,y)= CP(P(x,y))是属于(Ih,Iw,k)维输出矩阵Ok通道向量,其包含在所有图像块上执行的Cp的结果P(x,y)。

为此可以创建一个直接从I计算O的网络CI,同时避免在每个图像补丁上独立执行Cp时发生的冗余。Cp和CI之间的架构差异如下图所示。此处,要素提取器中的所有池化层都将替换为多池层

Cp(左)和CI(右)的架构

值得一提的是,CI将给出与在图像I的每个补丁上独立执行网络Cp相同的结果。但是CI运行速度要快得多,因为它避免了重叠补丁之间的冗余。

当处理层的类型时从CpCI的必要步骤:主要是普通层(没有汇集或跨越)和异常层(包括池或跨越)。

1.普通图层

没有跨步或汇集,Cp和CI的层是相同的,即

这是因为它们的输出不依赖于输入的空间位置,而只取决于输入值本身。

2.异常层(包括汇集或跨越)

与普通层相比,必须明确处理跨步和合并层。下图显示了汇集的主要问题:第一个补丁P(x,y)需要与第二个补丁P(x + 1,y)(绿色)不同的2 x 2汇集(蓝色),因此不能共享汇集输出。

但是补丁P(x + 2,y)可以再次使用原始池(蓝色)。P(x,y)和P(x + 2,y)的重叠位置提供相同的结果,因此可以共享(亮黄色)。

这个例子的概括是s 是池/步幅大小,u和v是整数,P(x,y)和P(x + su,y + sv)补丁仍然共享由共享的像素的汇集输出两个补丁。

在不同的图像位置(红色)修补P. 使用蓝色的补丁和使用绿色池的补丁之间的共享是不可能的

这将创建所有一起S×S具有不同的池的情况下独立于所述输入来计算“我们的池层,其中的I”是用于输入图像1-第i层。由于s×s汇聚层将输出大小减小到Iw / s ,Ih / s(输入大小为Iw ,Ih),很明显需要s×s这样的输出来获得空间大小Iw的输出O,Ih。

不同池输出被堆叠在一个额外的输出尺寸记为中号。记录为通道的所有不同池化输出现在将被后续层视为独立样本(类似于批量维度)。

上面的动画给出了关于如何完成过程的更好的直觉,每个通道最终执行池化以在M 中堆叠。

3.没有变形

使用一个多池层,得到一个输出W,其尺寸为W =(M = s×s,Ih / s,Iw / s,k),要将其取消到最终输出O =(Ih,Iw, k)。未扭曲程序背后的直觉在下图中可视化,用于2×2汇集。在这里,所有的渠道应该得到交织在一起,产生最终的输出Ø。

在左边, 2×2 = 4输出图像来自2×2多次充电,右边是最终的非扭曲输出O.

直接不变形是复杂的,特别是有几个池层。这可能是以前的工作避免汇集图层的原因。但是,如果观察尺寸空间中的问题,只需转置和重塑操作就可以轻松解决。大多数深度学习框架都支持这些操作作为层。

实验

作者提出了基准测试结果,比较了改进的网络CI和在图像的所有补丁上运行的基于补丁的CNN Cp。实验在GeForce GTX TITAN X上进行。

从下表中可以看出,Cp的执行时间与图像像素大致成比例(如预期)。另一方面,CI几乎不需要更多时间来拍摄更大的图像。另一方面,CI的内存消耗几乎呈线性增长。如果没有足够的可用内存,则可以将输入图像拆分为多个部分,并且可以单独处理每个部分。

检查加速列清楚地表明CI执行速度更快,尤其是在较大的图像上。

CI和 Cp的速度基准

加速基于补丁的CNN

在这里将解释如何使用“具有池化或跨越层的CNN快速密集特征提取”的实现来加速任何基于补丁的CNN。

项目结构很简单,有两个实现:pytorch和tensforflow,每个包含以下内容:

  • FDFE.py - 实施所有方法层以及论文中描述的前后处理方法
  • BaseNet.py- 这是指在训练补丁P上实施预先训练的CNN Cp
  • SlimNet.py- 这是指CI的实施
  • sample_code.py - 测试运行

1.实施改进的网络 -CI

为了使用自己的预先训练的网络,需要执行补丁:

  1. 实施您的网络 BaseNet.net
  2. 相应修改SlimNet.py:
  • BsetNet.py根据其顺序复制模型层,例如
self.conv1 = list(base_net.modules())[change_this_index]
  • 对于每个MaxPool2d图层multiMaxPooling而不是确定的步幅值(sLn)
  • 根据multiMaxPooling模型中的数量隐藏unwrapPool图层
  • 不要删除以下图层 - multiPoolPrepare,unwrapPrepare

2.在改进的网络上运行示例代码

现在应该sample_code.py确保项目正常工作。该测试生成一个大小的随机输入图像I,imH X imW并在Cp和CI上对其进行评估。

该脚本继续并评估CNN输出之间的差异并执行速度基准测试。Cp有两种操作模式

  • singlePatch模式 - 在单个补丁上运行Cp,该补丁pH x pW将从输入图像I中裁剪
  • allPatches模式 - 在多个补丁上运行Cp。这里batch_size将确定一次评估多少补丁

可能的参数 - sample_code.py有可以调整的初始参数,如图像高度,图像宽度,贴片宽度,贴片高度等...

3.应该期待看到什么?

脚本输出以下内容:

  • base_net Cp输出和slim_net输出CI之间的聚合差异- 如上所述,两个输出之间应该存在任何主要差异。
  • 对于Cp,每个补丁的平均评估
  • 对于CI,每帧的总评估。即整个输入图像

预期的详细信息应如下所示:

Total time for C_P: 0.017114248275756836 sec

------------------------------------------------------------

Averaged time for C_I per Patch without warm up: 0.0010887398617342114 sec

------- Comparison between a base_net over all patches output and slim_net -------

aggregated difference percentage = 0.0000000000 %

maximal abs difference = 0.0000000000 at index i=0,j=0

------------------------------------------------------------

已经大大提升了网络。就在这个例子中,将运行时间提高了~10。

结论

源代码GitHub存储库。

https://github.com/erezposner/Fast_Dense_Feature_Extraction

本文分享自微信公众号 - 相约机器人(xiangyuejiqiren),作者:代码医生

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • P图美颜1秒识破,Adobe伯克利联手打造“反PS”神器

    虚假视频和图片的泛滥传播已经让整个世界越来越焦虑,连PS的老东家Adobe都坐不住了!

    代码医生工作室
  • 使用StyleGAN创建新脚本

    将StyleGAN应用于Unicode字符的图像,以查看它是否可以创建新字符。发现了一些有趣的结果如上图。

    代码医生工作室
  • 有关如何使用特征提取技术减少数据集维度的端到端指南

    如今,使用具有数百个(甚至数千个)特征的数据集变得非常普遍。如果要素的数量变得与存储在数据集中的观测值的数量相似(甚至更大!),则很可能导致机器学习模型过度拟合...

    代码医生工作室
  • 去噪算法升个级,图片瞬间变清晰 | 论文

    图像上噪点太多了,一大片都是点点的雪花连女神的脸都看不清了,传统去噪方法效果太差,可否有破解方法?

    量子位
  • 微信Android热补丁实践演进之路

    继插件化后,热补丁技术在2015年开始爆发,目前已经是非常热门的Android开发技术。其中比较著名的有淘宝的Dexposed、支付宝的AndFix以及Qzon...

    张绍文
  • Confluence 6 安装补丁类文件 原

    Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将...

    HoneyMoose
  • Scrapy 爬虫模板--CSVFeedSpider

    这一篇文章我要讲解一下 Scrapy 爬虫模板中的 CSVFeedSpider 模板,该模板可以说是目前 Scrapy 中最简单的模板,因此这篇文章不会有太长的...

    喵叔
  • 实战 | 记两个实战中遇见的逻辑漏洞

    http://***.test.com.cn/*/forgetPassword.html

    用户5878089
  • 教你自建云盘存储PDF书籍支持在线预览和下载!

    在技术学习的路上经常与同好交流心得,时而分享一些技术的PDF书籍。但也经常发现即使是一些可以开源的书籍,分享出来的链接也常常遇到链接失效问题。

    小傅哥
  • Proxy实现监听

    之前分享过vue2的响应式,然后有人问vue3用proxy是怎么实现的,本来打算研究一波,看了源码之后,发现自己想多了,所以改成学一学proxy的使用。

    wade

扫码关注云+社区

领取腾讯云代金券