当前位置: 首页 > news >正文

【深度学习】论文笔记:空间变换网络(Spatial Transformer Networks)

在这里插入图片描述

  • 博主简介:努力学习的22级计算机科学与技术本科生一枚🌸
  • 博主主页: @Yaoyao2024
  • 往期回顾: 【机器学习】有监督学习·由浅入深讲解分类算法·Fisher算法讲解
  • 每日一言🌼: 今天不想跑,所以才去跑,这才是长距离者的思维。
    ——村上春树

本文是对Google DeepMind 团队2015年发表的空间变换网络STN的详细讲解,作为初学者也是参考了很多博客,都在本文末尾给出,感谢前辈们的努力。

空间变换网络(Spatial Transformer Networks,简称STN)是一种深度学习模型,旨在增强网络对几何变换的适应能力。STN是由Max Jaderberg等人在2015年提出的,其核心思想是在传统的卷积神经网络(CNN)中嵌入一个可学习的模块,该模块能够显式地对输入图像进行空间变换,从而使得网络能够对输入图像的几何变形具有更好的适应性。STN的引入使得网络能够自动进行图像的校正,例如旋转、缩放、剪切等,这在很多视觉任务中是非常有用的,如图像识别、目标检测和图像分割等。

一、为什么提出(Why)

  1. 一个理想中的模型:我们希望鲁棒的图像处理模型具有空间不变性,当目标发生某种转化后,模型依然能给出同样的正确的结果

  2. 什么是空间不变性:举例来说,如下图所示,假设一个模型能准确把左图中的人物分类为凉宫春日,当这个目标做了放大、旋转、平移后,模型仍然能够正确分类,我们就说这个模型在这个任务上具有尺度不变性,旋转不变性,平移不变性

    在这里插入图片描述

  3. CNN在这方面的能力是不足的:maxpooling的机制给了CNN一点点这样的能力,当目标在池化单元内任意变换的话,激活的值可能是相同的,这就带来了一点点的不变性。但是池化单元一般都很小(一般是2*2),只有在深层的时候特征被处理成很小的feature map的时候这种情况才会发生

  4. Spatial Transformer:本文提出的空间变换网络STN(Spatial Transformer Networks)STN可以使模型学习平移、缩放、旋转和更通用的扭曲的不变性。(二维空间变换网络)

二、STN是什么(What)

  1. STN对feature map(包括输入图像)进行空间变换,输出一张新的图像。
  2. 我们希望STN对feature map进行变换后能把图像纠正到成理想的图像,然后丢进NN去识别,举例来说,如下图所示,输入模型的图像可能是摆着各种姿势,摆在不同位置的凉宫春日,我们希望STN把它纠正到图像的正中央,放大,占满整个屏幕,然后再丢进CNN去识别。
  3. 这个网络可以作为单独的模块,可以在CNN的任何地方插入(即插即用),所以STN的输入不止是输入图像,可以是CNN中间层的feature map
    在这里插入图片描述

三、STN是怎么做的(How)

STN可以通过为每个输入样本生成适当的变换来主动对图像(或特征图)进行空间变换。然后在整个特征图上(非局部)执行变换,并且可以包括缩放、裁剪、旋转以及非刚性变形。这使得包含空间变换器的网络不仅可以选择图像中最相关(注意力)的区域,还可以将这些区域转换为规范的预期姿势,以简化后续层中的推理。

在这里插入图片描述

