imtoken下载官网|dcn

作者: imtoken下载官网
2024-03-07 18:06:19

数据网,数据通信网,DCN三个的区别? - 知乎

数据网,数据通信网,DCN三个的区别? - 知乎首页知乎知学堂发现等你来答​切换模式登录/注册通信通信网络数据通信数据网,数据通信网,DCN三个的区别?我对这三者的概念非常混乱,我说一下自己的理解,请大家指导指正! 数据网和数据通信网是一个意思,是通信网按业务进行分类的一种,是一种提供数据通信业务的网…显示全部 ​关注者7被浏览26,519关注问题​写回答​邀请回答​好问题​添加评论​分享​1 个回答默认排序P·IG​ 关注Data Communication Network -- 数据通信网 / 数据传输网络“DCN是一种支持网络七层协议栈中第一层(物理层)、第二层(数据链路层)和第三层(网络层)功能的网络,主要承载管理信息和分布式信令消息。在公用数据通信网中有电路交换、分组交换和租用电路三种形式的数据传输业务。”--摘自百度百科按照我的理解,数据通信网,即DCN,就是一种网络。我国DCN网(全国电信数据通信网),就是这种网络在我国的具体应用。机房网络里面的DCN,我理解为机房里面有部分路由、交换机等设备组成了一个DCN网络。我也是打网时遇到DCN,理解不深入,欢迎纠正补充。发布于 2021-01-27 19:23​赞同 7​​添加评论​分享​收藏​喜欢收起​​

神州数码集团

神州数码集团

EN

首页

产品及服务

解决方案

合作伙伴

投资者关系

关于我们

联系我们

隐私政策

法律声明

网络安全与隐私保护

云原生产品

云原生产品

云原生产品

云原生平台CNP

云原生平台CNP介绍

架构管理

应用管理

应用架构

DevOps平台

数据服务

IT治理

云原生工具

楠竹OpenJDK

神州视讯

云安全(山石网科)

云安全防火墙(山石云·界)

云内东西向微隔离可视化平台(山石云·格)

云安全资源池(山石云·池)

网元控制器软件(山石云·集)

虚拟化安全网元

数字原生产品

数字原生产品

数字原生产品

数据智能

DataOps平台

云原生大数据平台

数据安全

数据安全管控平台

数据分类分级平台

数据库审计

山石网科数据安全治理方案

数据平台

神州云 | Bluenic客户数据平台

神州云 | Jarvis知识管理平台

基础架构产品

终端产品

台式机(神州鲲泰)

笔记本(神州鲲泰)

投影机(神州云科)

数据计算

AI服务器与AI集群(神州鲲泰)

通用计算服务器(神州鲲泰)

通用计算服务器(神州云科)

数据通信

交换机(DCN)

无线产品(DCN)

路由器(DCN)

智行网络(DCN)

网络设备(神州云科)

数据存储

超融合基础架构(神州云科)

分布式存储(神州云科)

云原生容器一体机(神州云科)

数据保护及容灾系统(神州云科)

登云数据库一体机(神州云科)

网络安全

网络安全(DCN)

安全运营(山石网科)

工业互联网安全(山石网科)

基础设施安全(山石网科)

应用交付

应用交付(神州云科容翼系列)

应用交付(云科通明湖)

高性能可扩展应用交付控制器(神州云科)

虚拟化软件系列(神州云科)

实训教学

网络实训(DCN)

安全实训(DCN)

大数据和人工智能专项实训(DCN)

智能桌面云(DCN)

实训教学平台(山石网科)

攻防演练平台(山石网科)

竞赛靶场平台(山石网科)

产品行业应用

行业应用与成功案例(DCN)

行业应用与成功案例(神州云科)

行业应用与成功案例(山石网科)

服务

数云融合

数云融合

全栈云服务及MSP

云管理服务

混合云运维解决方案

云成本管理

云安全合规

Landing Zone

合作云资源

企业IT服务

企业级IT服务

安全服务(山石网科)

智网欺骗诱捕系统(山石网科)

重保支撑服务(山石网科)

红蓝对抗服务(山石网科)

安全培训服务(山石网科)

安全通告服务(山石网科)

应急保障服务(山石网科)

安全评估服务(山石网科)

行业解决方案

汽车

汽车后市场供应链优化

汽车制造智能质检

共享出行云上全生命周期管理

车联网云管理平台开发

某大型跨国车企大数据测试平台项目

某车企人脸识别工位分配系统

汽车制造行业售后零配件运维管理项目

零售快消

结构化+非结构化大数据平台

零售全渠道大数据平台搭建

化妆品行业客户数据平台

SAP基础架构部署及运维

大数据分析平台

多云运维和管理

大型零售业云平台设计和运维

DevOps运维

立白科技集团混合云平台建设

某全球连锁咖啡品牌云上数字化项目

运营商

分享通信云迁移项目

金融

证券行业数据脱敏解决方案

中意财险云迁移项目

国都证券专有云服务项目

平安银行大型银行数据脱敏

中国农业银行总行商用数据脱敏管理工具项目

平安人寿数据分类分级&脱敏项目

广西农信数据脱敏平台项目

制造

正大食品数字化转型

某制造业企业多云运维和迁移

某制造业企业智能售后服务系统

某国立科研机构科教工业互联网平台项目

酒店文旅

东方明珠媒体数据平台搭建与运维

中影光峰云迁移

旅游集团整体云服务平台搭建

文旅大数据平台建设

铂涛酒店集团

安徽省博物馆数字化改造

政企

厦门鲲鹏超算中心

华邦集团云迁移实施项目

宝鸡市“互联网+人社”公共服务信息系统网络平台建设

天津市人力资源和社会保障局数据中心建设

北京经开区信创园WiFi6无线网络建设

教育

沧州市教育城域网建设

新疆伊犁州霍城县职教中心校园网

武汉市新沟中学智慧园区网

通用解决方案

“云+端”解决方案

资产盘点系统(手持盘点)

资产盘点系统(车载盘点)

资产出入库管理系统

资产实时定位管理系统

智能识别系统

叉车RFID应用系统

场景创新解决方案

神州云|IHP智能混合办公平台

产品技术生态

千帆生态

开源生态

公司公告

投资者交流

公司概况

资质奖项

理论著作

企业文化

资讯与活动

联系我们

加入我们

首页

产品及服务

解决方案

合作伙伴

投资者关系

关于我们

EN

云原生产品

数字原生产品

基础架构产品

服务

云原生产品

云原生产品

云原生平台CNP

架构管理

应用管理

应用架构

DevOps平台

数据服务

IT治理

云原生工具

楠竹OpenJDK

神州视讯

云安全(山石网科)

云安全防火墙(山石云·界)

云内东西向微隔离可视化平台(山石云·格)

云安全资源池(山石云·池)

网元控制器软件(山石云·集)

虚拟化安全网元

数字原生产品

数字原生产品

数据智能

DataOps平台

云原生大数据平台

数据安全

数据安全管控平台

数据分类分级平台

数据库审计

山石网科数据安全治理方案

数据平台

神州云 | Bluenic客户数据平台

神州云 | Jarvis知识管理平台

终端产品

台式机(神州鲲泰)

笔记本(神州鲲泰)

投影机(神州云科)

数据计算

AI服务器与AI集群(神州鲲泰)

通用计算服务器(神州鲲泰)

通用计算服务器(神州云科)

数据通信

交换机(DCN)

无线产品(DCN)

路由器(DCN)

智行网络(DCN)

网络设备(神州云科)

数据存储

超融合基础架构(神州云科)

分布式存储(神州云科)

云原生容器一体机(神州云科)

数据保护及容灾系统(神州云科)

登云数据库一体机(神州云科)

网络安全

网络安全(DCN)

安全运营(山石网科)

工业互联网安全(山石网科)

基础设施安全(山石网科)

应用交付

应用交付(神州云科容翼系列)

应用交付(云科通明湖)

高性能可扩展应用交付控制器(神州云科)

虚拟化软件系列(神州云科)

实训教学

网络实训(DCN)

安全实训(DCN)

大数据和人工智能专项实训(DCN)

智能桌面云(DCN)

实训教学平台(山石网科)

攻防演练平台(山石网科)

竞赛靶场平台(山石网科)

产品行业应用

行业应用与成功案例(DCN)

行业应用与成功案例(神州云科)

行业应用与成功案例(山石网科)

数云融合

数云融合

全栈云服务及MSP

云管理服务

混合云运维解决方案

云成本管理

云安全合规

Landing Zone

合作云资源

企业IT服务

企业级IT服务

安全服务(山石网科)

智网欺骗诱捕系统(山石网科)

重保支撑服务(山石网科)

红蓝对抗服务(山石网科)

安全培训服务(山石网科)

安全通告服务(山石网科)

应急保障服务(山石网科)

安全评估服务(山石网科)

行业解决方案

通用解决方案

汽车

零售快消

运营商

金融

制造

酒店文旅

政企

教育

“云+端”解决方案

资产盘点系统(手持盘点)

资产盘点系统(车载盘点)

资产出入库管理系统

资产实时定位管理系统

智能识别系统

叉车RFID应用系统

场景创新解决方案

神州云|IHP智能混合办公平台

合作伙伴

产品技术生态

千帆生态

开源生态

投资者关系

公司公告

投资者交流

关于我们

公司概况

资质奖项

理论著作

企业文化

资讯与活动

联系我们

加入我们

公司新闻

more

2024/02

23

算力实火!神州数码智算筑基成果打卡

近日,国务院国资委在中央企业人工智能专题推进会上明确提出“AI赋能 产业焕新”的战略目标。抢抓战略机遇,主动拥抱人工智能带来的深刻变革。会议强调,要夯实发展基础底座,把主要资源集中投入到最需要、最有优势的领域,加快建设一批智能算力中心,进一步深化开放合作。

2024/02

20

入围中国移动新型智算中心集采!

2024年2月18日,新年开工大吉。中国移动发布“23年~24年新型智算中心(试验网)采购(标包12)招标公告”。神州数码集团股份有限公司下属控股子公司神州数码(中国)有限公司为该项目的中标候选人之一,投标报价为2,473,722,753 63元(不含税),中标份额8 48%,据招标公告显示,本次采购主要包含1250台人工智能服务器及配套产品。

2024/02

07

神州数码受邀参加全国信标委云建设与应用专题工作组2024年一季度会议

2024年1月30日-31日,全国信标委云计算标准工作组云建设与应用专题工作组2024年第一季度会议在邯郸成功召开,本次会议由邯郸银行承办。

2024/02

06

车企大数据测试平台:入选!

近日,由中国信息协会主办的《2023中国数字化转型优秀方案集》正式公布,神州数码“某大型跨国车企大数据测试平台项目”实践案例成功入选。

2024/01

31

「数云100」| 美妆品牌的营销“竞速”,数字化助跑抢先机

国家统计局发布的数据显示,2023全年,社会消费品零售总额达到471495亿元,同比增长7 2%,其中,化妆品类商品零售额为4142亿元,同比增长5 1%,达到了历史最高水平。

2024/01

31

正式加入关保联盟,推动信息安全技术创新

数字化时代下,关键信息基础设施的安全问题日益凸显。为保障国家和社会的信息安全,在北京市科学技术委员会、中关村科技园区管理委员会与北京市公安局批准下,中关村华安关键信息基础设施安全保护联盟应运而生,并正式登记注册为社会团体组织。

2024/01

30

凭实力,载入这本全景册

近期, FreeBuf咨询正式发布《CCSIP(China Cyber Security Industry Panorama)2023中国网络安全行业全景册(第六版)》。依托在数据安全领域持续深耕与实践的专业技术能力,神州数码入选数据安全分类下的数据脱敏、分类分级、数据库安全、数据安全管控(平台型)四大细分领域。

2024/01

25

神州数码揽获2024腾讯产业合作伙伴大会四项大奖

近日,2024腾讯产业合作伙伴大会在三亚举行。神州数码作为腾讯云深度合作伙伴,受邀参加了本次盛会。

2024/01

22

如何在云上实现汽车研发效能提升?

伴随着数字化的时代洪流,一场围绕数字化赛道的全新竞速已经摆在了汽车产业链上下游的面前。尽管各方对于数字化的角度不尽相同,但主机厂正在牵引着庞大而复杂的汽车产业在不断升级与演变,主机厂自身的业务需求、系统建设、技术架构也在数字化技术的融合下产生着天翻地覆的变化,甚至连汽车的本质也开始逐步迁移。

2024/01

22

发力企业数字化转型,神州数码与德勤中国达成战略合作

1月18日,神州数码与德勤中国在深圳举行合作签约暨“德勤中国-神州数码联合创新中心”启动仪式,并发布“数智化创新赋能平台”和“企业GenAI加速器”两大解决方案。双方将以联合创新中心为载体,以服务大型企业为核心,以提供重大复杂数字化解决方案为核心竞争力,共同引领新时期的数智化转型。

更多

最新活动

more

最新活动

more

一个启动、两个入驻、三场战略签约,神州数码三重打造2024“开门红”

了解更多

了解详情

更多

数云融合

more

云原生技术推动了企业的敏捷业务能力的构建,数字原生技术使得数据成为驱动企业转型变革的核心资产。

了解更多

云原生产品

more

基于云原生的技术方法体系,神州数码为您构建全新的开发、交付与运维模式,让应用根植于云、生长于云,并帮助您的业务在云端实现高效、稳定、安全的运行。

了解更多

数字原生产品

more

依托云、大数据与人工智能技术,神州数码为您的企业注入数字化创新能力,提升数据质量,保障数据安全,深入挖掘企业现有的数据资源,实现数据资产价值。

了解更多

了解详情

更多

自主创新

基础架构产品

数据计算

AI服务器与AI集群(神州鲲泰)

了解详情

数据通信

路由器(DCN)

了解详情

终端产品

台式机(神州鲲泰)

了解详情

终端产品

笔记本(神州鲲泰)

了解详情

成就客户

行业解决方案

金融

金融

场景

方案

价值

证券行业数据脱敏解决方案

在金融机构的后台数据库中,储存着大量的敏感信息,无论是从商业惯例还是数据安全角度,这些敏感信息都应得到有效的保护。

了解更多

汽车

共享

出行

周期管理

共享出行云上全生命周期管理

基于多云MSP和系统开发综合能力,在中国区完成适配资源、落地布署、系统测试、上线运营、本地化持续迭代开发等全部工作,并通过DevOps对全过程提供支持。

了解更多

零售快消

一站式

DevOps

运维

DevOps运维

借助一站式多云资源和多云服务管理与高效的DevOps运维能力,快速部署新上线业务,分钟级完成促销期间的扩容,并同时减少大量运维成本。

了解更多

更多

合作伙伴

产品技术生态

千帆生态

开源生态

股票代码:000034.SZ

相关网站

神州商桥

神州云

神州云科

神州鲲泰

神州数码DCN

神州问学

联系我们

隐私政策

法律声明

网络安全与隐私保护

关注我们,了解神州数码

版权所有2016-2024 神州数码集团股份有限公司,保留一切权利。 京ICP备05051615号-1 京公网安备 11010802037792号

在线咨询

公司新闻

数云融合

自主创新

行业数字化

生态合作

在线咨询

发 送

请留下您的具体需求我们将尽快与您联系

*您的姓名

*您的手机号

*您的邮箱

您的公司名称

您的具体需求

提 交

DCN和DCNv2(可变性卷积)学习笔记(原理代码实现方式)_dcnv2代码-CSDN博客

>

DCN和DCNv2(可变性卷积)学习笔记(原理代码实现方式)_dcnv2代码-CSDN博客

DCN和DCNv2(可变性卷积)学习笔记(原理代码实现方式)

最新推荐文章于 2023-12-21 22:07:21 发布

just-solo

最新推荐文章于 2023-12-21 22:07:21 发布

阅读量2.8w

收藏

345

点赞数

65

分类专栏:

计算机视觉

深度学习

文章标签:

卷积

网络

深度学习

机器学习

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/justsolow/article/details/105971437

版权

深度学习

同时被 2 个专栏收录

64 篇文章

3 订阅

订阅专栏

计算机视觉

57 篇文章

8 订阅

订阅专栏

DCN和DCNv2(可变性卷积)

网上关于两篇文章的详细描述已经很多了,我这里具体的细节就不多讲了,只说一下其中实现起来比较困惑的点。(黑体字会讲解)

DCNv1解决的问题就是我们常规的图像增强,仿射变换(线性变换加平移)不能解决的多种形式目标变换的几何变换的问题。如下图所示。 可变性卷积的思想很简单,就是讲原来固定形状的卷积核变成可变的。如下图所示: 首先来看普通卷积,以3x3卷积为例对于每个输出y(p0),都要从x上采样9个位置,这9个位置都在中心位置x(p0)向四周扩散得到的gird形状上,(-1,-1)代表x(p0)的左上角,(1,1)代表x(p0)的右下角,其他类似。 用公式表示如下: 可变性卷积Deformable Conv操作并没有改变卷积的计算操作,而是在卷积操作的作用区域上,加入了一个可学习的参数∆pn。同样对于每个输出y(p0),都要从x上采样9个位置,这9个位置是中心位置x(p0)向四周扩散得到的,但是多了 ∆pn,允许采样点扩散成非gird形状。 偏移量是通过对原始特征层进行卷积得到的。比如输入特征层是w×h×c,先对输入的特征层进行卷积操作,得到w×h×2c的offset field。这里的w和h和原始特征层的w和h是一致的,offset field里面的值是输入特征层对应位置的偏移量,偏移量有x和y两个方向,所以offset field的channel数是2c。offset field里的偏移量是卷积得到的,可能是浮点数,所以接下来需要通过双向性插值计算偏移位置的特征值。在偏移量的学习中,梯度是通过双线性插值来进行反向传播的。 看到这里是不是还是有点迷茫呢?那到底程序上面怎么实现呢? 事实上由上面的公式我们可以看得出来∆pn这个偏移量是加在原像素点上的,但是我们怎么样从代码上对原像素点加这个量呢?其实很简单,就是用一个普通的卷积核去跟输入图片(一般是输入的feature_map)卷积就可以了卷积核的数量是2N也就是23*3==18(前9个通道是x方向的偏移量,后9个是y方向的偏移量),然后把这个卷积的结果与正常卷积的结果进行相加就可以了。 然后又有了第二个问题,怎么样反向传播呢?为什么会有这个问题呢?因为求出来的偏移量+正常卷积输出的结果往往是一个浮点数,浮点数是无法对应到原图的像素点的,所以自然就想到了双线性差值的方法求出浮点数对应的浮点像素点。(这个跟roi-align的技巧相似,可以去看看这两篇文章 ) 了解了这个以后下面就简单了。 可变形RoI池化。 DCN v2 对于positive的样本来说,采样的特征应该focus在RoI内,如果特征中包含了过多超出RoI的内容,那么结果会受到影响和干扰。而negative样本则恰恰相反,引入一些超出RoI的特征有助于帮助网络判别这个区域是背景区域。

DCNv1引入了可变形卷积,能更好的适应目标的几何变换。但是v1可视化结果显示其感受野对应位置超出了目标范围,导致特征不受图像内容影响(理想情况是所有的对应位置分布在目标范围以内)。

为了解决该问题:提出v2, 主要有

1、扩展可变形卷积,增强建模能力 2、提出了特征模拟方案指导网络培训:feature mimicking scheme

上面这段话是什么意思呢,通俗来讲就是,我们的可变性卷积的区域大于目标所在区域,所以这时候就会对非目标区域进行错误识别。

