DiffusionDet:用于物体检测的扩散模型

在这里插入图片描述

论文标题:DiffusionDet: Diffusion Model for Object Detection

论文地址:https://arxiv.org/pdf/2211.09788

DiffusionDet:用于物体检测的扩散模型

  • 检测模型发展
    • 物体检测
  • DiffusionDet方法
    • 预备知识
    • DiffusionDet前向扩散过程
    • DiffusionDet反向扩散推理过程
  • 模型架构
    • 图像编码器
    • 检测解码器
  • 实验结果

本文提出了DiffusionDet,这是一个新颖的框架,将目标检测任务转化为从噪声框到目标框的去噪扩散过程

在训练阶段,对象框从真实框扩散到随机分布,并且模型学习逆转这种噪声过程。在推理阶段,模型以渐进的方式将一组随机生成的框细化为输出结果。研究可以实现动态的框数和迭代评估。在标准基准测试上的大量实验表明,与之前的检测器相比,DiffusionDet 取得了优异的性能。

在从 COCO 到 CrowdHuman 的零样本传输设置下,使用更多框和迭代步骤进行评估时,DiffusionDet 实现了 5.3 AP 和 4.8 AP 的增益

代码可在 https://github.com/ShoufaChen/DiffusionDet 获取。

目标检测旨在预测图像中目标对象的一组边界框和相关类别标签。作为一项基本的视觉识别任务,它在实例分割、姿势估计、动作识别、对象跟踪和视觉关系检测等许多相关识别场景中发挥着至关重要的作用。现代目标检测方法经历了从经验对象先验到可学习对象查询的不断演变。

具体来说,大多数检测器通过在经验设计的候选对象上定义代理回归和分类来解决检测任务,例如滑动窗口、区域建议、锚框和参考点。最近,DETR提出了可学习的对象查询,消除了手工设计的组件,建立了端到端的检测管道,吸引了大量关注。

尽管这些方法实现了简洁而有效的设计,但它们仍然依赖于一组固定的可学习查询。一个自然的问题是:是否有一种更简单的方法,甚至不需要可学习查询的替代品?为了解决这一问题,设计了一个新颖的框架,可以直接从一组随机框中检测对象。这些框不包含需要在训练阶段优化的可学习参数,目标是逐渐细化这些框的位置和大小,直到它们完美覆盖目标对象。这种从噪声到框的方法既不需要启发式对象先验,也不需要可学习的查询,进一步简化了对象候选并推动了检测管道的发展。

在这里插入图片描述
噪声到框范式的原理类似于去噪扩散模型中的噪声到图像过程,后者是一类基于似然的模型,通过学习的去噪模型逐渐去除图像中的噪声来生成图像。扩散模型在许多生成任务中取得了巨大成功,并开始在图像分割等感知任务中进行探索。然而,现有技术尚未成功地将其应用于目标检测。

在此基础上,提出了DiffusionDet,它通过将检测作为图像中边界框的位置(中心坐标)和大小(宽度和高度)空间上的生成任务,使用扩散模型来处理目标检测任务。

在训练阶段,将高斯噪声添加到地面实况框以获得噪声框。然后,这些噪声框用于从主干编码器的输出特征图中裁剪感兴趣区域(RoI)的特征,例如ResNet和Swin Transformer。最后,这些RoI特征被发送到检测解码器,该解码器经过训练可以预测无噪声的真实框。通过这个训练目标,DiffusionDet能够从随机框中预测真实框。在推理阶段,DiffusionDet通过反转学习的扩散过程来生成边界框,该过程将噪声先验分布调整为边界框上的学习分布。

DiffusionDet 作为一种概率模型,具有令人着迷的灵活性。训练一次网络,并在推理阶段的不同设置下使用相同的网络参数,包括动态框数和迭代评估。利用随机框作为候选对象,DiffusionDet 的训练和评估阶段得以解耦,可以使用任意数量的随机框来训练和评估模型。此外,受益于扩散模型的迭代去噪特性,DiffusionDet可以迭代地重用整个检测头,进一步提高其性能。