如上图所示,STN的输入为 U U U,输出为 V V V,因为输入可能是中间层的feature map,所以画成了立方体(多channel),STN主要分为下述三个步骤

  1. 定位网络(Localization Network):这一部分是STN的核心,其任务是学习输入图像的空间变换参数。定位网络可以是任意的网络结构,它接受输入图像,并输出空间变换所需的参数。这些参数定义了一个变换矩阵,用于调整图像的空间位置。(是一个自己定义的网络,它输入 U U U,输出变化参数 Θ \Theta Θ,这个参数用来映射 U U U V V V的坐标关系)。
  2. 网格生成器(Grid Generator):接收定位网络输出的变换参数,并生成一个对应于输出图像的坐标网格。这个坐标网格对应于输入图像中的每一个像素位置。根据 V V V中的坐标点和变化参数 Θ \Theta Θ,计算出 U U U中的坐标点。这里是因为 V V V的大小是自己先定义好的,当然可以得到 V V V的所有坐标点,而填充 V V V 中每个坐标点的像素值的时候,要从 U U U中去取,所以根据 V V V中每个坐标点和变化参数 Θ \Theta Θ进行运算,得到一个坐标。在sampler中就是根据这个坐标去 U U U中找到像素值,这样子来填充 V V V
  3. Sampler:要做的是填充 V V V,根据Grid generator得到的一系列坐标和原图 U U U(因为像素值要从 U U U中取)来填充,因为计算出来的坐标可能为小数,要用另外的方法来填充,比如双线性插值。从输入图像中采样像素来产生变换后的输出图像。这一步骤确保了图像的空间变换是可微分的,从而可以通过反向传播算法进行训练。

下面针对每个模块阐述一下

1、Localisation net

这个模块就是输入 U U U,输出一个变换参数 Θ \Theta Θ,那么这个 Θ \Theta Θ具体是指什么呢?

我们知道线性代数里,图像的平移,旋转和缩放都可以用矩阵运算来做

举例来说,如果想放大图像中的目标,可以这么运算,把(x,y)中的像素值填充到(x’,y’)上去,比如把原来(2,2)上的像素点,填充到(4,4)上去。
[ x ′ y ′ ] = [ 2 0 0 2 ] [ x y ] + [ 0 0 ] \begin{bmatrix}x^{'}\\y^{'}\end{bmatrix}=\begin{bmatrix}2&0\\0&2\end{bmatrix}\begin{bmatrix}x\\y\end{bmatrix}+\begin{bmatrix}0\\0\end{bmatrix} [xy]=[2002][xy]+[00]

如果想旋转图像中的目标,可以这么运算(可以在极坐标系中推出来,证明放到最后的附录)
[ x ′ y ′ ] = [ c o s Θ − s i n Θ s i n Θ c o s Θ ] [ x y ] + [ 0 0 ] \begin{bmatrix}x^{'}\\y^{'}\end{bmatrix}=\begin{bmatrix}cos\Theta&-sin\Theta\\sin\Theta&cos\Theta\end{bmatrix}\begin{bmatrix}x\\y\end{bmatrix}+\begin{bmatrix}0\\0\end{bmatrix} [xy]=[cosΘsinΘsinΘcosΘ][xy]+[00]

这些都是属于仿射变换(affine transformation)

[ x ′ y ′ ] = [ a b c d ] [ x y ] + [ e f ] \begin{bmatrix}x^{^{\prime}}\\y^{^{\prime}}\end{bmatrix}=\begin{bmatrix}a&b\\c&d\end{bmatrix}\begin{bmatrix}x\\y\end{bmatrix}+\begin{bmatrix}e\\f\end{bmatrix} [xy]=[acbd][xy]+[ef]

在仿射变化中,变化参数就是这6个变量, Θ = { a , b , c , d , e , f } (此 Θ 跟上述旋转变化里的角度 Θ 无关) \Theta=\{a,b,c,d,e,f\}\text{(此}\Theta\text{跟上述旋转变化里的角度}\Theta\text{无关)} Θ={a,b,c,d,e,f}(Θ跟上述旋转变化里的角度Θ无关)

这6个变量就是用来映射输入图和输出图之间的坐标点的关系的,我们在第二步grid generator就要根据这个变化参数,来获取原图的坐标点

总结如下:

  1. 功能:定位网络的主要任务是预测空间变换的参数。根据输入图像,这个网络会输出一组参数,这些参数定义了一个空间变换,可以是平移、旋转、缩放等或者更复杂的仿射变换或者非线性变换。
  2. 结构:定位网络通常是一个小型的卷积神经网络全连接网络,其具体结构可以根据任务的复杂度和输入数据的特性来定制。网络的输出大小是固定的,对应于特定变换所需的参数数量。

2、Grid generator