所以自然能想到的解决方案就是加入权重项进行惩罚。(至于这个实现起来就比较简单了,直接初始化一个权重然后乘(input+offsets)就可以了) 可调节的RoIpooling也是类似的,公式如下: R-CNN Feature Mimicking 作者发现对于RoI分类时,普通CNN或者DCN V1的错误边界显著性区域都会延伸到RoI之外,于是与RoI不相关的图像内容就会影响RoI特征的提取,从而可能影响目标检测的结果。不过R-CNN在进行分类时,结果完全是依赖于RoI的,因为R-CNN的分类branch的输入就RoI的cropped image。 R-CNN是通过select-search得到的roi然后输入到网络中得出每一个roi的feature-map,faster-rcnn是整张图片输进去得到feature-map通过rpn得出rois。 采用了类似知识蒸馏的方法,用一个R-CNN分类网络作为teacher network 帮助Faster R-CNN更好收敛到目标区域内。

得到RoI之后,在原图中抠出这个RoI,resize到224x224,再送到一个R-CNN中进行分类,这个R-CNN只分类,不回归。然后,主网络fc2的特征去模仿R-CNN fc2的特征,实际上就是两者算一个余弦相似度,1减去相似度作为loss即可。

Feature mimic loss定义如下: 其中Ω代表RoI的集合。

代码实现:

class DeformNet(nn.Module):

def __init__(self):

super(DeformNet, self).__init__()

self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)

self.bn1 = nn.BatchNorm2d(32)

self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)

self.bn2 = nn.BatchNorm2d(64)

self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)

self.bn3 = nn.BatchNorm2d(128)

self.offsets = nn.Conv2d(128, 18, kernel_size=3, padding=1)

self.conv4 = DeformConv2D(128, 128, kernel_size=3, padding=1)

self.bn4 = nn.BatchNorm2d(128)

self.classifier = nn.Linear(128, 10)

def forward(self, x):

# convs

x = F.relu(self.conv1(x))

x = self.bn1(x)

x = F.relu(self.conv2(x))

x = self.bn2(x)

x = F.relu(self.conv3(x))

x = self.bn3(x)

# deformable convolution

offsets = self.offsets(x)

x = F.relu(self.conv4(x, offsets))

x = self.bn4(x)

print(x)

x = F.avg_pool2d(x, kernel_size=28, stride=1).view(x.size(0), -1)

x = self.classifier(x)

return F.log_softmax(x, dim=1)

这是调用代码,其实只是一个壳子,下面来看看主要的代码。

class DeformConv2D(nn.Module):

def __init__(self, inc, outc, kernel_size=3, padding=1, bias=None):

super(DeformConv2D, self).__init__()

self.kernel_size = kernel_size

self.padding = padding

self.zero_padding = nn.ZeroPad2d(padding)

self.conv_kernel = nn.Conv2d(inc, outc, kernel_size=kernel_size, stride=kernel_size, bias=bias)

# 注意,offset的Tensor尺寸是[b, 18, h, w],offset传入的其实就是每个像素点的坐标偏移,也就是一个坐标量,最终每个点的像素还需要这个坐标偏移和原图进行对应求出。

def forward(self, x, offset):

dtype = offset.data.type()

ks = self.kernel_size

# N=9=3x3

N = offset.size(1) // 2

#这里其实没必要,我们反正这个顺序是我们自己定义的,那我们直接按照[x1, x2, .... y1, y2, ...]定义不就好了。

# 将offset的顺序从[x1, y1, x2, y2, ...] 改成[x1, x2, .... y1, y2, ...]

offsets_index = Variable(torch.cat([torch.arange(0, 2*N, 2), torch.arange(1, 2*N+1, 2)]), requires_grad=False).type_as(x).long()

# torch.unsqueeze()是为了增加维度,使offsets_index维度等于offset

offsets_index = offsets_index.unsqueeze(dim=0).unsqueeze(dim=-1).unsqueeze(dim=-1).expand(*offset.size())

# 根据维度dim按照索引列表index将offset重新排序,得到[x1, x2, .... y1, y2, ...]这样顺序的offset

offset = torch.gather(offset, dim=1, index=offsets_index)

# ------------------------------------------------------------------------

# 对输入x进行padding

if self.padding:

x = self.zero_padding(x)

# 将offset放到网格上,也就是标定出每一个坐标位置

# (b, 2N, h, w)

p = self._get_p(offset, dtype)

# 维度变换

# (b, h, w, 2N)

p = p.contiguous().permute(0, 2, 3, 1)

# floor是向下取整

q_lt = Variable(p.data, requires_grad=False).floor()

# +1相当于向上取整,这里为什么不用向上取整函数呢?是因为如果正好是整数的话,向上取整跟向下取整就重合了,这是我们不想看到的。

q_rb = q_lt + 1

# 将lt限制在图像范围内,其中[..., :N]代表x坐标,[..., N:]代表y坐标

q_lt = torch.cat([torch.clamp(q_lt[..., :N], 0, x.size(2)-1), torch.clamp(q_lt[..., N:], 0, x.size(3)-1)], dim=-1).long()

# 将rb限制在图像范围内

q_rb = torch.cat([torch.clamp(q_rb[..., :N], 0, x.size(2)-1), torch.clamp(q_rb[..., N:], 0, x.size(3)-1)], dim=-1).long()

# 获得lb

q_lb = torch.cat([q_lt[..., :N], q_rb[..., N:]], -1)

# 获得rt

q_rt = torch.cat([q_rb[..., :N], q_lt[..., N:]], -1)

# 限制在一定的区域内,其实这部分可以写的很简单。有点花里胡哨的感觉。。在numpy中这样写:

#p = np.where(p >= 1, p, 0)

#p = np.where(p

# 插值的时候需要考虑一下padding对原始索引的影响

# (b, h, w, N)

# torch.lt() 逐元素比较input和other,即是否input < other

# torch.rt() 逐元素比较input和other,即是否input > other

mask = torch.cat([p[..., :N].lt(self.padding)+p[..., :N].gt(x.size(2)-1-self.padding),

p[..., N:].lt(self.padding)+p[..., N:].gt(x.size(3)-1-self.padding)], dim=-1).type_as(p)

#禁止反向传播

mask = mask.detach()

#p - (p - torch.floor(p))不就是torch.floor(p)呢。。。

floor_p = p - (p - torch.floor(p))

#总的来说就是把超出图像的偏移量向下取整

p = p*(1-mask) + floor_p*mask

p = torch.cat([torch.clamp(p[..., :N], 0, x.size(2)-1), torch.clamp(p[..., N:], 0, x.size(3)-1)], dim=-1)

# bilinear kernel (b, h, w, N)

# 插值的4个系数

g_lt = (1 + (q_lt[..., :N].type_as(p) - p[..., :N])) * (1 + (q_lt[..., N:].type_as(p) - p[..., N:]))

g_rb = (1 - (q_rb[..., :N].type_as(p) - p[..., :N])) * (1 - (q_rb[..., N:].type_as(p) - p[..., N:]))

g_lb = (1 + (q_lb[..., :N].type_as(p) - p[..., :N])) * (1 - (q_lb[..., N:].type_as(p) - p[..., N:]))

g_rt = (1 - (q_rt[..., :N].type_as(p) - p[..., :N])) * (1 + (q_rt[..., N:].type_as(p) - p[..., N:]))

# (b, c, h, w, N)

x_q_lt = self._get_x_q(x, q_lt, N)

x_q_rb = self._get_x_q(x, q_rb, N)

x_q_lb = self._get_x_q(x, q_lb, N)

x_q_rt = self._get_x_q(x, q_rt, N)

# (b, c, h, w, N)

# 插值的最终操作在这里

x_offset = g_lt.unsqueeze(dim=1) * x_q_lt + \

g_rb.unsqueeze(dim=1) * x_q_rb + \

g_lb.unsqueeze(dim=1) * x_q_lb + \

g_rt.unsqueeze(dim=1) * x_q_rt

#偏置点含有九个方向的偏置,_reshape_x_offset() 把每个点9个方向的偏置转化成 3×3 的形式,

# 于是就可以用 3×3 stride=3 的卷积核进行 Deformable Convolution,

# 它等价于使用 1×1 的正常卷积核(包含了这个点9个方向的 context)对原特征直接进行卷积。

x_offset = self._reshape_x_offset(x_offset, ks)

out = self.conv_kernel(x_offset)

return out

#求每个点的偏置方向

def _get_p_n(self, N, dtype):