DiffusionDet的灵活性使其在检测不同场景(例如稀疏或拥挤)的对象时具有巨大优势,而无需额外的微调。例如,在CrowdHuman数据集上直接评估COCO预训练模型时,通过调整评估框的数量和迭代步骤,DiffusionDet获得了显著的性能提升。而以前的方法只能获得边际收益,甚至性能下降。此外,在COCO数据集上评估DiffusionDet时,借助ResNet-50主干,使用单个采样步骤和300个随机框实现了45.8 AP,性能显著优于Faster R-CNN和DETR,并与Sparse R-CNN相当。通过增加采样步数和随机框的数量,DiffusionDet进一步提升到46.8 AP。

在这里插入图片描述

检测模型发展

物体检测

现代对象检测方法主要依赖于经验对象先验进行框回归和类别分类,如提案、锚点和点的方法。例如,提案方法、锚点方法和点方法。最近,Carion等人提出的DETR使用了一组固定的可学习查询来检测对象。从那时起,基于查询的检测范式引起了极大的关注,并激发了一系列后续工作。这些方法进一步优化了检测管道,提高了检测精度和效率。在这项工作中,DiffusionDet进一步推动了对象检测的进展,通过引入从噪声到对象框的去噪扩散过程,消除了对固定可学习查询的依赖。

  1. 提案方法(Proposal-based Methods):

基本概念:提案方法通过在图像中生成大量候选框(或提案),然后对这些提案进行分类和边界框回归来检测目标。
工作流程:典型的提案方法如R-CNN系列,首先使用选择性搜索或区域生成网络(RPN)等技术生成大量候选框。然后,这些提案经过卷积神经网络(CNN)进行特征提取,并送入分类器和回归器以识别目标类别和精确定位目标框。

  1. 锚点方法(Anchor-based Methods):

基本概念:锚点方法预先定义一组锚点(或先验框),并在每个锚点上预测目标的类别和边界框。
工作流程:Faster R-CNN是典型的锚点方法,它使用锚点在图像上生成大量候选框。通过卷积神经网络(CNN),每个锚点位置预测目标的类别概率和边界框偏移量。

  1. 点方法(Point-based Methods):

基本概念:点方法直接在图像的每个像素位置上进行预测,而不依赖于预定义的候选框或锚点。
工作流程:典型的点方法如CornerNet和ExtremeNet,通过预测图像中每个像素点是否是目标的关键点(如角点或中心点),然后根据这些点进行目标检测。

  1. 基于可学习查询的方法(Query-based Methods):

基本概念:基于可学习查询的方法,如DETR(Transformers for Detection),使用一组固定的可学习查询来代替传统的候选框或锚点,直接从图像中的特征表示中预测目标的位置和类别。
工作流程:DETR通过Transformer架构,将图像特征映射到查询和键值对上,通过自注意力机制进行全局感知,并直接输出目标框的位置和类别,消除了传统检测方法中的候选框生成和选择过程。

为了更好理解这些方法,可以想象你是一名侦探,正在调查一个大案件,需要找到凶手并收集证据。不同的目标检测方法就像你使用不同的策略来找到罪犯的方式。

  1. 提案方法:这就像你使用一台复杂的搜索引擎,输入关键词后系统会返回一大堆可能相关的线索。然后,你逐个查看这些线索,判断它们是否有用,最终确定哪些线索确实指向了罪犯的位置。
  2. 锚点方法:这更像是在调查开始时,你事先在地图上标出了几个可能的藏匿点。然后,你沿着这些标记的地方逐一寻找,看看哪个位置最有可能藏着罪犯。
  3. 点方法:这就像你从头开始搜索,每走一步都仔细观察周围的每个细节。你注意到每个可能有线索的地方,不依赖于预先设定的搜索点,而是在每个位置都可能找到有用的线索。
  4. 基于可学习查询的方法:这就像你是一位智能侦探,有一套精心设计的问题集,可以直接询问任何人或查阅资料,并根据收到的回答来直接确定罪犯的身份和行踪。这种方法不依赖于提前准备的搜索点或线索,而是通过直接的交流和信息处理来找到答案。

尽管扩散模型在图像生成方面取得了巨大成功,但在判别任务中的潜力尚未充分探索。一些研究尝试将扩散模型应用于图像分割,但目标检测领域的进展相对滞后。分割任务处理方式与图像生成更相似,而目标检测是一个集合预测问题,需要将对象候选分配给地面实况对象。

