Language Adaptive Weight Generation for Multi-task Visual Grounding 论文阅读笔记
Language Adaptive Weight Generation for Multi-task Visual Grounding 论文阅读笔记
- 一、Abstract
- 二、引言
- 三、相关工作
- 3.1 指代表达式理解
- 3.2 指代表达式分割
- 3.3 动态权重网络
- 四、方法
- 4.1 总览
- 4.2 语言自适应权重生成
- 语言特征聚合
- 权重生成
- 4.3 多任务头
- 4.4 训练目标
- 五、实验
- 5.1 数据集和评估指标
- 数据集
- 评估指标
- 5.2 实施细节
- 训练
- 推理
- 5.3 与 SOAT 方法的比较
- REC 任务
- RES 任务
- 指代表达式的长度分析
- 5.4 消融分析
- 5.5 定量分析
- 六、结论和限制
写在前面
新的一周开始了,冲冲冲~
这篇文章是 上一篇博文 的参考文献之一,遂找来读读,粗略一扫,论文创新点挺好的,可惜没有提供源代码。话说,上篇浙大的不开源,这篇难道也不开源吗?那以后可能得绕道了。。。
- 论文地址:Language Adaptive Weight Generation for Multi-task Visual Grounding
- 代码地址:原文未提供
- 收录于: CVPR 2023
- Ps:2023 年每周一篇博文阅读笔记,主页 更多干货,欢迎关注呀,期待 5 千粉丝有你的参与呦~
一、Abstract
之前的方法通常以一种被动的方式利用视觉 Backbone,即以固定权重提取视觉特征,而没有表达式的参与。理想情况下,视觉 Backbone 应当主动根据表达式来提取视觉特征。于是本文基于语言自适应权重 Language Adaptive Weights(VG-LAW),提出一种主动感知视觉定位框架。通过不同表达式生成的动态权重将视觉 Backbone 作为一个特定表达式的特征提取器,不需要额外的跨模态交互模块。实验表明方法很有效。
二、引言
首先指出视觉定位的含义,难点,应用。之前的方法通常采用通用的目标检测框架,且重点关注跨模态交互模块的设计。然而采用固定结构来提取视觉特征可能会导致提取出的视觉特征和表达式不匹配,例如存在缺失或冗余的特征。如下图所示:
一些特征可视化例子如下图所示:
有一些方法已经注意到这一现象并提出相应的解决办法,例如 QRNet 和 LAVT, 通过嵌入设计的交互模块,例如 QD-ATT、PWAN 到每个阶段的末尾。然而这一先提取后调整的策略无法避免包含大量固定权重提取出来的特征。于是本文采用一种更简单且细粒度的计划来修改视觉 Backbone 的权重。如图 1 c 所示。
本文基于语言自适应权重 Language Adaptive Weights(VG-LAW),提出一种主动感知视觉定位框架。通过将指代表达式注入权重中,从而动态调整视觉 Backbone 的权重。具体来说,VG-LAW 首先通过两个连续的特征聚合和权重生成得到语言特征的自适应权重,用于视觉 Backbone。然后语言感知的视觉 Backbone 能在无需手动修改视觉 Backbone 结构的情况下提取相关表达式的视觉特征,因此无需额外的跨模态融合。进一步地,基于表达式的相关特征,提出一种轻量、整洁的多任务预测头用于指代表达式理解 REC 和指代表达式分割 RES 任务。
文本贡献总结如下:
- 基于语言自适应权重 Language Adaptive Weights(VG-LAW),提出一种主动感知视觉定位框架。能够在无需手动修改视觉 Backbone 框架的情况下主动地提取相关表达式的视觉特征。
- 能够直接用于 REC 和 RES 任务,无需设计跨模态注意力模块。
- 实验表明达到了 SOTA 的结果。
三、相关工作
3.1 指代表达式理解
得益于注意力机制,最近基于 Transformer 的方法能够有效捕捉模态内部和模态间的上下文交互信息。
3.2 指代表达式分割
最近的研究利用 Transformer 来实现跨模态交互,已达到优越的性能,但所有的这些方法要么通过调整输入,要么修改固定网络权重的结构来实现跨模态交互。
3.3 动态权重网络
网络能够自适应地动态调整权重。根据其生成方式,大致分为三种:使用可学习的 embedding 或中间特征作为输入,使用全连接层直接生成动态权重;将可学习权重进行求和,这被认为是混合专家,可能会导致优化困难;用矩阵分解的方式得到权重,最终的权重通过计算一些矩阵的乘法生成。
四、方法
4.1 总览
VG-LAW 框架由四个部分组成,语言 Backbone、语言自适应权重生成器、视觉 Backbone、多任务头。
给定一个指代表达式,N 层的 BERT 语言编码器将表达式 tokenizes,再前置一个 [CLS] token,提取出语言特征 F l ∈ × R L × d l F_l\in\times{R}^{L\times d_l} Fl∈×RL×dl,其中 L L L 和 d l d_l dl 分别表示 token 的数量和维度。之后将 F l F_l Fl 送入语言自适应权重生成器得到权重,用于视觉 Backbone。
接下来,给定一张图像 I ∈ × R 3 × H × W I\in\times{R}^{3\times H\times W} I∈×R3×H×W,通过视觉 Backbone 提取出表达式感知的视觉特征 F v ∈ R C × H s × W s F_v\in\mathbb{R}^{C\times\frac{H}{s}\times\frac{W}{s}} Fv∈RC×sH×sW,其中 C C C、 s s s 分别表示通道数量和步长。最后,将 [CLS] token 表示的语言特征 F l 1 ∈ R d l F_l^1\in\mathbb{R}^{{d}_l} Fl1∈Rdl 和视觉特征送入多任务头中,预测指代表达式的 bounding box 和 mask。
4.2 语言自适应权重生成
语言特征聚合
考虑到指代表达式对应的是不同数量的语言 tokens,且视觉 Backbone 的每层可能会倾向于不同的语言 tokens,于是尝试用固定尺寸聚合每层的语言特征。根据多头注意力机制,引入一个可学习的特定层 embedding e i ∈ R d l e_i\in\mathbb{R}^{d_l} ei∈Rdl 用于视觉 Backbone 的第 i i i 层,动态提取特定层的语言特征。将 e i e_i ei 和 F l F_l Fl 分为 G G G 组,对于每一个组 g g g,令逐 token 注意力 α i g ∈ [ 0 , 1 ] L \alpha_{i}^{g}\in[0,1]^{L} αig∈[0,1]L 为 e i g e_i^g eig 和 F l g F_l^{g} Flg 的 Softmax 点乘:
α i g = S o f t m a x ( [ e i g ⋅ F l g , 1 , e i g ⋅ F l g , 2 , ⋯ , e i g ⋅ F l g , L ] ) \alpha_{i}^{g}=\mathrm{Softmax}([e_{i}^{g}\cdot F_{l}^{g,1},e_{i}^{g}\cdot F_{l}^{g,2},\cdots,e_{i}^{g}\cdot F_{l}^{g,L}]) αig=Softmax([eig⋅Flg,1,eig⋅Flg,2,⋯,eig⋅Flg,L])然后对特征拼接得到聚合的语言特征 h 0 i ∈ R d l h_0^i\in\mathbb{R}^{d_l} h0i∈Rdl:
h 0 i , g = ∑ j = 1 L α i g , j F l g , j {h_{0}^{i,g}}=\sum_{j=1}^{L}\alpha_{i}^{g,j}F_{l}^{g,j} h0i,g=j=1∑Lαig,jFlg,j最后,使用全连接层 (FC) 减少其维度,用于视觉 Backbone 的第 i i i 层:
h 1 i = δ ( W 1 i h 0 i ) h_{1}^{i}=\delta(W_{1}^{i}h_{0}^{i}) h1i=δ(W1ih0i)其中 W 1 i ∈ R d l × d h W_{1}^{i}\in\mathbb{R}^{d_l\times d_h} W1i∈Rdl×dh 将维度降低为 d h = d l / r d_h=d_l/r dh=dl/r, r r r 为减少比例, δ \delta δ 表示 GeLU 激活函数。
权重生成
基于指代表达式,生成语言自适应的权重用于生成视觉 Backbone 中的 qeury X q X_q Xq,Key X k X_k Xk,Value X v X_v Xv:
X q = θ ( X ; W q ) , X k = θ ( X ; W k ) , X v = θ ( X ; W v ) X_q=\theta(X;W_q),X_k=\theta(X;W_k),X_v=\theta(X;W_v) Xq=θ(X;Wq),Xk=θ(X;Wk),Xv=θ(X;Wv)其中 θ ( ⋅ ; W ) \theta(\cdot;W) θ(⋅;W) 表示线性投影, X X X 表示输入的视觉特征。 W q , W k , W v ∈ R d o u t × d i n W_q,W_k,W_v{\in}\mathbb{R}^{d_{out}\times d_{in}} Wq,Wk,Wv∈Rdout×din 是用于生成 query,key,value 的动态投影权重。 d i n d_{in} din 和 d o u t d_{out} dout 是特征 X X X 和 query/key/value 的维度。
d o u t × d i n d_{out}\times d_{in} dout×din 还不足以用全连接层直接生成权重,例如 Hypernetworks。通过 K 个静态核的加权求和生成权重,DynamicConv 和 CondConv 能够缓解这一问题,但很难优化。于是根据动态通道融合 dynamic channel fusion,尝试用矩阵分解的方法生成动态权重。拿第 i i i 层的 ViT 块举例:
[ W q i , W k i , W v i ] = W 0 i + P Φ ( h 1 i ) Q T [W_q^i,W_k^i,W_v^i]=W_0^i+P\Phi(h_1^i)Q^T [Wqi,Wki,Wvi]=W0i+PΦ(h1i)QT其中 W 0 i ∈ R d o u t × d i n W_0^i\in\mathbb{R}^{d_{out}\times d_{in}} W0i∈Rdout×din 为特定层的静态可学习权重。 P ∈ R d o u t × d w P\in\mathbb{R}^{d_{out}\times d_{w}} P∈Rdout×dw 和 Q ∈ R d i n × d w Q\in\mathbb{R}^{d_{in}\times d_{w}} Q∈Rdin×dw 也是静态可学习权重,在所有 ViT 块中共享。 Φ ( h 1 i ) \Phi(h_1^i) Φ(h1i) 为全连接层,以聚合的语言特征 h 1 i h_1^{i} h1i 为输入,生成形状为 d w × d w d_w\times d_w dw×dw 的动态矩阵。
dynamic channel fusion:Yunsheng Li, Yinpeng Chen, Xiyang Dai, Dongdong Chen, Ye Yu, Lu Yuan, Zicheng Liu, Mei Chen, Nuno Vasconcelos, et al. Revisiting dynamic convolution via matrix decomposition. In ICLR, 2020. 3, 4
4.3 多任务头
多任务头中有两个分支分别用于 REC 和 RES 任务。
对于 REC 分支,直接应用坐标回归来预测指代目标的 Bounding box。为了池化 2 − d 2-d 2−d 视觉特征,提出一个语言自适应的池化模块 language adaptive pooling module (LAP),使用语言自适应的注意力来聚合视觉特征。具体来说,视觉特征 { F v i , j } ∈ R C × H s × W s {\{F_{v}^{i,j}\}}\in\mathbb{R}^{C\times\frac{H}{s}\times\frac{W}{s}} {Fvi,j}∈RC×sH×sW 和语言特征 F l 1 ∈ R d l F_l^1\in\mathbb{R}^{d_l} Fl1∈Rdl 首先投影到低维度空间 R k \mathbb{R}^{k} Rk,并计算其点乘相似度的 softmax 归一化后的注意力权重 A ∈ R H s × W s A\in\mathbb{R}^{\frac Hs\times\frac Ws} A∈RsH×sW。然后通过计算注意力权重 A A A 的求和来聚合视觉特征。最后,将聚合后的视觉特征送入三层全连接层,Sigmoid 函数用于预测指代的 bounding box b ^ = ( x ^ , y ^ , w ^ , h ^ ) \hat b=(\hat x,\hat y,\hat w,\hat h) b^=(x^,y^,w^,h^)。
对于 RES 分支,应用二分类沿着视觉特征的空间维度来预测指代目标的 mask。具体来说,视觉特征 F v F_v Fv 首先采用连续的转置卷积上采样到 F v ^ ∈ R d l × H 4 × W 4 \hat{F_{v}}\in\mathbb{R}^{d_{l}\times\frac{{H}}{4}\times\frac{W}{4}} Fv^∈Rdl×4H×4W,然后在每个视觉特征上使用线性投影 θ ( ⋅ ; W ) \theta(\cdot;W) θ(⋅;W) 得到中间的分割图 s ˉ ∈ R H 4 × W 4 \bar{s}\in\mathbb{R}^{\frac H4\times\frac W4} sˉ∈R4H×4W,其中 W = F l 1 W=F_l^1 W=Fl1。最后在 s ˉ \bar s sˉ 上使用双线性插值上采样得到全分辨率分割 mask s ^ ∈ R H × W \hat s\in\mathbb{R}^{H\times W} s^∈RH×W,后接一个 Sigmoid 函数。
4.4 训练目标
对于 REC,给定预测的 bounding box b ^ = ( x ^ , y ^ , w ^ , h ^ ) {\hat{b}}=(\hat{x},{\hat{y}},\hat{w},\hat{h}) b^=(x^,y^,w^,h^) 和 GT box b = ( x , y , w , h ) b=(x,y,w,h) b=(x,y,w,h),检测损失为:
L d e t = λ L 1 L L 1 ( b , b ^ ) + λ g i o u L g i o u ( b , b ^ ) \mathcal{L}_{det}=\lambda_{L1}\mathcal{L}_{L1}(b,\hat{b})+\lambda_{giou}\mathcal{L}_{giou}(b,\hat{b}) Ldet=λL1LL1(b,b^)+λgiouLgiou(b,b^)其中 L L 1 ( ⋅ ) \mathcal{L}_{L1}(\cdot) LL1(⋅) 和 L g i o u ( ⋅ ) \mathcal{L}_{giou}(\cdot) Lgiou(⋅) 分别表示 L1 损失和通用 IoU 损失, λ L 1 \lambda_{L1} λL1 和 λ g i o u \lambda_{giou} λgiou 为控制损失函数的相关权重。
对于 RES,给定预测的 mask s ^ \hat s s^ 和 GT s s s,分割损失定义为:
L s e g = λ f o c a l L f o c a l ( s , s ^ ) + λ d i c e L d i c e ( s , s ^ ) \mathcal{L}_{seg}=\lambda_{focal}\mathcal{L}_{focal}(s,\hat{s})+\lambda_{dice}\mathcal{L}_{dice}(s,\hat{s}) Lseg=λfocalLfocal(s,s^)+λdiceLdice(s,s^)其中 L f o c a l ( ⋅ , ⋅ ) \mathcal{L}_{focal}(\cdot,\cdot) Lfocal(⋅,⋅) 和 L d i c e ( ⋅ , ⋅ ) \mathcal{L}_{dice}(\cdot,\cdot) Ldice(⋅,⋅) 分别表示 focal 损失和 DICE/F-1 损失, λ f o c a l \lambda_{focal} λfocal 和 λ d i c e \lambda_{dice} λdice 为控制两个分割损失的相关权重。本文提出的框架可以同时训练 REC 和 RES 任务,其共同训练损失函数为:
L t o t a l = L d e t + L s e g \mathcal{L}_{total}=\mathcal{L}_{det}+\mathcal{L}_{seg} Ltotal=Ldet+Lseg
五、实验
5.1 数据集和评估指标
数据集
RefCOCO、RefCOCO+、RefCOCOg、ReferItGame。
评估指标
分别使用 P r e c @ 0.5 Prec@0.5 Prec@0.5 和 m I o U mIoU mIoU 来评估 REC 和 RES 的性能。
5.2 实施细节
训练
输入图像尺寸 448 × 448 448\times448 448×448。视觉 Backbone ViT-Base,采用 ViTDet 中的自适应方法将视觉 Backbone 应用于高分辨率图像。预训练使用 Mask R-CNN 在 MS-COCO 上,除去 val/test 子集。 W 0 i W_0^i W0i 和 Φ ( h 1 i ) \Phi(h_1^i) Φ(h1i) 采用相应的视觉 Backbone 权重和 0 来初始化。表达式的最大长度 40, 无级联的 6 层 BERT 作为语言 Backbone 来提取语言特征。 λ L 1 \lambda_{L1} λL1 和 λ g i o u \lambda_{giou} λgiou 设为 1, λ f o c a l \lambda_{focal} λfocal 和 λ d i c e \lambda_{dice} λdice 设为 4。减少率 r r r 设为 16。视觉和语言 Backbone 的初始学习率 4 e − 5 4e-5 4e−5,剩下部分的学习率 4 e − 4 4e-4 4e−4。AdamW 优化器,90 epochs,batch size 256,权重衰减 1 e − 4 1e-4 1e−4。在第 10 和 60 个 epochs 乘 10%。数据增强:水平翻转。NVIDIA A100 GPUs(不差钱)。
推理
推理时,输入图像尺寸 448 × 448 448\times448 448×448,表达式的最大长度 40。RES 的二值化阈值设为 0.35。无需后处理,直接输出 bounding box 和 分割 mask。
5.3 与 SOAT 方法的比较
REC 任务
RES 任务
指代表达式的长度分析
5.4 消融分析
5.5 定量分析
六、结论和限制
基于语言自适应权重,本文提出一种主动感知框架 VG-LAW 用于视觉定位。VG-LAW 能够直接注入表达式的信息到视觉 Backbone 的权重中而无需修改其结构。实验效果很好。
限制主要有两点:VG-LAW 在可解释性方面差,整体推理过程隐式,很难理解推理过程;多任务头一次预测一个实例,限制了其在短语定位中的应用。
写在后面
这篇文章创新点很足,算是打开了另一种思路。写作上也不拖沓,就是代码能不能开源呀?这么好的文章就别藏着掖着了。看看人家 LAVT。
相关文章:

