RIS 系列 See-Through-Text Grouping for Referring Image Segmentation 论文阅读笔记

RIS 系列 See-Through-Text Grouping for Referring Image Segmentation 论文阅读笔记

  • 一、Abstract
  • 二、引言
  • 三、相关工作
    • 3.1 Semantic Segmentation and Embeddings
    • 3.2 Referring Expression Comprehension
    • 3.3 Referring Image Segmentation
  • 四、方法
    • 4.1 视觉表示
    • 4.2 文本表示
    • 4.3 See-through-Text Embedding
    • 4.4 Bottom-up STEP Heatmaps
    • 5.5 Top-down Heatmap Refinement
      • 细节
    • 4.6 训练
  • 五、实验
    • 5.1 消融研究
    • 5.2 与 SOTA 方法的比较
    • 5.3 定量分析
  • 六、结论

写在前面

  最近 Arxiv 没啥新东西了,找篇老的文章读读,看看它们之间的区别在哪里。

  • 论文地址:See-Through-Text Grouping for Referring Image Segmentation
  • 代码地址:源文未提供
  • 收录于:ICCV 2019
  • Ps:2023 年的最后一篇博文阅读笔记,我今年的 flag 也实现啦。主页 更多干货,欢迎关注呀,期待 6 千粉丝有你的参与呦~

一、Abstract

  基于传统的分组技术,本文提出一种方法来解决指代分割。提出的方法受循环卷积神经网络 convolutional-recurrent neural network (ConvRNN) 驱动,迭代地执行自顶向下的,对分割线索的自下而上的聚合过程。给定语言表达式,本文提出的方法学习去预测与其相关的每个像素,并驱动一个 See-through-Text Embedding Pixelwise (STEP) 热力图。通过学到的视觉-文本 co-embedding 得出像素水平的分割 masks。将热力图转化为一个精炼的热力图,ConvRNN 执行一个自上而下的近似。在精炼热力图辅助下,通过重新评估注意力分布来更新指代表达式的文本表示,然后计算一个新的 STEP 热力图作为 ConvRNN 的下一步输入。本文提出的方法泛化性强,无需来自其他 DNN 模型的目标检测结果,达到了 SOTA 的效果。

二、引言

  首先指出深度神经网络 deep neural networks (DNNs) 搭配大尺度图像/视频数据集的分割效果很好,而问题在于这些方法智能应用在那些预定义的目标类别上。接下来指出 RIS 的定义,应用。

  本文旨在解决 RIS 问题,其中自然语言指代表达式用于引导像素级图像 mask 的生成。接下来再水一下 RIS 任务的难度。之前的方法总是采用 “拼接-卷积” 的流程:先拼接视觉和语言特征,然后应用卷积操作在拼接后的特征上。然而在未考虑像素的视觉特征与自然语言描述相关联的情况下,效果不那么好。

  接下来是对 bottom-up 和 top-down 方法的介绍,bottom-up 方法关注于将像素分组到一致的区域,而 top-down 则是利用先验信息,例如目标表示去完成这一任务。本文提出的分割方法是一种综合利用 bottom-up 和 top-down 视角下的 DNN 方法。

  给定一个 RIS 训练集,先学习一种兼容性表示是可行的。例如那些在指代区域中的像素产生较高的兼容性得分,而不在指代区域内的分数较低。

在这里插入图片描述
  如上图所示,提出的方法包含一个收集像素分割线索的的 bottom-up 部分 See-through-Text Embedding Pixelwise (STEP),旨在衡量视觉-语言 co-embedding 的兼容性。另一方面,计算分类损失的 GT 信息可以教导模型以 top-down 的方式精炼每一步的 STEP 热力图。此外,设计了一个 ConvRNN 模型来迭代 bottom-up 和 top-down 的信息。方法优势总结如下:

  • 不同于 “拼接-卷积” 的处理,文本的方法显式地学习到一个视觉-文本 co-embedding,名为 See-through-Text Embedding Pixelwise (STEP) 来对齐两个模态;
  • 提出的 STEP 输出一个兼容性得分来衡量给定的指代表达式,反过来又关联相关像素到对应区域。其中的分组原则配备了传统的 bottom-up 方法用于图像分割;
  • 提出的 ConvRNN 以及合适的加权/注意力计划确保了迭代融合过程的成果,增强了最后的分割效果;
  • 提出的方法是一种标注的 DNN 方法,其结构包含 bottom-up 和 top-down 推理。在几大数据集上实现了 SOTA 的效果。

