机器学习周记(第三十六周:语义分割)2024.4.22~2024.4.28

news2024/12/25 12:29:59

目录

摘要

ABSTRACT

1 FCN

2 双线性插值

3 膨胀卷积

3.1 gridding effect


摘要

  本周继续学习了语义分割的内容,主要包括 FCN(全卷积网络)、双线性插值和膨胀卷积等方面。FCN 通过上采样的倍率可以划分为 FCN-32S、FCN-16S、FCN-8S,它们从不同程度上利用了下采样的信息。双线性插值是一种常用的图像处理技术,经常用于上采样操作,将特征图从低分辨率插值到高分辨率。膨胀卷积通过在卷积核的内部引入一个可调参数,膨胀率(Dilation Rate),来扩展卷积核的感受野,以此捕获更广泛的上下文信息,而无需增加参数或降低分辨率,但膨胀卷积也会导致“gridding effect”(格点效应),需要注意选择合适的膨胀率和层级组合,避免这种效应对模型性能的影响。本周我也学习了一种设计膨胀率的标准方法 HDC,用于避免gridding effect。

ABSTRACT

This week, We continued learning about semantic segmentation, focusing mainly on FCN (Fully Convolutional Network), bilinear interpolation, and dilated convolution. FCN can be categorized into FCN-32S, FCN-16S, and FCN-8S based on the upsampling factor, each utilizing the downsampling information to varying degrees. Bilinear interpolation is a common image processing technique often used for upsampling, interpolating feature maps from low to high resolution. Dilated convolution expands the receptive field of convolutional kernels by introducing a tunable parameter, the dilation rate, enabling the capture of broader contextual information without increasing parameters or reducing resolution. However, dilated convolution may lead to the "gridding effect," necessitating careful selection of dilation rates and layer combinations to mitigate its impact on model performance. We also learned a standard method called HDC for designing dilation rates to avoid the gridding effect.

1 FCN

  FCN 首先通过一个预先训练好的卷积神经网络(如VGGResNet等)进行特征提取。这些网络通常经过在大规模图像数据集上进行了预训练,学习到了丰富的图像特征。最后的全连接层(FC)被去除,这样网络输出的特征图大小不再受输入图像大小限制,使得网络能够处理任意大小的图像。

  在传统的卷积神经网络中,通常使用最后的全连接层来输出一个固定大小的特征向量,但是在 FCN 中,为了使输出能够适应输入图像的大小,使用了上采样技术。通常使用上采样技术转置卷积(transposed convolution)或者双线性插值(bilinear interpolation),将低分辨率的特征图恢复到原始输入图像的分辨率大小,不同的上采样倍率也划分了不同类型的 FCN

  通过将不同层级的特征图进行融合,生成最终的语义分割结果。这种融合可以通过简单的连接或者更复杂的方法(如 skip connections)来实现。最后,对每个像素进行分类,以确定其所属的类别。这个阶段的实现取决于具体的任务,可以使用 softmax sigmoid 激活函数来获得每个像素点属于各个类别的概率。

  FCN-32S 是最简单的 FCN 变体。在此变体中,特征图由网络的最后一层直接上采样生成,因此上采样的倍率是 32 倍。通常会在 FC6 层增加卷积的 padding=3 以输出和 VGG16 Backbone 相同尺寸的特征图。注意,在 FC6、FC7 处理后,会使用一个卷积层将输出特征图的维度转为分类个数。FCN-32S 的上采样一般只采用双线性插值(冻结转置卷积的参数,减少计算量),因为在该倍率下转置卷积的效果不明显。

 

  FCN-16S 在 FCN-32S 的基础上增加了一步跳跃连接(skip connection),以提高语义分割的精度。这个变体中,下采样 pool41/16 的特征图被加入到上采样后的特征图中,以提供更多的细节信息。

  FCN-8S 是在 FCN-16S 的基础上再次增加了一步跳跃连接,这次是下采样 pool3 1/8 的特征图被加入到上采样后的特征图中。

  最后使用交叉熵损失函数计算 loss 以更新模型参数。

