论文标题: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进一步推动了对象检测的进展,通过引入从噪声到对象框的去噪扩散过程,消除了对固定可学习查询的依赖。
- 提案方法(Proposal-based Methods):
基本概念:提案方法通过在图像中生成大量候选框(或提案),然后对这些提案进行分类和边界框回归来检测目标。
工作流程:典型的提案方法如R-CNN系列,首先使用选择性搜索或区域生成网络(RPN)等技术生成大量候选框。然后,这些提案经过卷积神经网络(CNN)进行特征提取,并送入分类器和回归器以识别目标类别和精确定位目标框。
- 锚点方法(Anchor-based Methods):
基本概念:锚点方法预先定义一组锚点(或先验框),并在每个锚点上预测目标的类别和边界框。
工作流程:Faster R-CNN是典型的锚点方法,它使用锚点在图像上生成大量候选框。通过卷积神经网络(CNN),每个锚点位置预测目标的类别概率和边界框偏移量。
- 点方法(Point-based Methods):
基本概念:点方法直接在图像的每个像素位置上进行预测,而不依赖于预定义的候选框或锚点。
工作流程:典型的点方法如CornerNet和ExtremeNet,通过预测图像中每个像素点是否是目标的关键点(如角点或中心点),然后根据这些点进行目标检测。
- 基于可学习查询的方法(Query-based Methods):
基本概念:基于可学习查询的方法,如DETR(Transformers for Detection),使用一组固定的可学习查询来代替传统的候选框或锚点,直接从图像中的特征表示中预测目标的位置和类别。
工作流程:DETR通过Transformer架构,将图像特征映射到查询和键值对上,通过自注意力机制进行全局感知,并直接输出目标框的位置和类别,消除了传统检测方法中的候选框生成和选择过程。
为了更好理解这些方法,可以想象你是一名侦探,正在调查一个大案件,需要找到凶手并收集证据。不同的目标检测方法就像你使用不同的策略来找到罪犯的方式。
- 提案方法:这就像你使用一台复杂的搜索引擎,输入关键词后系统会返回一大堆可能相关的线索。然后,你逐个查看这些线索,判断它们是否有用,最终确定哪些线索确实指向了罪犯的位置。
- 锚点方法:这更像是在调查开始时,你事先在地图上标出了几个可能的藏匿点。然后,你沿着这些标记的地方逐一寻找,看看哪个位置最有可能藏着罪犯。
- 点方法:这就像你从头开始搜索,每走一步都仔细观察周围的每个细节。你注意到每个可能有线索的地方,不依赖于预先设定的搜索点,而是在每个位置都可能找到有用的线索。
- 基于可学习查询的方法:这就像你是一位智能侦探,有一套精心设计的问题集,可以直接询问任何人或查阅资料,并根据收到的回答来直接确定罪犯的身份和行踪。这种方法不依赖于提前准备的搜索点或线索,而是通过直接的交流和信息处理来找到答案。
尽管扩散模型在图像生成方面取得了巨大成功,但在判别任务中的潜力尚未充分探索。一些研究尝试将扩散模型应用于图像分割,但目标检测领域的进展相对滞后。分割任务处理方式与图像生成更相似,而目标检测是一个集合预测问题,需要将对象候选分配给地面实况对象。
为了应对这些挑战,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(zt∣z0)=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)−b∣∣22
这里, 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 features
feats = image_encoder(images)
# Pad gt_boxes to N
pb = pad_boxes(gt_boxes) # padded boxes: [B, N, 4]
# Signal scaling
pb = (pb * 2 - 1) * scale
# Corrupt gt_boxes
t = randint(0, T) # time step
eps = normal(mean=0, std=1) # noise: [B, N, 4]
pb_crpt = sqrt( alpha_cumprod(t)) * pb +
sqrt(1 - alpha_cumprod(t)) * eps
# Predict
pb_pred = detection_decoder(pb_crpt, feats, t)
# Set prediction loss
loss = 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 zT→zT−Δ→…→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 features
feats = image_encoder(images)
# noisy boxes: [B, N, 4]
pb_t = normal(mean=0, std=1)
# uniform sample step size
times = 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_t
pb_pred = detection_decoder(pb_t, feats, t_now)
# Estimate pb_t at t_next
pb_t = ddim_step(pb_t, pb_pred, t_now, t_next)
# Box renewal
pb_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分别表示小、中和大尺度物体的框平均精度。