三、相关工作

3.1 Semantic Segmentation and Embeddings

  首先引入 Fully Convolutional Network (FCN),接下来是一些方法的介绍:DeepLab、DeViSE 等。本文的方法同样也计算注意力,但是在像素水平上而不是 box 水平上。

3.2 Referring Expression Comprehension

  首先是对 REC 的粗略介绍,接着举例一些方法,还提到了 VQA。通常采用 Recurrent
Neural Network (RNN) 来编码序列,此外还引入一种卷积的 RNN 来融合多个热力图。此外, embedding 的共同学习还广泛应用在 VQA 中。 不同之处:并非使用平均池化将每个区域转变为一个向量用于后续的 embedding,而是稠密地 embed 每个像素的视觉表示到一个公共空间。提出的 See-through-Text Embedding Pixelwise (STEP) 为后续的 top-down 分组提供了上下文信息。

3.3 Referring Image Segmentation

  这一部分就有点多了,首先指出谁是第一个引入 RIS 任务的,之后是一些方法的介绍,例如 MAttNet 等。

  总结下:大多数之前的方法遵循 “拼接-卷积” 的理念,而卷积层用于融合这些拼接的多模态特征用于生成最终的分割。相比之下,文本的方法显式地学习一个 co-embedding 用于衡量多模态特征的兼容性,最后对图像分割的 bottom-up 进行分组。此外,使用了一个 ConvRNN 整合 top-down 和 bottom-up 的分割线索。

四、方法


  如上图所示,给定一个输入图像 I I I 和语言表达式 S S S,这一任务旨在定位到由 S S S 指定的前景区域。提出的 ConvRNN 受 see-through-text grouping 所驱动。在每一时间步上,首先从特征提取模型的感受野特征图上决策出 I I I 的视觉表示。之后 bottom-up grouping 将 embeded 这两种表示到一个公共特征空间用于逐像素的衡量多模态间的兼容性且生成 STEP 热力图 Q t Q_t Qt,表明每个像素的前景概率。以 Q t Q_t Qt 为输入,ConvRNN 将其提炼为 P t P_t Pt,即为时间步 t t t 的指代分割概率图。建立在这些迭代过程之上,本文的方法最终得到一个分割结果 P T P_T PT

4.1 视觉表示

  采用 DeepLab ResNet-101v2,预训练在 Pscal VOC 上生成视觉表示。输入图像调整至 W × H W\times H W×H 尺寸,零填充,输出五个特征图 F ℓ , ℓ ∈ { 1 , 2 , 3 , 4 , 5 } F_{\ell},\ell\in\{1,2,3,4,5\} F,{1,2,3,4,5}。在每个 F ℓ F_{\ell} F 上直接拼接上一个 8 维度的空间坐标来增强空间位置表示信息。ConvRNN 执行从 t = 1 , … , T t=1,\ldots,T t=1,,T,其中 T = 5 × K T=5\times K T=5×K,表明 K K K 折部署。在每一时间步上,视觉表示由 F ℓ t F_{\ell_{t}} Ft 来确定,其中 ℓ t = 4   m o d   5 \ell_t = 4~mod~5 t=4 mod 5

  具体来说,设置输入图像尺寸 W = H = 320 W=H=320 W=H=320,因此特征图的尺寸分别是: F 1 = F 2 = 80 × 80 F_1=F_2=80\times80 F1=F2=80×80 F 3 = F 4 = F 5 = 40 × 40 F_3=F_4=F_5=40\times40 F3=F4=F5=40×40。添加 8 维空间坐标表示后,通道维度分别为 72 , 264 , 520 , 1032 , 2056 72,264,520,1032,2056 72,264,520,1032,2056

