图像处理算法面经1
普通概念
卷积神经网络(CNN,Convolutional Neural Network)
原理:CNN 受到人类视觉神经系统的启发,通过卷积层、池化层和全连接层构建网络。卷积层使用卷积核在输入数据上滑动进行卷积操作,提取局部特征;池化层用于降低数据维度,减少计算量并增强特征的鲁棒性;全连接层则将提取的特征进行整合,完成分类或回归等任务。
应用场景:在图像识别(如人脸识别、物体检测)、语音识别、自然语言处理(如文本分类)等领域有广泛应用。
循环神经网络(RNN,Recurrent Neural Network)
原理:RNN 引入了循环结构,允许网络在处理序列数据时保存之前的信息。它通过隐藏状态在不同时间步之间传递信息,从而对序列数据进行建模。然而,传统 RNN 存在梯度消失或梯度爆炸的问题,导致难以学习长期依赖关系。
应用场景:主要用于处理序列数据,如自然语言处理中的机器翻译、文本生成,语音识别中的语音序列处理等。
生成对抗网络(GAN,Generative Adversarial Network)
原理:GAN 由生成器(Generator)和判别器(Discriminator)两个神经网络组成。生成器尝试生成逼真的数据,而判别器则负责区分生成的数据和真实数据。两者通过对抗训练不断提升性能,生成器最终能够生成高质量的合成数据。
应用场景:图像生成(如生成逼真的人脸、风景图像)、数据增强、风格迁移等。
Transformer
原理:Transformer 完全基于注意力机制,摒弃了传统的循环结构和卷积结构。它由编码器和解码器组成,编码器负责对输入序列进行特征提取,解码器则根据编码器的输出生成目标序列。Transformer 通过多头注意力机制捕捉序列中不同位置之间的依赖关系。
应用场景:在自然语言处理领域取得了巨大成功,如机器翻译、文本摘要、问答系统等,也逐渐应用于计算机视觉等其他领域。
注意力机制(Attention)
原理:注意力机制模拟了人类的注意力分配方式,允许模型在处理序列数据时聚焦于序列中的重要部分。它通过计算查询(Query)、键(Key)和值(Value)之间的相似度,为不同位置的元素分配不同的权重,从而动态地选择重要信息。
应用场景:广泛应用于自然语言处理和计算机视觉等领域,是 Transformer 等模型的核心组件,可提升模型对序列数据的处理能力。
YOLO(You Only Look Once)
YOLO(You Only Look Once)是一种实时目标检测算法,由 Joseph Redmon 等人在 2015 年提出。它以其快速的检测速度和较高的检测精度,在目标检测领域得到了广泛应用。
算法原理
YOLO 算法的核心思想是将目标检测问题转化为一个回归问题,通过一个单一的神经网络直接在图像上预测边界框和类别概率。
具体步骤如下:
图像划分:将输入图像划分为 (S\times S) 个网格。如果某个目标的中心落在某个网格内,那么该网格就负责检测这个目标。
预测输出:每个网格需要预测 B 个边界框(bounding box)及其置信度(confidence score),以及 C 个类别概率。每个边界框由 ((x, y, w, h)) 四个值表示,其中 ((x, y)) 是边界框的中心坐标,((w, h)) 是边界框的宽度和高度。置信度表示边界框中包含目标的可能性以及边界框的预测准确性。
置信度计算:置信度的计算公式为 (Pr(Object)\times IOU_{pred}^{truth}),其中 (Pr(Object)) 表示网格中是否存在目标的概率,(IOU_{pred}^{truth}) 是预测边界框与真实边界框的交并比(Intersection over Union)。
类别预测:每个网格还需要预测 C 个类别概率 (Pr(Class_i|Object)),表示在存在目标的前提下,该目标属于第 i 类的概率。
最终输出:将置信度与类别概率相乘,得到每个边界框属于各个类别的得分,通过设定阈值过滤掉得分较低的边界框,并使用非极大值抑制(NMS)去除重叠的边界框,最终得到检测结果。
发展历程
YOLOv3:2018 年推出,进一步改进了网络结构,使用了多尺度预测和特征融合技术,能够检测不同大小的目标。同时,采用了更复杂的损失函数,提高了检测精度。
YOLOv5:由 Ultralytics 公司开发,虽然没有正式的学术论文发表,但在实际应用中得到了广泛使用。它具有代码简洁、易于使用和训练速度快等优点,提供了不同规模的模型供用户选择。
YOLOX:2021 年提出,采用了无锚框(anchor-free)的检测方法,简化了模型结构,提高了检测效率。同时,引入了解耦头(Decoupled Head)和标签分配策略(Label Assignment)等技术,进一步提升了检测性能。
YOLOv8:同样由 Ultralytics 公司开发,是 YOLO 系列的最新版本。它支持图像分类、目标检测、实例分割和关键点检测等多种任务,并且在性能上有了进一步的提升。
优点
速度快:YOLO 算法将目标检测作为一个回归问题处理,通过一个神经网络直接预测边界框和类别概率,不需要像传统方法那样进行多次特征提取和分类,因此检测速度非常快,能够满足实时应用的需求。
端到端训练:YOLO 算法可以进行端到端的训练,即从输入图像到输出检测结果只需要一个网络,简化了训练过程,提高了训练效率。
全局信息利用:YOLO 算法在预测时考虑了整个图像的信息,能够更好地捕捉目标的上下文信息,减少了背景误检的情况。
缺点
定位精度有限:由于每个网格只能预测有限个边界框,对于密集分布的小目标,YOLO 算法的检测精度可能会受到影响。
小目标检测效果不佳:YOLO 算法在处理小目标时,由于网格划分和特征提取的限制,可能无法准确地检测到小目标。
对不同尺度目标适应性不足:虽然后续版本的 YOLO 算法采用了多尺度预测等技术,但对于尺度变化较大的目标,仍然存在一定的检测难度。
机考
字符串匹配
反转链表
迭代(双指针)
代码
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
cur, pre = head, None
while cur:
tmp = cur.next # 暂存后继节点 cur.next
cur.next = pre # 修改 next 引用指向
pre = cur # pre 暂存 cur
cur = tmp # cur 访问下一节点
return pre
寻找旋转排序数组中的最小值
二分查找
代码
class Solution:
def findMin(self, nums: List[int]) -> int:
left, right = -1, len(nums) - 1 # 开区间 (-1, n-1)
while left + 1 < right: # 开区间不为空
mid = (left + right) // 2
if nums[mid] < nums[-1]:
right = mid
else:
left = mid
return nums[right]
问题参考
牛客:https://www.nowcoder.com/discuss/737051368216702976?sourceSSR=search
代码参考
@灵茶山艾府