当前位置:   article > 正文

2021年字节跳动-计算机视觉研究员面经_字节博士计算机

字节博士计算机

介绍

本文是针对牛客面经贴:字节跳动-博士生-计算机视觉研究员面经的一个解答

一面:技术面

计算机视觉和机器学习问题

  1. 用numpy实现一下bicubic插值。
def W(x):
    # a = -1
    x = abs(x)
    if x <= 1:
        return 1 - 2*(x**2) + (x**3)
    elif x < 2:
        return 4 - 8*x + 5*(x**2) - (x**3)
    else:
        return 0

def weighted_sum(srcImg, scrX, srcY, u, v):
    # 为了加速,使用矩阵乘法
    A = np.array([W(u+1), W(u), W(u-1), W(u-2)])
    # A: 1x4
    A = A[np.newaxis, :]
    C = np.array([W(v+1), W(v), W(v-1), W(v-2)])
    # C: 4x1
    C = C[:, np.newaxis]
    # 选取原图像中对应的16个像素
    # 本应该是srcImg[scrX-1:scrX+3, srcY-1:srcY+3]
    # 为了防止数组越界,前面已经原图像进行了pad操作,即前面pad一个像素,后面pad两个像素
    # 所以此时的scrX-1已经对应着原图像的scrX了
    B = srcImg[scrX:scrX+4, srcY:srcY+4]
    res = np.zeros(3, dtype=np.float32)
    for i in range(3):
        tmp = np.matmul(A, B[:,:,i])
        tmp = np.matmul(tmp, C)
        if tmp > 255: tmp = 255
        if tmp < 0: tmp = 0
        res[i] = tmp
    return res

def bicubic(srcImg, dstH, dstW):
    srcH, srcW, _ = srcImg.shape
    # 将原图像的高度和宽度扩展(1, 2)个像素
    # 目的是为了防止后面的计算出现数组越界的情况
    srcImg = np.pad(srcImg, ((1,2),(1,2),(0,0)), mode='reflect')
    # 创建目标图像
    dstImg = np.zeros((dstH, dstW, 3), dtype=np.uint8)
    # 遍历目标图像中的每个像素点
    for dstX in range(dstH):
        for dstY in range(dstW):
            # 寻找目标图像上的一个点对应在原图像上的位置 (x, y)
            # 注意这里的x和y不是一个整数
            x = dstX * (srcH / dstH)
            y = dstY * (srcW / dstW)
            # 将x和y进行向下取整,得到原图上对应的像素位置(scrX, srcY)
            scrX = int(x)
            srcY = int(y)
            # 计算目标像素与原图像上整数像素之间的距离
            u = x - scrX
            v = y - srcY
            # 计算目标像素值,通过原图像16个整数像素的加权和
            dstImg[dstX, dstY] = weighted_sum(srcImg, scrX, srcY, u, v)
    return dstImg.astype(np.uint8)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

Python实现最近邻nearest、双线性bilinear、双三次bicubic插值

  1. 阐述常见的边缘提取算子,并介绍一下CANNY算子的具体步骤。

常见的边缘提取算子:

1、正交梯度算子(一阶导数算子):Roberts(罗伯茨)算子、Prewitt(普雷维特)算子、Sobel(索贝尔)算子
2、方向微分算子:Kirsch(基尔希)算子
3、二阶导数算子:Laplacian(拉普拉斯)算子、Marr/LoG(马尔)算子
4、最优边缘检测算子:Canny(坎尼)算子
5、SUSAN算子

Canny(坎尼)算子具体步骤

1、高斯滤波平滑
2、计算梯度大小与方向
3、非极大值抑制
4、双阈值检测和连接

原理:

1、图像降噪。我们知道梯度算子可以用于增强图像,本质上是通过增强边缘轮廓来实现的,也就是说是可以检测到边缘的。但是,它们受噪声的影响都很大。那么,我们第一步就是想到要先去除噪声,因为噪声就是灰度变化很大的地方,所以容易被识别为伪边缘。
2、计算图像梯度,得到可能边缘。我们在前面的关于《图像梯度》文章中有所介绍,计算图像梯度能够得到图像的边缘,因为梯度是灰度变化明显的地方,而边缘也是灰度变化明显的地方。当然这一步只能得到可能的边缘。因为灰度变化的地方可能是边缘,也可能不是边缘。这一步就有了所有可能是边缘的集合。
3、非极大值抑制。通常灰度变化的地方都比较集中,将局部范围内的梯度方向上,灰度变化最大的保留下来,其它的不保留,这样可以剔除掉一大部分的点。将有多个像素宽的边缘变成一个单像素宽的边缘。即“胖边缘”变成“瘦边缘”。
4、双阈值筛选。通过非极大值抑制后,仍然有很多的可能边缘点,进一步的设置一个双阈值,即低阈值(low),高阈值(high)。灰度变化大于high的,设置为强边缘像素,低于low的,剔除。在low和high之间的设置为弱边缘。进一步判断,如果其领域内有强边缘像素,保留,如果没有,剔除。这样做的目的是只保留强边缘轮廓的话,有些边缘可能不闭合,需要从满足low和high之间的点进行补充,使得边缘尽可能的闭合。

Canny边缘检测

  1. 机器学习中Overfitting的常用解决方法。

1、数据层面:增加训练样本、使用有效的数据增强
2、模型层面:减少网络参数、加入BN和Dropout等网络层
3、优化层面:加入正则化项,例如L1\L2正则、早停(即提前停止训练过程)
4、技术层面:使用半监督、少样本策略来使用上unlabel的数据

  1. BN的原理和具体实现,用Pytorch实现一下BN层。

背景:

在深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化的这一过程被称作Internal Covariate Shift。