4.2 文本表示

  使用 S = { w 1 , w 2 , … , w n } S=\{w_1,w_2,\ldots,w_n\} S={w1,w2,,wn} 表示给定的语言表达式,而在时间步 t t t 上的文本表示为 s t \mathrm s_t st。使用预训练的 GloVe 模型来编码每个词 w i ∈ S w_i\in S wiS 到一个 300D 的词 embedding w i ∈ R 300 \mathrm{w}_i\in\mathbb{R}^{300} wiR300。输入的句子 S S S 然后通过 GloVe 词 embedding 进行表示。注意:若 I I I 中的区域变得明显时,则 S S S 的文本表示也会逐渐增强。至此,拼接 S S S 中的 n n n 个词 embedding,然后送入单层的双向 LSTM。令 h j \mathrm{h}_j hj 表示 biLSTM 中,第 j j j 个单词的隐藏层输出,令 v i \mathrm{v}_i vi 表示 I I I 中像素 i i i 位置的视觉特征向量, v i \mathrm{v}_i vi 的维度与 F ℓ t F_{\ell_t} Ft 有关。之后分别在每个隐藏状态的输出上附上一个 1 × 1 1\times1 1×1 卷积,以得到 h j ↦ h ~ j ∈ R 400 \mathbf{h}_j\mapsto\tilde{\mathbf{h}}_j\in\mathbb{R}^{400} hjh~jR400 v i ↦ v ~ i ∈ R 400 \mathbf{v}_i\mapsto\tilde{\mathbf{v}}_i\in\mathbb{R}^{400} viv~iR400。然后在每个时间步 t t t 上, S S S 的文本表示执行逐像素 co-embedding 如下:
s t = ∑ i ∈ I π { P t − 1 ( i ) } × ∑ j = 1 n π { ⟨ v ~ i , h ~ j ⟩ } h j \mathrm{s}_t=\sum_{i\in I}\pi\{P_{t-1}(i)\}\times\sum_{j=1}^n\pi\{\langle\tilde{\mathrm{v}}_i,\tilde{\mathrm{h}}_j\rangle\}\mathrm{h}_j st=iIπ{Pt1(i)}×j=1nπ{⟨v~i,h~j⟩}hj其中 π { ⋅ } \pi\{\cdot\} π{} 表示 Softmax 函数, P t − 1 ( i ) P_{t-1}(i) Pt1(i) 为像素 i i i 成为指代前景的概率。 视觉参与的 s t \mathrm{s}_t st 表示连接到预测的分割图 P t − 1 P_{t-1} Pt1 上。

  GloVe 模型预训练在公共的 Crawl 数据集上,840B 个 tokens。每个句子 20 个单词长度。biLSTM 的细胞尺寸设为 1000。

4.3 See-through-Text Embedding

  为计算 ConvRNN 在每一时间步 t t t 上的 STEP,首先定义每一像素的视觉表示为 v \mathrm{v} v,然后采用两组映射 ϕ ( v ) \phi (\mathrm{v}) ϕ(v) ψ ( s ) \psi(\mathrm{s}) ψ(s) ( v , l ) (\mathrm{v},\mathrm{l}) (v,l) 映射到视觉-文本 co-embedding 的邻近空间上。因此,像素关联的任务就变为了通过相应的 embedding 函数来预测两个模态表示间的关系。

  除 biLSTM 外,还考虑了 atrous convolution 来增强上下文信息。具体来说,对所有来自 F ℓ , ℓ ∈ { 1 , 2 , 3 , 4 , 5 } F_{\ell},\ell\in\{1,2,3,4,5\} F,{1,2,3,4,5} 的特征图,利用卷积核尺寸为 3 × 3 3\times3 3×3,比例为 r = 3 r=3 r=3 的 atrous convolutions 生成。因此,给定成对表示 v \mathrm{v} v s \mathrm{s} s,STEP 通过一个归一化的单层全连接网络生成其 ebedding:
ϕ ( v ) = N L 2 ( tanh ⁡ ( W v ⋅ v + b v ) ) ψ ( s ) = N L 2 ( tanh ⁡ ( W s ⋅ s + b s ) ) \begin{aligned}\phi(\mathbf{v})&=\mathrm{NL}_2(\tanh(W_v\cdot\mathbf{v}+\mathbf{b}_v))\\\psi(\mathbf{s})&=\mathrm{NL}_2(\tanh(W_s\cdot\mathbf{s}+\mathbf{b}_s))\end{aligned} ϕ(v)ψ(s)=NL2(tanh(Wvv+bv))=NL2(tanh(Wss+bs))其中 W W W b b b 分别为 fc 网络的权重和 bias, N L 2 ( ⋅ ) \mathrm{NL}_2(\cdot) NL2() 表示 L 2 L2 L2-归一化,输出维度设为 1000。

4.4 Bottom-up STEP Heatmaps

  准备使用余弦相似度来衡量每一视觉-文本对的相似度。在像素 i i i 处与视觉特征 v i \mathrm{v}_i vi 的STEP 相似度通过内乘获得:
Q ( i ) = max ⁡ { 0 , ⟨ ϕ ( v i ) , ψ ( s ) ⟩ } Q(i)=\max\{0,\left.\langle\phi(\mathbf{v}_i),\psi(\mathbf{s})\rangle\right\} Q(i)=max{0,ϕ(vi),ψ(s)⟩}其示意图如下图所示:

在这里插入图片描述

5.5 Top-down Heatmap Refinement

  时间步 t t t 上的 STEP 的热力图 Q t Q_t Qt 源于 bottom-up grouping,其中像素关联通过衡量给定文本表达式 s t \mathrm{s}_t st 实现。这一过程极度依赖于局部联系,因此缺乏对指代分割的全局视角。于是本文将 top-down 过程整合进 ConvRNN,在指代分割的 GT 指导下来提炼 Q t Q_t Qt

  在本文的方法中,选择在 ConvRNN 下实施 top-down 的热力图提炼。具体来说,采用 GRU 卷积作为 base 模型,输入为 { x t } \{x_t\} {xt},则有:
f t = σ ( R f ∗ h t − 1 + W f ∗ x t + b f ) zt = σ ( R z ∗ h t − 1 + W z ∗ x t + b z ) h ^ t = tanh ⁡ ( R h ∗ ( f t ⊙ h t − 1 ) + W h ∗ x t + b h ) h t = z t ⊙ h t − 1 + ( 1 − z t ) ⊙ h ^ t \begin{aligned} &f_t =\sigma(R^f*h_{t-1}+W^f*x_t+b^f) \\ &\text{zt} =\sigma(R^z*h_{t-1}+W^z*x_t+b^z) \\ &\hat{h}_{t} =\tanh(R^h*(f_t\odot h_{t-1})+W^h*x_t+b^h) \\ &h_{t} =z_t\odot h_{t-1}+(1-z_t)\odot\hat{h}_t \end{aligned} ft=σ(Rfht1+Wfxt+bf)zt=σ(Rzht1+Wzxt+bz)h^t=tanh(Rh(ftht1)+Whxt+bh)ht=ztht1+(1zt)h^t其中 f t f_t ft z t z_t zt h t h_t ht 分别为重置门的门值,更新门的门值,以及 t t t 时刻帧的隐藏激活值。输入的权重和循环隐藏单元分别为 W ∗ W^* W R ∗ R^* R b b b 表示 bias, σ \sigma σ 为 sigmoid 函数, ⊙ \odot 表示逐元素乘法。GRU 将输入和遗忘门组合到一个更新门 z t z_t zt 上,用于平衡之前的激活值 h t 1 h_{t1} ht1 和更新的激活值 h ^ t \hat h_t h^t,遗忘门 f t f_t ft 决定是否遗忘之前的激活。

  来自 ConvGRU 的最终隐藏层由多分辨率信息图组成,用于预测指代的前景概率。使用一个 1 × 1 1\times1 1×1 卷积来得到最终的概率图:
P T = σ ( W P ∗ h T + b P ) P_T=\sigma(W^P*h_T+b^P) PT=σ(WPhT+bP)

细节

  GRU 卷积的权重尺寸为 h × w × c × f h\times w\times c\times f h×w×c×f,其中 h , w , c , f h,w,c,f h,w,c,f 分别表示卷积核的高、宽、输入通道的数量、滤波器的数量。实验中设置 h = w = c = 3 h=w=c=3 h=w=c=3 f = 32 f=32 f=32。共有 5 × K 5\times K 5×K 张 STEP 热力图 { Q t } \{Q_t\} {Qt} 作为 GRU 卷积的输入,从而生成最终的指代分割。

4.6 训练

  完整的 DNN 模型连接解耦的 bottom-up 和 top-down 过程。为使得网络端到端训练,采用双向插值上采样热力图:
P T → upsample P ∈ R W × H P_T\xrightarrow{\text{upsample}} P \in \mathbb{R}^{W\times H} PTupsample PRW×H
  接下来是二值交叉熵损失函数的定义:
L = − 1 H W ∑ i { G log ⁡ P + ( 1 − G ) log ⁡ ( 1 − P ) } ( i ) L=\frac{-1}{HW}\sum_i\{G\log P+(1-G)\log(1-P)\}(i) L=HW1i{GlogP+(1G)log(1P)}(i)
  模型采用 Adam 优化器训练,700K 次迭代。权重衰减和初始的学习率分别为 0.005,0.00025,采用 polynomial 衰减,其指数为 0.9。