有了第一步的变化参数,这一步是做个矩阵运算,这个运算是 以目标图 V V V的所有坐标点为自变量,以为参数做一个矩阵运算,得到输入图 U U U的坐标点

( x i s y i s ) = Θ ( x i t y i t 1 ) = [ Θ 11 Θ 12 Θ 13 Θ 21 Θ 22 Θ 23 ] ( x i t y i t 1 ) \begin{pmatrix}x_i^s\\y_i^s\end{pmatrix}=\Theta\begin{pmatrix}x_i^t\\y_i^t\\1\end{pmatrix}=\begin{bmatrix}\Theta_{11}&\Theta_{12}&\Theta_{13}\\\Theta_{21}&\Theta_{22}&\Theta_{23}\end{bmatrix}\begin{pmatrix}x_i^t\\y_i^t\\1\end{pmatrix} (xisyis)=Θ xityit1 =[Θ11Θ21Θ12Θ22Θ13Θ23] xityit1

其中 ( x i t , y i ) 记为输出图 V 中的第 i 个坐标点, V 中的长宽可以和 U 不一样,自己定义的,所以这里用 i 来标识第几个坐标点 ( x i s , y i ) {(x_{i}{t},y_{i})} 记 为 输 出 图 V 中 的 第 i 个 坐 标 点 , V 中 的 长 宽 可 以 和 U 不 一 样 , 自 己 定 义 的 , 所 以 这 里 用 i 来 标 识 第 几 个 坐 标 点 {(x_{i}{s},y_{i})} (xit,yi)记为输出图V中的第i个坐标点,V中的长宽可以和U不一样,自己定义的,所以这里用i来标识第几个坐标点(xis,yi)

  • 功能:网格生成器接收定位网络预测的变换参数,并生成一个坐标网格,该网格代表了输入图像中每个像素映射到输出图像中的新位置
  • 原理:对于每个输出图像的像素位置,网格生成器使用变换参数来计算对应的输入图像中的坐标。这一过程通常涉及到矩阵运算,用于实现平移、旋转、缩放等仿射变换。
    在这里插入图片描述

3、Sampler

由于在第二步计算出了V中每个点对应到U的坐标点,在这一步就可以直接根据V的坐标点取得对应到U中坐标点的像素值来进行填充,而不需要经过矩阵运算。需要注意的是,填充并不是直接填充,首先计算出来的坐标可能是小数,要处理一下,其次填充的时候往往要考虑周围的其它像素值。填充根据的公式如下。

V i = ∑ n ∑ m U n m ∗ k ( x i s − m ; ϕ x ) ∗ k ( y i s − n ; ϕ y ) V_i=\sum_n\sum_mU_{nm}*k(x_i^s-m;\phi_x)*k(y_i^s-n;\phi_y) Vi=nmUnmk(xism;ϕx)k(yisn;ϕy)

举例来说,我要填充目标图V中的(2,2)这个点的像素值,经过以下计算得到(1.6,2.4)

( x i s y i s ) = [ Θ 11 Θ 12 Θ 13 Θ 21 Θ 22 Θ 23 ] ( x i t y i t 1 ) ( 1.6 2.4 ) = [ 0 0.5 0.6 1 0 0.4 ] ( 2 2 1 ) \begin{gathered}\begin{pmatrix}x_i^s\\y_i^s\end{pmatrix}=\begin{bmatrix}\Theta_{11}&\Theta_{12}&\Theta_{13}\\\Theta_{21}&\Theta_{22}&\Theta_{23}\end{bmatrix}\begin{pmatrix}x_i^t\\y_i^t\\1\end{pmatrix}\\\begin{pmatrix}1.6\\2.4\end{pmatrix}=\begin{bmatrix}0&0.5&0.6\\1&0&0.4\end{bmatrix}\begin{pmatrix}2\\2\\1\end{pmatrix}\end{gathered} (xisyis)=[Θ11Θ21Θ12Θ22Θ13Θ23] xityit1 (1.62.4)=[010.500.60.4] 221

如果四舍五入后直接填充,则难以做梯度下降。