Internal Covariate Shift(内部方差偏移):

1、上层网络需要不停调整来适应输入数据分布的变化,导致网络学习速度的降低
2、网络的训练过程容易陷入梯度饱和区,减缓网络收敛速度

白化:

优点:使得输入特征分布具有相同的均值与方差、去除特征之间的相关性
缺点:白化过程计算成本太高、白化过程由于改变了网络每一层的分布,因而改变了网络层中本身数据的表达能力

BN

1、用更加简化的方式来对数据进行规范化,使得第L层的输入每个特征的分布均值为0,方差为1。
2、使用两个可学习的参数,一定程度上保证了输入数据的表达能力。

BN的优势

1、BN使得网络中每层输入数据的分布相对稳定,加速模型学习速度
2、BN使得模型对网络中的参数不那么敏感,简化调参过程,使得网络学习更加稳定
3、BN允许网络使用饱和性激活函数(例如sigmoid,tanh等),缓解梯度消失问题
4、BN具有一定的正则化效果

python实现
在这里插入图片描述
BN的反向传播
BN层的反向传播推导

BN、LN、IN、GN的区别

1、BN是在batch上,对N、H、W做归一化,而保留通道 C 的维度。BN对较小的batch size效果不好。BN适用于固定深度的前向神经网络,如CNN,不适用于RNN;
2、LN在通道方向上,对C、H、W归一化,主要对RNN效果明显;
3、IN在图像像素上,对H、W做归一化,用在风格化迁移;
4、GN将channel分组,然后再做归一化。

Batch Normalization原理与实战
python神经网络pytorch中BN运算操作自实现
BN、LN、IN、GN
详说Normalization(Batch Normalization,Layer Normalization,Instance Normalization,Group Normalization)

  1. Dropout前传和后传的差异。

  2. BN和Dropout一起用的时候会出现什么问题?

会出现方差偏移现象:
解释一:

本论文作者发现理解 Dropout 与 BN 之间冲突的关键是网络状态切换过程中存在神经方差的(neural variance)不一致行为。
试想若有图一中的神经响应 X,当网络从训练转为测试时,Dropout 可以通过其随机失活保留率(即 p)来缩放响应,并在学习中改变神经元的方差,而 BN 仍然维持 X 的统计滑动方差。这种方差不匹配可能导致数值不稳定。而随着网络越来越深,最终预测的数值偏差可能会累计,从而降低系统的性能。
简单起见,作者们将这一现象命名为「方差偏移」。
事实上,如果没有 Dropout,那么实际前馈中的神经元方差将与 BN 所累计的滑动方差非常接近,这也保证了其较高的测试准确率。

解释二:

1、因为训练时采用了dropout,虽然通过除以(1-p)的方式来使得训练和测试时,每个神经元输入的期望大致相同,但是他们的方差却不一样。
2、BN是采用训练时得到的均值和方差对数据进行归一化的,现在dropout层的方差都不一样了,那还搞毛,一步错步步错,最终导致输出不准确,影响最后的性能。

解决办法:

1、在所有 BN 层后使用 Dropout。把Dropout放在所有BN层的后面就可以了,这样就不会产生方差偏移的问题,但实则有逃避问题的感觉。
2、修改 Dropout 的公式让它对方差并不那么敏感,就是高斯Dropout。这样做带来了一个好处就是这个形式的Dropout(又称为“Uout”)对方差的偏移的敏感度降低了,总得来说就是整体方差偏地没有那么厉害了。

Batch Normalization和Dropout如何搭配使用?
BN和Dropout共同使用时会出现的问题
如何通过方差偏移理解批归一化与Dropout之间的冲突

编程题与数学题

  1. 用较快的办法找到一个未排序数组第k大的数字。

Leetcode: 215. 数组中的第K个最大元素

  1. 用均匀分布随机整数生成器rand(7)来实现rand(10)。

Leetcode: 470. 用 Rand7() 实现 Rand10()

  1. 计算机中一般常见的是均匀分布的(伪)随机数,如果要用正态分布,就需要用均匀分布去生成,那么如何用均匀分布生成正态分布?或者给出数学推导。

Box-Muller方法
如何用均匀分布构造正态分布
两个均匀分布相加、两个正态分布相加、由均匀分布生成正态分布

二面:技术面

计算机视觉问题

  1. 用过GAN吗?用过什么样的GAN?目前在用的GAN是什么?
  2. 你对网络结构的设计有什么心得?
  3. 怎么做网络轻量化?
  4. 你对attention机制的理解是什么?attention机制的优势和劣势分别在哪里?
  5. 视频超分与图像超分之间的区别?

编程题

  1. 给定一个整数数组和一个目标值,返回数组中了两数之和等于目标值的数的下标。

三面:技术面(主管)

  1. 如果想给抖音的一个视频做封面,可以怎么设计算法,让我讲两种不同的思路。
  2. 有100盏灯,一开始都是亮的,第一次隔1盏灯按一下开关,第二次隔两盏,第99次隔99盏,问99次之后哪些灯是亮的。

四面:HR面

  1. 方向问题:去字节想做什么方向?有什么职业规划?对字节的期待是什么?
  2. 每次面试之后会做复盘吗?怎么做的?
  3. 实习期间遇到了什么问题和困难,怎么解决的?
  4. 科研和工作时碰到技术瓶颈怎么解决?
  5. 对于不太懂技术的人,比如她自己,请简单地阐述超分辨率和HDR重建这两个方向的区别。

最后再次感谢博主玛莉的棒棒糖提供的面经
建议看原博客:字节跳动-博士生-计算机视觉研究员面经

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/523784
推荐阅读
相关标签
  

闽ICP备14008679号