p_n_x, p_n_y = np.meshgrid(range(-(self.kernel_size-1)//2, (self.kernel_size-1)//2+1),

range(-(self.kernel_size-1)//2, (self.kernel_size-1)//2+1), indexing='ij')

# (2N, 1)

p_n = np.concatenate((p_n_x.flatten(), p_n_y.flatten()))

p_n = np.reshape(p_n, (1, 2*N, 1, 1))

p_n = Variable(torch.from_numpy(p_n).type(dtype), requires_grad=False)

return p_n

@staticmethod

#求每个点的坐标

def _get_p_0(h, w, N, dtype):

p_0_x, p_0_y = np.meshgrid(range(1, h+1), range(1, w+1), indexing='ij')

p_0_x = p_0_x.flatten().reshape(1, 1, h, w).repeat(N, axis=1)

p_0_y = p_0_y.flatten().reshape(1, 1, h, w).repeat(N, axis=1)

p_0 = np.concatenate((p_0_x, p_0_y), axis=1)

p_0 = Variable(torch.from_numpy(p_0).type(dtype), requires_grad=False)

return p_0

#求最后的偏置后的点=每个点的坐标+偏置方向+偏置

def _get_p(self, offset, dtype):

# N = 9, h, w

N, h, w = offset.size(1)//2, offset.size(2), offset.size(3)

# (1, 2N, 1, 1)

p_n = self._get_p_n(N, dtype)

# (1, 2N, h, w)

p_0 = self._get_p_0(h, w, N, dtype)

p = p_0 + p_n + offset

return p

#求出p点周围四个点的像素

def _get_x_q(self, x, q, N):

b, h, w, _ = q.size()

padded_w = x.size(3)

c = x.size(1)

# (b, c, h*w)将图片压缩到1维,方便后面的按照index索引提取

x = x.contiguous().view(b, c, -1)

# (b, h, w, N)这个目的就是将index索引均匀扩增到图片一样的h*w大小

index = q[..., :N]*padded_w + q[..., N:] # offset_x*w + offset_y

# (b, c, h*w*N)

index = index.contiguous().unsqueeze(dim=1).expand(-1, c, -1, -1, -1).contiguous().view(b, c, -1)

#双线性插值法就是4个点再乘以对应与 p 点的距离。获得偏置点 p 的值,这个 p 点是 9 个方向的偏置所以最后的 x_offset 是 b×c×h×w×9。

x_offset = x.gather(dim=-1, index=index).contiguous().view(b, c, h, w, N)

return x_offset

#_reshape_x_offset() 把每个点9个方向的偏置转化成 3×3 的形式

@staticmethod

def _reshape_x_offset(x_offset, ks):

b, c, h, w, N = x_offset.size()

x_offset = torch.cat([x_offset[..., s:s+ks].contiguous().view(b, c, h, w*ks) for s in range(0, N, ks)], dim=-1)

x_offset = x_offset.contiguous().view(b, c, h*ks, w*ks)

return x_offset

v2的代码就是在v1的基础上加了权重项sigmoid。就不详细注释了。

import torch

from torch import nn

class DeformConv2d(nn.Module):

def __init__(self, inc, outc, kernel_size=3, padding=1, stride=1, bias=None, modulation=False):

"""

Args:

modulation (bool, optional): If True, Modulated Defomable Convolution (Deformable ConvNets v2).

"""

super(DeformConv2d, self).__init__()

self.kernel_size = kernel_size

self.padding = padding

self.stride = stride

self.zero_padding = nn.ZeroPad2d(padding)

self.conv = nn.Conv2d(inc, outc, kernel_size=kernel_size, stride=kernel_size, bias=bias)

self.p_conv = nn.Conv2d(inc, 2*kernel_size*kernel_size, kernel_size=3, padding=1, stride=stride)

nn.init.constant_(self.p_conv.weight, 0)

self.p_conv.register_backward_hook(self._set_lr)

self.modulation = modulation

if modulation:

self.m_conv = nn.Conv2d(inc, kernel_size*kernel_size, kernel_size=3, padding=1, stride=stride)

nn.init.constant_(self.m_conv.weight, 0)

self.m_conv.register_backward_hook(self._set_lr)

@staticmethod

def _set_lr(module, grad_input, grad_output):

grad_input = (grad_input[i] * 0.1 for i in range(len(grad_input)))

grad_output = (grad_output[i] * 0.1 for i in range(len(grad_output)))

def forward(self, x):

offset = self.p_conv(x)

if self.modulation:

m = torch.sigmoid(self.m_conv(x))

dtype = offset.data.type()

ks = self.kernel_size

N = offset.size(1) // 2

if self.padding:

x = self.zero_padding(x)

# (b, 2N, h, w)

p = self._get_p(offset, dtype)

# (b, h, w, 2N)

p = p.contiguous().permute(0, 2, 3, 1)

q_lt = p.detach().floor()

q_rb = q_lt + 1

q_lt = torch.cat([torch.clamp(q_lt[..., :N], 0, x.size(2)-1), torch.clamp(q_lt[..., N:], 0, x.size(3)-1)], dim=-1).long()

q_rb = torch.cat([torch.clamp(q_rb[..., :N], 0, x.size(2)-1), torch.clamp(q_rb[..., N:], 0, x.size(3)-1)], dim=-1).long()

q_lb = torch.cat([q_lt[..., :N], q_rb[..., N:]], dim=-1)

q_rt = torch.cat([q_rb[..., :N], q_lt[..., N:]], dim=-1)

# clip p

p = torch.cat([torch.clamp(p[..., :N], 0, x.size(2)-1), torch.clamp(p[..., N:], 0, x.size(3)-1)], dim=-1)

# bilinear kernel (b, h, w, N)

g_lt = (1 + (q_lt[..., :N].type_as(p) - p[..., :N])) * (1 + (q_lt[..., N:].type_as(p) - p[..., N:]))

g_rb = (1 - (q_rb[..., :N].type_as(p) - p[..., :N])) * (1 - (q_rb[..., N:].type_as(p) - p[..., N:]))

g_lb = (1 + (q_lb[..., :N].type_as(p) - p[..., :N])) * (1 - (q_lb[..., N:].type_as(p) - p[..., N:]))

g_rt = (1 - (q_rt[..., :N].type_as(p) - p[..., :N])) * (1 + (q_rt[..., N:].type_as(p) - p[..., N:]))

# (b, c, h, w, N)

x_q_lt = self._get_x_q(x, q_lt, N)

x_q_rb = self._get_x_q(x, q_rb, N)

x_q_lb = self._get_x_q(x, q_lb, N)

x_q_rt = self._get_x_q(x, q_rt, N)

# (b, c, h, w, N)

x_offset = g_lt.unsqueeze(dim=1) * x_q_lt + \

g_rb.unsqueeze(dim=1) * x_q_rb + \

g_lb.unsqueeze(dim=1) * x_q_lb + \

g_rt.unsqueeze(dim=1) * x_q_rt

# modulation

if self.modulation:

m = m.contiguous().permute(0, 2, 3, 1)

m = m.unsqueeze(dim=1)

m = torch.cat([m for _ in range(x_offset.size(1))], dim=1)

x_offset *= m

x_offset = self._reshape_x_offset(x_offset, ks)

out = self.conv(x_offset)

return out

def _get_p_n(self, N, dtype):

p_n_x, p_n_y = torch.meshgrid(

torch.arange(-(self.kernel_size-1)//2, (self.kernel_size-1)//2+1),

torch.arange(-(self.kernel_size-1)//2, (self.kernel_size-1)//2+1))

# (2N, 1)

p_n = torch.cat([torch.flatten(p_n_x), torch.flatten(p_n_y)], 0)

p_n = p_n.view(1, 2*N, 1, 1).type(dtype)

return p_n

def _get_p_0(self, h, w, N, dtype):

p_0_x, p_0_y = torch.meshgrid(

torch.arange(1, h*self.stride+1, self.stride),

torch.arange(1, w*self.stride+1, self.stride))

p_0_x = torch.flatten(p_0_x).view(1, 1, h, w).repeat(1, N, 1, 1)

p_0_y = torch.flatten(p_0_y).view(1, 1, h, w).repeat(1, N, 1, 1)

p_0 = torch.cat([p_0_x, p_0_y], 1).type(dtype)

return p_0

def _get_p(self, offset, dtype):

N, h, w = offset.size(1)//2, offset.size(2), offset.size(3)

# (1, 2N, 1, 1)

p_n = self._get_p_n(N, dtype)

# (1, 2N, h, w)

p_0 = self._get_p_0(h, w, N, dtype)

p = p_0 + p_n + offset

return p

def _get_x_q(self, x, q, N):

b, h, w, _ = q.size()

padded_w = x.size(3)

c = x.size(1)

# (b, c, h*w)

x = x.contiguous().view(b, c, -1)

# (b, h, w, N)

index = q[..., :N]*padded_w + q[..., N:] # offset_x*w + offset_y

# (b, c, h*w*N)

index = index.contiguous().unsqueeze(dim=1).expand(-1, c, -1, -1, -1).contiguous().view(b, c, -1)

x_offset = x.gather(dim=-1, index=index).contiguous().view(b, c, h, w, N)

return x_offset

@staticmethod

def _reshape_x_offset(x_offset, ks):

b, c, h, w, N = x_offset.size()

x_offset = torch.cat([x_offset[..., s:s+ks].contiguous().view(b, c, h, w*ks) for s in range(0, N, ks)], dim=-1)

x_offset = x_offset.contiguous().view(b, c, h*ks, w*ks)

return x_offset

总结:

dcnv2比v1改进的地方。 1、扩展可变形卷积,增强建模能力 2、提出了特征模拟方案指导网络培训:feature mimicking scheme 3、dcnv1是在最后三层使用了dcnv1,但是dcnv2是在最后的conv3-conv5(12层)都使用了dcnv2.效果更好

优惠劵

just-solo

关注

关注

65

点赞

345

收藏

觉得还不错?

一键收藏

知道了

35

评论

DCN和DCNv2(可变性卷积)学习笔记(原理代码实现方式)

DCN和DCNv2(可变性卷积)网上关于两篇文章的详细描述已经很多了,我这里具体的细节就不多讲了,只说一下其中实现起来比较困惑的点。(黑体字会讲解)DCNv1解决的问题就是我们常规的图像增强,仿射变换(线性变换加平移)不能解决的多种形式目标变换的几何变换的问题。如下图所示。可变性卷积的思想很简单,就是讲原来固定形状的卷积核变成可变的。如下图所示:首先来看普通卷积,以3x3卷积为例对于每...

复制链接

扫一扫

专栏目录

pytorch版可变形卷积代码DCNv2.zip

04-09

pytorch版可变形卷积代码DCNv2,下载编译可直接使用,内附编译过程及详细使用方法。在Ubuntu环境下使用的。

论文及代码详解——可变形卷积(DCNv2)

zyw2002的博客

08-17

3733

DCNv2 是在DCNv1的基础上的改进版。理解DCNv2之前,建议先读。

35 条评论

您还未登录,请先

登录

后发表或查看评论

YOLOv8添加DCNv2可变形卷积

weixin_70423469的博客

07-13

5065

最近比较火的可变形卷积(Deformable Convolutional Networks(DCN))被称为目标检测改进网络结构的中涨点神器,确实在yolov8中加入DCN3可以涨3到4个点,尤其是它对小目标检测效果较好。来declare一下,否则会导入失败,至此已经差不多就ok了,现在只需要在yaml中你想要更改的网络结构的地方改一下就行,然后就可以训练了,如果不确定可以在训练的时候看一下print的网络结构即可。这三处()里都加上C2f_DCN,接着在modules文件夹下的__init__.py。

可变形卷积DCNv1、DCNv2、DCNv3比较

最新发布

m0_59959542的博客

12-21

2003

可变形卷积DCN

可变形卷积:DCNv1and DCNv2

chairon的博客

05-10

4917

可变形卷积顾名思义就是卷积的位置是可变形的,并非在传统的N × N的网格上做卷积,这样的好处就是更准确地提取到我们想要的特征(传统的卷积仅仅只能提取到矩形框的特征)(a)是标准的3×3卷积。(b),( c),(d)是给普通卷积加上偏移之后形成的可变形的卷积核,其中蓝色的是新的卷积点,箭头是位移方向。因此DCN v1提出在方形卷积核上的每个点学习一个偏移(offset),卷积核可以根据不同的数据学习不同的卷积核结构,如图1所示。在不同的阶段,不同的特征图,甚至不同的像素点上都可能有其最优的卷积核结构。

DCNv2简述

今天打卡Leetcode了吗

11-05

6327

引言

  由尺寸,位置,视野,部分变形成为目标识别检测中的一个挑战。DCNv1 介绍了两个模型,

  (1)可变形卷积:标准卷积网格采样点的位置都是前面预处理feature map学习的偏移。

  (2)可变形RoIpooling,其中,偏移学习RoIPooling中的bins的位置。将上述两个模型嵌入到神经网络中可以按照目标物的特性进行特征表示,通过变形采样及池化模式来适应目标物体的结构。基于上述方法,大幅度提高了目标检测的效果。

为了理解可变形卷积,通过在VOC图像上采样点的位置上增加偏移,并可视化其引

《南溪的目标检测学习笔记》——DCN(DCNv2)的学习笔记

墨门

01-08

2473

1 前言

我觉得DCN是一个十分具有实力的技术,在Deformable-DETR跟PP-YOLO中都有用到DCN;

2 DCN的特点

理论上可以获得任意大小的感受野(由于其deformable的特性)

【DCNv2踩坑记录】Windows10 + RTX3060 + cuda11.0 + pytorch1.7.1成功编译

qq_42700606的博客

09-06

5474

【DCNv2踩坑记录】 windows10 + RTX3060 + cuda11.0 + pytorch1.7.1 成功编译

pytorch DCNv2使用方式

街道口扛把子的博客

12-18

3168

主要注意offset的获得方式:

from torchvision.ops import DeformConv2d

class DConv(nn.Module):

def __init__(self, inplanes, planes, kernel_size=3, stride=1, padding=1, bias=False):

super(DConv, self).__init__()

self.conv1 = nn.Conv2d(inplanes, 2 *

深度学习之DCN-v2

Ton的博客

05-03

5816

这篇文章发表在2019的CVPR上,是Deformable Convolution Network的进阶版本——DCN-v2,通过对DCN的两处改进来增加卷积神经网络的适应性与灵活性。具体来说,通过堆叠多个DCN来增强感知的范围;通过引入调制机制来为DCN增加更多选择采样区域的自由度,这种调制通过门机制来实现对采样区域的注意力。

Deformable ConvNets v2: More Deformable, Better ResultsAbstract1 Introduction2 Focus poin.

DCNv2可变形卷积开发包

11-13

可变性卷积的思想很简单,就是讲原来固定形状的卷积核变成可变的。同时可以去我的github地址去下载:https://github.com/z1z9b89/DCNv2

tensorrtx 实现 yolov5 + dcnv2

03-20

参考 tensorrx yolov5 , 实现 tensorrt 推理。 backbone: # [from, number, module, args] [[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2 [-1, 1, DCN, [128, 3, 2]], # 1-P2/4 [-1, 3, C3, [128]], [-1, 1, DCN, ...

DCNv2-master.zip

06-30

支持pytorch1.7版本,不用做较大修改即可运行

DCNv2ubuntu16.04下编译好的

11-12

可变形卷积dcnv2编译,ubuntu16.04下编译好的,cuda10.0,cudnn7.1.3,欢迎下载

YOLOv4---(详解各种trick)

热门推荐

justsolow的博客

05-29

2万+

YOLOv4—(详解各种trick)

参考自(https://zhuanlan.zhihu.com/p/139764729)

前段时间大名鼎鼎的yolov4终于面世了,可是看过以后确实大失所望。不是说yolov4不好,只不过没有什么革命性的创新,相当于作者尝试了计算机视觉领域的各种花里胡哨的trick,然后给了一个最佳方案的trick组合。而且,这些东西对于实际的工业生产并没有什么用。。。。也就是落地基本不可能。

下面来仔细看一下文章中提到的各种trick。

论文地址

github

文中将前人的工作主要分

FCN(全卷积网络)详解

justsolow的博客

11-25

1万+

FCN详解

全卷积网络就是在全连接网络的基础上,通过用卷积网络替换全连接网络得到的。

首先看一下什么是全连接网络,以及全连接网络的缺点。

通常的CNN网络中,在最后都会有几层全连接网络来融合特征信息,然后再对融合后的特征信息进行softmax分类。

假设最后一层的feature_map的大小是7x7x512,那么全连接层做的事就是用4096个7x7x512的滤波器去卷积这个最后的feature_map。所以可想而知这个参数量是很大的!!

但是全卷积网络就简单多了。FCN的做法是将最后的全连接层替换为409

Triplet loss(三元损失函数)

justsolow的博客

06-22

1万+

Triplet loss(三元损失函数)

Triplet Loss是Google在2015年发表的FaceNet论文中提出的,论文原文见附录。Triplet Loss即三元组损失,我们详细来介绍一下。

Triplet Loss定义:最小化锚点和具有相同身份的正样本之间的距离,最小化锚点和具有不同身份的负样本之间的距离。

Triplet Loss的目标:Triplet Loss的目标是使得相同标签的特征在空间位置上尽量靠近,同时不同标签的特征在空间位置上尽量远离,同时为了不让样本的特征聚合到一个非常小的空间中

可变形卷积DCNv2

10-01

可变形卷积DCNv2是对DCNv1的改进版本。DCNv2的核心思想是在卷积操作时,不仅给卷积核的每个采样点的位置加一个偏移,还能学习每个采样点的权重。相比于DCNv1,DCNv2引入了更多的Deformable Convolution,将卷积层中的一些传统卷积操作替换为Deformable Convolution。此外,DCNv2还引入了RCNN feature mimicking的方法。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

just-solo

CSDN认证博客专家

CSDN认证企业博客

码龄7年

暂无认证

104

原创

4万+

周排名

57万+

总排名

27万+

访问

等级

3282

积分

114

粉丝

320

获赞

95

评论

1838

收藏

私信

关注

热门文章

DCN和DCNv2(可变性卷积)学习笔记(原理代码实现方式)

28794

CV面试题(持续更新!!!)

26904

YOLOv4---(详解各种trick)

20413

FCN(全卷积网络)详解

15249

Triplet loss(三元损失函数)

13604

分类专栏

算法

17篇

python的使用

18篇

计算机视觉

57篇

深度学习

64篇

自然语言处理

5篇

轻量化网络

1篇

markdown

1篇

机器学习

14篇

最新评论

DCN和DCNv2(可变性卷积)学习笔记(原理代码实现方式)

qq_63287913:

有完整的源码么?

DCN和DCNv2(可变性卷积)学习笔记(原理代码实现方式)

visualsoul:

github上看源码吧,如果你要用肯定要下源码

DCN和DCNv2(可变性卷积)学习笔记(原理代码实现方式)

visualsoul:

看你的任务,如果对象是形状不规则的效果明显

DCN和DCNv2(可变性卷积)学习笔记(原理代码实现方式)

可爱多多很多:

博主v3出来了,求讲。别人的v2我都没看懂一看您的就看懂了

TVM安装踩坑笔记

东风破1026:

编译cmake时 出现No download info given for 'project_libbacktrace' and its source directory: 如何解决呀

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

分治算法例题

二分查找模板

拓扑排序详解

2021年3篇

2020年103篇

2019年1篇

目录

目录

分类专栏

算法

17篇

python的使用

18篇

计算机视觉

57篇

深度学习

64篇

自然语言处理

5篇

轻量化网络

1篇

markdown

1篇

机器学习

14篇

目录

评论 35

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

CNN卷积神经网络之DCN(Deformable Convolutional Networks、Deformable ConvNets v2)_dcn神经网络-CSDN博客

>

CNN卷积神经网络之DCN(Deformable Convolutional Networks、Deformable ConvNets v2)_dcn神经网络-CSDN博客

CNN卷积神经网络之DCN(Deformable Convolutional Networks、Deformable ConvNets v2)

最新推荐文章于 2023-02-16 15:34:45 发布

球场书生

最新推荐文章于 2023-02-16 15:34:45 发布

阅读量1.2w

收藏

58

点赞数

11

分类专栏:

目标检测

CNN卷积神经网络

文章标签:

计算机视觉

人工智能

卷积

目标检测

可变形卷积

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/qq_41917697/article/details/116193042

版权

CNN卷积神经网络

同时被 2 个专栏收录

28 篇文章

17 订阅

订阅专栏

目标检测

16 篇文章

5 订阅

订阅专栏

可变形卷积网络Deformable ConvNets V1、V2

前言一、Deformable Convolutional NetworksDeformable ConvolutionDeformable RoI PoolingPosition-Sensitive (PS) RoI Poolingoffset偏移学习实验效果思考

二、Deformable ConvNets v2Stacking More Deformable Conv LayersModulated Deformable ModulesR-CNN Feature Mimicking思考

前言

2017年《Deformable Convolutional Networks》 论文地址:https://arxiv.org/pdf/1703.06211.pdf 2018年《Deformable ConvNets v2: More Deformable, Better Results》 论文地址:https://arxiv.org/pdf/1811.11168.pdf

由于构造卷积神经网络所用的模块中几何结构是固定的,其几何变换建模的能力本质上是有限的。可以说CNN还不能很好实现旋转不变性的。在以往会使用数据增强的方式,让网络强行记忆不同的几何形状。 作者认为以往的固定形状的卷积是网络难以适应几何变形的“罪魁祸首”,比如同一层的特征图的不同位置可能对应的是不同形状的物体,但是都和同一个形状卷积做计算,那么不能很好的将感受野作用在整个物体之上,因此提出了可变性卷积。

一、Deformable Convolutional Networks

下图展示了卷积核大小为 3x3 的正常卷积和可变形卷积的采样方式,(a) 所示的正常卷积规律的采样 9 个点(绿点),(b)( c)(d) 为可变形卷积,在正常的采样坐标上加上一个位移量(蓝色箭头),其中 ( c)(d) 作为 (b) 的特殊情况,展示了可变形卷积可以作为尺度变换,比例变换和旋转变换的特殊情况 : 下面介绍,如何计算偏置位移量:

Deformable Convolution

假设输入的特征图为WxH,将要进行的可变性卷积为kernelsize=3x3,stride=1,dialated=1,那么首先会用一个具有与当前可变性卷积层相同的空间分辨率和扩张率的卷积(这里也要k=3x3,s=1,dial,才能保证偏移个数一致)进行学习offset。conv会输出一个WxHx2N的offset filed(N是可变性卷积的3x3=9个点,2N是每个点有x和y两个方向向量)。之后,DConv可变形卷积核会根据偏移量进行卷积。 偏移量是小数,需要对原特征图进行双线性插值。

下图是连续三级可变形卷积带来的效果,每一级卷积都用3*3的卷积核做卷积,三层卷积后就能产生93=729个采样点。可以看到经过训练后所有的采样点都偏移到了不同尺度目标周围。

Deformable RoI Pooling

可变性ROIPooling的偏移值计算:首先RoI pooling产生pooled feature maps(绿色),然后用FC去学习归一化后的偏移值(为了使偏移量学习不受RoI大小的影响,需要对偏移量进行归一化),这个变量会和(w, h)做点乘,然后再乘以一个尺度因子,其中w,h是RoI的宽和高,而伽马是一个0.1的常数因子。用该位移作用在可变形兴趣区域池化(蓝色)上,以获得不局限于兴趣区域固定网格的特征。p也是个小数,需要通过双线性插值来得到真正的值。

个人理解,前者是为了让deformable能和RoI的尺度结合起来,更好地估计偏移位置;而后者是为了防止偏移量太大甚至超出RoI和整个图像。

调整后的bin如图红色框所示:此时并不是规则的将黄色框ROI进行等分成3x3的bin。

Position-Sensitive (PS) RoI Pooling

另外就是作者还搞出了一个和R-FCN的位置敏感比较类似的另一种RoI方法,同样是考虑deformable因素的,叫Position-Sensitive (PS) RoI Pooling,这里就不详细介绍了 偏移式学习是不同的,如图所示。在顶部分支中,一个conv层生成全空间分辨率偏移字段。对于每个RoI(同样对于每个类别),在这些字段上应用PS RoI池化,得到归一化偏移量∆pbij,然后将其转换为真实偏移量∆pij,方法与上述可变性RoI池化相同。

offset偏移学习

作者采用的是0初始化,然后按照网络其它参数学习率的

β

\beta

β倍来学习,这个

β

\beta

β默认是1,但在某些情况下,比如faster rcnn中的fc的那些,是0.01。 此外,并不是所有的卷积都一股脑地换成可行变卷积就是好的,在提取到一些语义特征后使用形变卷积效果会更好一点,一般来说是网络靠后的几层。下图是在不同层加入可变形卷积所带来的性能提升:

实验效果

加入DCN,参数量和速度只会略微增加:

下图是在各项任务中的性能对比:加入可变性卷积或者可变性ROI池化都能带来提升。(Atrous convolution也叫做空洞卷积dilated convolution)

思考

总而言之,卷积改变为类似采样的思路都是很有意义的,但是会存在以下几点需要顾及的地方:是否一层网络真的能有效学习偏置?不同图片的大量不同物体在offset优化上会不会引发竞争什么的(偏置会存在自己的偏好)?

二、Deformable ConvNets v2

本文对V1做了3方面的改进:增加可变形卷积的层数,增加可调节的可变形模块,采用蒸馏的方法模仿RCNN的特征。

Stacking More Deformable Conv Layers

本文题目就是More Deformable, Better Results。v1中使用的ResNet-50,只将conv5中的共3层3x3卷积换成了可变形卷积,本文则将conv3,conv4和conv5中一共12个3x3的卷积层都换成了可变形卷积。v1中发现对于pascal voc这样比较小规模的数据集来说,3层可变形卷积已经足够了。同时错误的变形也许会阻碍一些更有挑战性的benchmark上的探索。作者实验发现在conv3到conv5中使用可变形卷积,对于COCO上的object detection来说,是效率和精度上最好的均衡。△pk,△mk都是通过一个卷积层进行学习,因此卷积层的通道数是3N,其中2N表示△pk,这和DCNv1的内容是一样的,剩下N个通道的输出通过sigmoid层映射成[0,1]范围的值,就得到△mk。

Modulated Deformable Modules

v1仅仅给普通的卷积的采样点加了偏移,v2在此基础上还允许调节每个采样位置或者bin的特征的增益,就是给这个点的特征乘以个系数,如果系数为0,就表示这部分区域的特征对输出没有影响。这样就可以控制有效的感受野。

从实验上来看,增加DConv的数量,提升还是很明显的;但是Modulated Deformable Modules参数量增加很多,而带来的性能提升很微弱。

R-CNN Feature Mimicking

在detection训练过程中,如果有大量不在roi内的内容,可能会影响提取的特征,进而降低最终得到的模型的精度(但不是说没有额外的context就一定不好,加上这里性能提升微弱,所以说这里还是有待更多的思考。)。

对于V2来说,将在RoIpooling中RoI之外的调节系数设为0可以直接去除无关的context,但是实验表明这样还是不能很好的学习RoI的特征,这是由于Faster R-CNN本身的损失函数导致的,因此需要额外的监督信号来改善RoI特征提取的训练。由于,RCNN训练时是裁剪出roi,使用roi进行训练,因此大大减小了无关区域对特征提取的影响。但是如果直接将RCNN引入到fasterRCNN中,会导致训练和测试的时间大大增加。

于是作者采用feature mimicking的手段,强迫Faster R-CNN中的RoI特征能够接近R-CNN提取的特征。引入feature mimic loss,希望网络学到的特征与裁剪后的图像经过RCNN得到的特征是相似的,在这里设置loss如下,采用的是cos相似度评价指标。

网络训练的框架如上图所示,右侧其实就是一个R-CNN,不过后面只接了分类的branch。

还有就是虽然上图画了两个网络,但是R-CNN和Faster R-CNN中相同的模块是共用的相同的参数,比如Modulated Deformable Convolutions和Modulated Deformable RoIpooling部分。inference的时候就只需要运行Faster R-CNN的部分就行了。这样的话,增加的运算量就小了。

思考

看R-CNN Feature Mimicking实验结果:

对于前景上的正样本,使用Mimicking是特别有用的,对于负样本背景,网络倾向于利用更多的上下文信息(context),在这种情况下,Mimicking没有帮助。所以FG Only最好在没有mdconv的网络上,使用Mimicking的提升幅度要小一些,只有0.3个点。这里将之前的Modulated Deformable Modules(涨点也少,两个一起使用涨点就稍微明显一些)一起分析:仅仅通过Modulated带来的提升还是比较有限的,主要原因在于现有的损失函数难以监督模型对无关紧要的区域设置较小的权重,因此在模型训练阶段引入RCNN feature mimicking,通过RCNN网络提供有效的监督信息,发挥modulation的权重作用,使得提取到的特征更加集中于有效区域,因此涨点会更加明显。如果对于Modulated Deformable Convolutions能找到一个更好的学习机制,那么我感觉,仅仅是Modulated Deformable Modules也可以带来更好性能提升。

看不同尺度上的一些结果:

APL:800 -> 1000 不加可变性卷积(或者是加的不够多的也会掉点,从下表的绿蓝部分可见)都掉点了 [小物体APs涨了],但是 deformable 相关的在涨。分析:把图片调大会等价于减少网络的 receptive field,所以大物体会变得很差。那么这样DCN在调大图片仍然上涨 performance 就合理了,因为毕竟能动态调整感受野。

个人观点,欢迎交流: 按理说多加几层的DCN本应该在V1的时候就应该做实验得到结果,而不应该放在V2的时候说我们多加几层能涨好多点(本篇论文也基本是靠这个涨了很多点),后来看见了其中一个原作者的回答就合理了:

链接:https://www.zhihu.com/question/303900394

modulated 和feature mimicking 涨点都很少,有人会觉得这两项不过是为了发论文而想出来的华而不实的新点子,看起来比较有创新,毕竟涨分靠的是多加几层DConv。但是个人觉得给每个感受野增加增益系数确实是很有创新的,就好比是考虑了信号的相位,接着需要考虑幅度,很自然的想法。但是为什么收益甚微?然而modulated和feature mimicking 一起使用就显出了效果?感觉就是这个增益系数缺少合适的监督信息,训练起来的效果不太好,加入了feature mimicking能提供更多更好的监督信息让增益系数得以学习。

进一步思考一下,怎样才能让卷积更好的学习△mk?从前面可以知道△pk,△mk都是通过一个卷积层进行学习得来的,那么一个卷积层是不是不足以学习如此多的参数了;对于△mk可不可以在学习的时候加入正则化方法,因为一个特征图上需要重点关注的地方是有限的,此外也不能一个地点也不关注;要不要在每个特征图上加入更多的监督,加入增益系数的损失函数

欢迎交流,禁止转载!

上一篇:目标检测之FPN

优惠劵

球场书生

关注

关注

11

点赞

58

收藏

觉得还不错?

一键收藏

知道了

0

评论

CNN卷积神经网络之DCN(Deformable Convolutional Networks、Deformable ConvNets v2)

可变形卷积网络Deformable ConvNets V1、V2前言一、Deformable Convolutional NetworksDeformable ConvolutionDeformable RoI PoolingPosition-Sensitive (PS) RoI Poolingoffset偏移学习实验效果思考二、Deformable ConvNets v2Stacking More Deformable Conv LayersModulated Deformable ModulesR-CN

复制链接

扫一扫

专栏目录

Deform-CNN:使用pytorch的可变形卷积网络用于心电图诊断

04-06

变形神经网络

使用pytorch进行心电图诊断的可变形卷积网络。 这是文章“基于具有良好抗噪能力的可变形卷积神经网络的端到端12导心电图诊断系统”的源代码

入门

训练环境

NVIDIA驱动程序版本418.67

CUDA版本10.1

Python版本3.6.8

Pytorch版本1.4.0 + cu101

安装所需的软件包

从该存储库的根目录运行

pip install -r requirements.txt

下载数据集

我们使用CPSC-2018作为数据集。 您可以从下载数据重新处理数据并以.npy格式保存数据。 然后将数据放入文件夹./dataset/DataSet250HzRepeatFill并将标签放入文件夹./dataset 。 有关更多详细信息,请参考load_dataset.py 。

注意:在我们的实验中,我们删除了总长度超过30秒的数据,将采样频率降低到250 Hz

Deformable-ConvNets 预训练模型

11-29

国内无法下载的Deformable-ConvNets预训练模型resnet_v1_101-0000

参与评论

您还未登录,请先

登录

后发表或查看评论

深度学习之DCN

Ton的博客

04-15

7354

这篇文章介绍了一种可针对空间不变性的卷积方法,不同于常规的卷积网络种卷积核和待提取feature map是相同的(假设dilation=1),可变形卷积(Deformable Convolution Networks)的待提取feature map可能是任意变形之后的一个个采样点。DCN的提出使得网络不再对经过变换之后的输入敏感,即增加了空间不变性。

Note:

本文只介绍论文中的可变形卷积部分,而没有介绍论文中的可变形ROI池化部分。

参考目录:

①深度学习可形变卷积

②源码

③深度学习之 DCN(.

可变形卷积(DCN,Deformable Convolution Network)

热门推荐

jiangqixing0728的博客

08-10

3万+

ICCV 2017的一篇文章。可变形卷积(DCN)的原理和实现。在目标检测领域应用广泛,在项目、课程设计、毕业设计、比赛中对许多数据集和许多目标检测算法(只要含卷积操作),都能有不错的提升,泛化性很强。

MSRA微软亚洲研究院 最新卷积网络 Deformable Convolutional Networks(可变形卷积网络.htm

11-29

机器学习 深度学习 pytorch tensorflow 贝叶斯 神经网络 算法

可变形卷积(DCN)

qq_43471945的博客

02-16

2367

可变形卷积: Deformable Convolutional Networks原文摘要:卷积神经网络(CNNs)由于其构建模块中存在固定的几何结构,因此固有地局限于模型几何转换。在本工作中,我们引入了两个新的模块来增强cnn的转换建模能力,即可变形卷积和可变形感兴趣区域池。两者都是基于用额外的偏移量来增加模块中的空间采样位置,并学习来自目标任务的偏移量,而无需额外的监督。新的模块可以很容易地取代现有cnn中的普通对应模块,并且可以很容易地通过标准的反向传播进行端到端训练,从而产生可变形的卷积网络。

论文阅读笔记 | 目标检测算法——DCN(可变形卷积网络)

Clichong

08-20

2906

如有错误,恳请指出。

文章目录1. Introduction2. Deformable Convolutional Networks2.1 Deformable Convolution2.2 Deformable RoI Poolingb2.3 Postion﹣Sensitive RoI Pooling3. Understanding Deformable ConvNets4. Result

paper:Deformable Convolutional Networks

摘要:

卷积神经网络由于其构建.

Duplicate Bug Report Detection Using Dual-Channel Convolutional Neural Networks翻译

weixin_44765557的博客

01-23

436

Duplicate Bug Report Detection Using Dual-Channel Convolutional Neural Networks翻译

ABSTRACT

开发人员依靠错误报告来修复错误,错误报告通常在bug跟踪系统中存储和管理。由于表达习惯不同,不同的报告者可能会使用不同的表达方式来描述错误跟踪系统中的同一错误。结果,错误跟踪系统通常包含许多重复的错误报告。自动检测这些重复的错误报告将节省大量的错误分析工作。先前的研究发现,深度学习技术可有效地检测到重复的错误报告。受最近自然

[论文阅读]使用深度学习方法预测蛋白质磷酸化位点DeepPhos: prediction of protein phosphorylation sites with deep learning(一)

IST-CTO

08-25

1309

这项研究中,文章提出了一种新颖的多层CNN架构DeepPhos,以准确预测具有蛋白质序列信息的磷酸化位点。

如何把“自己的”网络中的conv2d替换为dcnv2

qq_17127427的博客

10-15

5135

1、dcnv2的实现测试了两种,一种是官方版dcnv2,git链接:https://github.com/CharlesShang/DCNv2.git,编译直接cd到DCNv2,然后./make.sh即可,第二种是mmcv.ops.modulated_deform_conv.ModulatedDeformConv2dPack

2、实验以resnet50、mnist训练为例

from torch_op.common import init_seed

from torchvision.datasets i

yolov5 加入可形变卷积

shuaijieer的博客

08-09

5642

找到parse_model函数,把DCNConv加入进去。修改yolov5s.yaml文件。修改common.py 文件。运行下面命令查看网络结构。修改yolo.p文件。

tf-deformable-conv-layer:可变形卷积层的TensorFlow实现

05-06

可变形卷积的TensorFlow实现

这是以下论文的TensorFlow实现:

戴继峰,齐浩志,熊玉文,李毅,张国栋,韩寒,魏一辰。 2017。可变形卷积网络。 arXiv [cs.CV]。 arXiv。

该代码只能在。

旋转训练图

采样地点

基本用法

DeformableConvLayer是自定义的Keras图层,因此您可以像其他任何标准图层(例如Dense , Conv2D一样使用它。

这是一个简单的示例:

inputs = tf . zeros ([ 16 , 28 , 28 , 3 ])

model = tf . keras . Sequential ()

model . add ( DeformableConvLayer ( filters = 6 , kernel_size = 3 , strides = 1 , padding = 'valid' , dilat

Video Restoration with Enhanced Deformable Convolutional Network

01-28

EDVR - Video Restoration with Enhanced Deformable Convolutional Networks.pdf

CNN卷积神经网络之SKNet及代码

qq_41917697的博客

02-05

1万+

CNN卷积神经网络之SKNet及代码前言SK Convolution细节网络结构实验结果代码

《Selective Kernel Networks》

论文地址:https://arxiv.org/pdf/1903.06586.pdf

前言

CVPR2019 SKNet是SENet的加强版,是attention机制中的与SE同等地位的一个模块,可以方便地添加到现有的网络模型中,对分类问题,分割问题有一定的提升。如果不清楚SENet的,可以先看一下CNN卷积神经网络之SENet

SK Convolution

CNN卷积神经网络之SENet及代码

qq_41917697的博客

02-26

7966

CNN卷积神经网络之SENet未经本人同意,禁止任何形式的转载!一、前言二、SE block细节SE block的运用实例模型的复杂度三、消融实验1.降维系数r2.Squeeze操作3.Excitation操作4.不同的stages5.集成策略四、SE block作用的分析五、SENET-154的一些细节*

未经本人同意,禁止任何形式的转载!

一、前言

《Squeeze-and-Excitation Networks》

论文地址:https://arxiv.org/abs/1709.01507.

SENe

CNN卷积神经网络之ConvNeXt

qq_41917697的博客

02-18

7024

CNN卷积神经网络之ConvNeXt前言改进内容1 训练技巧2 宏观设计3 ResNeXt-ify4 Inverted Bottleneck5 Large Kernel Sizes67

前言

《A ConvNet for the 2020s》

论文地址:https://arxiv.org/abs/2201.03545

pytorch代码:https://github.com/facebookresearch/ConvNeXt

最近Transfomer在CV领域大放异彩,颇有一种要碾压CNN的气势。但是作者觉

CNN卷积神经网络之RegNet

qq_41917697的博客

02-06

4783

CNN卷积神经网络之RegNet前言设计思路AnyNet设计空间网络结构实验结果消融实验结论

前言

《Designing Network Design Spaces》

论文地址:https://arxiv.org/pdf/2003.13678.pdf

代码:https://github.com/facebookresearch/pycls

何恺明团队在CVPR 2020上发布的论文,提出了RegNet。在相同的训练设计和FLOPs的条件下,RegNet的精度超越了之前最SOTA的EfficientNet,

轻量级网络之GhostNet

qq_41917697的博客

05-16

4384

轻量级网络之GhostNet前言动机Ghost模块G-bneckGhostNet网络结构实验性能消融实验Ghost模块 pytorch代码

欢迎交流,禁止转载!!

前言

《GhostNet: More Features from Cheap Operations》

论文地址:GhostNet: More Features from Cheap Operations

来自华为诺亚方舟实验室,发表于2020年的CVPR上。提供了一个全新的Ghost模块,旨在通过廉价操作生成更多的特征图。该Ghost模块即插即用

deformable onnx

最新发布

05-24

Deformable ONNX refers to a version of the Open Neural Network ExchangeONNX) format that support for deformable convolutional neural networks (DCNNs). Deformable convolutions are a type of convolutional layer used in computer vision tasks, which allow for more flexible and accurate feature extraction by allowing the receptive field of the convolutional filters to be adjusted based on the input data.

To support deformable convolutions in ONNX, additional operators and attributes are added to the standard ONNX specification. These include the DeformableConv operator, which performs the deformable convolution operation, as well as attributes that specify the parameters of the deformable convolution such as the number of output channels and the kernel size.

With support for deformable convolutions in ONNX, models that use these types of layers can be exported and used across different deep learning frameworks and hardware platforms that support the ONNX format. This allows for greater flexibility and portability of DCNN models, which can be particularly useful in scenarios where real-time inference is required or where hardware constraints limit the use of certain deep learning frameworks.

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

球场书生

CSDN认证博客专家

CSDN认证企业博客

码龄6年

暂无认证

112

原创

3071

周排名

1万+

总排名

53万+

访问

等级

2401

积分

1万+

粉丝

800

获赞

280

评论

2739

收藏

私信

关注

热门文章

CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://mirrors.tuna.tsinghua.edu.cn/anaconda/pk

52414

WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connec

40184

python timm库

34288

多尺度特征提取模块 Multi-Scale Module及代码

28980

ERROR: Cannot find command ‘git‘ - do you have ‘git‘ installed and in your PATH?

26944

分类专栏

工具使用技巧

5篇

python

5篇

Backbone

3篇

目标检测

16篇

latex

1篇

环境安装

14篇

AI代码相关基础知识

19篇

一些方法和trick

6篇

CNN卷积神经网络

28篇

Debug小结

17篇

损失函数

4篇

语言指示性视觉图像定位

3篇

无监督学习

1篇

最新评论

latex 摘要前面放图片

我不会离散数学:

或者在tex文件

\twocolumn[{%

% \renewcommand\twocolumn[1][]{#1}%maketitle

\maketitle % 原本在twocolumn外面,本来就有的

\begin{center}

\centering

\includegraphics[width=1\textwidth,height=5cm]{./figures/Figure1.png}

\captionof{figure}{Test caption}

\end{center}%

%\label{fig:1}

}]

mmdetection安装与环境配置

VIP2800:

你好,解决了么,遇到了相同的问题

Focal Loss及代码

桃汁甜饼:

您好,我想问一下独热编码应用到分类结果,具体怎么操作啊

mmdetection安装与环境配置

python小白Q:

但是该环境中有mmengine

mmdetection安装与环境配置

python小白Q:

您好!显示ModuleNotFoundError: No module named 'mmengine'

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

latex加批注框

python在图片中显示中文(PIL)

python占用cpu,增加cpu利用率

2024年2篇

2023年1篇

2022年18篇

2021年92篇

目录

目录

分类专栏

工具使用技巧

5篇

python

5篇

Backbone

3篇

目标检测

16篇

latex

1篇

环境安装

14篇

AI代码相关基础知识

19篇

一些方法和trick

6篇

CNN卷积神经网络

28篇

Debug小结

17篇

损失函数

4篇

语言指示性视觉图像定位

3篇

无监督学习

1篇

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

全面解析可变形卷积家族(DCN v1+ v2) - 知乎

全面解析可变形卷积家族(DCN v1+ v2) - 知乎首发于计算机视觉混谈切换模式写文章登录/注册全面解析可变形卷积家族(DCN v1+ v2)CristianoC目录DCN v1DCN v2参考DCN v1背景在计算机视觉领域,同一物体在不同场景,角度中未知的几何变换是检测/识别的一大挑战,通常来说我们有两种做法:(1)通过充足的数据增强,扩充足够多的样本去增强模型适应尺度变换的能力。(2)设置一些针对几何变换不变的特征或者算法,比如SIFT和sliding windows。两种方法都有缺陷,第一种方法因为样本的局限性显然模型的泛化能力比较低,无法泛化到一般场景中,第二种方法则因为手工设计的不变特征和算法对于过于复杂的变换是很难的而无法设计。所以作者提出了Deformable Conv(可变形卷积)和 Deformable Pooling(可变形池化)来解决这个问题。可变形卷积可变形卷积顾名思义就是卷积的位置是可变形的,并非在传统的N × N的网格上做卷积,这样的好处就是更准确地提取到我们想要的特征(传统的卷积仅仅只能提取到矩形框的特征),通过一张图我们可以更直观地了解: 在上面这张图里面,左边传统的卷积显然没有提取到完整绵羊的特征,而右边的可变形卷积则提取到了完整的不规则绵羊的特征。那可变卷积实际上是怎么做的呢?其实就是在每一个卷积采样点加上了一个偏移量,如下图所示: (a) 所示的正常卷积规律的采样 9 个点(绿点),(b)(c)(d) 为可变形卷积,在正常的采样坐标上加上一个位移量(蓝色箭头),其中 (c)(d) 作为 (b) 的特殊情况,展示了可变形卷积可以作为尺度变换,比例变换和旋转变换等特殊情况。我们先看普通的卷积,以3x3卷积为例对于每个输出y(p0),都要从x上采样9个位置,这9个位置都在中心位置x(p0)向四周扩散,(-1,-1)代表x(p0)的左上角,(1,1)代表x(p0)的右下角。 所以传统的卷积输出就是(其中P_n就是网格中的n个点): 正如我们上面阐述的可变形卷积,他就是在传统的卷积操作上加入了一个偏移量,正是这个偏移量才让卷积变形为不规则的卷积,这里要注意这个偏移量可以是小数,所以下面的式子的特征值需要通过双线性插值的方法来计算。: 那这个偏移量如何算呢?我们来看: 对于输入的一张feature map,假设原来的卷积操作是3×3的,那么为了学习偏移量offset,我们定义另外一个3×3的卷积层(图中上面的那层),输出的维度其实就是原来feature map大小,channel数等于2N(分别表示x,y方向的偏移)。下面的可变形卷积可以看作先基于上面那部分生成的offset做了一个插值操作,然后再执行普通的卷积。可变形卷积的可视化 我们可以从上图看到,可以看到当绿色点在目标上时,红色点所在区域也集中在目标位置,并且基本能够覆盖不同尺寸的目标,因此经过可变形卷积,我们可以更好地提取出感兴趣物体的完整特征,效果是非常不错的。可变形池化 理解了可变形卷积之后,Deformable RoIPooling(可变形池化)就比较好理解了。原始的RoIPooling在操作过程中是将RoI划分为k×k个子区域。而可变形池化的偏移量其实就是子区域的偏移。同理每一个子区域都有一个偏移,偏移量对应子区域有k×k个。与可变形卷积不同的是,可变形池化的偏移量是通过全连接层得到的。因为和可变形卷积类似,这里就不多讲了。DCN v2背景DCN v1听起来不错,但其实也有问题:我们的可变形卷积有可能引入了无用的上下文(区域)来干扰我们的特征提取,这显然会降低算法的表现。作者也做了一个实验进行对比说明: 我们可以看到虽然DCN v1更能覆盖整个物体,但是同时也会引入一些无关的背景,这造成了干扰,所以作者提出了三个解决方法:(1)More Deformable Conv Layers(使用更多的可变形卷积)。(2)Modulated Deformable Modules(在DCNv1基础(添加offset)上添加每个采样点的权重)(3)R-CNN Feature Mimicking(模拟R-CNN的feature)。使用更多的可变形卷积在DCN v1中只在conv 5中使用了三个可变形卷积,在DCN v2中把conv3到conv5都换成了可变形卷积,提高算法对几何形变的建模能力。 在DCNv1基础(添加offset)上添加每个采样点的权重我们知道在DCN v1中的卷积是添加了一个offset\Delta{P_n}: 为了解决引入了一些无关区域的问题,在DCN v2中我们不只添加每一个采样点的偏移,还添加了一个权重系数\Delta{m_k},来区分我们引入的区域是否为我们感兴趣的区域,假如这个采样点的区域我们不感兴趣,则把权重学习为0即可: 总的来说,DCN v1中引入的offset是要寻找有效信息的区域位置,DCN v2中引入权重系数是要给找到的这个位置赋予权重,这两方面保证了有效信息的准确提取。R-CNN Feature Mimicking作者发现把R-CNN和Faster RCNN的classification score结合起来可以提升performance,说明R-CNN学到的focus在物体上的feature可以解决无关上下文的问题。但是增加额外的R-CNN会使inference速度变慢很多。DCNV2里的解决方法是把R-CNN当做teacher network,让DCN V2的ROIPooling之后的feature去模拟R-CNN的feature,类似知识蒸馏的做法,下面会具体展开: 左边的网络为主网络(Faster RCNN),右边的网络为子网络(RCNN)。实现上大致是用主网络训练过程中得到的RoI去裁剪原图,然后将裁剪到的图resize到224×224大小作为子网络的输入,这部分最后提取的特征和主网络输出的1024维特征作为feature mimicking loss的输入,用来约束这2个特征的差异(通过一个余弦相似度计算,如下图所示),同时子网络通过一个分类损失进行监督学习,因为并不需要回归坐标,所以没有回归损失。在inference阶段仅有主网络部分,因此这个操作不会在inference阶段增加计算成本。 再用直白一点的话说,因为RCNN这个子网络的输入就是RoI在原输入图像上裁剪出来的图像,因此不存在RoI以外区域信息的干扰,这就使得RCNN这个网络训练得到的分类结果更加可靠,以此通过一个损失函数监督主网络Faster RCNN的分类支路训练就能够使网络提取到更多RoI内部特征,而不是自己引入的外部特征。总的loss由三部分组成:mimic loss + R-CNN classification loss + Faster-RCNN loss.DCN v2可视化通过实验结果我们也可以看到DCN v2更能集中在物体的完整有效的区域: 参考DCN v1论文https://arxiv.org/pdf/1703.06211.pdfDCN v2论文https://arxiv.org/pdf/1811.11168.pdfhttps://www.zhihu.com/question/303900394/answer/540818451发布于 2020-08-11 11:45卷积卷积神经网络(CNN)​赞同 80​​10 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录计算机视觉混谈CV

数据时代DCN网络架构- 新华三集团-H3C

数据时代DCN网络架构- 新华三集团-H3C

登录

欢迎user新华三退出

已有账号登录

还没有账号?注册

国家 / 地区

China - 简体中文

Global - English

Russia - Русский

Japan - 日本語

导航

产品与解决方案

行业解决方案

服务

支持

合作伙伴

新华三人才研学中心

关于我们

新华三商城

产品与解决方案

< 返回

云与智能

云与智能

云计算

大数据

人工智能

计算虚拟化

分布式云存储

超融合

桌面云

数据库

智慧城市

工业互联网

热门推荐

数智抗疫平台 服务县区政府

以数智赋能,构建起技防、数控、网管、智治的综合防疫平台,形成疫情防控数字闭环,助基层政府精准抗疫。

即刻专享 一步上云

极致超融合,打造稳定高效全新IT架构;极简云桌面,畅享安全流畅办公全新体验。

智能联接

智能联接

应用驱动数据中心网络

应用驱动广域网

应用驱动园区网

园区光网络——智融全光2.0

路由器

交换机

无线局域网

物联网

移动通信

智能管理与运维

传输产品

操作系统

热门推荐

《融合全光网络白皮书》限时下载

智融全光2.0园区解决方案

面向未来的网络架构,覆盖校园、医院、企业等多个行业应用场景,随需而变,满足当下及未来十年的园区业务演进。

智能联接 使能智慧未来

围绕云智原生、开放生态、绿色低碳三大创新理念,以应用驱动网络为核心中枢,为园区、数据中心、广域网三大场景应用打造智能、融合、极简、可信、超宽的网络底座。

智慧计算

智慧计算

H3C服务器

机架服务器

塑合型刀片系统

边缘服务器

关键业务服务器

H3C数据中心整机柜系统

服务器智能管理平台

HPE服务器

机架服务器

塑合型刀片系统

塔式服务器

高密度服务器

关键业务服务器

边缘服务器

服务器智能管理平台

热门推荐

全栈式体验环境 让AI触手可及

中小型企业一站式计算存储解决方案

想要IT资金投入回报高、想要业务连续不间断、想要IT维护简单省心,新华三计算存储一站式解决方案,全面应对数据库、共享存储、虚拟化等各类业务应用需求。

智能存储

智能存储

H3C存储

企业级智能全闪存存储

企业级智能混合闪存存储

分布式存储

超融合系统

入门级智能存储

数据备份与保护

存储网络设备

HPE存储

企业级智能全闪存存储

企业级智能混合闪存存储

超融合系统

入门级智能存储

数据备份与保护

高密度存储型服务器

存储网络设备

热门推荐

H3C UniStor X10000 G3系列分布式融合存储

HPE Nimble HF系列智能存储

HPE Primera 600系列智能存储

中小型企业一站式计算存储解决方案

想要IT资金投入回报高、想要业务连续不间断、想要IT维护简单省心,新华三计算存储一站式解决方案,全面应对数据库、共享存储、虚拟化等各类业务应用需求。

智慧医院存储解决方案

全面覆盖医疗细分场景

以智能存储解决方案助力智慧医院建设升级

商用PC

商用PC

商用台式机

H3C D5-020s

H3C D5-020t

H3C D5-030s

H3C D5-030t

H3C X5-030s

H3C X5-030t

H3C X5-020s

H3C X5-020t

H3C X7-030s

商用笔记本

H3CBook Ultra 14T

H3CBook Ultra 14

H3CBook Pro 14

H3CBook 14

H3C Z6-410

商用显示器

H3C M4-271F

H3C M4-242F

H3C M4-221F

H3C M8-341Q

H3C M4-245F

H3C M4-242FD

配件

H3C 100W快速充电器

主动安全

主动安全

新华三AD-WAN安全解决方案

零信任安全解决方案

云安全解决方案

商用密码应用安全性评估解决方案

新华三数字安全仿真平台

数据安全解决方案

监管行业态势感知解决方案

边界安全

应用安全

数据安全

密码安全

工控安全

终端安全

安全管理

安全检测与审计

云安全

热门推荐

M9000系列多业务安全网关

新华三结合云计算、IPv6、大数据及高性能计算的发展趋势,针对云计算数据中心、运营商CGN、大型企业及园区网出口等市场推出推出多款高性能多业务安全网关。

商用密码应用安全性评估解决方案

新华三密码应用安全性评估解决方案针对密码应用相关标准规范,基于物理和环境安全、网络和通信安全、设备和计算安全、应用和数据安全、密钥管理安全角度进行统一规划设计。

统一运维

统一运维

IT服务管理咨询

AIO一站式运维服务

U-Center统一运维平台

业务运维服务

安仔远程运维服务

热门推荐

数据中心绿色节能

TMMi咨询认证服务

维保服务

业务连续性和容灾

数据中心迁移服务

AIO一站式运维管理外包服务

面向异构ICT基础架构提供一站式运维管理外包服务,为客户承担对应的IT服务质量和管理绩效,带动客户全面提升IT的整体服务管理水平。

智能终端

智能终端

明星产品

新华三云屏

Magic家用网络

Magic家用摄像机

Magic商用网络

Mini商用网络

技术解决方案

技术解决方案

SeerFabric智能无损数据中心解决方案

隐私计算解决方案

场站边缘解决方案

计算存储企业级解决方案

查看所有

行业解决方案

< 返回

行业解决方案

行业解决方案

运营商

零碳智慧园区

政府

制造

金融

教育

医疗

电力能源

交通

广电

互联网

中小企业

热门推荐

如何快速有效提升县域医疗水平?

从县域医院数字化转型需求出发,新华三推出与实际应用场景紧密结合的智慧医院解决方案,提升县医院综合能力,助力县域内医疗资源整合共享。

合作伙伴营销资料平台上线

最新最全的营销资料,千份营销资料,快速获取!

服务

< 返回

技术服务解决方案

技术服务解决方案

热门推荐

数据中心绿色节能

维保服务

AIO一站式运维管理外包服务

面向异构ICT基础架构提供一站式运维管理外包服务,为客户承担对应的IT服务质量和管理绩效,带动客户全面提升IT的整体服务管理水平。

架构咨询

架构咨询

IT基础架构咨询

网络架构咨询

数据中心迁移

业务连续性/容灾咨询

容灾管理系统

轻量化服务

热门推荐

数据中心绿色节能

维保服务

AIO一站式运维管理外包服务

面向异构ICT基础架构提供一站式运维管理外包服务,为客户承担对应的IT服务质量和管理绩效,带动客户全面提升IT的整体服务管理水平。

H3C TaaS服务

H3C TaaS服务

测试体系咨询

测试平台建设

专业测试服务

热门推荐

数据中心绿色节能

维保服务

AIO一站式运维管理外包服务

面向异构ICT基础架构提供一站式运维管理外包服务,为客户承担对应的IT服务质量和管理绩效,带动客户全面提升IT的整体服务管理水平。

统一运维

统一运维

IT服务管理咨询

AIO一站式运维服务

U-Center统一运维平台

业务运维服务

安仔远程运维服务

热门推荐

数据中心绿色节能

维保服务

AIO一站式运维管理外包服务

面向异构ICT基础架构提供一站式运维管理外包服务,为客户承担对应的IT服务质量和管理绩效,带动客户全面提升IT的整体服务管理水平。

数据中心

数据中心

数字化数据中心(BIM)

验证及运维

实施

设计

咨询

热门推荐

数据中心绿色节能

维保服务

AIO一站式运维管理外包服务

面向异构ICT基础架构提供一站式运维管理外包服务,为客户承担对应的IT服务质量和管理绩效,带动客户全面提升IT的整体服务管理水平。

云与智能服务

云与智能服务

行业云服务解决方案

大数据增值服务

云定制开发服务

赋能运营云服务

云运维服务

云迁移服务

云集成服务

云软件部署服务

云规划设计服务

热门推荐

数据中心绿色节能

维保服务

AIO一站式运维管理外包服务

面向异构ICT基础架构提供一站式运维管理外包服务,为客户承担对应的IT服务质量和管理绩效,带动客户全面提升IT的整体服务管理水平。

安全服务与运营

安全服务与运营

专业安全服务

教育培训

攻防对抗

工程实施

咨询规划

风险评估

安全运营服务

威胁检测与响应服务MDR

安全托管服务MSS

安全SaaS服务

热门推荐

数据中心绿色节能

维保服务

AIO一站式运维管理外包服务

面向异构ICT基础架构提供一站式运维管理外包服务,为客户承担对应的IT服务质量和管理绩效,带动客户全面提升IT的整体服务管理水平。

产品支持服务

技术维护服务

技术维护服务

基础技术维护服务

主动式技术维护服务

工程服务

ICT专业技术运维服务

热门推荐

数据中心绿色节能

维保服务

AIO一站式运维管理外包服务

面向异构ICT基础架构提供一站式运维管理外包服务,为客户承担对应的IT服务质量和管理绩效,带动客户全面提升IT的整体服务管理水平。

云软件技术支持服务

云软件技术支持服务

大数据软件技术支持服务

云计算软件技术支持服务

热门推荐

数据中心绿色节能

维保服务

AIO一站式运维管理外包服务

面向异构ICT基础架构提供一站式运维管理外包服务,为客户承担对应的IT服务质量和管理绩效,带动客户全面提升IT的整体服务管理水平。

智能终端服务

智能终端服务

热门推荐

数据中心绿色节能

维保服务

AIO一站式运维管理外包服务

面向异构ICT基础架构提供一站式运维管理外包服务,为客户承担对应的IT服务质量和管理绩效,带动客户全面提升IT的整体服务管理水平。

商用终端服务(台式机 笔记本 显示器)

商用终端服务(台式机 笔记本 显示器)

更多服务支持

产品资料下载

驱动程序下载

服务政策查询

服务产品查询

服务网点查询

热门推荐

数据中心绿色节能

维保服务

AIO一站式运维管理外包服务

面向异构ICT基础架构提供一站式运维管理外包服务,为客户承担对应的IT服务质量和管理绩效,带动客户全面提升IT的整体服务管理水平。

支持

< 返回

服务支持中心

服务支持中心

在线技术支持(服务器及存储)

保修期查询

条码防伪查询

授权业务

产品生命周期

知了社区

智能终端在线客服

HPE产品支持中心

新华三服务APP

安全通告

已知问题查询

iService

商用终端在线客服(台式机及笔记本)

软件授权有效期文件

文档中心

文档中心

软件下载

软件下载

政策动态

政策动态

服务公告

服务政策

服务新闻

维保服务说明

合作伙伴服务标准

合作伙伴

< 返回

成为合作伙伴

成为合作伙伴

加盟新华三

星级服务资质认证标准

售前资质认证标准

自主营销绿色通道

热门推荐

合作伙伴营销资料平台上线

最新最全的营销资料,千份营销资料,快速获取!

已成为合作伙伴

已成为合作伙伴

合作伙伴查询

政策与公告

合作伙伴业务管理

订单供货查询

业务流程中心

快易通

稽核反馈

热门推荐

合作伙伴营销资料平台上线

最新最全的营销资料,千份营销资料,快速获取!

合作伙伴资源中心

合作伙伴资源中心

产品与方案中心

营销资料下载中心

技术服务BOM产品说明书

技术资料查询

人才直通车

配置器(iConfig)

智能工具盒(iBox)

热门推荐

合作伙伴营销资料平台上线

最新最全的营销资料,千份营销资料,快速获取!

合作伙伴培训与认证

合作伙伴培训与认证

生态赋能

售前能力认证

H3C技术认证

新华三大讲堂

热门推荐

合作伙伴营销资料平台上线

最新最全的营销资料,千份营销资料,快速获取!

解决方案联盟

解决方案联盟

解决方案合作伙伴认证申请

生态联合解决方案

数字化创新实验室

热门推荐

合作伙伴营销资料平台上线

最新最全的营销资料,千份营销资料,快速获取!

合作伙伴官网

新华三人才研学中心

< 返回

商学管理

商学管理

领导力训战院介绍

培训产品

热门推荐

2022新华三暑期百城人才生态计划

2022新华三技术认证暑期百城计划正在进行中!我们有最优惠的认证价格,最强大的认证支持,更有千元奖金等你领!

2022新华三杯大赛

“新华三杯”2022全国大学生数字技术大赛火热进行中!笔记本电脑、Switch主机、最高价值10万元团队奖等丰厚奖品,更有考证优惠,就业福利活动等你解锁。

IT管理

IT管理

IT管理研修院介绍

培训课程

热门推荐

2022新华三暑期百城人才生态计划

2022新华三技术认证暑期百城计划正在进行中!我们有最优惠的认证价格,最强大的认证支持,更有千元奖金等你领!

2022新华三杯大赛

“新华三杯”2022全国大学生数字技术大赛火热进行中!笔记本电脑、Switch主机、最高价值10万元团队奖等丰厚奖品,更有考证优惠,就业福利活动等你解锁。

生态赋能

生态赋能

学习产品与服务

热门推荐

2022新华三暑期百城人才生态计划

2022新华三技术认证暑期百城计划正在进行中!我们有最优惠的认证价格,最强大的认证支持,更有千元奖金等你领!

2022新华三杯大赛

“新华三杯”2022全国大学生数字技术大赛火热进行中!笔记本电脑、Switch主机、最高价值10万元团队奖等丰厚奖品,更有考证优惠,就业福利活动等你解锁。

技术认证

H3C认证在线

 

 

热门推荐

2022新华三暑期百城人才生态计划

2022新华三技术认证暑期百城计划正在进行中!我们有最优惠的认证价格,最强大的认证支持,更有千元奖金等你领!

2022新华三杯大赛

“新华三杯”2022全国大学生数字技术大赛火热进行中!笔记本电脑、Switch主机、最高价值10万元团队奖等丰厚奖品,更有考证优惠,就业福利活动等你解锁。

ICT技术

ICT技术

ICT技术研修院

培训课程

热门推荐

2022新华三暑期百城人才生态计划

2022新华三技术认证暑期百城计划正在进行中!我们有最优惠的认证价格,最强大的认证支持,更有千元奖金等你领!

2022新华三杯大赛

“新华三杯”2022全国大学生数字技术大赛火热进行中!笔记本电脑、Switch主机、最高价值10万元团队奖等丰厚奖品,更有考证优惠,就业福利活动等你解锁。

智能技术

智能技术

智能技术研修院介绍

培训课程

热门推荐

2022新华三暑期百城人才生态计划

2022新华三技术认证暑期百城计划正在进行中!我们有最优惠的认证价格,最强大的认证支持,更有千元奖金等你领!

2022新华三杯大赛

“新华三杯”2022全国大学生数字技术大赛火热进行中!笔记本电脑、Switch主机、最高价值10万元团队奖等丰厚奖品,更有考证优惠,就业福利活动等你解锁。

安全技术

安全技术

安全技术研修院介绍

培训课程

热门推荐

2022新华三暑期百城人才生态计划

2022新华三技术认证暑期百城计划正在进行中!我们有最优惠的认证价格,最强大的认证支持,更有千元奖金等你领!

2022新华三杯大赛

“新华三杯”2022全国大学生数字技术大赛火热进行中!笔记本电脑、Switch主机、最高价值10万元团队奖等丰厚奖品,更有考证优惠,就业福利活动等你解锁。

校企合作

校企合作

校企合作介绍

校企合作模式

人才输出计划

热门推荐

2022新华三暑期百城人才生态计划

2022新华三技术认证暑期百城计划正在进行中!我们有最优惠的认证价格,最强大的认证支持,更有千元奖金等你领!

2022新华三杯大赛

“新华三杯”2022全国大学生数字技术大赛火热进行中!笔记本电脑、Switch主机、最高价值10万元团队奖等丰厚奖品,更有考证优惠,就业福利活动等你解锁。

查看所有

关于我们

< 返回

公司概况

公司概况

公司简介

总裁寄语

管理团队

发展历史

焦点时刻

企业社会责任

领航者文化

公司视频

公司动态

公司动态

公司新闻

媒体播报

品牌活动

数字化领航直播间

云上新华三

云上新华三

云上新华三

公司刊物

公司刊物

《数字化领航》

联系我们

联系我们

公司总部

集团代表处

媒体联络

意见反馈

采购公告

如何购买

在线举报

加入我们

加入我们

新华三集团招聘

紫光集团招聘

紫光西数招聘

查看所有

如何购买

数字化领航直播间

云上展厅

新华三商城 New

登录

欢迎user

退出

China - 简体中文

Global - English

Russia - Русский

Japan - 日本語

国家/地区

互联网技术专栏

首页解决方案行业解决方案互联网互联网技术专栏

docurl=/cn/Solution/IndustrySolution/Media/Media_Technology/202008/1318818_30004_0.htm

数据时代DCN网络架构

【发布时间:2020-09-21】

收藏

打印

推荐

新华三互联网系统部 王京网络是IT基础设施重要的组成部分,是联接所有IaaS层资源对上提供服务的基础。在数据时代,云计算、大数据和人工智能的核心是数据,网络就是承载数据流动的高速公路。从过去以严谨、规范著称的金融行业数据中心,再到现在引领技术潮流的互联网公司数据中心,数据中心网络近十余年的变化可谓是日新月异。图1:网络技术快速更迭大量的网络技术如雨后春笋般涌现,一个新技术还没有规模化应用和落地,就被另一个更优的新技术所代替。我也曾经花费过很多时间和精力去掌握Trill,这个当时被认为很有潜力,用于构建大二层网络的数据中心技术。从协议原理、报文结构、选路和转发、资源占用一直到Troubleshooting,屠龙本领练就的差不多了,最后却发现没什么地方去施展和发挥。层出不穷的协议和技术就像过眼烟云一般,如果再过十年,回看这段网络发展的高速上升期,相信每一名网络从业者都会有很多感悟。如今,云原生技术发展迅速,已经有超过200个项目,应用的开发、发布、运行、运维也发生了改变。大量的应用系统采用云原生技术所构建,容器作为业务负载的最小单元,其特点是敏捷、一致性和具备极强的复制扩展能力。集群由数量众多的容器构成,数量级远高于VM。同时,更细粒度的资源分配机制和保证可靠性的分布策略,导致业务容器以及各种分布式系统组件间的跨Node通信和交互更加频繁,这些都依赖于外部网络提供可靠的端到端转发,同时对流量控制和可视化提出了更高的要求。其次,随着大数据和人工智能技术的普及,基于此的推荐系统、图像搜索和识别、语音交互、机器翻译等被广泛应用。而且,大数据和人工智能已成为企业经营管理和应对市场竞争的重要武器,海量的数据被存储下来用于分析挖掘。从数据处理、模型训练(机器学习/深度学习)到上线服务,每个环节都依赖于强大的算力和海量的数据,对计算资源和存储资源的消耗与日俱增,促使数据中心建设向大规模、超大规模演进(截至2020年上半年,全球超大规模数据中心达到541个),与之配套的网络规模也越来越大,网络自动化和智能运维成为刚需。最后,不得不提的是长、短视频、直播、VR/AR等视频流媒体近两年的爆发式增长,而且渗透到了新闻、教育、购物、社交、出行、游戏娱乐等各个领域,用户规模庞大、使用时长高,根据相关报告分析,到2022年视频流媒体将占到全球互联网流量的82%。伴随着5G终端的快速普及,用户对高质量视频、低延迟观看体验的期望不断提高,又进一步推升了对网络带宽的消耗。图2:H3C基于Tomahawk系列芯片的四代产品演进面对业务需求侧的变化趋势以及网络技术的快速发展,数据中心网络设备的迭代速度也随之加快。当前,数据中心交换机不到2年就更新一代产品,且每一代新产品的推出都提供近乎翻倍的性能,更高的吞吐、更大的表项、更多的特性,产品在网络中的角色定位也更有针对性。图3:25G+ Ethernet Adapter发展预测在服务器端网卡和光模块整体产业环境的推动下,数据中心接入链路带宽从10G->25G->50G->100G->200G演进,互联链路带宽从40G->100G->200G->400G演进。主力场景从2018年至今的25G接入+100G互联组合,将在2021年开始过渡到100G接入+400G互联组合。GPU场景将从100G接入过渡到200G接入。图4:H3C基于Trident系列芯片的产品演进综合前述背景,再来看网络架构。DCN网络架构的选择是受到业务需求、当前技术条件、设备成本、管理成本、人力投入等诸多因素的影响。没有一种架构可以驾驭所有客户的场景和需求,需要全面考量和平衡后进行选择。第一种:适用于中小型、中型规模的数据中心两级Clos架构是应用最早、最普遍的网络架构,现如今依然是很多行业客户的首选。整网设备只有两种角色,数据转发路径短,跨Leaf一跳可达,路径和时延具有很强的一致性。统一的接入方式也给上线部署和水平扩展方面带来了很大的便利条件,例如BGP协议的部署,策略的控制,日常维护和问题排查等。非常适合体量中小,运维人员编制少的企业。两级Clos架构对Spine交换机的性能和可靠性要求很高,一般采用数据中心框式核心交换机产品。基于可变信元转发和VoQ调度机制,保证Spine设备内部的严格无阻塞交换,分布式大缓存的配置在应对流量突发等方面具备天然的优势。框式核心交换机有独立的控制平面、转发平面和支撑系统,而且采用冗余设计,整个系统在可靠性上远高于盒式交换机。图5:H3C AD-DC应用驱动数据中心解决方案两级Clos架构在和商用SDN控制器方案的适配上更成熟,结合SDN控制器可快速构建基于EVPN的网络Overlay方案,降低东西向和南北向服务链的部署难度,满足云场景下网络对VM、裸金属、容器等全形态计算资源联动的需求。另外,该架构也同样适用于大型企业在各地部署的汇聚机房和边缘机房,用于构建边缘计算网络,缓解主干网络压力和降低访问时延。图6:两级Clos双Spine示例图7:两级Clos四Spine示例Spine采用2台或4台框式核心交换机,Leaf交换机每台4上行,在保证3:1收敛的情况下(10G Leaf 4*40G上行,48*10G下行;25G Leaf 4*100G上行,48*25G下行),可支撑的服务器(双上行)规模分别为5000+台和10000+台。由拓扑可见,两级Clos架构的网络规模也就是水平扩展能力,是受到Spine设备所能提供的端口总数限制的(设备台数*单机提供的端口数)。由于Leaf交换机上行端口数量是固定的(通常4~8个),因此Spine层交换机的台数也是受限的,不能持续增加。图8:H3C数据中心框式核心交换机的演进当前,框式核心交换机支持的业务板槽位数最多是16个,历史上曾经达到过18个(注:在十一年前的2009年,H3C推出的初代旗舰数据中心核心交换机S12518,具备9个交换网板和18个业务板槽位,是迄今为止的槽位巅峰)。在1U左右的空间内,单槽位支持的面板端口数普遍最多是48个。这样,整机所能提供的最大面板端口数为768个。在物理空间有限的条件下,如何能进一步提升Spine交换机的接入能力,将两级Clos架构的网络规模扩展到较佳,满足特定场景的需求,就需要用到端口拆分方案。图9:单板+光纤配线箱端口拆分是采用更高速率的端口拆分成多个低速端口使用,变向提高单槽位的端口密度,增加整机的接入能力。例如,在10G组网时代,采用更高速率的40G业务板,通过将1个40G端口拆分成4个10G端口使用。这样,一块36端口40G业务板可以拆分出144个10G端口,是一块48端口10G业务板端口密度的3倍。即将在2021年开始规模部署的400G、200G设备上,这种端口拆分方案也将会得到沿用,来解决诸多的网络互联需求。第二种:适用于中型、大型规模的数据中心两级Clos架构所支撑的服务器规模一般小于20000台,三级Clos架构的引入解决了两级Clos架构在网络规模上的瓶颈。三级Clos架构在两级Clos架构的中间增加了一级汇聚交换机(Pod Spine),由一组Pod Spine交换机和其下连的所有Leaf交换机一起组成一个Pod,通过Spine层交换机将多个Pod互连组成整个网络。增加Pod的数量即可实现网络的水平扩展,大幅提升了网络的扩展能力。同时,以Pod为单位进行业务部署,在适配多种业务需求、提供差异化服务、隔离性等方面,三级Clos架构更具灵活性。图10:三级Clos示例A图11:三级Clos示例B三级Clos架构在每个Pod内部,Pod Spine采用4台或8台高密100G盒式交换机,Pod Spine半数端口用于上接Spine,半数端口用于下接Leaf,Leaf交换机每台4上行或8上行,典型场景如下:A场景:Pod Spine采用4台64口100G盒式交换机(S9820-64H),Leaf交换机每台4上行,在保证Pod内3:1收敛的情况下(25G Leaf 4*100G上行,48*25G下行),单Pod可支撑的服务器(双上行)规模为768台。B场景:Pod Spine采用8台128口100G盒式交换机(S9820-8C),Leaf交换机每台8上行,在保证Pod内1.5:1收敛的情况下(25G Leaf 8*100G上行,48*25G下行),单Pod可支撑的服务器(双上行)规模为1536台。在保证1:1收敛的情况下(25G Leaf 8*100G上行,32*25G下行),单Pod可支撑的服务器(双上行)规模为1024台。由于高密汇聚交换机Pod Spine的引入,Spine层的框式核心交换机突破了个位数限制,可以部署数十台,Spine层框式核心交换机提供的总端口数可用于连接数十个Pod,整个网络可以支撑服务器规模超过10万台。另外,通过调整Pod内Pod Spine交换机的上、下行端口比例,可以灵活定义每个Pod的收敛比,在满足不同业务需求的同时还有助于降低成本,避免不必要的浪费。第三种:适用于大型、超大型规模的数据中心基于盒式设备的多平面组网架构,是当前头部互联网公司采用的最新架构,用于组建大规模和超大规模的数据中心网络。其架构最早源于Facebook的F4,由于构建该网络的两代交换机6-pack和Backpack都是基于多芯片(12颗)设计的,一台设备12个控制平面在管理和部署上有诸多不便,而且成本也较高。F4演进到F16后,得益于芯片能力的提升,用于构建F16的交换机Minipack采用单芯片设计,功耗、成本和技术门槛大幅降低,方案也更加成熟,自此这种架构开始被国内互联网公司引入。图12:基于盒式设备的多平面组网示例《Introducing data center fabric, the next-generation Facebook data center network》和《Reinventing Facebook's data center network》两篇原文对该架构进行了详细的阐述。相比三级Clos架构,基于盒式设备的多平面组网架构将Spine层的框式交换机也替换为了盒式交换机,这样,全网各层设备均由盒式交换机组建。在设备连接上,不同于三级Clos架构中每台Pod Spine都需要和所有Spine层交换机Full-Mesh全互联,在新架构中将Spine层交换机分成多组(组数与每个Pod中Pod Spine交换机数量一致),每组中的Spine交换机构成一个平面(如图12,Spine层分成8个平面,用不同颜色进行了区分),每个Pod中的Pod Spine交换机只需要和对应平面中的Spine交换机Full-Mesh全互联。这样,整个Spine层可以连接更多的Pod,构建出超大规模的数据中心,支撑数十万级别的服务器,且随着盒式交换机性能的提升,该架构还可以持续的提升容量空间。图13:Chassis & Box一台满配48口100G业务板的核心框式交换机S12516X-AF与6台128口100G的盒式交换机S9820-8C,都可提供相同数量的100G端口(768个),但是采用盒式交换机方案在成本、功耗和散热上具有明显的优势,同时也免去了以往框式核心交换机对机柜空间和配电的特殊要求。由于Spine和Pod Spine采用了相同的设备,功能特性一致,转发延迟一致,非常便于一些新功能的开发并在全网去部署应用。并且,整个网络从100G组网向200G、400G组网以及后续更高速组网的演进上能保持同步。另外,得益于单芯片设计,采用盒式交换机组建的整个Spine层在转发延时上要明显低于采用框式设备,进一步降低了跨Pod的访问延迟。当然,该架构也引入了新的问题,Spine层设备的数量比采用框式交换机时的数量翻了多倍,而且盒式交换机的单机可靠性比框式核心交换机要低,这给网络管理和日常运维带来了很大的挑战。配套的管理平台、监控平台等都要能够适应这种变化,对网络运维团队也提出了更高的要求,如完善的人员分工,丰富的运维经验,有较强的技术能力和平台的开发能力等,通过对整个网络的把控来规避和降低设备和网络故障对业务的影响。图14:gRPC+INT以上我们分别介绍了三种当前最典型的DCN网络架构。如何才能更好、更高效的驾驭这些网络,就离不开网络可视化技术。网络可视化技术不但能够完成端到端的流量监控、风险预警、协助故障排查。通过数据积累和分析,还能够用来指导和优化数据中心的网络架构设计(模型、收敛比、POD规模等),是一种非常重要的技术手段。网络可视化技术越来越主动、高效和智能。例如,通过gRPC可以更实时、高精度的从设备中采集所需的各种信息。通过INT或Telemetry Stream可以获取业务数据在网络中转发的路径和延迟。通过TCB可以对设备MMU进行监控,获取队列丢包的时间、原因、被丢弃报文。通过MOD可以检测报文在设备内部转发过程中发生的丢包,并能捕获到丢包原因及丢弃报文的特征。通过Packet Trace可深入转发逻辑,模拟报文在芯片中的转发,确定问题根因等。利用大数据和AI技术将网络中采集到的各类信息进行存储、分析和预判,实现从数据训练模型,用模型洞察网络。图15:Smart NIC未来,智能网卡将是DCN网络中重要的组成部分,具备可编程能力的智能网卡在释放CPU资源、实现高性能转发的同时,还拥有隧道封装/解封装、虚拟交换、加解密、RDMA等功能,随着业务场景和需求的增加,越来越多的数据平面功能将由智能网卡来完成,打破了基于服务器或交换机各自实现的局限性,有望做到性能、功能和灵活性的完美平衡。智能网卡将接替Leaf交换机作为DCN网络的最末端,由此,网络架构、协议部署、可视化技术等也会因智能网卡的引入而发生改变,更利于端到端的性能优化和服务保障、端到端的探测和监控、SRv6等新技术的应用,未来的DCN网络将会更上一个台阶,为不断丰富的上层业务提供更稳定、更高效、更灵活的网络服务。

猜你喜欢

如何购买

提交项目需求

合作伙伴查询

关于新华三

公司简介

发展历史

焦点时刻

品牌活动

企业社会责任

新华三集团招聘

联系新华三

公司总部

集团代表处

常用链接

知了社区

保修期查询

文档中心

软件下载

友情链接

紫光集团

紫光股份

紫光云

紫光计算机

关注新华三

官方微信

视频号

官方头条

官方抖音号:新华三

官方微博

版权所有 2003-2022 新华三技术有限公司.保留一切权利.  浙ICP备09064986号   浙公网安备 33010802004416号

隐私政策

版权声明

网站地图

联系我们

联系我们

联系我们

 售前咨询

 提交项目需求

售前咨询热线

400-810-0504 转 1

 售后咨询

售后服务热线

400-810-0504

售后大客户专线 

400-826-5511

 人工在线咨询

获取更多支持与服务

[深度模型] Deep & Cross Network (DCN) - 知乎

[深度模型] Deep & Cross Network (DCN) - 知乎首发于推荐算法学习笔记切换模式写文章登录/注册[深度模型] Deep & Cross Network (DCN)俊俊推荐算法工程师一枚本人微信公众号为“推荐算法学习笔记”,定期推出经典推荐算法文章,欢迎关注。本文主要介绍的是经典的深度模型DCN。paper名称为《Deep & Cross network for Ad Click Predictions》一. 概述DCN是一个可以同时高效学习低维特征交叉和高维非线性特征的深度模型,不需要人工特征工程的同时需要的计算资源非常低。DCN的模型结构如下图所示可以看到DCN分成4部分。最底下是“Embedding and stacking layer”,中间部分是“Cross network”和“Deep network”,最上面是“Combination output layer”。下面分别对每个部分进行讲解二. Embedding and stacking layer这一层是模型的输入层。我们知道输入的特征分为稠密和稀疏特征。对于稀疏特征,我们一般采用one hot encoding的方式进行编码,然后再经过一层embedding将one hot embedding转换成稠密向量。最后,将稠密特征和经过转换的稀疏特征对应的稠密向量concat起来组成模型的最终输入,也就是图中的x0三. Cross Network在cross network里面我们主要使用以下的公式进行一层一层的叠加:假如我们要叠加3层,则每一层计算如下可视化如下图所示w和b是我们要学习的参数,可以看到在cross network里面,输入和输出的维度是一样的。为什么这么设计?cross network为1层的时候,我们可以得到的最高是2维的特征交叉;cross network为2层的时候,我们得到的是最高3维的特征交叉;cross network为3层的时候,我们得到的是最高4维的特征交叉;以此类推。。。因此cross network以一种参数共享的方式,通过对叠加层数的控制,可以高效地学习出低维的特征交叉组合,避免了人工特征工程。对cross network更深入的分析可参考paper四. Deep Networkdeep network部分就是传统的全连接前馈神经网络,用来学习高维非线性特征交叉组合。公式如下所示五. Combination Output Layer最后,将cross network和deep network的输出concat起来,通过一个logit层,对于一个二分类问题,公式如下图所示其中损失函数为公式最右边一项为l2正则六. 总结以上便是DCN的全部内容,如果有问题,欢迎随时联系。本人微信公众号为“推荐算法学习笔记”,定期推出经典推荐算法文章,欢迎关注。发布于 2020-05-06 00:47机器学习深度学习(Deep Learning)神经网络​赞同 103​​11 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录推荐算法学习笔记推荐系统,

推荐系统系列(十):DCN理论与实践 - 知乎

推荐系统系列(十):DCN理论与实践 - 知乎首发于苏打实验室切换模式写文章登录/注册推荐系统系列(十):DCN理论与实践ZONGMING日拱一卒无有尽,功不唐捐终入海前言在Wide&Deep [2]之后,2017年Stanford与Google联合推出了Deep&Cross Network(DCN)[1]。该模型主要特点在于提出Cross network,用于特征的自动化交叉编码。传统DNN对于高阶特征的提取效率并不高,Cross Network通过调整结构层数能够构造出有限阶(bounded-degree)交叉特征,对特征进行显式交叉编码,在精简模型参数的同时有效的提高了模型的表征能力。从模型结构上来看,DCN是将Wide&Deep中的Wide侧替换为Cross Network,利用该部分自动交叉特征的能力,模型无需进行额外的特征工程工作。同时,DCN参考了Deep Crossing[3] 模型引入了残差结构的思想,使得模型能够更深。熟悉DeepFM [4]的同学可能觉得DCN与DeepFM也有几分相似,并且二者都采用了底层特征共享的模式。但二者其实是同时期提出的工作,所以并无参考之说。言归正传,接下来让我们一起来对模型进行分析学习。分析1. DCN模型结构模型结构如下,共分为4个部分,分别为 Embedding and Stacking Layer(特征预处理输入)、Cross network(自动化特征显式交叉)、Deep network(特征隐式交叉)和Combination output Layer(输出)。1.1 Embedding and Stacking Layer常规操作,首先针对原始特征进行预处理,其中类别特征(Sparse feature)可以通过二值化处理,然后进行特征Embedding,将高维稀疏特征转化为低维稠密的实值向量(Embedding vec),再拼接其他连续特征(Dense feature)作为模型的输入。\begin{aligned} X_0=[X_{embed,1}^T,\dots,X_{embed,,}^T,X_{dense}^T] \end{aligned} \qquad (1) \\其中 X_{embed,i}^T 代表特征Embedding vec,X_{dense}^T 代表连续实值特征向量。为了方便与下面的介绍保持统一,假设 X_0 \in \mathbb{R}^d ,X_0=[x_1,x_2,\dots,x_d] 。1.2 Cross Network这个部分是模型的核心,数学表达式如下:\begin{aligned} X_{l+1}=X_0X_{l}^TW_{l}+b_{l}+X_{l}=f(X_{l},W_{l},b_{l})+X_{l} \end{aligned} \qquad (2) \\其中 X_{l},X_{l+1} \in \mathbb{R}^d 分别代表Cross Network的第 l,l+1 层的输出,W_{l},b_{l} \in \mathbb{R}^d 分别为该层的参数与偏置项。因为 f(X_{l},W_{l},b_{l})=X_{l+1}-X_{l} ,所以函数 f:\mathbb{R}^d \mapsto \mathbb{R}^d 是拟合 X_{l+1} 与 X_{l} 的残差,这个思想与Deep Crossing一致。公式(2)对应的图形化表示如Fig 2,图中所有的向量维度都是一样的。利用 X_0 与 X^{\prime} 做向量外积得到所有的元素交叉组合,层层叠加之后便可得到任意有界阶组合特征,当cross layer叠加 l 层时,交叉最高阶可以达到 l+1 阶,参考[5]可以举例说明:为了方便起见,首先将 b 设置为零向量,令 X_0=\left[\begin{matrix}x_{0,1}\\x_{0,2}\end{matrix}\right] ,那么\begin{aligned} X_1={} & X_0X_0^{\prime}W_0+X_0 \\ ={} & \left[\begin{matrix}x_{0,1}\\x_{0,2}\end{matrix}\right] \left[x_{0,1}x_{0,2}\right] \left[\begin{matrix}w_{0,1}\\w_{0,2}\end{matrix}\right] + \left[\begin{matrix}x_{0,1}\\x_{0,2}\end{matrix}\right] \\ ={} & \left[\begin{matrix}x_{0,1}^2,x_{0,1}x_{0,2}\\x_{0,2}x_{0,1},x_{0,2}^2\end{matrix}\right] \left[\begin{matrix}w_{0,1}\\w_{0,2}\end{matrix}\right] + \left[\begin{matrix}x_{0,1}\\x_{0,2}\end{matrix}\right] \\ ={} & \left[\begin{matrix}w_{0,1}x_{0,1}^2+w_{0,2}x_{0,1}x_{0,2}\\ w_{0,1}x_{0,2}x_{0,1}+w_{0,2}x_{0,2}^2\end{matrix}\right] + \left[\begin{matrix}x_{0,1}\\x_{0,2}\end{matrix}\right] \\ ={} & \left[\begin{matrix}w_{0,1}{\color{Red}{x_{0,1}^2}}+w_{0,2}{\color{Red}{x_{0,1}x_{0,2}}}+{\color{Red}{x_{0,1}}}\\ w_{0,1}{\color{Red}{x_{0,2}x_{0,1}}}+w_{0,2}{\color{Red}{x_{0,2}^2}}+{\color{Red}{x_{0,2}}}\end{matrix}\right] \end{aligned} \qquad (3) \\继续计算 X_2,有:\begin{aligned} X_2={} & X_0X_1^{\prime}W_1+X_1 \\ ={} & \left[\begin{matrix}x_{0,1}\\x_{0,2}\end{matrix}\right] \left[w_{0,1}x_{0,1}^2+w_{0,2}x_{0,1}x_{0,2}+x_{0,1}, \quad w_{0,1}x_{0,2}x_{0,1}+w_{0,2}x_{0,2}^2+x_{0,2}\right] \left[\begin{matrix}w_{1,1}\\w_{1,2}\end{matrix}\right] \\ +{} & \left[\begin{matrix}w_{0,1}x_{0,1}^2+w_{0,2}x_{0,1}x_{0,2}+x_{0,1} \\ w_{0,1}x_{0,2}x_{0,1}+w_{0,2}x_{0,2}^2+x_{0,2}\end{matrix}\right] \\ ={} & \left[\begin{matrix} w_{0,1}x_{0,1}^3+w_{0,2}x_{0,1}^2x_{0,2}+x_{0,1}^2, \quad w_{0,1}x_{0,2}x_{0,1}^2+w_{0,2}x_{0,2}^2x_{0,1}+x_{0,2}x_{0,1} \\ w_{0,1}x_{0,1}^2x_{0,2}+w_{0,2}x_{0,1}x_{0,2}^2+x_{0,1}x_{0,2}, \quad w_{0,1}x_{0,2}^2x_{0,1}+w_{0,2}x_{0,2}^3+x_{0,2}^2 \end{matrix}\right] \left[\begin{matrix}w_{1,1}\\w_{1,2}\end{matrix}\right] \\ +{} & \left[\begin{matrix}w_{0,1}x_{0,1}^2+w_{0,2}x_{0,1}x_{0,2}+x_{0,1} \\ w_{0,1}x_{0,2}x_{0,1}+w_{0,2}x_{0,2}^2+x_{0,2}\end{matrix}\right] \\ ={} & \left[\begin{matrix} w_{0,1}w_{1,1}{\color{Red}{x_{0,1}^3}}+w_{0,2}w_{1,1}{\color{Red}{x_{0,1}^2x_{0,2}}}+w_{1,1}{\color{Red}{x_{0,1}^2}} + w_{0,1}w_{1,2}{\color{Red}{x_{0,2}x_{0,1}^2}}+w_{0,2}w_{1,2}{\color{Red}{x_{0,2}^2x_{0,1}}}+w_{1,2}{\color{Red}{x_{0,2}x_{0,1}}} \\ w_{0,1}w_{1,1}{\color{Red}{x_{0,1}^2x_{0,2}}}+w_{0,2}w_{1,1}{\color{Red}{x_{0,1}x_{0,2}^2}}+w_{1,1}{\color{Red}{x_{0,1}x_{0,2}}} + w_{0,1}w_{1,2}{\color{Red}{x_{0,2}^2x_{0,1}}}+w_{0,2}w_{1,2}{\color{Red}{x_{0,2}^3}}+w_{1,2}{\color{Red}{x_{0,2}^2}} \end{matrix}\right] \\ +{} & \left[\begin{matrix}w_{0,1}{\color{Red}{x_{0,1}^2}}+w_{0,2}{\color{Red}{x_{0,1}x_{0,2}}}+{\color{Red}{x_{0,1}}} \\ w_{0,1}{\color{Red}{x_{0,2}x_{0,1}}}+w_{0,2}{\color{Red}{x_{0,2}^2}}+{\color{Red}{x_{0,2}}}\end{matrix}\right] \\ \end{aligned} (4) \\从公式(3)(4)的标红处可以看出,当cross layer叠加 l 层时,交叉最高阶可以达到 l+1 阶,并且包含了所有的交叉组合,这是DCN的精妙之处。复杂性分析:一般来说,要对特征进行高阶显式交叉,一定会加大模型的参数量。在DCN中,假设Cross Layer有 L_c 层,最底层输入 X_0 为 d 维。因为每一层仅有 W,b 参数,所以模型参数量会额外增加 d \times L_c \times 2 个。因为 X_0X_{l}^{\prime}W_{l}=X_0(X_{l}^{\prime}W_{l}) ,先计算 X_{l}^{\prime}W_{l} 得到一个标量,然后再与 X_0 相乘,在时间与空间上计算效率都得到提升,最终 L_c 层 Cross Layer 的时空复杂度均为 O(dL_c) ,也就是说时空复杂度随着输入与层数线性增长,这是非常好的性质。让我们更进一步分析一下Cross Layer的设计理念,通常来说当两个向量的外积之后,往往想到的是再利用一个矩阵来对结果进行压缩变换,假设向量外积之后为 d \times n 维矩阵,那么为了将结果变换为 d 维向量,需要使用的参数矩阵为 n \times d 维,不仅参数量变多了,而且矩阵相乘的运算复杂度高达三次方。参数量过多很容易造成过拟合,参数量的适当精简反而可以提高模型的泛化能力与鲁棒性。如Cross Layer中使用向量而不是矩阵来对结果进行变换,本质上是通过参数共享的模式减少参数量。共享参数能够对样本外数据仍有较好的泛化能力,且能够对噪声数据带来的参数变化进行纠正。1.3 Deep Network与之前的Wide&Deep一样,这个部分是简单的DNN结构。可以表示为:\begin{aligned} h_{l+1}=f(W_{l}h_{l}+b_{l}) \end{aligned} \qquad (5) \\其中 h_{l},h_{l+1} 分别为第 l,l+1 层的输出,W_l 与 b_l 为参数与偏置项, f 为 relu激活函数。假设DNN中的隐层节点为 m 个,共有 L_d 层,且最底层输入为 d 维,那么DNN部分参数量为 d \times m + m + (m^2+m) \times (L_d-1) 。1.4 Combination Output Layer将Cross Network与Deep Network部分的输出进行简单拼接,通过激活函数作为最后的输出。\begin{aligned} p=\sigma\left({[X_{L_1}^T,h_{L_2}^T]}W_{logits}\right) \end{aligned} \qquad (6) \\其中 X_{L_1}^T \in \mathbb{R}^d ,h_{L_2}^T \in \mathbb{R}^m 分别为Cross Network与Deep Network的输出,W_{logits} \in \mathbb{R}^{d+m} 是变换矩阵,\sigma 为 sigmoid 激活函数。模型使用的Loss函数为 logloss,并且加入了正则项:\begin{aligned} loss = -\frac{1}{N}\sum_{i=1}^Ny_ilog(p_i)+(1-y_i)log(1-p_i)+ \lambda \sum ||W||^2 \end{aligned} \qquad (7) \\2. 性能对比作者使用 Criteo 数据集进行实验对比,对比模型有 LR、FM、DNN、Deep Crossing。至于为什么没有Wide&Deep模型进行对比,在原文中提到,因为Wide部分需要手工构造合适的交叉特征,这需要领域知识来对特征进行选择,不方便作为对比试验。 W&D. Different than DCN, its wide component takes as input raw sparse features, and relies on exhaustive searching and domain knowledge to select predictive cross features. We skipped the com- parison as no good method is known to select cross features. 几个模型的对比结果如下,结果来看DCN的确表现更优。令人不能理解的是,排除了Wide&Deep模型之后,后续的对比实验都是DCN与DNN模型的对比....作者重点对比的是二者的效率问题,DCN使用更少的参数量能够达到更优的效果(感觉没什么信服力)。最后,作者设计实验观察不同Cross Layer层数与隐层节点数对结果带来的影响。3. 实践仍然使用 MovieLens 100K 作为数据集,核心代码如下。参数含义:vec_dim :代表embedding vector维度field_lens :list结构,其中每个元素代表对应Field有多少取值。例如gender有两个取值,那么其对应的元素为2cross_layer_num:cross network 层数dnn_layers:list结构,其中每个元素对应DNN部分节点数目lr :学习率class DCN(object):

def __init__(self, vec_dim=None, field_lens=None, cross_layer_num=None, dnn_layers=None, lr=None, dropout_rate=None):

self.vec_dim = vec_dim

self.field_lens = field_lens

self.field_num = len(field_lens)

self.feat_num = np.sum(field_lens)

self.cross_layer_num = cross_layer_num

self.dnn_layers = dnn_layers

self.lr = lr

self.dropout_rate = dropout_rate

self._build_graph()

def _build_graph(self):

self.add_input()

self.inference()

def add_input(self):

self.index = tf.placeholder(tf.int32, shape=[None, self.field_num], name='feat_index') # (batch, F)

self.x = tf.placeholder(tf.float32, shape=[None, self.field_num], name='feat_value') # (batch, F)

self.y = tf.placeholder(tf.float32, shape=[None], name='input_y')

self.is_train = tf.placeholder(tf.bool)

def cross_layer(self, x0, xl, name):

with tf.variable_scope(name):

node_num = self.field_num * self.vec_dim

w = tf.get_variable(name='w', shape=[node_num], dtype=tf.float32)

b = tf.get_variable(name='b', shape=[node_num], dtype=tf.float32)

xl_w = tf.tensordot(xl, w, axes=[1,0]) # (batch, )

x0_xl_w = tf.multiply(x0, tf.expand_dims(xl_w, -1)) # (batch, node_num)

x = tf.add(x0_xl_w, b) # (batch, node_num)

x = x+xl # (batch, node_num)

return x

def inference(self):

with tf.variable_scope('emb_part'):

embed_matrix = tf.get_variable(name='second_ord_v', shape=[self.feat_num, self.vec_dim], dtype=tf.float32)

embed_v = tf.nn.embedding_lookup(embed_matrix, self.index) # (batch, F, K)

embed_x = tf.multiply(tf.expand_dims(self.x, axis=2), embed_v) # (batch, F, K)

embed_x = tf.layers.dropout(embed_x, rate=self.dropout_rate, training=self.is_train) # (batch, F, K)

node_num = self.field_num * self.vec_dim

embed_x = tf.reshape(embed_x, shape=(-1, node_num)) # (batch, node_num)

with tf.variable_scope('cross_part'):

cross_vec = embed_x

for i in range(self.cross_layer_num):

cross_vec = self.cross_layer(embed_x, cross_vec, 'cross_layer_%d'%i) # (batch, node_num)

with tf.variable_scope('dnn_part'):

dnn = embed_x

in_num = node_num

for i in range(len(self.dnn_layers)):

out_num = self.dnn_layers[i]

w = tf.get_variable(name='w_%d'%i, shape=[in_num, out_num], dtype=tf.float32)

b = tf.get_variable(name='b_%d'%i, shape=[out_num], dtype=tf.float32)

dnn = tf.matmul(dnn, w) + b

dnn = tf.layers.dropout(tf.nn.relu(dnn), rate=self.dropout_rate, training=self.is_train)

in_num = out_num

with tf.variable_scope('output_part'):

in_num += node_num

output = tf.concat([cross_vec, dnn], axis=1)

proj_w = tf.get_variable(name='proj_w', shape=[in_num, 1], dtype=tf.float32)

self.y_logits = tf.matmul(output, proj_w)

self.y_hat = tf.nn.sigmoid(self.y_logits)

self.pred_label = tf.cast(self.y_hat > 0.5, tf.int32)

self.loss = -tf.reduce_mean(self.y*tf.log(self.y_hat+1e-8) + (1-self.y)*tf.log(1-self.y_hat+1e-8))

self.train_op = tf.train.AdamOptimizer(self.lr).minimize(self.loss)reference[1] Wang, R., Fu, B., Fu, G., & Wang, M. (2017, August). Deep & cross network for ad click predictions. In Proceedings of the ADKDD'17 (p. 12). ACM.[2] Cheng, Heng-Tze, et al. "Wide & deep learning for recommender systems." Proceedings of the 1st workshop on deep learning for recommender systems. ACM, 2016.[3] Shan, Ying, et al. "Deep crossing: Web-scale modeling without manually crafted combinatorial features." Proceedings of the 22nd ACM SIGKDD international conference on knowledge discovery and data mining. ACM, 2016.[4] Guo, Huifeng, et al. "DeepFM: a factorization-machine based neural network for CTR prediction." arXiv preprint arXiv:1703.04247 (2017).[5] https://zhuanlan.zhihu.com/p/55234968[6] https://zhuanlan.zhihu.com/p/43364598欢迎关注公众号:SOTA Lab专注知识分享,不定期更新计算机、金融相关文章~发布于 2019-12-08 17:36深度学习(Deep Learning)人工智能推荐系统​赞同 65​​11 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录苏打实验室计算机领域知

可变形卷积(DCN,Deformable Convolution Network)-CSDN博客

>

可变形卷积(DCN,Deformable Convolution Network)-CSDN博客

可变形卷积(DCN,Deformable Convolution Network)

置顶

Jumbo星

已于 2023-08-13 15:34:24 修改

阅读量3.3w

收藏

390

点赞数

68

分类专栏:

目标检测

论文解读

文章标签:

人工智能

深度学习

计算机视觉

于 2022-08-10 16:38:09 首次发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/jiangqixing0728/article/details/126269423

版权

论文解读

同时被 2 个专栏收录

7 篇文章

2 订阅

订阅专栏

目标检测

2 篇文章

2 订阅

订阅专栏

可变形卷积即DCN(缩写取自Deformable ConvNets)提出于ICCV 2017的paper:Deformable Convolutional Networks

论文paper地址:https://openaccess.thecvf.com/content_ICCV_2017/papers/Dai_Deformable_Convolutional_Networks_ICCV_2017_paper.pdf

codebase地址:(很多框架中都已实现,这里选择以pytorch的为例)https://github.com/4uiiurz1/pytorch-deform-conv-v2/blob/master/deform_conv_v2.py

目录

DCN

文章创新点(贡献):

一、可变形卷积(DCN/DConv)

为什么要用DConv?

可变形卷积怎么实现?

总结:DCN的操作流程(全过程)

实现DCN中的两个问题Q&A 

二、可变形RoI池化

MMdetection里的DCN源码解析 

DCNv2

DCN

文章创新点(贡献):

本文提出了两个新模块:可变形卷积和可变形RoI池化

新模块可以很容易地取代现有CNN中的普通模块,并且可以通过标准反向传播轻松地进行端到端训练。

DCN目前也出到了v2,值得一提的是,DCN的思维也算一种可学习的自适应模块,跟注意力机制模块BAM/CBAM的思路有点像。

mmdetection里也有相关实现,可轻松移植进自己的项目,DCN对于大多数检测场景尤其是比赛都是有用的★

一、可变形卷积(DCN/DConv)

(a)是普通的卷积操作

(b)、(c)、(d)是可变形卷积(deformable convolution,即DConv)

可变形卷积实际是指标准卷积操作中采样位置增加了一个偏移量offset,这样卷积核就能在训练过程中扩展到很大的范围。(c)(d)是(b)的特例,表明可变形卷积推广了尺度、长宽比和旋转的各种变换。

为什么要用DConv?

卷积单元(卷积核)对输入的特征图在固定的位置进行采样;池化层不断减小着特征图的尺寸;RoI池化层产生空间位置受限的RoI。然而,这样做会产生一些问题,比如,卷积核权重的固定导致同一CNN在处理一张图的不同位置区域的时候感受野尺寸都相同,这对于编码位置信息的深层卷积神经网络是不合理的。因为不同的位置可能对应有不同尺度或者不同形变的物体,这些层需要能够自动调整尺度或者感受野的方法。再比如,目标检测的效果很大程度上依赖于基于特征提取的边界框,这并不是最优的方法,尤其是对于非网格状的物体而言。

左图a是正常卷积,b是可变形卷积。

最上面的图像是在大小不同的物体上的激活单元。

中间层是为了得到顶层激活单元所进行的采样过程(可以看作是一个卷积操作,3*3卷积核对应九个点九个数最后得到上面一个点即一个数值),左图是标准的3x3方阵采样,右图是非标准形状的采样,但是采样的点依然是3x3,符合3*3卷积的广义定义。

最下面一层是为了得到中间层进行的采样区域,同理。

明显发现,可变形卷积在采样时可以更贴近物体的形状和尺寸,更具有鲁棒性,而标准卷积无法做到这一点。

可变形卷积怎么实现?

如上图所示,偏差offset通过一个卷积层conv获得,输入特征图,输出偏差。生成通道维度是2N,其中的2分别对应X和Y这2个2D偏移,N具体是靠卷积核大小计算得到,比如常见的3*3卷积,9个参数那么N=9。

一共有两种卷积核:卷积核和卷积核学习offset对应的卷积层内的卷积核,这两种卷积核通过双线性插值反向传播同时进行参数更新。

这种实现方式相当于于比正常的卷积操作多学习了卷积核的偏移offset。

总的来说整个流程如下图所示,DCN(也有的地方称为DConv)多了右边灰色框里的东西。

总结:DCN的操作流程(全过程)

总的来说,DConv具体操作流程是:

① 我们一开始,和正常的卷积神经网络一样,根据输入的图像,利用传统的卷积核提取特征图。

②我们把得到的特征图作为输入,对特征图再施加一个卷积层,这么做的目的是为了得到可变形卷积的变形的偏移量。(重点)其中,偏移层是2N,因为我们在平面上做平移,需要改变x值和y值两个方向。

③在训练的时候,用于生成输出特征的卷积核和用于生成偏移量的卷积核是同步学习的。其中偏移量的学习是利用插值算法,通过反向传播进行学习。

实现DCN中的两个问题Q&A 

Q:

1、如何将可变形卷积变成单独的一个层,而不影响别的层;

2、在前向传播实现可变性卷积中,如何能有效地进行反向传播。

A:

1、在实际操作时,并不是真正地把卷积核进行扩展,而是对卷积前图片的像素重新整合,变相地实现卷积核的扩张。也就是说,实际上变的是每次进行卷积后得到的带偏移值的坐标值,根据这些坐标取像素点,然后双线性差值,得到新feature map,然后作为输出并成为下一层的新输入。

2、在图片像素整合时,需要对像素进行偏移操作,偏移量的生成会产生浮点数类型,而偏移量又必须转换为整形,直接对偏移量取整的话无法进行反向传播,这时采用双线性差值的方式来得到对应的像素。

二、可变形RoI池化

跟可变形卷积的区别就是输入是经过普通RoI池化后的feature map,进入一个全连接层(不是卷积层),得到一个偏移。注意这里的偏移量要归一化,为了匹配RoI的尺寸。

可变形RoI池化可用的场景也不多,也没有什么好借鉴的,因此就不作过多介绍,感兴趣的可以去看论文和源码对应部分深入了解。

MMdetection里的DCN源码解析 

这里我们选用mmdetection框架进行DCN的源码分析,注意我用的版本是mmdetection=2.23.0:

GitHub - open-mmlab/mmdetection at v2.23.0

在使用dcn之前首先要明确,dcn一般放在backbone里,哪怕neck或者后面的head里也有一些卷积模块,一般不会用dcn代替普通的卷积。

如果要在某个backbone使用dcn,可以参考configs/dcn或者configs/dcnv2里的官方config来进行修改,这里以configs/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py为例,config相关部分的代码为

_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py'

model = dict(

backbone=dict(

dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False),

stage_with_dcn=(False, True, True, True)))

可以看出这个config基本上继承faster_rcnn_r50_fpn_1x_coco.py,即用faster_rcnn+backbone为resnet-50+neck为fpn来给coco数据集train 12个epoch,只是把backbone即resnet-50里的普通conv改成了dcn,其中resnet-50有4个stage,第2-第4个stage都进行了这种修改,第1个stage保留原有的conv。

在resnet的源码中:

for i, num_blocks in enumerate(self.stage_blocks):

stride = strides[i]

dilation = dilations[i]

dcn = self.dcn if self.stage_with_dcn[i] else None

if plugins is not None:

stage_plugins = self.make_stage_plugins(plugins, i)

else:

stage_plugins = None

planes = base_channels * 2**i

res_layer = self.make_res_layer(

block=self.block,

inplanes=self.inplanes,

planes=planes,

num_blocks=num_blocks,

stride=stride,

dilation=dilation,

style=self.style,

avg_down=self.avg_down,

with_cp=with_cp,

conv_cfg=conv_cfg,

norm_cfg=norm_cfg,

dcn=dcn,

plugins=stage_plugins,

init_cfg=block_init_cfg)

这里的res_layer具体实现源码在mmdet/models/utils/res_layer.py,但是这里的dcn这个变量实际上真正起作用的是在block里,比如resnet-50用的block是Bottleneck

self.conv2 = build_conv_layer(

dcn,

planes,

planes,

kernel_size=3,

stride=self.conv2_stride,

padding=dilation,

dilation=dilation,

bias=False)

这里跳转过去会发现实际上是mmcv对torch.nn.Conv2d加了个封装,因此实现还是以pytorch的为准。

具体源码在:

pytorch-deform-conv-v2/deform_conv_v2.py at 529abbbe9b81e852d272220c855255fd631c43c6 · 4uiiurz1/pytorch-deform-conv-v2 · GitHub

class DeformConv2d(nn.Module):

def __init__(self, inc, outc, kernel_size=3, padding=1, stride=1, bias=None, modulation=False):

"""

Args:

modulation (bool, optional): If True, Modulated Defomable Convolution (Deformable ConvNets v2).

"""

super(DeformConv2d, self).__init__()

self.kernel_size = kernel_size

self.padding = padding

self.stride = stride

self.zero_padding = nn.ZeroPad2d(padding)

self.conv = nn.Conv2d(inc, outc, kernel_size=kernel_size, stride=kernel_size, bias=bias)

# 可变形卷积多出来的部分

self.p_conv = nn.Conv2d(inc, 2*kernel_size*kernel_size, kernel_size=3, padding=1, stride=stride)

nn.init.constant_(self.p_conv.weight, 0)

self.p_conv.register_backward_hook(self._set_lr)

self.modulation = modulation

if modulation:

self.m_conv = nn.Conv2d(inc, kernel_size*kernel_size, kernel_size=3, padding=1, stride=stride)

nn.init.constant_(self.m_conv.weight, 0)

self.m_conv.register_backward_hook(self._set_lr)

@staticmethod

def _set_lr(module, grad_input, grad_output):

grad_input = (grad_input[i] * 0.1 for i in range(len(grad_input)))

grad_output = (grad_output[i] * 0.1 for i in range(len(grad_output)))

def forward(self, x):

offset = self.p_conv(x)

if self.modulation:

m = torch.sigmoid(self.m_conv(x))

dtype = offset.data.type()

ks = self.kernel_size

N = offset.size(1) // 2

if self.padding:

x = self.zero_padding(x)

# (b, 2N, h, w)

p = self._get_p(offset, dtype)

# (b, h, w, 2N)

p = p.contiguous().permute(0, 2, 3, 1)

q_lt = p.detach().floor()

q_rb = q_lt + 1

q_lt = torch.cat([torch.clamp(q_lt[..., :N], 0, x.size(2)-1), torch.clamp(q_lt[..., N:], 0, x.size(3)-1)], dim=-1).long()

q_rb = torch.cat([torch.clamp(q_rb[..., :N], 0, x.size(2)-1), torch.clamp(q_rb[..., N:], 0, x.size(3)-1)], dim=-1).long()

q_lb = torch.cat([q_lt[..., :N], q_rb[..., N:]], dim=-1)

q_rt = torch.cat([q_rb[..., :N], q_lt[..., N:]], dim=-1)

# clip p

p = torch.cat([torch.clamp(p[..., :N], 0, x.size(2)-1), torch.clamp(p[..., N:], 0, x.size(3)-1)], dim=-1)

# bilinear kernel (b, h, w, N)

g_lt = (1 + (q_lt[..., :N].type_as(p) - p[..., :N])) * (1 + (q_lt[..., N:].type_as(p) - p[..., N:]))

g_rb = (1 - (q_rb[..., :N].type_as(p) - p[..., :N])) * (1 - (q_rb[..., N:].type_as(p) - p[..., N:]))

g_lb = (1 + (q_lb[..., :N].type_as(p) - p[..., :N])) * (1 - (q_lb[..., N:].type_as(p) - p[..., N:]))

g_rt = (1 - (q_rt[..., :N].type_as(p) - p[..., :N])) * (1 + (q_rt[..., N:].type_as(p) - p[..., N:]))

# (b, c, h, w, N)

x_q_lt = self._get_x_q(x, q_lt, N)

x_q_rb = self._get_x_q(x, q_rb, N)

x_q_lb = self._get_x_q(x, q_lb, N)

x_q_rt = self._get_x_q(x, q_rt, N)

# (b, c, h, w, N)

x_offset = g_lt.unsqueeze(dim=1) * x_q_lt + \

g_rb.unsqueeze(dim=1) * x_q_rb + \

g_lb.unsqueeze(dim=1) * x_q_lb + \

g_rt.unsqueeze(dim=1) * x_q_rt

# modulation

if self.modulation:

m = m.contiguous().permute(0, 2, 3, 1)

m = m.unsqueeze(dim=1)

m = torch.cat([m for _ in range(x_offset.size(1))], dim=1)

x_offset *= m

x_offset = self._reshape_x_offset(x_offset, ks)

out = self.conv(x_offset)

return out

def _get_p_n(self, N, dtype):

p_n_x, p_n_y = torch.meshgrid(

torch.arange(-(self.kernel_size-1)//2, (self.kernel_size-1)//2+1),

torch.arange(-(self.kernel_size-1)//2, (self.kernel_size-1)//2+1))

# (2N, 1)

p_n = torch.cat([torch.flatten(p_n_x), torch.flatten(p_n_y)], 0)

p_n = p_n.view(1, 2*N, 1, 1).type(dtype)

return p_n

def _get_p_0(self, h, w, N, dtype):

p_0_x, p_0_y = torch.meshgrid(

torch.arange(1, h*self.stride+1, self.stride),

torch.arange(1, w*self.stride+1, self.stride))

p_0_x = torch.flatten(p_0_x).view(1, 1, h, w).repeat(1, N, 1, 1)

p_0_y = torch.flatten(p_0_y).view(1, 1, h, w).repeat(1, N, 1, 1)

p_0 = torch.cat([p_0_x, p_0_y], 1).type(dtype)

return p_0

def _get_p(self, offset, dtype):

N, h, w = offset.size(1)//2, offset.size(2), offset.size(3)

# (1, 2N, 1, 1)

p_n = self._get_p_n(N, dtype)

# (1, 2N, h, w)

p_0 = self._get_p_0(h, w, N, dtype)

p = p_0 + p_n + offset

return p

def _get_x_q(self, x, q, N):

b, h, w, _ = q.size()

padded_w = x.size(3)

c = x.size(1)

# (b, c, h*w)

x = x.contiguous().view(b, c, -1)

# (b, h, w, N)

index = q[..., :N]*padded_w + q[..., N:] # offset_x*w + offset_y

# (b, c, h*w*N)

index = index.contiguous().unsqueeze(dim=1).expand(-1, c, -1, -1, -1).contiguous().view(b, c, -1)

x_offset = x.gather(dim=-1, index=index).contiguous().view(b, c, h, w, N)

return x_offset

@staticmethod

def _reshape_x_offset(x_offset, ks):

b, c, h, w, N = x_offset.size()

x_offset = torch.cat([x_offset[..., s:s+ks].contiguous().view(b, c, h, w*ks) for s in range(0, N, ks)], dim=-1)

x_offset = x_offset.contiguous().view(b, c, h*ks, w*ks)

return

DCNv2

2018年原作者团队又对DCN做了改进,做了充分的可视化来分析原版DCN的缺点

paper:https://arxiv.org/abs/1811.11168

关注博主即可阅读全文

优惠劵

Jumbo星

关注

关注

68

点赞

390

收藏

觉得还不错?

一键收藏

知道了

12

评论

可变形卷积(DCN,Deformable Convolution Network)

ICCV 2017的一篇文章。可变形卷积(DCN)的原理和实现。在目标检测领域应用广泛,在项目、课程设计、毕业设计、比赛中对许多数据集和许多目标检测算法(只要含卷积操作),都能有不错的提升,泛化性很强。

复制链接

扫一扫

专栏目录

Python-可变形卷积网络的官方实现

08-11

可变形卷积网络的官方实现,Deformable Convolutional Networks

Python-利用Pytorch实现的可变形卷积网络v2

08-09

利用Pytorch实现的可变形卷积网络v2

12 条评论

您还未登录,请先

登录

后发表或查看评论

pytorch-deform-conv:变形卷积的PyTorch实现

02-05

可变形卷积的PyTorch实现

魏欧阳@巴斯德研究所

感谢Felix Lau的Keras / TensorFlow实现: ( )

待办事项清单

在pytorch中实现偏移量映射

所有测试通过

变形卷积模块

微调可变形卷积模块

大规模mnist演示

使用缓存的网格数组提高速度

使用pytorch(而不是Keras)的MNIST数据集

支持不同宽度和高度的输入图像

张量流实施基准

可变形卷积网络

戴继峰,齐浩志,熊玉文,李毅,张国栋,韩寒和魏一辰。 2017年。“可变形卷积网络”。 arXiv [cs.CV]。 arXiv。

以下动画是由Felix Lau(及其tenso

可变形卷积DCNv1、DCNv2、DCNv3比较

m0_59959542的博客

12-21

2003

可变形卷积DCN

可变形卷积(Deformable Conv)原理解析与torch代码实现

panghuzhenbang的博客

03-28

1万+

图6为可变形卷积示意图。图1所示为普通卷积在输入特征图上进行卷积计算的过程,卷积核大小为3*3,在输入特征图尺寸为7*7上进行卷积,将卷积核权重与输入特征图对应位置元素相乘并求和得到输出特征图元素,按一定方式滑动窗口就能计算得到整张输出特征图。图6所示,在input feature map上普通卷积操作对应卷积采样区域是一个卷积核大小的正方形(绿框),而可变形卷积对应的卷积采样区域为一些蓝框表示的点,这就是可变形卷积与普通卷积的区别。先来一张图感受一下,图3为标准卷积与可变形卷积的卷积示例。

DCNv2可变形卷积开发包

11-13

可变性卷积的思想很简单,就是讲原来固定形状的卷积核变成可变的。同时可以去我的github地址去下载:https://github.com/z1z9b89/DCNv2

可变形卷积(Deformable Convolution)

NorthSmile的博客

09-12

5564

之前分了两次将深度学习中常用的各种卷积操作进行了汇总介绍,具体包括标准2D卷积、1×1卷积、转置卷积、膨胀卷积、深度卷积以及可分离卷积和分组卷积,之前在读文献时碰巧见过还有一个可变形卷积,这种卷积方式可以更好的根据目标本身的形状进行特征提取。这篇文章主要目的是为了学习理解可变形卷积,以便后面实验使用。我在这里首先把原文摘要中的部分信息进行提取展示,以对可变形卷积有一个初步的认识,并了解作者为什么提出可变形卷积。

可变形卷积从概念到实现过程

热门推荐

LEEANG121的博客

02-09

5万+

可变形卷积是如何实现的?什么是可变形卷积?为什么要可变形卷积?如何实现可变形卷积?

什么是可变形卷积?

可变形卷积是指卷积核在每一个元素上额外增加了一个参数方向参数,这样卷积核就能在训练过程中扩展到很大的范围。

上图来自论文Deformable Convolutional Networks

上图中

(a)是传统的标准卷积核,尺寸为3x3(图中绿色的点);

(b)就是我们今天要谈论的可变形卷积,通...

可变形卷积(DCN)

qq_43471945的博客

02-16

2367

可变形卷积: Deformable Convolutional Networks原文摘要:卷积神经网络(CNNs)由于其构建模块中存在固定的几何结构,因此固有地局限于模型几何转换。在本工作中,我们引入了两个新的模块来增强cnn的转换建模能力,即可变形卷积和可变形感兴趣区域池。两者都是基于用额外的偏移量来增加模块中的空间采样位置,并学习来自目标任务的偏移量,而无需额外的监督。新的模块可以很容易地取代现有cnn中的普通对应模块,并且可以很容易地通过标准的反向传播进行端到端训练,从而产生可变形的卷积网络。

第三十六课.可变形卷积

白景屹的博客

05-26

3904

目录背景DCN实例效果

背景

视觉识别的一个关键挑战是如何适应物体尺度、姿态、视点和零件变形的几何变化或模型几何变换。

但对于视觉识别的传统CNN模块,不可避免的都存在固定几何结构的缺陷:卷积单元在固定位置对输入特征图进行采样;池化层以固定比率降低空间分辨率;一个ROI(感兴趣区域)池化层将一个ROI分割成固定的空间单元;缺乏处理几何变换的内部机制等。

这些将会引起一些明显的问题。例如,同一CNN层中所有激活单元的感受野大小是相同的,这对于在空间位置上编码语义的高级CNN层是不需要的。而且,对于具有精细定位

来聊聊可形变卷积及其应用

AI算法修炼营的博客

04-27

2096

点击上方“AI算法修炼营”,选择加星标或“置顶”标题以下,全是干货可形变卷积使用可变形卷积,可以提升Faster R-CNN和R-FCN在物体检测和分割上的性能。只要增加很少的计算量,就...

Deform-CNN:使用pytorch的可变形卷积网络用于心电图诊断

04-06

变形神经网络

使用pytorch进行心电图诊断的可变形卷积网络。 这是文章“基于具有良好抗噪能力的可变形卷积神经网络的端到端12导心电图诊断系统”的源代码

入门

训练环境

NVIDIA驱动程序版本418.67

CUDA版本10.1

Python版本3.6.8

Pytorch版本1.4.0 + cu101

安装所需的软件包

从该存储库的根目录运行

pip install -r requirements.txt

下载数据集

我们使用CPSC-2018作为数据集。 您可以从下载数据重新处理数据并以.npy格式保存数据。 然后将数据放入文件夹./dataset/DataSet250HzRepeatFill并将标签放入文件夹./dataset 。 有关更多详细信息,请参考load_dataset.py 。

注意:在我们的实验中,我们删除了总长度超过30秒的数据,将采样频率降低到250 Hz

基于可变形卷积的手绘图像检索

05-06

手绘图像仅包含简单线条轮廓, 与色彩、细节信息丰富的自然图像有着截然不同的特点. 然而目前的神经网络大多针对自然图像设计, 不能适应手绘图像稀疏性的特性. 针对此问题, 本文提出一种基于可变形卷积的手绘检索方法. 首先通过Berkerly边缘检测算法将自然图转化为边缘图, 消除域差异. 然后将卷积神经网络中的部分标准卷积替换为可变形卷积, 使网络能够充分关注手绘图轮廓信息. 最后分别将手绘图与边缘图输入网络并提取全连接层特征作为特征描述子进行检索. 在基准数据集Flickr15k上的实验结果表明, 本文方法与现有方法相比能够有效提高手绘图像检索精度.

tf-deformable-conv-layer:可变形卷积层的TensorFlow实现

05-06

可变形卷积的TensorFlow实现

这是以下论文的TensorFlow实现:

戴继峰,齐浩志,熊玉文,李毅,张国栋,韩寒,魏一辰。 2017。可变形卷积网络。 arXiv [cs.CV]。 arXiv。

该代码只能在。

旋转训练图

采样地点

基本用法

DeformableConvLayer是自定义的Keras图层,因此您可以像其他任何标准图层(例如Dense , Conv2D一样使用它。

这是一个简单的示例:

inputs = tf . zeros ([ 16 , 28 , 28 , 3 ])

model = tf . keras . Sequential ()

model . add ( DeformableConvLayer ( filters = 6 , kernel_size = 3 , strides = 1 , padding = 'valid' , dilat

Python-PyTorch中的可变形卷积网络

08-11

PyTorch中的可变形卷积网络

AI技术在室内定位的应用

jgtx8888的博客

03-01

1173

通过在室内布置信标节点,用户携带的移动设备可以接收到信标信号并计算出与信标的距离,进而确定自身位置。同时,一些新型的机器学习算法还可以处理复杂环境下的干扰问题,提高定位系统的鲁棒性。其中,AI技术在室内定位领域的应用越来越广泛,为我们的生活和工作带来了诸多便利。(2)提高鲁棒性:随着物联网技术的不断发展,室内定位系统将面临越来越多的干扰和挑战。随着AI技术的不断发展和普及,其在室内定位领域的应用将越来越广泛。(2)复杂环境下的定位精度:在复杂环境下,AI技术可能难以保证高精度的定位效果。

文献速递:帕金森的疾病分享--多模态机器学习预测帕金森病

weixin_38594676的博客

03-01

1617

在调整后,此模型的性能得到改善,如下所述及表3中,未调整模型在PPMI的平均AUC指标为80.75,标准差为8.84(范围=69.44–88.51),而在PPMI调整后的平均AUC为82.17,标准差为8.96(范围=70.93–90.17)。请注意,x轴的限制可能会有所不同,因为一些模型基于对输入数据的适应度和使用的算法,天生就会产生比其他模型更不极端的概率分布,更详细的图像包含在补充图5中。其次,机器学习(ML)流程自动化和人工智能的进展,以最大化利用这些大量的、容易获得的数据的价值。

pytorch基础2-数据集与归一化

最新发布

qq_33345365的博客

03-02

1424

Dataset逐个样本检索数据集的特征和标签。在训练模型时,通常希望以“minibatch”的形式传递样本,在每个周期重混洗(reshuffle)数据以减少模型过拟合,并使用Python的多进程加速数据检索。在机器学习中,需要指定数据集中的特征和标签。**特征(Feature)**是输入,**标签(label)**是输出。我们训练特征,然后训练模型以预测标签。特征是图像像素中的模式。标签是10个类别类型:T恤,凉鞋,连衣裙等。DataLoader是一个可迭代对象,用简单的API抽象了这种复杂性。

可变形卷积pytorch

01-12

可变形卷积(Deformable Convolution)是一种在卷积神经网络中引入空间变形的操作,可以有效地捕捉目标的非刚性形变。在PyTorch中,可以通过使用DeformConv2D模块来实现可变形卷积。

下面是一个使用可变形卷积的示例代码:

```python

import torch

import torch.nn as nn

from deform_conv import DeformConv2D

# 定义一个包含可变形卷积的网络模型

class DeformConvNet(nn.Module):

def __init__(self):

super(DeformConvNet, self).__init__()

self.conv1 = nn.Conv2d(3, 64, kernel_size=3, padding=1)

self.bn1 = nn.BatchNorm2d(64)

self.offsets = nn.Conv2d(64, 18, kernel_size=3, padding=1)

self.conv2 = DeformConv2D(64, 64, kernel_size=3, padding=1)

self.fc = nn.Linear(64 * 32 * 32, 10)

def forward(self, x):

x = self.conv1(x)

x = self.bn1(x)

x = self.offsets(x)

x = self.conv2(x)

x = x.view(x.size(0), -1)

x = self.fc(x)

return x

# 创建一个DeformConvNet实例

model = DeformConvNet()

# 将输入数据传入模型进行前向计算

input = torch.randn(1, 3, 32, 32)

output = model(input)

# 打印输出结果

print(output)

```

在上面的代码中,我们首先定义了一个包含可变形卷积的网络模型DeformConvNet。然后,我们创建了一个DeformConvNet实例,并将输入数据传入模型进行前向计算,最后打印输出结果。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

Jumbo星

CSDN认证博客专家

CSDN认证企业博客

码龄2年

暂无认证

57

原创

5531

周排名

3万+

总排名

17万+

访问

等级

940

积分

7612

粉丝

234

获赞

56

评论

1010

收藏

私信

关注

热门文章

可变形卷积(DCN,Deformable Convolution Network)

33833

语义分割、实例分割

21996

计算机视觉的上游任务和下游任务

21299

Amy-Tabb机器人世界手眼标定(1、环境搭建)

7962

windows10+pytorch+cuda11.3+cudnn8.2.1环境搭配

5984

分类专栏

目标检测

2篇

论文解读

7篇

手眼标定项目

4篇

BEV

1篇

PCB缺陷检测

2篇

最新评论

PAA介绍

崇山峻岭的小狗:

你好博主 我想问问我想把数据按照季节划分成四个窗口 可以用PAA算法吗?

可变形卷积(DCN,Deformable Convolution Network)

矜次方:

大佬你好,我在使用你推荐的模块放入自己的代码里进行训练时报错 you are tring to call the hook of a dead module,请问你有遇到过这个问题吗

mmyolo框架中计算各类别的AP@0.5指标

W^~:

如果我需要各类别的ar值,需要怎么设置呢

overleaf写论文笔记(latex)

CSDN-Ada助手:

你好,CSDN 开始提供 #论文阅读# 的列表服务了。请看:https://blog.csdn.net/nav/advanced-technology/paper-reading?utm_source=csdn_ai_ada_blog_reply 。如果你有更多需求,请来这里 https://gitcode.net/csdn/csdn-tags/-/issues/34?utm_source=csdn_ai_ada_blog_reply 给我们提。

mmdet里workers_per_gpu和sampers_per_gpu的作用

philip_pond:

你好,请问,我开了4个GPU,samples_per_gpu=2,是对应8个batch size吗?为何总的批次仍然为2个batch size……

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

[解决错误]mmyolo的bbox_loss和检测bbox都是空

mmyolo框架中计算各类别的AP@0.5指标

mmdetection里的测速脚本

2023年19篇

2022年39篇

2021年2篇

目录

目录

分类专栏

目标检测

2篇

论文解读

7篇

手眼标定项目

4篇

BEV

1篇

PCB缺陷检测

2篇

目录

评论 12

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值