我们知道做梯度下降时,梯度的表现就是权重发生一点点变化的时候,输出的变化会如何。

如果用四舍五入后直接填充,那么(1.6,2.4)四舍五入后变成(2,2)当 Θ \Theta Θ(我们求导的时候是需要对 Θ \Theta Θ求导的)有一点点变化的时候,(1.6,2.4)可能变成了(1.9,2.1)四舍五入后还是变成(2,2),输出并没有变化,对 Θ \Theta Θ的梯度没有改变,这个时候没法用梯度下降来优化 Θ \Theta Θ

如果采用上面双线性插值的公式来填充,在这个例子里就会考虑(2,2)周围的四个点来填充,这样子,当 Θ \Theta Θ有一点点变化的时,式子的输出就会有变化,因为 ( x i s , y i ) (x_{i}{s},y_{i}) (xis,yi)的变化会引起V的变化。注意下式中U的下标,第一个下标是纵坐标,第二个下标才是横坐标。

V = U 21 ( 1 − 0.6 ) ( 1 − 0.4 ) + U 22 ( 1 − 0.4 ) ( 1 − 0.4 ) + U 31 ( 1 − 0.6 ) ( 1 − 0.6 ) + U 32 ( 1 − 0.4 ) ( 1 − 0.6 ) V=U_{21}(1-0.6)(1-0.4)+U_{22}(1-0.4)(1-0.4)+U_{31}(1-0.6)(1-0.6)+U_{32}(1-0.4)(1-0.6) V=U21(10.6)(10.4)+U22(10.4)(10.4)+U31(10.6)(10.6)+U32(10.4)(10.6)

4、STN小结

简单总结一下,如下图所示
在这里插入图片描述

  1. Localization net根据输入图,计算得到一个Θ
  2. Grid generator根据输出图的坐标点和Θ,计算出输入图的坐标点,举例来说想知道输出图上(2,2)应该填充什么坐标点,则跟Θ 运算,得到(1.6,2.4)
  3. Sampler根据自己定义的填充规则(一般用双线性插值)来填充,比如(2,2)坐标对应到输入图上的坐标为(1.6,2.4),那么就要根据输入图上(1.6,2.4)周围的四个坐标点(1,2),(1,3),(2,2),(2,3)的像素值来填充。

四、STN模块的pytorch实现

这里我们假设Mnist数据集作为网络输入:

(1)首先定义Localisation net特征提取部分,为两个Conv层后接Maxpool和Relu操作:

在这里插入图片描述
(2)定义Localisation net的变换参数θ回归部分,为两层全连接层内接Relu:
在这里插入图片描述
(3)在nn.module的继承类中定义完整的STN模块操作:

在这里插入图片描述

五、空间变换网络的实际应用

在这里插入图片描述

1、STN作为网络的第一层

在这里插入图片描述

2、STN插入CNN 的中间层

在这里插入图片描述

六、评价

思想非常巧妙,因为卷积神经网络中的池化层(pooling layer)直接用一些max pooling 或者average pooling 的方法,将图片信息压缩,减少运算量提升准确率。

作者认为之前pooling的方法太过于暴力,直接将信息合并会导致关键信息无法识别出来,所以提出了一个叫空间转换器(spatial transformer)的模块,将图片中的的空间域信息做对应的空间变换,从而能将关键的信息提取出来。

Unlike pooling layers, where the receptive fields are fixed and local, the spatial transformer module is a dynamic mechanism that can actively spatially transform an image (or a feature map) by producing an appropriate transformation for each input sample.

在这里插入图片描述
空间转换器模型直观的实验图:

(a)列是原始的图片信息,其中第一个手写数字7没有做任何变换,第二个手写数字5,做了一定的旋转变化,而第三个手写数字6,加上了一些噪声信号;这些变化都是随机的
(b)列中的彩色边框是学习到的spatial transformer的框盒(bounding box),每一个框盒其实就是对应图片学习出来的一个spatial transformer

🪧©列中是通过spatial transformer转换之后的特征图,可以看出7的关键区域被选择出来,5被旋转成为了正向的图片,6的噪声信息没有被识别进入。