2 双线性插值

  双线性插值是一种常用的图像处理技术,用于在离散网格上对图像进行平滑且连续的放大或缩小。在深度学习中,特别是在全卷积网络(FCN)等模型中,双线性插值经常用于上采样操作,以将特征图从低分辨率插值到高分辨率。插值是指根据已知数据点的数值,在其之间估算其他点的值的一种方法。双线性插值是插值方法的一种,用于在给定四个邻近的网格点的值的情况下估算两个坐标轴上任意点的值。用一个简单的例子来描述双线性插值进行上采样操作的过程。

  假设有一张 3x3 大小的图片,其中的每个像素单位长为1,像素中心用红点表示。要将其放大到 5x5 大小,并确定每一个像素的值(蓝点)。首先,需要将这个 5x5 大小的图片与 3x3 大小的图片进行对齐。对齐的方法有两种,一种是角对齐,另一种是边对齐,具体展示如下:

  无论采用哪种对齐方式,第二步都是找出距离每一个目标像素(蓝点)最近的四个原图像素(红点),然后通过目标像素与原图像素的相对位置计算目标像素的值。放大一个目标像素来作为例子解释计算过程,观察可知,距离蓝点最近的四个红点分别为 v1、v2、v3 和 v4。红点间的距离为1,所以蓝点距离四条边的值可以定义为 a、1-a、b 和 1-b。至此可以先计算出蓝点在水平方向上的两个插值 p1 和 p2,计算公式为 p1=(1-b)*v1+b*v2,p2=(1-b)*v3+b*v4。注意,距离越近,权重越大,即与更大的距离相乘。最后,在垂直方向上进行插值即得到目标像素的值 p=(1-a)*p1+a*p2。

双线性插值代码:

def bilinear_interpolation(image, out_height, out_width, corner_align=False):
    # 获取输入图像
    height, width = image.shape[:2]

    # 创建输出图像
    output_image = np.zeros((out_height, out_width), dtype=np.float32)

    # 计算 x、y 轴缩放因子
    scale_x_corner = float(width - 1) / (out_width - 1)  # (3-1)/(5-1)=0.5
    scale_y_corner = float(height - 1) / (out_height - 1)  # (3-1)/(5-1)=0.5

    scale_x = float(width) / out_width  # 3 / 5 = 0.6
    scale_y = float(height) / out_height  # 3 / 5 = 0.6

    # 遍历输出图像的每个像素,分别计算其在输入图像中最近的四个像素的坐标,然后按照加权值计算当前像素的像素值
    for out_y in range(out_height):
        for out_x in range(out_width):
            if corner_align:
                # 计算当前像素在输入图像中的位置
                x = out_x * scale_x_corner  # 1 * 0.5 = 0.5
                y = out_y * scale_y_corner  # 1 * 0.5 = 0.5
            else:
                x = (out_x + 0.5) * scale_x - 0.5  # 1 * 0.5 = -0.2
                y = (out_y + 0.5) * scale_y - 0.5  # 1 * 0.5 = -0.2
                x = np.clip(x, 0, width - 1)  # 0
                y = np.clip(y, 0, height - 1)  # 0

            # 计算当前像素在输入图像中最近的四个像素的坐标
            x0, y0 = int(x), int(y)
            x1, y1 = x0 + 1, y0 + 1

            # 对原图像边缘进行特殊处理
            if x0 == width - 1:
                x0 = width - 2
                x1 = width - 1
            if y0 == height - 1:
                x0 = height - 2
                x1 = height - 1

            xd = x - x0
            yd = y - y0
            p00 = image[y0, x0]
            p01 = image[y0, x1]
            p10 = image[y1, x0]
            p11 = image[y1, x1]
            x0y = p01 * xd + (1 - xd) * p00
            x1y = p11 * xd + (1 - xd) * p10
            output_image[out_y, out_x] = x1y * yd + (1 - yd) * x0y

    return output_image