为了应对这些挑战,DiffusionDet首次采用扩散模型进行目标检测,通过将检测任务重新定义为从噪声框到对象框的生成式去噪过程,克服了之前的方法局限。接下来将详细介绍DiffusionDet的方法技术

DiffusionDet方法

预备知识

设目标检测的学习目标是输入目标对 ( x , b , c ) (x,b,c) (x,b,c),其中 x x x是输入图像, b b b c c c是一组分别是图像中对象的边界框和类别标签 x x x

更具体地说,将集合中的第 i i i框表示为 b i = ( c x i , c y i , w i , h i ) b^i=(c^i_x,c^i_y,w^i,h^i) bi=(cxi,cyi,wi,hi),其中 ( c x i , c y i ) (c^i_x,c^i_y) (cxi,cyi)是边界框的中心坐标, ( w i , h i ) (w^i,h^i) (wi,hi)是该边界框的宽度和高度,

DiffusionDet前向扩散过程

DiffusionDet前向扩散过程就是高斯噪声扩散过程

初始设置

  • 原始边界框 b b b ( x , y , w , h ) (x,y,w,h) (x,y,w,h)表示
  • b = ( x , y , w , h ) b=(x,y,w,h) b=(x,y,w,h)其中 ( x , y ) (x,y) (x,y)是中心坐标, ( w , h ) (w,h) (w,h)是宽度和高度

前向噪声过程

扩散模型的前向噪声过程使用高斯模糊噪声来逐步扰动边界框 b b b

  • 噪声过程定义为:
  • q ( z t ∣ z 0 ) = N ( z t ∣ α ˉ t z 0 , ( 1 − α ˉ t ) I ) q(z_t|z_0) = N(z_t|\bar \alpha_t z_0,(1 - \bar \alpha_t)I) q(ztz0)=N(ztαˉtz0,(1αˉt)I)
  • 其中 z 0 = b , z t z_0=b,z_t z0=b,zt是是经过 t t t步扩散后的边界框, α ˉ t \bar \alpha_t αˉt是递归因子。
  • α ˉ t \bar \alpha_t αˉt计算为 α ˉ t = ∏ s = 0 t α s \bar \alpha_t=\prod_{s=0}^t\alpha_s αˉt=s=0tαs,其中 α s \alpha_s αs是逐步添加的噪声方差。
  • 随机噪声生成:在每个时间步 t t t,从均值为 0、标准差为 σ \sigma σ的高斯分布 N ( 0 , σ 2 I ) N(0,\sigma^2I) N(0,σ2I)中生成随机噪声 ϵ t \epsilon_t ϵt,其中 ϵ t \epsilon_t ϵt是形状为 [ B , N , 4 ] [B,N,4] [B,N,4]的张量, B B B是批量大小, N N N是检测框的数量
  • 使用递归因子 α t \alpha_t αt控制噪声的扰动强度,逐步更新检测框 p b pb pb。递归因子 α t \alpha_t αt是累积乘积 ∏ i = 1 t α i \prod^t_{i=1}\alpha_i i=1tαi,用于逐步减小扰动强度。
  • 高斯模糊噪声引入:将高斯噪声 ϵ t \epsilon_t ϵt乘以 1 − α c u m p r o d ( t ) \sqrt{1-\alpha_{cumprod(t)}} 1αcumprod(t) 并加到通过递归因子缩放后的真实框 p b pb pb上,得到扰动后的检测框 p b pb pb

p b t b , i = α c u m p r o d ( t ) ⋅ p b b , i + 1 − α c u m p r o d ( t ) ⋅ ϵ b , i , t pb_{t_{b,i}} = \sqrt{\alpha_{cumprod(t)}} ·pb_{b,i} + \sqrt{1-\alpha_{cumprod(t)}} ·\epsilon_{b,i,t} pbtb,i=αcumprod(t) pbb,i+1αcumprod(t) ϵb,i,t
这里 p b b , i = ( x b , i , y b , i , w b , i , h b , i ) pb_{b,i}=(x_{b,i},y_{b,i},w_{b,i},h_{b,i}) pbb,i=(xb,i,yb,i,wb,i,hb,i)表示批次 b b b中的第 i i i个检测框。
ϵ b , i , t = ( ϵ b , i , t x , ϵ b , i , t y , ϵ b , i , t w , ϵ b , i , t h ) \epsilon_{b,i,t}=(\epsilon^x_{b,i,t},\epsilon^y_{b,i,t},\epsilon^w_{b,i,t},\epsilon^h_{b,i,t}) ϵb,i,t=(ϵb,i,tx,ϵb,i,ty,ϵb,i,tw,ϵb,i,th)是从高斯分布中采样的噪声。