Language Adaptive Weight Generation for Multi-task Visual Grounding 论文阅读笔记
Language Adaptive Weight Generation for Multi-task Visual Grounding 论文阅读笔记 一、Abstract二、引言三、相关工作3.1 指代表达式理解3.2 指代表达式分割3.3 动态权重网络 四、方法4.1 总览4.2 语言自适应权重生成语言特征聚合权重生成 4.3 多任务头4.4 训练目标 五、实…...
面试算法4:只出现一次的数字
题目 输入一个整数数组,数组中只有一个数字出现了一次,而其他数字都出现了3次。请找出那个只出现一次的数字。例如,如果输入的数组为[0,1,0,1,0,1,100],则只…...
#与##的用法
# 作用: 左右加双引号,使其变成字符串 #的作用:是在形参左右各加双引号,使它变成字符串。#define STR(param) #paramchar *pStr STR(hello); // 展开后 char *pStr “hello”; ## 作用:胶水,使…...

Flutter的路由router-页面跳转
文章目录 概念介绍基本路由(Basic Routing)跳转到某个页面弹出页面 命名路由(Named Routing)第三方路由管理库(Third-Party Routing Libraries) Android原生的路由Intent-based Routing(基于Int…...

24v转5v稳压芯片-5A大电流输出ic
这款24V转5V5A汽车充电芯片具有以下特性和参数: - 宽输入电压范围:4.5V至36V - 最大输出电流:5.0A - 高达92%的转换效率 - 恒流/恒压模式控制 - 最大占空比100% - 可调输出电压 - 2%的输出电压精度 - 集成40mΩ高侧开关 - 集成18mΩ低侧开关 …...
Layui + Flask | 表单元素(组件篇)(06)
表单元素是输入框、选择框、复选框、开关、单选框等表单项组件,用于对表单域进行输入。layui 的表单元素对原生的表单元素进行了大幅的用着,有好看的 UI 同时又有非常方便操作的 API。 输入框 https://layui.dev/docs/2.8/form/input.html 输入框组件是对文本框 <input ty…...

Kakfa - Producer机制原理与调优
Producer是Kakfa模型中生产者组件,也就是Kafka架构中数据的生产来源,虽然其整体是比较简单的组件,但依然有很多细节需要细品一番。比如Kafka的Producer实现原理是什么,怎么发送的消息?IO通讯模型是什么?在实…...

基于图像形态学处理和边缘提取算法的路面裂痕检测matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 [Rr,Cc] size(Image1);% 获取 Image1 矩阵的大小(行数和列数) % 创…...

opencv 基础(持续更新中)
1 前言 https://www.couragesteak.com/ 2 安装 3 基础属性demo 打开一张图片: import cv2img cv2.imread(./girl.jpg)print(img.shape) # (1536, 1024, 3) 数组形状 print(type(img)) # numpy 数组 print(img) # 三维数组(彩色图片&am…...

科普现场!万博智云参加第五届张江汇智科普节
9月15日,第五届张江汇智科普节在汇智国际商业中心如期开展,展会中汇集了众多信息科技领域的新兴产品,展示内容主要分为国产替代和元宇宙场景展示两个方面。展现国产化最新科技成果,践行技术普惠理念,把高、精、专的技术…...
【记录】实现从Linux下载下载文件(文件导出功能)并记录过程产生的BUG问题。
前言 导出功能的实现,主要记录总结导出过程中出现的一些问题。 代码实现导出功能 public R templateDown(HttpServletResponse response) {String fileName "template.xlsx";// 清空responseresponse.reset();response.setCharacterEncoding("UTF…...
可扩展性表设计方案
文章目录 1 使用预留字段2 使用JSON字段3 使用单表继承4 构建属性表5 直接构建新表6 适当冗余 1 使用预留字段 在表设计初期,可以预留一些命名通用的备用字段,例如field1、field2、field3。当业务需要增加新字段时,就直接使用这些预留字段,无…...

Scotch: Combining SGX and SMM to Monitor Cloud Resource Usage【TEE的应用】
目录 摘要引言贡献 背景SMMXen Credit Scheduler与资源核算SGX 威胁模型Scheduler attacksResource interference attacksVM Escape attacks 架构Resource Accounting WorkflowCost of Accounting 具体的部署和评估见论文相关工作Resource Accounting基于SMM的方法基于SGX的系统…...
腾讯mini项目-【指标监控服务重构】2023-08-19
今日已办 benchmark How can we create a configuration for gobench with -benchmem – IDEs Support (IntelliJ Platform) | JetBrains 本机进行watermill-benchmark 使用 apifox 自动化测试上报固定数量的消息 启动watermill-pub/sub的 benchmark 函数 func BenchmarkPu…...
go实现grpc-快速开始
准备工作 Go, 最新版的 如果不会安装看Getting Started. Protocol buffer compiler, protoc, version 3. 想要安装, 请读Protocol Buffer Compiler Installation. 为 protocol compiler安装Go plugins: 想要安装运行以下命令: $ go install google.golang.org/protobuf/cmd/…...
linux上的init 0-6指令作用以及一些快捷键和系统指令
目录 linux上的init 0-6指令作用 CtrlAltF1-F7作用 Linux常用系统指令 查看linux内核版本 ubuntu和centos查看系统版本信息以及硬件信息 linux上的init 0-6指令作用 在Linux系统中,运行级别(也称为init级别)用来表示系统的不同状态或操作…...

Mixin 混入
Mixin 混入 混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。 怎么理解呢,就是每一个组件都会有一…...
pycharm快捷键
CtrlAltL 代码规范化 CtrlHome 回到代码最开始 CtrlEnd 回到代码最后面 shift回车 鼠标任意位置的下一行 altj 一直按可以选中相同的变量 alt鼠标左键 可以选择多个需要修改的变量或值 将光标放在某一行,home到最前面,end到最后…...
【面试刷题】——Linux基础命令
Linux基础命令是在Linux操作系统中执行常见任务的一组命令。以下是一些常用的Linux基础命令,它们用于管理文件系统、执行系统任务、查看文件内容等。 文件和目录操作: ls: 列出目录中的文件和子目录。 pwd: 显示当前工作目录的路径。 cd: 更改当前工作…...
第四步 Vue2 配置ESLint
ESLint 是一个广泛使用的 JavaScript 代码检查工具,可以帮助开发者在编写代码时发现并修复潜在的问题和错误。 在 第一步 创建工程 时虽然已经选择了包含 ESLint 预设配置,但还需要做一些调整,让我们使用起来能够更加的丝滑。 vue.config.j…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...