3 膨胀卷积

  膨胀卷积(Dilated Convolution),也称为空洞卷积(Atrous Convolution),是卷积神经网络(CNN)中常用的一种卷积操作。相比于传统的卷积操作,膨胀卷积在保持特征图尺寸的同时增加了感受野的大小。这种技术被广泛应用于各种计算机视觉任务中,如语义分割、图像超分辨率、视频分析等。

  在传统的卷积操作中,我们以固定的卷积核大小(通常是 3x3 或 5x5)在输入特征图上滑动,从而生成输出特征图。例如,一个 3x3 的卷积核应用到一个特征图上如下所示:

输入特征图:
| 1  2  3  4  5 |
| 6  7  8  9  10|
| 11 12 13 14 15|
| 16 17 18 19 20|
| 21 22 23 24 25|

卷积核:
| a  b  c |
| d  e  f |
| g  h  i |

输出特征图:
| p1 p2 p3 |
| p4 p5 p6 |
| p7 p8 p9 |

在这个示例中,步长为1,输出特征图中的每个位置(例如,p1, p2, p3, …)都是通过卷积核与对应输入图像的区域进行点乘并求和得到的。这个区域的大小由卷积核的大小确定。

  膨胀卷积通过在卷积核的内部引入一个可调参数,通常称为膨胀率(Dilation Rate),来扩展卷积核的感受野。膨胀率决定了在卷积核中插入的零值的间距。在每个方向上,膨胀率值决定了在卷积核中取样点之间的空白距离。

输入特征图:
| 1  2  3  4  5 |
| 6  7  8  9  10|
| 11 12 13 14 15|
| 16 17 18 19 20|
| 21 22 23 24 25|

填充特征图(padding为2):
| 0  0  0  0  0  0  0  0  0 |
| 0  0  0  0  0  0  0  0  0 |
| 0  0  1  2  3  4  5  0  0 |
| 0  0  6  7  8  9  10 0  0 |
| 0  0  11 12 13 14 15 0  0 |
| 0  0  16 17 18 19 20 0  0 |
| 0  0  21 22 23 24 25 0  0 |
| 0  0  0  0  0  0  0  0  0 |
| 0  0  0  0  0  0  0  0  0 |


膨胀卷积核(膨胀率为2):
| a  0  b  0  c |
| 0  0  0  0  0 |
| d  0  e  0  f |
| 0  0  0  0  0 |
| g  0  h  0  i |

输出特征图:
| p1  p2  p3  p4  p5  p6  |
| p7  p8  p9  p10 p11 p12 |
| p13 p14 p15 p16 p17 p18 |
| p19 p20 p21 p22 p23 p24 |
| p25 p26 p27 p28 p29 p30 |

在这个示例中,膨胀率为2,步长为1,因此在水平和垂直方向上插入了一个间隔。这意味着卷积核的感受野变大了,但输出特征图的尺寸却保持不变。输出特征图中的每个位置仍然是通过卷积核与对应输入图像的区域进行点乘并求和得到的。

  膨胀率决定了卷积核内部的采样间隔。具体来说,膨胀率为 r 的卷积核的感受野大小为 (2r + 1) x (2r + 1)。因此,通过增加膨胀率,我们可以有效地增加卷积核的感受野,从而捕获更广阔范围内的上下文信息,而无需增加参数或降低分辨率。

膨胀卷积的优点:

① 更大的感受野:膨胀卷积可以通过增加膨胀率来实现更大的感受野,以捕获更广泛的上下文信息。

② 保持特征图尺寸:与传统卷积相比,膨胀卷积可以在不降低分辨率的情况下增加感受野大小。

3.1 gridding effect

  在使用膨胀卷积时,一个常见的问题是“gridding effect”(格点效应)。这种效应发生的原因是膨胀卷积的间隔性导致输入图像的某些区域被重复采样,而相邻区域则可能完全被忽略,从而在输出特征图中形成了类似网格的模式。这种间断性的采样结果导致模型在空间连续性上表现不佳,尤其是在处理需要高空间一致性的任务时,如图像分割。

  上图中的每一个卷积层都使用了相同的膨胀率 r=2,感受野的范围虽然够大(13x13),但是其中存在相当一部分数据完全没有被用于计算,即产生了 gridding effect 现象。如果按 r=1,r=2,r=3,递增的膨胀率进行卷积,则结果如下,在感受野的范围同样为 13x13 的基础上运用到了每一个数据进行计算,很明显对 gridding effect 现象有一定的抑制作用。

  由此可见,不同层的膨胀率选择非常重要。通过实验,对于不同层的膨胀率选择通常基于如下标准:

所以,当 kernel size = 3 时,三层卷积的膨胀率应该为 [1,2,5],而非 [1,2,9],用具体的实验结果也能证明这一点:

[1,2,5]的感受野情况:

[1,2,9]的感受野情况:

此外,标准中还建议,所选膨胀率的公约数最好为1,否则同样会存在 gridding effect,例如 [2,4,8],公约数为2,感受野情况如下所示。而且当卷积层大于3层时,最好采用“锯齿状”的膨胀率,例如 [1,2,5,1,2,5]。

上述的标准也称为 HDC

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1630223.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity | 优化专项-包体 | 字体

1. 字体包体占用 常用汉字字体文件大小通常在 10M~12M 左右,大概包含常见汉字 3.5w 个。我国汉字有大约将近十万个,全字库的大小对于游戏包体是灾难性的 在小游戏中,即使是常见汉字,大小也足以影响小游戏总包体,进而…

深入探索计算机视觉:高级主题与前沿应用的全面解析

引言 计算机视觉,作为人工智能领域的一个重要分支,旨在让计算机能够“看”懂世界,理解和解释视觉场景。随着深度学习技术的迅猛发展,计算机视觉已经在许多领域取得了显著的进展,如自动驾驶、安防监控、医疗诊断等。在…

vue使用source map调试

一、开发环境 1、开启配置:devtool: ‘eval-source-map’,跟mode配置平级 效果就是控制台报错行数和源码行数完全一致 二、生产环境 1、在生产环境下,一般要关闭source map,如果只想定位报错的具体行数,且不想暴露源码。此时可…

《苍穹外卖》Day11部分知识点记录(数据统计——图像报表)

一、Apache ECharts 介绍 Apache ECharts是一款基于javascript的数据可视化图标库,提供直观、生动、可交互、可个性化定制的数据可视化图表。 官网地址:https://echarts.apache.org/zh/index.html 效果展示 柱形图饼图折线图 入门案例 1. 在 echart…

CAS机制(Compare And Swap)源码解读与三大问题

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java源码解读-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 目录 1. 前言 2. 原子性问题 3. 乐观锁与悲观锁 4. CAS操作 5. CAS算法带来的…

【算法】组合回溯专题

组合总数 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被…

MySQL-多表查询-练习

练习 1.写一个查询显示所有雇员的 last name、department id、anddepartment name。 SELECT e.LAST_NAME,e.DEPARTMENT_ID,d.DEPARTMENT_NAME FROM employees e,departments d WHERE e.DEPARTMENT_ID d.DEPARTMENT_ID;2.创建一个在部门 80 中的所有工作岗位的唯一列表&#x…

2024长三角快递物流展:科技激荡,行业焕发新活力

7月8日,杭州将迎来快递物流科技盛宴,这是一年一度的行业盛会,吸引了全球领先的快递物流企业和创新技术汇聚一堂。届时,会展中心将全方位展示快递物流及供应链、分拣系统、输送设备、智能搬运、智能仓储、自动识别、无人车、AGV机器…

nginx修改http为https

Linux运维工具-ywtool 目录 一. 获取 SSL 证书1.安装openssl2.自签名证书 二.安装SSL证书三.配置Nginx支持HTTPS四.重启nginx 一. 获取 SSL 证书 SSL/TLS证书是用来验证服务器身份和提供一个安全的连接通道的 获取SSL/TLS证书有几种方法 1.购买域名,购买SSL证书 2.自签名证书…

测试基础 学习测试你必须要知道的基础知识