大家还记得扩散模型推导最终式子吗:
在这里插入图片描述
不记得的可以参考我写的这篇文章:Diffusion Model算法

这里看DiffusionDet前向扩散公式是不是和扩散模型推导式子一模一样

模型训练和损失函数

在训练期间,使用神经网络 f θ ( z t , t , x ) f_\theta(z_t,t,x) fθ(zt,t,x),通过最小化 ℓ 2 \ell_2 2损失来根据扰动后的边界框 z t z_t zt预测原始边界框 b b b

L t r a i n = 1 2 ∣ ∣ f θ ( z t , t , x ) − b ∣ ∣ 2 2 \mathcal{L}_{train}=\frac{1}{2}||f_\theta(z_t,t,x)-b||^2_2 Ltrain=21∣∣fθ(zt,t,x)b22

这里, x x x是相应的图像

DiffusionDet 训练代码如下

def train_loss(images, gt_boxes):"""images: [B, H, W, 3]gt_boxes: [B, *, 4]# B: batch# N: number of proposal boxes"""# Encode image featuresfeats = image_encoder(images)# Pad gt_boxes to Npb = pad_boxes(gt_boxes) # padded boxes: [B, N, 4]# Signal scalingpb = (pb * 2 - 1) * scale# Corrupt gt_boxest = randint(0, T) # time stepeps = normal(mean=0, std=1) # noise: [B, N, 4]pb_crpt = sqrt( alpha_cumprod(t)) * pb +sqrt(1 - alpha_cumprod(t)) * eps# Predictpb_pred = detection_decoder(pb_crpt, feats, t)# Set prediction lossloss = set_prediction_loss(pb_pred, gt_boxes)return loss

DiffusionDet反向扩散推理过程

推理阶段的重建过程

在推理阶段,使用训练好的模型 f θ f_\theta fθ和更新规则,以迭代方式从噪声框 z t z_t zt重建数据样本 b b b

z T → z T − Δ → … → b z_T→z_{T−Δ}→…→b zTzTΔb

这种方法利用高斯模糊噪声扩散技术,逐步处理边界框 b b b,并通过神经网络模型重建原始的边界框数据。这种方法可以提高对象检测任务的鲁棒性和性能,尤其在处理噪声数据和不确定性方面表现出色。

DiffusionDet的推理过程是从噪声到目标框的去噪采样过程。从高斯分布中采样的框开始,模型逐步完善其预测,如算法 所示。

def infer(images, steps, T):"""images: [B, H, W, 3]# steps: number of sample steps# T: number of time steps"""# Encode image featuresfeats = image_encoder(images)# noisy boxes: [B, N, 4]pb_t = normal(mean=0, std=1)# uniform sample step sizetimes = reversed(linespace(-1, T, steps))# [(T-1, T-2), (T-2, T-3), ..., (1, 0), (0, -1)]time_pairs = list(zip(times[:-1], times[1:])for t_now, t_next in zip(time_pairs):# Predict pb_0 from pb_tpb_pred = detection_decoder(pb_t, feats, t_now)# Estimate pb_t at t_nextpb_t = ddim_step(pb_t, pb_pred, t_now, t_next)# Box renewalpb_t = box_renewal(pb_t)return pb_pred

模型架构

由于扩散模型需要迭代生成数据样本,在推理阶段需要多次运行模型 f θ f_\theta fθ。然而,直接在每个迭代步骤中对原始图像应用 f θ f_\theta fθ在计算上是不可行的。(类似于扩散模型学习一个潜在的空间向量,就是为了减少计算复杂度和内存需求问题)

