Light-Head R-CNN解读

2024-08-24 18:08
文章标签 解读 cnn head light

本文主要是介绍Light-Head R-CNN解读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近对检测很有兴趣哎,这些天写了好几个相关博客了,下一步准备写SSD和YOLO了,近段时间要把检测吃透

Light-Head R-CNN: In Defense of Two-Stage Object Detector,名字很有趣,守护two stage检测器的尊严。

Motivation

region-free的方法如YOLO,SSD,速度是很快,但是总体来说精度上还是不如两段的region-based系列的Faster rcnn(及加速版R-FCN),那我们想要精度最高速度最快,就有两个做法了,提升region-free系列的精度(这个等我再二刷SSD后再想想有木有什么思路),另一个就是提升region-based系列的速度了,本文就是后者。

首先Faster rcnn为什么还是很慢,在我上一篇博客R-FCN解读中已经提过,它的第二阶段每个proposal是不共享计算的,fc大量的参数和计算严重拖了速度(其实faster rcnn+res101已经做了努力,在res5c有个global pool到2014*1*1,不然第二阶段第一个fc参数参数更多。kaiming论文是C5作为fc6 fc7的,C5后面也依然有global pool,最后分类肯定要有一个全连接的,global pool之后参数也少很多(2048*1*1*C,不然就是2048*7*7*C))。而R-FCN就在着力于解决这个第二阶段的问题,通过生成一个k^2(C+1) channel的score map和PSRoIpooling可以去掉第二阶段的隐层fc,加速了很多。

但是R-FCN生成的score map是和C相关的,在MSCOCO上有81类需要生成7*7*81=3969个channel的score map,这个是耗时耗内存的。所以本文想生成一个thin 的feature map,这样可以显著加速还可以腾出“时间”在后面的rcnn部分做点文章提升精度。

Approach

在Resnet101 res5c后利用大的可分离卷积,生成(α * p * p)channel的feature map,α本文取10,p和其他框架一致取7,这个最终只有10*7*7=490,而且与类别数C无关,大大减少了计算量,第二阶段的rcnn 子网络,本文为了提升精度,相比R-FCN多了一个隐层fc,这是thin feature map为它省来的计算空间,所以速度依然很快。

这里写图片描述

Basic feature extractor.

两种设置,一种是ResNet101,设为L,一种是自己设计的简单的Xception网络,设为S

thin feature map

参考论文Large Kernel Matters – Improve Semantic Segmentation by Global Convolutional Network
本文设置k=15, Cmid = 64 for setting S,and Cmid = 256 for setting L

这里写图片描述

Ablation experiment

thin feature map

首先说明直接把feature map变为thin feature map有什么影响啊?
做法就是直接把R-FCN得到的feature map用1*1的卷积降维到490,然后由于channel减少和类别树无关了,不能像R-FCN直接vote了(R-FCN vote后得到(C+1)*1*1,然后可以直接softmax,而本文vote的话得到10*1*1,不能直接softmax,所以加个10*1*1*C的全连接分类,加个10*1*1*4*C的全连接回归,图中那个fc应该是cls和loc都有的)。B1是直接复现的R-FCN,B2是改了点配置(1, 图片尺度和anchor scale增多 2, 回归的loss比重扩大1倍 3, 只选前256个loss大的样本进行反向传播)
从表中可以看到,channel变少了那么多后,精度并没有损失太多,把PSRoIpooing换成roipooling情况是一样的,甚至有些提升(因为PSRoIpooing后channel变成10channel了,而RoIPooling后channel还是490,参数多了些精度有些许提升)。而且这地方channel变少后集成FPN很方便,因为fpn会在很多level的feature上通过3*3卷积生成这个(C+1)*k*k channel的feature map,十分耗内存和计算,详见我的另一篇博客FPN解读
这里写图片描述
这里写图片描述

large separable convolution

把粗暴的1*1降维换成Large separable convolution,k=15, Cmid = 256,其他和R-FCN一样

这里写图片描述

R-CNN subnet

我们在R-CNN subnet中多加了一个2048channel的隐层fc(无dropout,注意区别于前面的实验是直接加个10*1*1*C的全连接分类(对应表格第3行的数据),这里要有个10*1*1*2048的隐层fc,然后再有个2048*C的全连接分类,loc类似),这个隐层fc是2048和1024 channel都差不多,参数变化很少,精度速度影响也不大。
从表上看到最终提升了2个点左右,而且注意由于用了thin feature map,速度是比它们快的。
这里写图片描述

