【图像处理】U-Net中的重叠-切片(Overlap-tile)
原创 CW 深蓝学院
作者简介
CW,广东深圳人,毕业于中山大学(SYSU)数据科学与计算机学院,毕业后就业于腾讯计算机系统有限公司技术工程与事业群(TEG)从事Devops工作,期间在AI LAB实习过,实操过道路交通元素与医疗病例图像分割、视频实时人脸检测与表情识别、OCR等项目。
目前也有在一些自媒体平台上参与外包项目的研发工作,项目专注于CV领域(传统图像处理与深度学习方向均有)。
Foreword
最开始接触 U-Net 的时候并不知道原作使用了 Overlap-tile 这种策略,因此当时不太理解为何网络结构要设计成非对称形式,即上采样得到的特征图尺寸与对应层在下采样时的尺寸不一致。
另外发现,这种策略可用于许多场景,特别是当 数据量较少 或者 不适合对原图进行缩放时尤其适用(缩放通常使用插值算法,主流的插值算法如双线性插值具有低通滤波的性质,会使得图像的高频分量受损,从而造成图像轮廓和边缘等细节损失,可能对模型学习有一定影响),同时它还能起到为目标区域提供上下文信息的作用。
本文先对这种策略的原理以及在U-Net中的使用进行说明,然后结合源码对该策略的实现进行解析,内容包括随机切片、镜像填充后按序切片以及将切片重构成图像。
1
Overlap-tile在U-Net中的使用
先来对Overlap-tile策略的原理及其在U-Net中的使用做个介绍,让大家对其有个初步印象和基本理解。
熟悉U-Net结构的炼丹者们肯定清楚,它并不是一个完全对称的结构。也就是说,某一层特征图下采样后再上采样回来到对应层时,其尺寸会发生变化,比原来的小,原因在于U-Net使用的是不带padding的3x3卷积(valid卷积),每次经过这样的一个卷积就会使得特征图尺寸减小2x2。
(U-Net)
显然,如果直接输入原图,那么最后输出的尺寸会比原图小。如果我们希望得到和输入一致的尺寸,会怎么做?
最直接的是对输出结果再进行一次上采样,可以使用插值或者转置卷积的方法,若使用插值,由于其是不可学习的,会带来一定的误差;而使用转置卷积的话,又会增加参数量,并且模型也不一定能学习得好。
另外一种方法就是将U-Net中的valid卷积改为same卷积,即使用padding,这样每次3x3卷积就不会改变特征图的尺寸了,最终上采样回来的尺寸就能够和输入一致了。但是,padding是会引入误差的,而且模型越深层得到的feature map抽象程度越高,受到padding的影响会呈累积效应。
上述方法都体现出明显的不足之处,那么有没有更好的方法呢?我们来看看U-Net中的Overlap-tile是怎么做的。
做法其实很简单,就是在输入网络前对图像进行padding,使得最终的输出尺寸与原图一致。特别的是,这个padding是镜像padding,这样,在预测边界区域的时候就提供了上下文信息。
(Overlap-tile)
上图左边是对原图进行镜像padding后的效果,黄框是原图的左上角部分,padding后其四周也获得了上下文信息,与图像内部的其它区域有类似效果。
Overlap-tile策略可搭配 patch(图像分块)一起使用。当内存资源有限从而无法对整张大图进行预测时,可以对图像先进行镜像padding,然后按序将padding后的图像分割成固定大小的patch。这样,能够实现对任意大的图像进行无缝分割,同时每个图像块也获得了相应的上下文信息。
另外,在数据量较少的情况下,每张图像都被分割成多个patch,相当于起到了扩充数据量的作用。更重要的是,这种策略不需要对原图进行缩放,每个位置的像素值与原图保持一致,不会因为缩放而带来误差。
2
随机切片
随机切片是在图像内部随机选取patch中心,然后将图像切成固定数量的patch。
以下示例是对单张图像及对应的掩膜(mask)做随机切片。
(随机切片 i)
patch中心位置根据其尺寸在图像内部随机选取,确定中心位置后,再根据各边长就可以确定patch的左上和右下两个顶点坐标。
(随机切片 ii)
最后从原图中取出对应位置的区域即可。
(随机切片 iii)
随机切片效果
(左:切片得到的图像块;右:原图对应区域)
3
镜像填充
对原图进行镜像填充,能够使模型对边界区域进行预测时获得上下文信息。下图蓝框部分是原图的左上角部分,镜像填充后,得到红框部分。
(镜像填充效果)
镜像填充后会进行按序切片,在切片时,各patch之间可以设定一个固定的间隔,这样能够避免过份重叠。至于各边需要填充多少长度,可以基于以下两种方式来决定:
i). 填充后,各边都能恰好切出整数个patch(最后不会剩余一点长度不足一个patch);
ii). 提前计算输入输出之间的尺寸差,使得padding后输出与输入尺寸保持一致。
下面就第i)种方式进行源码解析。若有多张不同尺寸的图片,那么就一张张独立处理;否则,可以组成一个批次进行处理。
(镜像填充 i)
先在竖直方向上进行填充,填充后,将原图置于中间,顶部和底部使用原图的镜像进行填充。
(镜像填充 ii )
然后在水平方向上进行填充,同样地,将填充前的图像置于中间,左右两边剩余部分使用填充前图像的镜像进行填充。
(镜像填充 iii)
4
按序切片
按序切片就是从图像的左上方开始,按照一定间隔依次将图像切成一个个小的图像块,直至图像的右下方。
(按序切片 i)
注意,各切片之间的间隔是可以小于切片边长的,这就代表各切片可能存在重叠部分。
(按序切片 ii)
每张图切出相同数量相同大小的切片,计算出各个切片的位置,从图中取出对应的部分就得到各切片。
(按序切片 iii)
5
将切片重构成图像
将图像切片后,模型是对切片进行预测的,那么通常我们需要将这些切片的预测结果重新组合成整张图像对应的预测结果以方便评估和展示。
预测结果的重组与切片重组成图像的原理类似,这里就切片重组进行源码解析。
(切片重组 i)
在上一节提到,切片之间可能存在重叠部分,而重叠部分的像素值,我们通常取平均值。对于切片重构图像来说,取平均后的像素值与原图相同;而对于切片预测结果重组成整图预测结果来说,求平均相当于对多次预测所得的概率求均值作为最终预测结果。
(切片重组 ii)
注意,并不是将切片直接放入图像对应位置,而是使用求和(下图中 img +=、weights +=),就是因为切片之间可能存在重叠的部分,我们需要对这些部分求均值。
(切片重组 iii)
如果切片前做了padding,那么重构后的图像尺寸对应的是padding后的尺寸,因此我们还要裁出原图。我们在padding的时候,原图是放中间的,那么记下之前padding的长度就很容易计算出原图位置了。
(裁剪出原图)
6
End
如本文所述,Overlap-tile带来的好处有许多:不需要对图像进行缩放从而避免图像细节损失、能够为边界区域提供上下文信息、在数据量较少时充当数据扩充的手段。但是,在炼丹的世界里,实际效果如何还得“炼一炼”才知道,感兴趣的炼丹师可以在训练中尝试下这种策略。
【图像处理】U-Net中的重叠-切片(Overlap-tile)相关推荐
- 图像处理:U-Net中的重叠-切片(Overlap-tile)
深蓝学院是专注于人工智能的在线教育平台,已有数万名伙伴在深蓝学院平台学习,很多都来自于国内外知名院校,比如清华.北大等. 最开始接触 U-Net 的时候并不知道原作使用了 Overlap-tile 这 ...
- MTCNN中的重叠度IOU和非极大值抑制NMS原理及Python实现
MTCNN中的重叠度IOU和非极大值抑制NMS原理及Python实现 一.重叠度iou 从在一张照片上框人脸时,因为图像金字塔的原因可能会把人脸框两次以上,每个框的坐标为[X1,Y1X2,Y2,C], ...
- 洛谷 P2202 [USACO13JAN]方块重叠Square Overlap
洛谷 P2202 [USACO13JAN]方块重叠Square Overlap Description 在一个直角坐标系中,有N个边长为K的正方形. 给出每一个正方形的中心,请判断所有的正方形是否有重 ...
- golang中int类型切片无需传指针
golang中int类型切片无需传指针就可以改变切片的值 func main() {x := []int{1, 2, 3}func(arr []int) {arr[0] = 7fmt.Println( ...
- python列表切片得到的是列表还是字符串_python中列表的切片问题 python arry怎么取列切片...
python 列表切片赋值 对列表切片进行赋值,解释器处理时是直接将序列中的内容赋值过去的 ,还切片赋值,得到的与原变量无关,是两个不同的对象:直接赋值,引用的是同一个对象. 请看下例 切片赋值. a ...
- 8 list切片_Python中14个切片操作,你常用哪几个?
切片(Slice)是一个取部分元素的操作,是Python中特有的功能.它可以操作list.tuple.字符串. Python的切片非常灵活,一行代码就可以实现很多行循环才能完成的操作.切片操作的三个参 ...
- python中list的切片和range函数
1.python中list的切片 语法:[start:stop:step] step代表切片步长:切片区间为[start,stop),包含start但不包含stop 1.step > 0,从左往 ...
- 卷积与反卷积、步长(stride)与重叠(overlap)及 output 的大小
1. 卷积与反卷积 如上图演示了卷积核反卷积的过程,定义输入矩阵为 III(4×44\times 44×4),卷积核为 KKK(3×33\times 33×3),输出矩阵为 OOO(2×22\time ...
- 图像处理、显示中的行宽(linesize)、步长(stride)、间距(pitch)
图像处理.显示中的行宽(linesize).步长(stride).间距(pitch) 在图像数据传输和显示的过程中有一个不常用的参数:间距. 间距的名称: 它有很多的别名,在使用d3d显示的时候,它叫 ...
最新文章
- 最好用的修改docker镜像源的方式
- 深度学习中的噪声数据该如何处理?
- STM32-超级终端显示日历
- python中的队列和栈_python的队列和栈
- 苹果前置摄像头拍出来是反的怎么调_不用等了!屏下摄像头难攻克,明年还是挖孔屏...
- InfoPath Forms Services的配置
- java基础英语---第二十一天
- dalvik对于Java方法调用的实现
- mariadb中文手册_MariaDB性能调优工具mytop的使用详解
- jsx怎么往js里传参数_给js文件传参数(详解)
- 为Visual Studio更换皮肤和背景图
- PADS 9.5封装向导 多一个管脚
- 第二季-专题16-LCD亮起来
- 安装linux镜像文件
- 【Visio】 Visio的安装
- 苹果手机测距离_手机传感器怎样运作 手机传感器工作原理【介绍】
- DBA-doing business as
- 【Blender-Python】蜡笔画圆球动画
- 打造自己的专属Linux(一):快速建立一个小型Linux
- isEmpty()的坑
热门文章
- 欧几里得范数_浅谈机器学习中的范数
- 阿尔伯塔大学计算机科学本科几年,本科——21阿尔伯塔大学CS专业早录取
- java switch 类型_Java switch case数据类型原理解析
- swish 好还是relu好_筒灯暗装好还是明装好?
- mysql 实例名_不为人知的MySQL高可用复制管理工具——Orchestrator简介
- fiddler证书 iphone_使用Fiddler进行iOS APP的HTTP/HTTPS抓包
- ios assetlibrary
- 第二篇: 在虚拟主机上使用ASP.NET Ajax
- 当当购书双十一钜惠,5折封顶!附图灵人工智能书单
- 深度人脸表情识别研究进展