因此,作者建议将整个模型分为两部分:图像编码器和检测解码器。图像编码器仅运行一次,从原始输入图像 x x x中提取深度特征表示,而检测解码器则使用这些特征作为条件,而不是直接使用原始图像,逐步细化从噪声框 z t z_t zt 中得出的框预测。

在这里插入图片描述

图像编码器

图像编码器接收原始图像作为输入,并提取其高级特征,为后续的检测解码器做准备。采用了卷积神经网络,例如 ResNet ,以及基于 Transformer 的模型如 Swin来实现DiffusionDet。特征金字塔网络被用于生成 ResNet 和 Swin 主干网的多尺度特征图。

检测解码器

借鉴 Sparse R-CNN的设计,检测解码器接收一组检测框作为输入,从图像编码器生成的特征图中裁剪感兴趣区域(RoI)特征,并将这些 RoI 特征送入检测头以获得框的回归和分类结果。

对于 DiffusionDet,在训练阶段,这些检测框会受到真实框的干扰,并且在评估阶段则直接从高斯分布中采样。

检测解码器由 6 个级联阶段组成(参见上图(b)),与 Sparse R-CNN 中的解码器有几点不同:
(1)DiffusionDet 的起始点是随机框,而 Sparse R-CNN 在推理中使用一组固定的学习框;
(2)Sparse R-CNN 将检测框及其对应的检测特征作为输入对,而 DiffusionDet 只需检测框;
(3)DiffusionDet 可以在评估过程中以迭代方式重复使用检测头,参数在不同步骤间共享,并通过时间步嵌入指定每步骤的扩散过程,这称为迭代评估,而 Sparse R-CNN 则在前向传递中仅使用一次检测解码器。

实验结果

这个表格总结了在COCO 2017验证集上不同物体检测方法的性能比较。AP代表框平均精度,AP50和AP75分别表示IoU阈值为0.5和0.75时的框平均精度,APr、APs和APm分别表示小、中和大尺度物体的框平均精度。

在这里插入图片描述

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

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

相关文章

【gtest】 C++ 的测试框架之使用 gtest 编写单元测试

目录 🌊前言 🌊使用 cmake 启动并运行 gtest 🌍1. 设置项目 🌍2. 创建并运行二进制文件 🌊1. gtest 入门 🌍1.1 断言(assertions) 🌍1.2 简单测试 🌍…

最新(2024年)安装gdal库方法

方法一:直接 conda install gdal 方法二:https://github.com/cgohlke/geospatial-wheels/releases/tag/v2024.2.18 这个链接里下载whl文件

Day51 代码随想录打卡|二叉树篇---二叉搜索树的最小绝对差

题目(leecode T530): 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数,其数值等于两值之差的绝对值。 方法:本题计算二叉搜索树的最小绝对差,涉…

快慢指针在字符串中的应用-443. 压缩字符串

题目链接及描述 443. 压缩字符串 - 力扣(LeetCode) 题目分析 这个题目总体不算太难,如果之前接触过双指针(快慢指针)的话,比较好做。题目可以理解为计算数组中对应各个连续字符出现的次数,并将…

测试基础13:测试用例设计方法-错误推断、因果图判定表

