阅读笔记 First Order Motion Model for Image Animation
文章解决的是图片动画的问题。假设有源图片和驱动视频,并且其中的物体是同一类的,文章的方法让源图片中的物体按照驱动视频中物体的动作而动。
文章的方法只需要一个同类物体的视频集,不需要而外的标注。
方法
该方法基于self-supervised策略,主要方法是基于训练视频中的一帧图像和和学习到的动作表示,重建出训练视频。其中,动作表示由动作特定的关键点(motion-specific keypoint)和局部仿射变换(local affine transformations)组成。

框架图如上图所示,由两个部分组成,一个是运动估计模块,一个是图像生成模块。
运动估计模块的目的是估计从驱动视频的一帧 D ∈ R 3 × H × W \mathbf D \in \mathbb R^{3\times H \times W} D∈R3×H×W到源图片 S ∈ R 3 × H × W \mathbf S \in \mathbb R^{3\times H \times W} S∈R3×H×W的稠密运动场(dense motion field)。运动场 T S ← D : R 2 → R 2 \mathcal T_{\mathbf S \leftarrow \mathbf D}: \mathbb R^2 \rightarrow \mathbb R^2 TS←D:R2→R2将 D \mathbf D D中每个像素位置映射到对应的 S \mathbf S S。 T S ← D \mathcal T_{\mathbf S \leftarrow \mathbf D} TS←D也被称为反向光流(backward optical flow)。使用反向光流而不是正向光流,因为可以使用双线性采样以可微分的方式有效地实现后向扭曲。
仿射变换
在齐次坐标上,仿射变换可以用下面的式子表示:
[ y ⃗ 1 ] = [ B b ⃗ 0 , … , 0 1 ] [ x ⃗ 1 ] {\begin{bmatrix}{\vec{y}}\\1\end{bmatrix}}= {\begin{bmatrix}B&{\vec {b}}\ \\0,\ldots ,0&1\end{bmatrix}} {\begin{bmatrix}{\vec {x}}\\1\end{bmatrix}} [y1]=[B0,…,0b 1][x1]因为运算矩阵的最后一行是为了运算补齐的,所以在2维图像上仿射变换的参数由矩阵 A ∈ R 2 × 3 \mathbf A \in \mathbb R^{2 \times 3} A∈R2×3表示。
运动估计模块
粗运动估计
粗运动估计预测关键点处的运动模式。
动作估计模块估计反向光流 T S ← D \mathcal T_{\mathbf S \leftarrow \mathbf D} TS←D。 T S ← D \mathcal T_{\mathbf S \leftarrow \mathbf D} TS←D用在关键点附近的一阶泰勒展开表示。
假设存在一个抽象参考帧 R \mathbf R R。这样,我们需要估计两个变换:从 R \mathbf R R到 S \mathbf S S( T S ← R \mathcal T_{\mathbf S \leftarrow \mathbf R} TS←R)和从 R \mathbf R R到 D \mathbf D D( T D ← R \mathcal T_{\mathbf D \leftarrow \mathbf R} TD←R)。抽象参考帧的好处是可以让我们独立的处理 D \mathbf D D和 S \mathbf S S。
为了描述方便,用 X \mathbf X X表示 S \mathbf S S或者 D \mathbf D D,用 p 1 , ⋯ , p K p_1,\cdots,p_K p1,⋯,pK表示抽象参考帧 R \mathbf R R上的关键点的坐标,用 z z z表示在其他帧上的点的坐标。我们估计在关键点 p 1 , ⋯ , p K p_1,\cdots,p_K p1,⋯,pK周围的 T X ← R \mathcal T_{\mathbf X \leftarrow \mathbf R} TX←R。具体而言,我们考虑 T X ← R \mathcal T_{\mathbf X \leftarrow \mathbf R} TX←R在关键点 p 1 , ⋯ , p K p_1,\cdots,p_K p1,⋯,pK的一阶泰勒展开:
T X ← R ( p ) = T X ← R ( p k ) + ( d T X ← R ( p ) d p ∣ p = p k ) ( p − p k ) + o ( ∥ p − p k ∥ ) \mathcal T_{\mathbf X \leftarrow \mathbf R}(p)=\mathcal T_{\mathbf X \leftarrow \mathbf R}(p_k)+(\frac{d \mathcal T_{\mathbf X \leftarrow \mathbf R}(p)}{dp}|_{p=p_k})(p-p_k)+o(\|p-p_k\|) TX←R(p)=TX←R(pk)+(dpdTX←R(p)∣p=pk)(p−pk)+o(∥p−pk∥)这是可以看做一个仿射变换 A X ← R k ∈ R 2 × 3 \mathbf A^k_{\mathbf X \leftarrow \mathbf R} \in \mathbb R^{2 \times 3} AX←Rk∈R2×3, T X ← R ( p k ) \mathcal T_{\mathbf X \leftarrow \mathbf R}(p_k) TX←R(pk)是平移参数, d T X ← R ( p ) d p ∣ p = p k \frac{d \mathcal T_{\mathbf X \leftarrow \mathbf R}(p)}{dp}|_{p=p_k} dpdTX←R(p)∣p=pk是线性映射的参数。
T X ← R \mathcal T_{\mathbf X \leftarrow \mathbf R} TX←R用其在K个关键点处的值和Jacobian表示。
T X ← R ( p ) ≈ { { T X ← R ( p 1 ) , d T X ← R ( p ) d p ∣ p = p 1 } , ⋯ , { T X ← R ( p K ) , d T X ← R ( p ) d p ∣ p = p K } } \mathcal T_{\mathbf X \leftarrow \mathbf R}(p) \approx \{\{ \mathcal T_{\mathbf X \leftarrow \mathbf R}(p_1),\frac{d \mathcal T_{\mathbf X \leftarrow \mathbf R}(p)}{dp}|_{p=p_1}\}, \cdots,\{ \mathcal T_{\mathbf X \leftarrow \mathbf R}(p_K),\frac{d \mathcal T_{\mathbf X \leftarrow \mathbf R}(p)}{dp}|_{p=p_K}\}\} TX←R(p)≈{{TX←R(p1),dpdTX←R(p)∣p=p1},⋯,{TX←R(pK),dpdTX←R(p)∣p=pK}}
我们假设 T X ← R \mathcal T_{\mathbf X \leftarrow \mathbf R} TX←R在每个关键点的局部是双射。则对于 T S ← D \mathcal T_{\mathbf S \leftarrow \mathbf D} TS←D,我们有
T S ← D = T S ← R ∘ T D ← R − 1 \mathcal T_{\mathbf S \leftarrow \mathbf D}=\mathcal T_{\mathbf S \leftarrow \mathbf R} \circ \mathcal T^{-1}_{\mathbf D \leftarrow \mathbf R} TS←D=TS←R∘TD←R−1用一阶泰勒展开近似有
T S ← D ( z ) ≈ T S ← R ( p k ) + J k ( z − T D ← R ( p k ) ) J k = ( d T S ← R ( p ) d p ∣ p = p k ) ( d T D ← R ( p ) d p ∣ p = p k ) − 1 \mathcal T_{\mathbf S \leftarrow \mathbf D}(z) \approx \mathcal T_{\mathbf S \leftarrow \mathbf R}(p_k) + J_k(z-\mathcal T_{\mathbf D \leftarrow \mathbf R}(p_k))\\ J_k=(\frac{d \mathcal T_{\mathbf S \leftarrow \mathbf R}(p)}{dp}|_{p=p_k})(\frac{d \mathcal T_{\mathbf D \leftarrow \mathbf R}(p)}{dp}|_{p=p_k})^{-1} TS←D(z)≈TS←R(pk)+Jk(z−TD←R(pk))Jk=(dpdTS←R(p)∣p=pk)(dpdTD←R(p)∣p=pk)−1
T S ← R ( p k ) \mathcal T_{\mathbf S \leftarrow \mathbf R}(p_k) TS←R(pk)和 T D ← R ( p k ) \mathcal T_{\mathbf D \leftarrow \mathbf R}(p_k) TD←R(pk)用基于U-Net的关键点预测网络(keypoint predictor network)预测。对每个关键点预测一个heatmap,总共预测K个heatmap。U-Net的decoder最后一层用softmax预测关键点置信图(keypoint confidence map),也就是关键点在每个像素位置的置信度,满足 ∑ z ∈ Z W k ( z ) = 1 \sum_{z \in \mathcal Z} \mathbf W^k(z)=1 ∑z∈ZWk(z)=1,其中 Z \mathcal Z Z表示所有的像素位置。
T S ← R ( p k ) \mathcal T_{\mathbf S \leftarrow \mathbf R}(p_k) TS←R(pk)和 T D ← R ( p k ) \mathcal T_{\mathbf D \leftarrow \mathbf R}(p_k) TD←R(pk)相当于仿射变换中的平移参数,注意这里是两维的(z包含x和y)。平移参数用关键点置信图加权计算:
b k = ∑ z ∈ Z W k ( z ) z b^k = \sum_{z \in \mathcal Z} \mathbf W^k(z)z bk=z∈Z∑Wk(z)z
d T S ← R ( p ) d p ∣ p = p k \frac{d \mathcal T_{\mathbf S \leftarrow \mathbf R}(p)}{dp}|_{p=p_k} dpdTS←R(p)∣p=pk和 d T D ← R ( p ) d p ∣ p = p k \frac{d \mathcal T_{\mathbf D \leftarrow \mathbf R}(p)}{dp}|_{p=p_k} dpdTD←R(p)∣p=pk相当于仿射变换中的线性变换部分,他们作为仿射变换中剩下的4个参数用keypoint predictor network的额外的4个通道估计,每个关键点4个额外的通道。用 P i j k ∈ R H × W P^k_{ij} \in \mathbb R^{H \times W} Pijk∈RH×W表示其中一个通道的估计值,其中 i , j i,j i,j是仿射变换的坐标。线性变换的参数用关键点置信图加权融合:
B k [ i , j ] = ∑ z ∈ Z W k ( z ) P i j k ( z ) \mathbf B^k[i,j] = \sum_{z \in \mathcal Z} \mathbf W^k(z)P^k_{ij}(z) Bk[i,j]=z∈Z∑Wk(z)Pijk(z)
密集运动估计
密集运动估计预测整个图像每个像素点的运动模式 T ^ S ← D \hat{\mathcal T}_{\mathbf S \leftarrow \mathbf D} T^S←D。
我们使用卷积网络从 K K K个关键点处的泰勒展开 T S ← D ( z ) \mathcal T_{\mathbf S \leftarrow \mathbf D}(z) TS←D(z)和源图像帧 S \mathbf S S中估计 T ^ S ← D \hat{\mathcal T}_{\mathbf S \leftarrow \mathbf D} T^S←D。
用关键点处的变换扭曲源图像帧 S \mathbf S S,可以得到 K K K个变换后的图像 S 1 , ⋯ , S K \mathbf S^1, \cdots, \mathbf S^K S1,⋯,SK。另外,考虑额外的图像 S 0 = S \mathbf S^0 = \mathbf S S0=S作为背景。
对每一个关键点计算heatmap H k ( z ) \mathbf H_k(z) Hk(z)表示每个变换在哪发生。
H k ( z ) = e x p ( ( T D ← R ( p k ) − z ) 2 σ ) − e x p ( ( T S ← R ( p k ) − z ) 2 σ ) \mathbf H_k(z) = exp(\frac{(\mathcal T_{\mathbf D \leftarrow \mathbf R}(p_k)-z)^2}{\sigma}) - exp(\frac{(\mathcal T_{\mathbf S \leftarrow \mathbf R}(p_k)-z)^2}{\sigma}) Hk(z)=exp(σ(TD←R(pk)−z)2)−exp(σ(TS←R(pk)−z)2)
将 H k \mathbf H_k Hk和 S 0 , ⋯ , S K \mathbf S^0, \cdots, \mathbf S^K S0,⋯,SK拼接输入基于U-Net的稠密运动网络(dense motion network)。dense motion network估计 K + 1 K+1 K+1个掩码 M k , k = 0 , ⋯ , K \mathbf M_k, k = 0, \cdots, K Mk,k=0,⋯,K 表示每个位置用哪个局部变换,满足 ∑ k = 0 K M k ( z ) = 1 \sum_{k=0}^K \mathbf M^k(z)=1 ∑k=0KMk(z)=1。最后的密集运动场表示为:
T ^ S ← D ( z ) = M 0 z + ∑ k = 1 K M k ( T S ← R ( p k ) + J k ( z − T D ← R ( p k ) ) ) \hat{\mathcal T}_{\mathbf S \leftarrow \mathbf D}(z) = \mathbf M_0z + \sum_{k=1}^K \mathbf M_k(\mathcal T_{\mathbf S \leftarrow \mathbf R}(p_k) + J_k(z-\mathcal T_{\mathbf D \leftarrow \mathbf R}(p_k))) T^S←D(z)=M0z+k=1∑KMk(TS←R(pk)+Jk(z−TD←R(pk)))
表示为矩阵坐标变换有:
O ( z ) = M 0 ( z ) z + ∑ k = 1 K M k ( z ) A S ← D k [ z 1 ] \mathbf O(z) = \mathbf M^0(z)z + \sum_{k=1}^K \mathbf M^k(z) \mathbf A^k_{\mathbf S \leftarrow \mathbf D} {\begin{bmatrix}{z}\\1\end{bmatrix}} O(z)=M0(z)z+k=1∑KMk(z)AS←Dk[z1]
图像生成模块
1.根据上面预测的 T ^ S ← D \hat{\mathcal T}_{\mathbf S \leftarrow \mathbf D} T^S←D对 S S S经过两个下采样卷积的特征图(feature map ) ξ ∈ R H ′ × W ′ \xi \in \mathbb R^{H'\times W'} ξ∈RH′×W′使用warp操作。
2.在 S S S中存在遮挡的时候, D ′ D' D′并不能完全通过warp源图像获得,而是需要inpaint。所以,预测一个遮挡图(occlusion map) O ^ S ← D ∈ [ 0 , 1 ] H ′ × W ′ \hat{\mathcal O}_{\mathbf S \leftarrow \mathbf D} \in [0,1]^{H'\times W'} O^S←D∈[0,1]H′×W′,表示源图像需要被inpaint的区域。occlusion map通过在dense motion network后添加一层来预测。
经过转换的feature map可以表示为:
ξ ′ = O ^ S ← D ⊙ f w ( ξ , T ^ S ← D ) \xi' = \hat{\mathcal O}_{\mathbf S \leftarrow \mathbf D} \odot f_w(\xi, \hat{\mathcal T}_{\mathbf S \leftarrow \mathbf D}) ξ′=O^S←D⊙fw(ξ,T^S←D) f w f_w fw表示反向变形(back-warping)操作。经过转换的feature map输入到图像生成模块的后面层处理,最后生成图像。
训练
训练的损失由多项组成。首先是基于perceptual loss的reconstruction loss。该loss用预训练的VGG-19网络作为特征提取器,对比重建帧和驱动视频的真实帧的特征差异。
另外考虑到关键点的学习是无标签的,这会导致不稳定的表现,引入Equivariance constraint用在无监督关键点的学习中。假设图片 X X X经过过一个已知的变换 T X ← Y \mathcal T_{\mathbf X \leftarrow \mathbf Y} TX←Y,得到 Y Y Y。Equivariance constraint要求:
T X ← R ≡ T X ← Y ∘ T Y ← R \mathcal T_{\mathbf X \leftarrow \mathbf R} \equiv \mathcal T_{\mathbf X \leftarrow \mathbf Y} \circ \mathcal T_{\mathbf Y \leftarrow \mathbf R} TX←R≡TX←Y∘TY←R通过对两边进行一阶泰勒展开有,并使用L1 loss分别约束关键点处的值和Jacobian。
参考资料
《First Order Motion Model for Image Animation》
《Motion Representations for Articulated Animation》
相关文章:
阅读笔记 First Order Motion Model for Image Animation
文章解决的是图片动画的问题。假设有源图片和驱动视频,并且其中的物体是同一类的,文章的方法让源图片中的物体按照驱动视频中物体的动作而动。 文章的方法只需要一个同类物体的视频集,不需要而外的标注。 方法 该方法基于self-supervised策…...
【计算机图形学】课堂习题汇总
在直线的光栅化算法中,如果不考虑最大位移方向则可能得到怎样的直线? A:斜率为1的线 B:总是垂直的 C:离散的点,无法构成直线 D:总是水平的 在直线的改进的Bresenham算法中,每当误…...
国外导师对博士后申请简历的几点建议
正所谓“工欲善其事,必先利其器”,想要申请国外的博士后职位,就要准备好相应的申请文书材料。如果说Cover Letter是职位的窍门砖,那么申请者的简历就是争取职位的决定性筹码。 相信大家已经看过许多简历的模版了,但是…...
【五一创作】Scratch资料袋
Scratch软件是免费的、免费的、免费的。任何需要花钱才能下载Scratch软件的全是骗子。 1、什么是Scratch Scratch是麻省理工学院的“终身幼儿园团队”开发的一种图形化编程工具。是面向青少年的一款模块化,积木化、可视化的编程语言。 什么是模块化、积木化&…...
数据库基础篇 《17.触发器》
数据库基础篇 《17.触发器》 在实际开发中,我们经常会遇到这样的情况:有 2 个或者多个相互关联的表,如商品信息和库存信息分别存放在 2 个不同的数据表中,我们在添加一条新商品记录的时候,为了保证数据的完整性&#…...
03 - 大学生如何使用GPT
大学生如何使用GPT提高学习效率 一、引言 在当今的高速发展的信息时代,大学生面临着越来越多的学习挑战。作为一种先进的人工智能技术,GPT为大学生提供了一种强大的学习工具。本文将介绍大学生在不同场景中如何使用GPT来提高学习效率,并给出…...
【P1】Jmeter 准备工作
文章目录 一、Jmeter 介绍1.1、Jmeter 有什么样功能1.2、Jmeter 与 LoadRunner 比较1.3、常用性能测试工具1.4、性能测试工具如何选型1.5、学习 Jmeter 对 Java 编程的要求 二、Jmeter 软件安装2.1、官网介绍2.2、JDK 安装及环境配置2.3、Jmeter 三种模式2.4、主要配置介绍2.4.…...
字节的面试,你能扛住几道?
C , Python 哪一个更快? 读者答:这个我不知道从哪方面说,就是 C 的话,它其实能够提供开发者非常多的权限,就是说它能涉及到一些操作系统级别的一些操作,速度应该挺快。然后 Python 实现功能还…...
NOPI用法之自定义单元格背景色(3)
NPOI针对office2003使用HSSFWorkbook,对于offce2007及以上使用XSSFWorkbook;今天我以HSSFWorkbook自定义颜色为例说明,Office2007的未研究呢 在NPOI中默认的颜色类是HSSFColor,它内置的颜色有几十种供我们选择,如果不…...
数据分析中常见标准的参考文献
做数据分析过程中,有些分析法方法的标准随便一搜就能找到,不管是口口相传还是默认,大家都按那样的标准做了。日常分析不细究出处还可以,但是正式的学术论文你需要为你写下的每一句话负责,每一个判断标准都应该有参考文…...
辨析 变更请求、批准的变更请求、实施批准的变更请求
变更请求、批准的变更请求、实施批准的变更请求辨析 辨析各种变更请求,不服来辨。 变更请求 定义:对正规受控的文件或计划(范围、进度、成本、政策、过程、计划或程序)等的变更,以反映修改或增加的意见或内容 根据变更请求的工作内容可将变…...
leetcode 561. 数组拆分
题目描述解题思路执行结果 leetcode 561. 数组拆分 题目描述 数组拆分 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。 返回该 最大总和 。 示例 1&am…...
AviatorScript
AviatorScript 是一门高性能、轻量级寄宿于 JVM (包括 Android 平台)之上的脚本语言 特性介绍 支持数字、字符串、正则表达式、布尔值、正则表达式等基本类型,完整支持所有 Java 运算符及优先级等。函数是一等公民,支持闭包和函…...
Oracle跨服务器取数——DBlink 初级使用
前言 一句话解释DBlink是干啥用的 实现跨库访问的可能性. 通过DBlink我们可以在A数据库访问到B数据库中的所有信息,例如我们在加工FDS层表时需要访问ODS层的表,这是就需要跨库访问 一、DBlink的分类 private:用户级别,只有创建该dblink的用户才可以使…...
200人 500人 园区网设计
实验要求: ① 设置合理的STP优先级、边缘端口、Eth-trunk ② 企业内网划分多个vlan ,减少广播域大小,提高网络稳定性 ③ 所有设备,在任何位置都可以telnet远程管理 ④ 出口配置NAT ⑤ 所有用户均为自动获取ip地址 ⑥ 在企业…...
netstat命令解析
一、linux系统中netstat命令的帮助信息 └──╼ $netstat -h usage: netstat [-vWeenNcCF] [<Af>] -r netstat {-V|--version|-h|--help}netstat [-vWnNcaeol] [<Socket> ...]netstat { [-vWeenNac] -i | [-cnNe] -M | -s [-6tuw] }-r, --route …...
API接口的自我阐述
API(Application Programming Interface),翻译为应用程序接口,是一套定义程序之间如何通讯的接口。API可以实现软件的可重用性、可维护性和互操作性,同时也可以提升软件的性能和安全性。API接口是一个软件系统中的重要…...
Day32内部类
内部类 内部类就是在一个类中定义一个类,(在A类中定义一个B类,B类就被称为内部类) 格式:public class 类名{ 修饰符 class 类名{} } 如:public class Outer{ public class Inner {} } //内部类可以访问外部…...
用户画像系列——HBase 在画像标签过期策略中的应用
一、背景 前面系列文章介绍了用户画像的概念、用户画像的标签加工、用户画像的应用。本篇文章主要介绍一些画像的技术细节,让大家更加详细的了解画像数据存储和处理的逻辑 举个现实中的例子: 例子1:因为疫情原因,上线一个平台(…...
时下热门话题:ChatGPT能否取代人类?
时下热门话题:ChatGPT能否取代人类? 2022年11月底,人工智能对话聊天机器人ChatGPT推出,迅速在社交媒体上走红,短短5天,注册用户数就超过100万。2023年1月末,ChatGPT的月活用户已突破1亿&#x…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