(d)列最终可以通过这些转换后的特征图来预测出中手写数字的数值。

🌱spatial transformer其实就是注意力机制的实现,因为训练出的spatial transformer能够找出图片信息中需要被关注的区域,同时这个transformer又能够具有旋转、缩放变换的功能,这样图片局部的重要信息能够通过变换而被框盒提取出来。🌱

参考

  • 原文链接:https://www.cnblogs.com/liaohuiqiang/p/9226335.html
  • https://blog.csdn.net/qq_43700729/article/details/136601998
  • 李弘毅讲 STN 网络:https://www.youtube.com/watch?v=SoCywZ1hZak
  • 知乎:https://zhuanlan.zhihu.com/p/41738716
  • https://blog.csdn.net/Rosemary_tu/article/details/84069878
  • https://ddelephant.blog.csdn.net/article/details/111303416?fromshare=blogdetail&sharetype=blogdetail&sharerId=111303416&sharerefer=PC&sharesource=Yaoyao2024&sharefrom=from_link

本人能力有限,上述内容如有理解不当的地方,欢迎与我讨论!

相关文章:

【深度学习】论文笔记:空间变换网络(Spatial Transformer Networks)

博主简介:努力学习的22级计算机科学与技术本科生一枚🌸博主主页: Yaoyao2024往期回顾: 【机器学习】有监督学习由浅入深讲解分类算法Fisher算法讲解每日一言🌼: 今天不想跑,所以才去跑,这才是长…...

Charles抓包_Android

1.下载地址 2.破解方法 3.安卓调试办法 查看官方文档,Android N之后抓包要声明App可用User目录下的CA证书 3.1.在Proxy下进行以下设置(路径Proxy->Proxy Settings) 3.1.1.不抓包Windows,即不勾选此项,免得打输出不…...

【MATLAB源码-第204期】基于matlab的语音降噪算法对比仿真,谱减法、维纳滤波法、自适应滤波法;参数可调。

操作环境: MATLAB 2022a 1、算法描述 语音降噪技术的目的是改善语音信号的质量,通过减少或消除背景噪声,使得语音更清晰,便于听者理解或进一步的语音处理任务,如语音识别和语音通讯。在许多实际应用中,如…...

Scala的包及其导入

//1.单个导入 //import com.sala02.A //import com.sala02.B //2.导入多个类 //import com.sala02.{A,B} //3.导入一个包下的所有类:包名._ //import com.sala02._ //4.导入一个包中的类,给他改个名字 //格式:import 包名.{原来的名字 > 新…...

deepfm模型实现招聘职位推荐算法

项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…...

编程之路:蓝桥杯备赛指南

文章目录 一、蓝桥杯的起源与发展二、比赛的目的与意义三、比赛内容与形式四、比赛前的准备五、获奖与激励六、蓝桥杯的影响力七、蓝桥杯比赛注意事项详解使用Dev-C的注意事项 一、蓝桥杯的起源与发展 蓝桥杯全国软件和信息技术专业人才大赛,简称蓝桥杯&#xff0c…...

Android 15 在状态栏时间中显示秒数

这是更新后的博客草稿,关于在Android 15状态栏中显示秒数的实现: 在Android 15状态栏中显示秒数 在Android 15中,您可以通过两种方式在状态栏中显示秒数:使用ADB命令或修改系统源代码。下面详细介绍这两种方法。 方法一:通过ADB实现 您可以使用ADB(Android调试桥)命令…...

Flutter 鸿蒙next版本:自定义对话框与表单验证的动态反馈与错误处理

在现代移动应用开发中,用户体验是至关重要的一环。Flutter和鸿蒙操作系统(HarmonyOS)的结合,为开发者提供了一个强大的平台,以创建跨平台、高性能的应用程序。本文将探讨如何在Flutter与鸿蒙next版本中创建自定义对话框…...

Unreal Engine5中使用 Lyra框架

UE5系列文章目录 文章目录 UE5系列文章目录前言一、Lyra和AIS框架的区别二、下载官方Lyra游戏示例三、Lyra在动画蓝图中的使用 前言 Unreal Engine 5(UE5)提供了多种用于游戏开发的模板和框架,其中Lyra和AlS是两个不同的示例项目&#xff0c…...