课程大纲 1、错误推测法 靠主观经验和直觉来推测可能容易出现问题的功能或场景,设计相关测试用例进行验证。 2、因果图&判定表 2.1定义 因果图和判定表是分析和表达多逻辑条件下,执行不同操作的情况的工具。 (因果图和判定表配合使用&a…

生产运作管理--第六版陈荣秋

第一章: 生产运作的分类有哪些? 答:可以分为两大类: 产品生产: 产品生产是通过物理或者化学作用将有形输入转化为有形输出的过程。 按照工艺过程的特点,可以分为: 连续性生产:物料均匀、连续的按…

TCP/IP协议,三次握手,四次挥手

IP - 网际协议 IP 负责计算机之间的通信。 IP 负责在因特网上发送和接收数据包。 HTTP - 超文本传输协议 HTTP 负责 web 服务器与 web 浏览器之间的通信。 HTTP 用于从 web 客户端(浏览器)向 web 服务器发送请求,并从 web 服务器向 web …

TCP三次握手和四次挥手过程简介(抓包分析,简单易懂,小白)

接上篇 传输层部分 链路层、网络层、传输层和应用层协议详解分析-CSDN博客文章浏览阅读689次,点赞10次,收藏15次。wireshark抓包分析-CSDN博客wireshark是网络包分析工具网络包分析工具的主要作用是尝试捕获网络包,并尝试显示包的尽可能详细…

6年前端社招一个月上岸20K经历,附简历

面经哥只做互联网社招面试经历分享,关注我,每日推送精选面经,面试前,先找面经哥 本人普通本科6年前端经历,从年前开始准备跳槽,一开始感觉自己履历算不上突出,经历过迷茫和沮丧的时候&#xff0…

【计算机毕业设计】基于Springboot的B2B平台医疗病历交互系统【源码+lw+部署文档】

包含论文源码的压缩包较大,请私信或者加我的绿色小软件获取 免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者…

MySQL日志(二):MySQL抖动

一条SQL语句, 正常执行的时候特别快, 但是有时也不知道怎么回事, 它就会变得特别慢, 并且这样的场景很难复现, 它不只随机, 而且持续时间还很短。 看上去, 这就像是数据库“抖”了一下。 今天&…

redis 笔记2之哨兵

文章目录 一、哨兵1.1 简介1.2 实操1.2.1 sentinel.conf1.2.2 问题1.2.3 哨兵执行流程和选举原理1.2.4 使用建议 一、哨兵 1.1 简介 上篇说了复制,有个缺点就是主机宕机之后,从机只会原地待命,并不能升级为主机,这就不能保证对外…

Linux中Web服务器配置和管理(Apache)

文章目录 一、WEB服务器介绍1.1、WEB服务器概述1.2、WEB服务器的发展历史1.3、WEB服务器的优点与缺点1.4、WEB服务器的工作流程 二、Apache介绍2.1、Apache是什么2.2、Apache的发展史与应用场景2.3、Apache的特点2.4、Apache的工作原理2.5、Apache的模块 三、安装使用Apache服务…

Apache druid未授权命令执行漏洞复现

简介 Apache Druid是一个实时分析型数据库,旨在对大型数据集进行快速的查询分析("OLAP"查询)。Druid最常被当做数据库来用以支持实时摄取、高性能查询和高稳定运行的应用场景,同时,Druid也通常被用来助力分析型应用的图…

牛客仓鼠的鸡蛋

分析一下判断语句 如果能放就输出位置 不能放就输出-1 不能放的条件是最大值小于要放的鸡蛋数量,线段树维护最大值 放的位置用线段树二分 每个篮子不能放超过k堆鸡蛋,记录一下每个篮子放的次数,次数等于k后给最大值附上0即可 // Proble…

使用powershell筛选AD域控不能自主更改的用户并变更

# 查询“用户不能更改密码”为勾选状态的所有域用户,将域账户、姓名、勾选状态作为结果保存到C:\result\result.csvGet-ADUser -Filter * -Properties CannotChangePassword | Where-Object { $_.CannotChangePassword -eq $true } | Select SamAccountName, Name, …

javaWeb项目-ssm+vue在线购物系统功能介绍

本项目源码:java-ssmvue在线购物系统的设计与实现源码说明文档资料资源-CSDN文库 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:sprin…

UnityAPI学习之延时调用(Invoke)

延时调用(Invoke) 当我们进行简单函数的延时调用不想使用协程时,我们可以使用Invoke()函数 using System.Collections; using System.Collections.Generic; using UnityEngine;public class NO15_Invoke : MonoBehaviour {//显示在每次生成…

MySQL 日志(一)

本篇主要介绍MySQL日志的相关内容。 目录 一、日志简介 常用日志 一般查询日志和慢查询日志的输出形式 日志表 二、一般查询日志 三、慢查询日志 四、错误日志 一、日志简介 常用日志 在MySQL中常用的日志主要有如下几种: 这些日志通常情况下都是关闭的&a…

MySQL日志(三):数据安全

先来看一个结论:只要redo log和binlog保证持久化到磁盘, 就能确保MySQL异常重启后, 数据可以恢复。 binlog写入逻辑 binlog的写入逻辑比较简单: 事务执行过程中, 先把日志写到binlog cache, 事务提交的时候…