High Accuracy and High Speed

本文把PSRoIpooling改成和RoIalign那样的插值,然后加上和其他model的同样配置和数据增强,精度是可以达到state-of-art的

这里写图片描述

然后速度方面,把base model换成自己设计的”S”,速度也是可以秒掉SSD、YOLO等region-free以追求速度为主的model,同时精度和它们相当

这里写图片描述

这里写图片描述

下一步是不是要精度达到region-based,速度达到region-free呢,期待中(实力暂时不够,只能期待了)

部分代码

# light head
# large kernel
conv_new_1 = mx.sym.Convolution(data=relu1, kernel=(15, 1), pad=(7, 0), num_filter=256, name="conv_new_1", lr_mult=3.0)
relu_new_1 = mx.sym.Activation(data=conv_new_1, act_type='relu', name='relu1')
conv_new_2 = mx.sym.Convolution(data=relu_new_1, kernel=(1, 15), pad=(0, 7), num_filter=10*7*7, name="conv_new_2", lr_mult=3.0)
relu_new_2 = mx.sym.Activation(data=conv_new_2, act_type='relu', name='relu2')
conv_new_3 = mx.sym.Convolution(data=relu1, kernel=(1, 15), pad=(0, 7), num_filter=256, name="conv_new_3", lr_mult=3.0)
relu_new_3 = mx.sym.Activation(data=conv_new_3, act_type='relu', name='relu3')
conv_new_4 = mx.sym.Convolution(data=relu_new_3, kernel=(15, 1), pad=(7, 0), num_filter=10*7*7, name="conv_new_4", lr_mult=3.0)
relu_new_4 = mx.sym.Activation(data=conv_new_4, act_type='relu', name='relu4')
light_head = mx.symbol.broadcast_add(name='light_head', *[relu_new_2, relu_new_4])
# PSROIPooling
roi_pool = mx.contrib.sym.PSROIPooling(name='roi_pool', data=light_head, rois=rois, group_size=7, pooled_size=7, output_dim=10, spatial_scale=0.0625)
# 隐层fc
fc_new_1 = mx.symbol.FullyConnected(name='fc_new_1', data=roi_pool, num_hidden=2048)
fc_new_1_relu = mx.sym.Activation(data=fc_new_1, act_type='relu', name='fc_new_1_relu')
# 分类和回归
cls_score = mx.symbol.FullyConnected(name='cls_score', data=fc_new_1_relu, num_hidden=num_classes)
bbox_pred = mx.symbol.FullyConnected(name='bbox_pred', data=fc_new_1_relu, num_hidden=num_reg_classes * 4)

参考:
terrychenism/Deformable-ConvNets

这篇关于Light-Head R-CNN解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1103215

相关文章

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

MySQL之搜索引擎使用解读

《MySQL之搜索引擎使用解读》MySQL存储引擎是数据存储和管理的核心组件,不同引擎(如InnoDB、MyISAM)采用不同机制,InnoDB支持事务与行锁,适合高并发场景;MyISAM不支持事务,... 目录mysql的存储引擎是什么MySQL存储引擎的功能MySQL的存储引擎的分类查看存储引擎1.命令

Spring的基础事务注解@Transactional作用解读

《Spring的基础事务注解@Transactional作用解读》文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@Tran... 目录一、事务管理基础1.1 Spring事务的核心注解1.2 注解属性详解1.3 实现原理二、事务事

Linux五种IO模型的使用解读

《Linux五种IO模型的使用解读》文章系统解析了Linux的五种IO模型(阻塞、非阻塞、IO复用、信号驱动、异步),重点区分同步与异步IO的本质差异,强调同步由用户发起,异步由内核触发,通过对比各模... 目录1.IO模型简介2.五种IO模型2.1 IO模型分析方法2.2 阻塞IO2.3 非阻塞IO2.4

MySQL8.0临时表空间的使用及解读

《MySQL8.0临时表空间的使用及解读》MySQL8.0+引入会话级(temp_N.ibt)和全局(ibtmp1)InnoDB临时表空间,用于存储临时数据及事务日志,自动创建与回收,重启释放,管理高... 目录一、核心概念:为什么需要“临时表空间”?二、InnoDB 临时表空间的两种类型1. 会话级临时表

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

解读GC日志中的各项指标用法

《解读GC日志中的各项指标用法》:本文主要介绍GC日志中的各项指标用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基础 GC 日志格式(以 G1 为例)1. Minor GC 日志2. Full GC 日志二、关键指标解析1. GC 类型与触发原因2. 堆