五、实验

  • 数据集:ReferItGame (ReferIt)、UNC & UNC+、Google-Ref (GRef);
  • 指标:mean intersection-over-union metric (mIoU)、Prec@X: X ∈ { 0.5 , 0 : 6 , 0.7 , 0.8 , 0.9 } X\in \{0.5,0:6,0.7,0.8,0.9\} X{0.5,0:6,0.7,0.8,0.9}

5.1 消融研究

在这里插入图片描述
在这里插入图片描述

5.2 与 SOTA 方法的比较

在这里插入图片描述

5.3 定量分析

在这里插入图片描述
在这里插入图片描述

六、结论

  本文提出一种 DNN 架构,由两个解耦模块组成,用于解决 RIS 任务。 第一个模块解决 bottom-up grouping 问题,输出为 See-through-Text Embedding Pixelwise (STEP) 热力图。第二个模块将 ConvRNN 视为 top-down 驱动机制来提炼生成的 STEP 热力图。创新点在于 ConvRNN 的输入为前一步指代的输出。实验效果很好。

写在后面

  读这篇论文就知道不是大陆的笔锋,原来是湾湾国立清华大学出品。论文新颖性放在 18、19 年来说还是可以的,实验也还行。

  落笔千言,终究结束。2023 年啊,52周,写完了 52 篇高质量博文。期待我们下一次相见~

另外吐槽下 CSDN 2023 年的博客之星,越来越水了,真实离谱,一堆灌水,一坨翔。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PHP开发日志 ━━ 基于PHP和JS的AES相互加密解密方法详解(CryptoJS) 适合CryptoJS4.0和PHP8.0

最近客户在做安全等保,需要后台登录密码采用加密方式,原来用个base64变形一下就算了,现在不行,一定要加密加key加盐~~ 前端使用Cypto-JS加密,传输给后端使用PHP解密,当然,前端虽然有key有盐&…

探索 3D 图形处理的奥秘

最近一年多来,在 3Dfx、Intel 们的狂轰滥炸中,在 Quake、古墓丽影们的推波助澜下,三维图形已经成为计算机迷眼中的又一个热点。3D 世界到底是怎样的神奇,我们又是怎样享受它的乐趣呢?就让我们来一探究竟吧。 图形基础…

十三:爬虫-Scrapy框架(下)

一:各文件的使用回顾 1.items的使用 items 文件主要用于定义储存爬取到的数据的数据结构,方便在爬虫和 Item Pipeline 之间传递数据。 items.pyimport scrapyclass TencentItem(scrapy.Item):# define the fields for your item here like:title scr…

Kasada p.js (x-kpsdk-cd、x-kpsdk-cd、integrity)

提供x-kpsdk-cd的API服务 详细请私信~ 可试用~ 一、简述 integrity是通过身份验证Kasada检测机器人流量后获得的一个检测结果(数据完整性) x-kpsdk-cd 是经过编码计算等等获得。当你得到正确的解决验证码值之后,解码会看到如下图 二、cook…

以太网帧结构

网络中传输数据时需要定义并遵循一些标准,以太网是根据IEEE 802.3标准来管理和控制数据帧的。了解IEEE 802.3标准是充分理解以太网中链路层通信的基础。 网络通信协议 不同的协议栈用于定义和管理不同网络的数据转发规则。 20世纪60年代以来,计算机网络…

读书笔记1——用户画像平台构建与业务实践

目录 1.画像的基本概念 2、OLAP的3种建模类型 3.OLAP相关技术发展历程 4.业界画像平台介绍 神策数据 2.火山引擎增长分析 3. GrowingLo 4.阿里云智能用户增长 5.涉及岗位 这是一本从功能模块、技术实现、平台构建、业务应用4个层次由浅入深地讲解用户画像的著作。作者在…

2-4基础算法-离散化/贪心/01背包问题

文章目录 一.离散化二.贪心01背包问题 一.离散化 离散化是一种将数组的值域压缩&#xff0c;从而更加关注元素的大小关系的算法。 离散化数组要求内部有序&#xff08;一般去重&#xff09; 可以通过离散化下标得到值 也可以通过值得到离散化下标 #include <iostream>…

图灵日记之java奇妙历险记--继承和多态

目录 继承概念继承语法父类成员访问子类中访问父类的成员变量子类中访问父类的成员方法 super关键字子类构造方法super和this初始化protected关键字继承方式final 关键字继承与组合 多态条件向上转型重写动态绑定&&静态绑定多态再理解向下转型多态的优缺点好处缺陷 继承…