1.认识测试 在学习测试之前,我们需要明白以下几点 1.什么是测试 2.测试的岗位有哪些 3.测试开发和开发之间的区别 4.优秀的测试人员需要有哪些品质 我们大概说一说 其实生活中处处有测试 我们试衣服 我们在买手机之前先看手机功能符不符合需求 这些都是测试 测试主要就是为了发…

Java | Leetcode Java题解之第46题全排列

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> permute(int[] nums) {List<List<Integer>> res new ArrayList<List<Integer>>();List<Integer> output new ArrayList<Integer>();for (i…

保护企业财务报告,这款防泄密软件做得到!

在日益增长的金融欺诈和网络攻击中&#xff0c;保护企业的财务报告是维持公司声誉和稳定运营的关键。财务报告包含了公司的敏感信息&#xff0c;如利润、收入、财务结构等&#xff0c;一旦泄露&#xff0c;可能会对公司造成不利影响。华企盾DSC数据防泄密系统为企业提供了全面的…

第58篇:创建Nios II工程之Hello_World<四>

Q&#xff1a;最后我们在DE2-115开发板上演示运行Hello_World程序。 A&#xff1a;先烧录编译Quartus硬件工程时生成的.sof文件&#xff0c;在FPGA上成功配置Nios II系统&#xff1b;然后在Nios II Eclipse窗口右键点击工程名hello_world&#xff0c;选择Run As-->Nios II …

决策树模型示例

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个决策树模型pytorch程序,最后打印5个条件分别的影响力。 一 决策树模型是一种非参数监督学习方法&#xff0c;主要…

SpringMVC进阶(数据格式化以及数据校验)

文章目录 1.数据格式化1.基本介绍1.基本说明2.环境搭建 2.基本数据类型和字符串转换1.需求分析2.环境搭建1.data_valid.jsp首页面2.Monster.java封装请求信息3.MonsterHandler.java处理请求信息4.monster_addUI.jsp添加妖怪界面5.单元测试 3.保存妖怪信息1.MonsterHandler.java…

【面经】汇总

面经 Java基础集合都有哪些面向对象的三大特点ArrayList和LinkedList的区别&#xff1f;ArrayList底层扩容是怎么实现的&#xff1f;讲一讲HashMap、以及put方法的过程讲一讲HashMap的扩容过程Hashmap为什么要用红黑树而不用其他的树&#xff1f;Java8新特性有哪些LoadFactor负…

ASP.NET企业投资价值分析系统

摘 要 本文将影响股票投资价值的宏观因素、行业因素、企业内部等诸多因素予以量化分析&#xff0c;对钢铁板块和汽车板块各上市公司进行综合评估&#xff0c;为广大股民的投资方向和资金安全提供了有力的支持。本文还阐述了企业投资价值分析的必要性&#xff0c;说明了企业投…

【Vision Pro应用】分享一个收集Apple Vision Pro 应用的网站

您是否也觉得 Vision Pro 应用程序商店经常一遍又一遍地展示相同的几个 VisionOS 应用程序?许多有趣、好玩的应用程序似乎消失得无影无踪,让人很难发现它们。为了帮助大家更轻松地探索和体验最新、最有趣的 Vision Pro 应用程序,这里分享一个网站https://www.findvisionapp.…

通过Cmake官网下载.gz文件安装最新版本的CMAKE、适用于debian

1.前往官网下载最新版本debian https://cmake.org/download/ 2.选他 3. 通过XFTP传输到服务器 4. 解压文件 #cd 进入对应目录&#xff0c;然后执行下面命令解压 $ tar -zxvf cmake-3.29.2.tar.gz5.执行这个文件 $ ./bootstrap6.完成之后再执行这个 $ make7.然后&#xff…

Java高阶私房菜:JVM垃圾回收机制及算法原理探究

目录 垃圾回收机制 什么是垃圾回收机制 JVM的自动垃圾回收机制 垃圾回收机制的关键知识点 初步了解判断方法-引用计数法 GCRoot和可达性分析算法 什么是可达性分析算法 什么是GC Root 对象回收的关键知识点 标记对象可回收就一定会被回收吗&#xff1f; 可达性分析算…