2021秋招提前批-小米未来星-视觉算法研究员-面试总结

1 minute read

Published:



你是第位访客~ ٩(๑^o^๑)۶ Σ(っ °Д °;)っ被你发现了!

小米未来星-视觉算法研究员 面经

部门概况:部门是属于小米 AI 实验室下面的二级部门,在北京和武汉都有团队,目前总体人员规模在 100 多人左右。部门主要做的是视觉相关的技术在小米手机上的应用,包括人脸识别,手机拍照的相关算法, 比如自拍虚化,背景换天,夜景增强。 相册内的人脸聚类等应用。

一面 (2020 年 8 月 04 日)

面试主要是三个部分:项目相关,算法题

  • 聊了一下当前实习所做的事情。
  • 以及之前做的项目的内容。
  • 讲了一篇论文。
  • 传统的 style transfer 的做法有哪些
  • 算法题
'''
输入一张二维的灰度图,然后逐个pixel用sobel算子计算灰度图像的梯度
sobel算子如下:
dx=[
[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]
]
dy=[
[-1, -2, -1],
[0, 0, 0],
[1, 2, 1]
]
为了简化运算,最后的梯度输出为
grad=|dx|+|dy|
'''
import numpy as np

def sobel(img,dx,dy):
    n,m=img.shape

    padding=np.zeros((n+2,m+2)) # padding with zero
    padding[1:n+1,1:m+1]=img
    img=padding

    x_cache=np.zeros(img.shape)
    y_cache=np.zeros(img.shape)

    dx=np.reshape(1,-1)
    dy=np.reshape(1,-1)

    for i in range(1,n+1):
        for j in range(1,m+1):
            ''' for循环版本
            tx=0
            ty=0
            for x in range(-1,2):
                for y in range(-1,2):
                    cur_i=i+x
                    cur_j=j+y
                    if cur_i>=0 and cur_i<n and cur_j>=0 and cur_j<m:
                        tx+=img[cur_i][cur_j] * dx[x+1][y+1]
                        ty+=img[cur_i][cur_j] * dy[x+1][y+1]
            '''
            data=img[i:i+3,j:j+3].reshape(-1,1)
            tx=np.matmul(dx,data).squeeze()
            ty=np.matmul(dy,data).squeeze()
            x_cache[i][j]=tx
            y_cache[i][j]=ty
    return np.abs(x_cache)+np.abs(y_cache)

二面 (2020 年 8 月 4 日)

二面面了一个半小时,面试官会问很多项目上的细节

  • 当前实习的工作,以及实现的方法,考虑

  • 霍夫变换直线检测的原理。
  • 多条线段怎么判断是否组成一个矩形。

  • 讲了一下论文

  • 会不会安卓开发

  • SLAM 系统的位姿矩阵如何和 OpenGL 的相机投影矩阵转换

  • 深度学习抑制过拟合的方法有哪些

    • dropout,BN,regularization,early stop, data augmentation,lr warming up。
  • BN 的作用,BN 在 inference 的时候均值和方差是怎么用的?

  • 如何实现 pytorch 里的 data loader?多进程还是多线程实现?

  • 进程和线程的区别

  • python 为啥多线程无法利用多核计算资源?

    • python 解释器的全局锁问题
  • python 多线程和多进程一般开到多少?

  • 线程间的通信怎么做

  • 多线程的读写怎么保证安全性,为什么要注意线程的安全性,java 里的线程信号量怎么实现。

  • 进程的内存分配,堆?栈?

  • 算法题
'''
给定一个pixel转换函数输入是一个pixel,输出是某个转换的值,如果有一个很大的图片4K*5K 大小,想要对每个pixel依次操作得到返回的结果如何计算。

设给定的转换函数是 def PixelTransform(pix): return something
'''

def func(img):
  n,m=img.shape
  mp={i:PixelTransform(i) for i in range(256)}
  for i in range(n):
    for j in range(m):
        img[i][j]=mp[img[i][j]]
  return img

  • 算法题 2

'''
如果PixelTransform函数接受两个参数pix和gamma,对一张给定的图片需要对每个pixel计算多种不同的gamma值得到结果,假设有k个gamma选项,最终得到k个处理后的图片,求着k个图片所有的pixel的均值。

如果pixelTransform函数接受的输入是一个区域,这个算法还适用吗?
'''

def PixelTransform(pix,gamma):
    return None

def func(img,gammas):
    cont={}
    n,m=img.shape
    for i in range(n):
        for j in range(m):
            cur=img[i][j]
            cont[cur]=cont.get(cur,0)+1

    g_cache={i:0 for i in cont}
    for g in gammas:
        for pix,cnt in cont.items():
            g_cache[pix]+=PixelTransform(pix, g)

    total_pix_cnt=0
    total_sum=0
    for pix,cnt in cont.items():
        t_g = g_cache[pix]
        total_sum += t_g*cnt
        total_pix_cnt += cnt

    return total_sum/(total_pix_cnt*len(gammas))