【逗老师的无线电】ICOM IC-705终端模式Terminal Mode直连反射器配置-外置Pi-Star网关篇

各位友台大家好呀&#xff0c;逗老师最近整了一台IC-705&#xff0c;最吸引人的莫过于这玩意可以通过USB连接树莓派直接进行通联。下面简单介绍一下这个功能和其配置方法 一、功能 终端模式Terminal Mode允许IC-705电台作为终端直接连接反射器&#xff0c;基于不同的连接方式…

C/C++学习笔记十三 C++中的重载运算符

1、什么是运算符重载&#xff1f; 运算符重载是 C 中的一项功能&#xff0c;使运算符&#xff08;例如 、- 等&#xff09;能够处理用户定义的数据类型。这种机制称为编译时多态性&#xff0c;并提供了为不同数据类型定制运算符行为的优点。 例如&#xff0c;我们可以重载“”运…

八皇后问题(C语言)

了解题意 在一个8x8的棋盘上放置8个皇后&#xff0c;使得任何两个皇后都不能处于同一行、同一列或同一斜线上。问有多少种方法可以放置这8个皇后&#xff1f; 解决这个问题的目标是找到所有符合要求的皇后摆放方式&#xff0c;通常使用回溯算法来求解。回溯算法会尝试所有可能…

网格布局(大练习)

最近对网格布局研究了一下&#xff0c;写了一个简单的demo。可以参考参考~ 网格基础布局&#xff1a;github地址 挤占网格布局&#xff1a;github地址 基础网站格局&#xff1a;github地址 复杂网站格局&#xff08;方式一&#xff09;&#xff1a;github地址 复杂网站格局&am…

1.Linux快速入门

Linux快速入门 Linux操作系统简介Linux操作系统优点Linux操作系统发行版1. Red Hat Linux2. CentOS3. Ubuntu4. SUSE Linux5. Fedora Linux 32位与64位操作系统的区别Linux内核命名规则 Linux操作系统简介 Linux操作系统是基于UNIX以网络为核心的设计思想&#xff0c;是一个性…

X210 Linux开发板挂载NFS文件系统

网络搭建 采用“路由器”“有线网”来将Linux开发板和Ubuntu虚拟机连接在同一个局域网中。具体接线如下&#xff1a; Linux开发板通过网线直接连接到“路由器”的LAN接口上&#xff0c;然后笔记本电脑通过Wifi与路由器连接。 VirtualBox虚拟机网络设置 在”网线“设置界面中…

1.S32K3电源和复位

一、电源 S32K3系列芯片的电源各不相同。以S32K34x&#xff0c;S32K32x及S32K314为例。 并且该芯片支持以下特性&#xff1a; • Combination of internal and external voltage regulator options, offering RUN and Standby modes • FPM , which is used on chip-level in…

Flood Fill算法总结

算法思想 从一个起点开始&#xff0c;每一次随机选择一个新加进来的格子&#xff0c;看一下它周围能否扩展新的格子。如果能扩展&#xff0c;那么就扩展进来&#xff0c;直到不能扩展新的格子为止。当然需要判重&#xff0c;同样一个格子只能覆盖一次&#xff0c;这样能够保证时…

JVM工作原理与实战(二):字节码编辑器jclasslib

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、字节码编辑器jclasslib介绍和安装 1.介绍 2.安装 3.IntelliJ IDEA 插件安装 二、字节码编辑器jclasslib的使用 1.使用jclasslib bytecode viewer打开字节码文件 2.使用Intell…

gitLab页面打tag操作步骤

作者&#xff1a;moical 链接&#xff1a;gitLab页面打tag简单使用 - 掘金 (juejin.cn) 来源&#xff1a;稀土掘金 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 ---------------------------------------------------------------------…

对I2C总线上挂接多个AT24C02的读写操作

#include <reg51.h> // 包含51单片机寄存器定义的头文件 #include <intrins.h> //包含_nop_()函数定义的头文件 #define OP_READ1 0xa1 // 器件1地址以及读取操作,0xa1即为1010 0001B #define OP_WRITE1 0xa0 // 器件1地址以…

python文件打包实战技巧

众所周知&#xff0c;python是一种脚本语言&#xff0c;python程序必须在python环境下运行&#xff0c;所以如果想把自己写的程序给别人看的话&#xff0c;就比较麻烦&#xff0c;他需要先配置python环境&#xff0c;对于电脑小白来说这是“要命”的事情。而且如果是客户的话&a…