上期文章
文章目录
一、上期问题
- stable diffusion的网络架构
- T5的网络架构(Text-To-Text Transfer Transformer模型)
- SDXL模型
- DALLE模型
- BPE编码
- 为什么DDPM加噪声的幅度是不一致的
二、理论问题
1、GroundingDino模型
GroundingDino是一个开放集对象检测器,它可以通过人类输入对任意物体进行检测。Grounding DINO采用双编码器,单解码器结构,它包含用于图像特征提取的图像主干、用于文本特征提取的文本主干,用于图像和文本特征融合的特征增强器,用于查询初始化的语言引导查询选择模块和用于框细化的跨模态解码器。对于每个(图像、文本)对,我们首先分别使用图像主干和文本主干提取普通图像特征和普通文本特征。这两个普通特征被送到用于跨模态特征融合的特征增强器模块中。在获得跨模态文本和图像特征后,我们使用语言引导的查询选择模块从图像特征中筛选出与输入文字特征相似更高的图像特征作为跨模态查询。将文本特征、图像特征以及跨模态查询输入到跨模态解码器中完成对目标对象边界框的预测及对应短语的提取。
Grounding DINO:开放集目标检测,将基于Transformer的检测器DINO与真值预训练相结合
2、SAM模型
SAM模型是一个通用的图像分割基础模型,全称为segment anything model,它借助了NLP任务中的Prompt思路,通过给图像分割任务提供一下Prompt提示来完成任意目标的快速分割。SAM模型主要由image encoder、prompt encoder和mask解码器三大块组成,模型的输入包括一个图像和一个提示,图像经过图像编码器得到编码,提示则输入提示编码器转换成编码。将这两个信息源输入到mask解码器中,mask解码器将两个特征融合并解码出最终的分割掩码。
SAM:segment anything model——一个通用的图像分割基础模型
3、stable diffusion相对于传统的diffusion的区别是什么,有什么改进
SD模型是基于Latent的扩散模型,常规的扩散模型在实际像素空间进行前向扩散过程和反向生成过程;而基于Latent的扩散模型在低维的Latent隐空间进行前向扩散过程和反向生成过程,可以大大降低显存占用和计算复杂性。
前序问题:stable diffusion模型的网络架构?
4、IOU、GIOU、DIOU、CIOU的区别
- IOU的提出是为了准确地反应两个目标边框重合的程度
计算方式:用预测框A和真实框B的交集除以两者的并集得到IOU
I o U = A ⋂ B A ⋃ B IoU=\frac{A\bigcap B}{A\bigcup B} IoU=A⋃BA⋂B
- GIOU的提出是为了解决IOU为0时,真实框和预测框之间距离度量的问题
计算方式:在IoU后面增加了一项,计算两个框的最小外接矩形,用于表征两个框的距离。(C是两个框的最小外接矩形的面积)
G I o U = I o U − C − ( A ⋃ B ) C , G I O U L o s s = 1 − G I O U GIoU=IoU-\frac{C-(A\bigcup B)}{C},GIOU Loss=1-GIOU GIoU=IoU−CC−(A⋃B),GIOULoss=1−GIOU
- IOU和GIOU不能区分具有包含关系的两个框的相对位置关系,并且在垂直水平方向上回归效果较差。DIoU将GIoU中最小外接框来最大化重叠面积的惩罚项修改成最小化两个BBox中心点的标准化距离从而加速损失的收敛过程
计算方式: D I o U = I o U − ρ 2 ( b , b g t ) c 2 = I o U − d 2 c 2 DIoU=IoU-\frac{\rho^2(b,b^{gt})}{c^2}=IoU-\frac{d^2}{c^2} DIoU=IoU−c2ρ2(b,bgt)=IoU−c2d2, D I O U L o s s = 1 − D I O U DIOU Loss=1-DIOU DIOULoss=1−DIOU
其中, b b b为预测框的中心点, b g t b^{gt} bgt是真实框的中心点, ρ \rho ρ是计算两个中心点之间的欧式距离, c c c是能够同时包含预测框和真实框的最小外接矩形的对角线长度。
当两个框完美重叠时,d=0,IOU=1,DIOU=1;如果两个框相距很远, d 2 c 2 \frac{d^2}{c^2} c2d2趋近于1,IOU=0,DIOU=-1。因此DIOU的取值范围也是[-1,1]。
- CIOU在DIOU的基础上添加了一项用于度量检测框的尺度,考虑了框的纵横比,从而使得预测框更加符合真实框。
CIOU的三项恰好对应IOU、中心点距离、长宽比的计算。其中, α \alpha α是权重函数, v v v用来度量宽高比的一致性, w w w、 h h h和 w g t w^{gt} wgt、 h g t h^{gt} hgt分别代表预测框的高宽和真实框的高宽。
C I o U = I o U − ( ρ 2 ( b , b g t ) c 2 + α v ) v = 4 π 2 ( a r c t a n w g t h g t − a r c t a n w h ) 2 α = v ( 1 − I o U ) + v CIoU=IoU-(\frac{\rho^2(b,b^{gt})}{c^2}+\alpha v)\\ v=\frac{4}{\pi^2}(arctan\frac{w^{gt}}{h^{gt}}-arctan\frac{w}{h})^2\\ \alpha =\frac{v}{(1-IoU)+v} CIoU=IoU−(c2ρ2(b,bgt)+αv)v=π24(arctanhgtwgt−arctanhw)2α=(1−IoU)+vv
L C I o U = 1 − C I o U = 1 − I o U + ( ρ 2 ( b , b g t ) c 2 ) + α v L_{CIoU}=1-CIoU=1-IoU+(\frac{\rho^2(b,b^{gt})}{c^2})+\alpha v LCIoU=1−CIoU=1−IoU+(c2ρ2(b,bgt))+αv
5、Transformer模型
Transformer是一种基于自注意力机制的神经网络模型,它的基本结构是由编码器和解码器组成的,编码器可以将输入序列转换为向量表示,而解码器则可以将该向量表示转换回输出序列。每个编码器和解码器都由若干个相同的层构成,每层中都包含多头注意力和全连接的前馈网络。Transformer 的关键优势在于自注意力机制,它允许模型直接计算序列中任何两个位置之间的依赖关系,无需通过递归,这使得模型可以更好地捕捉序列中的长距离依赖关系。
【论文精读】Transformer:Attention Is All You Need
6、BERT模型
BERT模型是一种基于Transformer的预训练语言模型,它的最大创新之处在于引入了双向Transformer编码器,这使得模型可以同时考虑输入序列的前后上下文信息。BERT通过在大量文本数据上进行预训练,学习的到了丰富的语言知识,然后在特定任务上进行微调,如文本分类、情感分析等。BERT的训练过程包括预训练和微调两个阶段,在预训练阶段,BERT应用MLM方法训练词的语义理解能力,用NSP方法训练句子之间的理解能力。在微调阶段,只需将特定于任务的输入和输出插入BERT,并对所有端到端参数进行微调即可。
【论文精读】BERT:Pre-training of Deep Bidirectional Transformers for Language Understanding
三、力扣刷题回顾-数组部分
上期涉及题目:
本期题目:
704. 二分查找:
- 给定输入:一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target
- 要求输出:找出nums数组中target对应的下标,数组中不包含该target则返回 -1。
27. 移除元素:
- 给定输入:一个数组 nums 和一个值 val
- 要求输出:移除所有数值为val的元素之后的数组的新长度
- 注意事项:
- 不要使用额外的数组空间,必须仅使用 O(1) 额外空间并原地修改输入数组。
- 元素的顺序可以改变。
- 不需要考虑数组中超出新长度后面的元素。
977.有序数组的平方:
- 给定输入:一个按 非递减顺序 排序的整数数组 nums
- 要求输出:返回每个数字的平方组成的新数组,并且这个新数组也是按照非递减顺序排列的
对比分析:
704. 二分查找是一道典型的二分法习题,27. 移除元素和977.有序数组的平方两道题可以使用双指针的方法解决。
704. 二分查找
- 注意区间的边界值
class Solution:
def search(self, nums: List[int], target: int) -> int:
left=0
right=len(nums)-1
while left<=right:
mid=left+(right-left)//2
if target>nums[mid]:
left=mid+1
elif target<nums[mid]:
right=mid-1
else:
return mid
return -1
27. 移除元素
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
slow=0
fast=0
size=len(nums)
while fast<size:
if nums[fast]!=val:
nums[slow]=nums[fast]
slow+=1
fast+=1
return slow
977.有序数组的平方
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
left=0
right=len(nums)-1
new=[float('inf')]*len(nums)
news=len(nums)-1
while left<=right:
if abs(nums[left]) > abs(nums[right]):
new[news]=nums[left]*nums[left]
left+=1
news-=1
else:
new[news]=nums[right]*nums[right]
right-=1
news-=1
return new
参考:
代码随想录算法训练营第一天|数组理论基础,704. 二分查找,27. 移除元素
代码随想录算法训练营第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II