Spring Security-02-Spring Security认证方式-HTTP基本认证、Form表单认证、HTTP摘要认证、前后端分离安全处理方案

Lison <dreamlison163.com>, v1.0.0, 2024.06.01 Spring Security-02-Spring Security认证方式-HTTP基本认证、Form表单认证、HTTP摘要认证、前后端分离安全处理方案 文章目录 Spring Security-02-Spring Security认证方式-HTTP基本认证、Form表单认证、HTTP摘要认证、…...

【scikit-learn 1.2版本后】sklearn.datasets中load_boston报错 使用 fetch_openml 函数来加载波士顿房价

ImportError: load_boston has been removed from scikit-learn since version 1.2. 由于 load_boston 已经在 scikit-learn 1.2 版本中被移除&#xff0c;需要使用 fetch_openml 函数来加载波士顿房价数据集。 # 导入sklearn数据集模块 from sklearn import datasets # 导入波…...

vxe-table v4.8+ 与 v3.10+ 导出 xlsx、支持导出合并、设置样式、宽高、边框、字体、背景、超链接、图片的详细介绍,一篇就够了

Vxe UI vue vxe-table v4.8 与 v3.10 导出 xlsx、支持导出合并、设置样式、宽高、边框、字体、背景、超链接、图片等、所有常用的 Excel 格式都能自定义&#xff0c;使用非常简单&#xff0c;纯前端实现复杂的导出。 安装插件 npm install vxe-pc-ui4.2.39 vxe-table4.8.0 vx…...

江协科技STM32学习- P36 SPI通信外设

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…...

【大数据】ClickHouse常见的表引擎及建表语法

ClickHouse 中最强大的表引擎当属 MergeTree &#xff08;合并树&#xff09;引擎及该系列&#xff08;*MergeTree&#xff09;中的其他引擎。接下来我们就仔细了解下MergeTree 及该系列的其他引擎的使用场景及建表语法。 MergeTree MergeTree 系列的引擎被设计用于插入极大量…...

explain执行计划分析 ref_

这里写目录标题 什么是ExplainExplain命令扩展explain extendedexplain partitions 两点重要提示本文示例使用的数据库表Explain命令(关键字)explain简单示例explain结果列说明【id列】【select_type列】【table列】【type列】 【possible_keys列】【key列】【key_len列】【ref…...

网络学习/复习4传输层

1,0...

Notepad++ 更改字体大小和颜色

前言 在长时间编程或文本编辑过程中&#xff0c;合适的字体大小和颜色可以显著提高工作效率和减少眼睛疲劳。Notepad 提供了丰富的自定义选项&#xff0c;让你可以根据个人喜好调整编辑器的外观。 步骤详解 1. 更改字体大小 打开 Notepad 启动 Notepad 编辑器。 进入设置菜…...

基于SSM+小程序的宿舍管理系统(宿舍1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 本宿舍管理系统小程序有管理员和学生两个角色。 1、管理员功能有个人中心&#xff0c;公告信息管理&#xff0c;班级管理&#xff0c;学生管理&#xff0c;宿舍信息管理&#xff0c;宿舍…...

【案例分享】TeeChart 如何为人类绩效解决方案提供数据洞察

“过去二十年来&#xff0c;我们一直在使用 Steema Software 产品&#xff0c;尤其是 TeeChart&#xff0c;这是我们软件开发的基础部分。看到 TeeChart 在这段时间里不断发展、改进和增加功能&#xff0c;真是太棒了&#xff0c;这极大地增强了我们的产品。Steema 的客户和技术…...

细谈 Linux 中的多路复用epoll

大家好&#xff0c;我是 V 哥。在 Linux 中&#xff0c;epoll 是一种多路复用机制&#xff0c;用于高效地处理大量文件描述符&#xff08;file descriptor, FD&#xff09;事件。与传统的select和poll相比&#xff0c;epoll具有更高的性能和可扩展性&#xff0c;特别是在大规模…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...