Rocky Ding
公众号:WeThinkIn
写在前面
【三年面试五年模拟】栏目专注于分享CV算法与机器学习相关的经典&&必备&&高价值的面试知识点,并向着更实战,更真实,更从容的方向不断优化迭代。也欢迎大家提出宝贵的意见或优化ideas,一起交流学习💪
大家好,我是Rocky。
本文是“三年面试五年模拟”之独孤九剑秘籍的第十一式,之前我们将独孤九剑秘籍前六式进行汇总梳理成汇总篇,并制作成pdf版本,大家可在公众号后台 【精华干货】菜单或者回复关键词“三年面试五年模拟” 进行取用。除此之外Rocky还将YOLOv1-v7全系列大解析也制作成相应的pdf版本,大家可在公众号后台 【精华干货】菜单或者回复关键词“YOLO” 进行取用。
由于本系列都是Rocky在工作之余进行整理总结,难免有疏漏与错误之处,欢迎大家对可优化的部分进行指正,我将在后续的优化迭代版本中及时更正。
在【人人都是算法工程师】算法工程师的“三年面试五年模拟”之独孤九剑秘籍(先行版)中我们阐述了这个program的愿景与规划。本系列接下来的每一篇文章都将以独孤九剑秘籍框架的逻辑展开,考虑到易读性与文章篇幅,一篇文章中只选取每个分支技能树中的2-3个经典&&高价值知识点和面试问题,并配以相应的参考答案(精简版),供大家参考。
希望独孤九剑秘籍的每一式都能让江湖中的英雄豪杰获益。
So,enjoy(与本文的BGM一起食用更佳哦):
干货篇
----【目录先行】----
深度学习基础:
-
什么是有效感受野?
-
全局池化的作用?
经典模型&&热门模型:
-
有哪些经典的轻量型人脸检测模型?
-
LFFD人脸检测模型的结构和特点?
机器学习基础:
-
格拉姆矩阵的相关概念?
-
感知损失的相关概念?
Python/C/C++知识:
-
Python中的主要数据结构都有哪些?
-
Python中的可变对象和不可变对象?
-
C/C++中内存泄漏以及解决方法?
模型部署:
-
什么是模型量化?
-
什么是模型剪枝?
图像处理基础:
-
RGB图像转为灰度图的方法?
-
仿射变换和透视变换的概念?
计算机基础:
-
Linux中的进程状态种类
-
Linux中ps aux指令与grep指令配合管理进程
开放性问题:
-
业务侧,竞赛侧,研究侧成果如何互相转化?
-
深度学习的优势和局限?
----【深度学习基础】----
【一】什么是有效感受野?
感受野的相关知识在之前的文章【三年面试五年模拟】算法工程师的独孤九剑秘籍(前六式汇总篇)中介绍过。
我们接着再看看有效感受野(effective receptive field, ERF)的相关知识。
一般而言,feature map上有效感受野要小于实际感受野。其有效性,以中心点为基准,类似高斯分布向边缘递减。
总的来说,感受野主要描述feature map中的最大信息量,有效感受野则主要描述信息的有效性。
【二】全局池化的作用?
全局池化主要包括全局平均池化和全局最大池化。
接下来,Rocky以全局平均池化为例,讲述其如何在深度学习网络中发挥作用。
刚才已经讲过,全局平均池化就是对最后一层卷积的特征图,每个通道求整个特征图的均值。如下图所示:
一般网络的最后会再接几个全连接层,但全局池化后的feature map相当于一像素,所以最后的全连接其实就成了一个加权相加的操作。这种结构比起直接的全连接更加直观,参数量大大幅下降,并且泛化性能更好:
全局池化的作用:
- 代替全连接层,降低参数量。
- 减少过拟合,增加泛化能力。
----【经典模型&&热门模型】----
【一】有哪些经典的轻量型人脸检测模型?
人脸检测相对于通用目标检测来说,算是一个子任务。比起通用目标检测任务动辄检测1000个类别,人脸检测任务主要聚焦于人脸的单类目标检测,使用通用目标检测模型太过奢侈,有点“杀鸡用牛刀”的感觉,并且大量的参数冗余,会影响部署侧的实用性,故针对人脸检测任务,学术界提出了很多轻量型的人脸检测模型,Rocky在这里给大家介绍一些比较有代表性的:
- libfacedetection
- Ultra-Light-Fast-Generic-Face-Detector-1MB
- A-Light-and-Fast-Face-Detector-for-Edge-Devices
- CenterFace
- DBFace
- RetinaFace
- MTCNN
【二】LFFD人脸检测模型的结构和特点?
Rocky在实习/校招面试中被多次问到LFFD模型以及面试官想套取LFFD相关算法方案的情况,说明LFFD模型在工业界还是比较有价值的,下面Rocky就带着大家学习一下LFFD模型的知识:
LFFD(A-Light-and-Fast-Face-Detector-for-Edge-Devices)适用于人脸、行人、车辆等单目标检测任务,具有速度快,模型小,效果好的特点。LFFD是Anchor-free的方法,使用感受野替代Anchors,并在主干结构上抽取8路特征图对从小到大的人脸进行检测,检测模块分为类别二分类与边界框回归。
LFFD模型结构
我们可以看到,LFFD模型主要由四部分组成:tiny part、small part、medium part、large part。
模型中并没有采用BN层,因为BN层会减慢17%的推理速度。其主要采用尽可能快的下采样来保持100%的人脸覆盖。
LFFD主要特点:
-
结构简单直接,易于在主流AI端侧设备中进行部署。
-
检测小目标能力突出,在极高分辨率(比如8K或更大)画面,可以检测其间10个像素大小的目标;
LFFD损失函数
LFFD损失函数是由regression loss和classification loss的加权和。
分类损失使用了交叉熵损失。
回归损失使用了L2损失函数。
LFFD论文地址:LFFD: A Light and Fast Face Detector for Edge Devices论文地址
----【机器学习基础】----
【一】格拉姆矩阵的相关概念?
n维欧式空间中任意k个向量之间两两的内积所组成的矩阵,称为这k个向量的格拉姆矩阵(Gram matrix),这是一个对称矩阵。
其中对角线元素提供了k个不同特征图(a1,a2 … ,ak)各自的信息,其余元素提供了不同特征图之间的相关信息。既能体现出有哪些特征,又能体现出不同特征间的紧密程度。图像风格迁移领域将其定义为风格特征。
格拉姆矩阵在风格迁移中有广泛的应用,深度学习中经典的风格迁移流程是:
-
准备基线图像和风格图像。
-
使用特征提取器分别提取基线图像和风格图像的feature map。
-
分别计算两个图像的feature map的格拉姆矩阵,以两个图像的格拉姆矩阵的差异最小化为优化目标,不断调整基线图像,使风格不断接近目标风格图像。
【二】感知损失的相关概念?
感知损失在图像生成领域中比较常用。其核心是将gt图片卷积得到的高层feature与生成图片卷积得到的高层feature进行回归,从而约束生成图像的高层特征(内容和全局结构)。
上面的公式中,划线部分代表了高层特征,一般使用VGG作为特征提取器。
----【Python/C/C++知识】----
【一】Python中的主要数据结构都有哪些?
- 列表(list)
- 元组(tuple)
- 字典(dict)
- 集合(set)
【二】Python中的可变对象和不可变对象?
可变对象与不可变对象的区别在于对象本身是否可变。
可变对象:list(列表) dict(字典) set(集合)
不可变对象:tuple(元组) string(字符串) int(整型) float(浮点型) bool(布尔型)
【三】C/C++中内存泄漏以及解决方法?
内存泄漏是指己动态分配的堆内存由于某种原因导致程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
解决方法:
造成内存泄漏的主要原因是在使用new或malloc动态分配堆上的内存空间,而并未使用delete或free及时释放掉内存造成的。所以解决方法就是注意new/delete和malloc/free一定要配套使用。
----【模型部署】----
【一】什么是模型量化?
通常的深度学习模型参数是FP32浮点型的,而模型量化主要是使用FP16,INT8以及INT4等低精度类型来保存模型参数,从而有效的降低模型计算量和内存占用,并将精度损失限制在一个可接受的范围内。
模型量化主要分在线量化和离线量化。在线量化在模型训练阶段采用量化方法进行量化。离线量化主要在模型离线工具(模型转换阶段)中采用量化方法进行量化。
工业界中主要使用离线量化作为通用模型量化的解决方案。
【二】什么是模型剪枝?
模型剪枝按照剪枝粒度可分为突触剪枝、神经元剪枝、权重矩阵剪枝等,主要是将权重矩阵中不重要的参数设置为0,结合稀疏矩阵来进行存储和计算。通常为了保证性能,需要逐步进行迭代剪枝,让精度损失限制在一个可接受的范围。
突触剪枝剪掉神经元之间的不重要的连接。对应到权重矩阵中,相当于将某个参数设置为0。
神经元剪枝则直接将某个节点直接裁剪。对应到权重矩阵中,相当于某一行和某一列置零。
除此之外,也可以将整个权重矩阵裁剪,每一层中只保留最重要的部分,这就是权重矩阵剪枝。相比突触剪枝和神经元剪枝,权重矩阵剪枝压缩率要大很多。
----【图像处理基础】----
【一】RGB图像转为灰度图的方法?
- RGB任选一通道作为灰度图
- RGB中最大值最为灰度图
- RGB的均值作为灰度图
- RGB的加权均值作为灰度图
【二】仿射变换和透视变换的概念?
仿射变换是对图片进行平移,缩放,倾斜和旋转等操作,是一种二维坐标到二维坐标之间的线性变换。它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。
透视变换是将图片投影到一个新的视平面,也称作投影映射。它是将二维图片投影到三维空间,再投回另一个二维空间的映射操作。
仿射变换和透视变换的最大区别:一个平行四边形,经过仿射变换后依然是平行四边形;而经过透视变换后只是一个四边形(不再平行了)。
----【计算机基础】----
【一】Linux中的进程状态种类
- 运行(正在运行或在运行队列中等待)
- 中断(休眠中,受阻,在等待某个条件的形成或等待接受到信号)
- 不可中断(收到信号不唤醒和不可运行,进程必须等待直到有中断发生)
- 僵死(进程已终止,但进程描述符存在,直到父进程调用wait4()系统调用后释放)
- 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)
【二】Linux中ps aux指令与grep指令配合管理进程
ps相关指令
ps命令(Process Status)是最基本同时也是非常强大的进程查看命令。
- ps a 显示现行终端机下的所有程序,包括其他用户的程序。
- ps -A 显示所有程序。
- ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
- ps -e 此参数的效果和指定"A"参数相同。
- ps e 列出程序时,显示每个程序所使用的环境变量。
- ps f 用ASCII字符显示树状结构,表达程序间的相互关系。
- ps -H 显示树状结构,表示程序间的相互关系。
- ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。
- ps s 采用程序信号的格式显示程序状况。
- ps S 列出程序时,包括已中断的子程序资料。
- ps -t <终端机编号> 指定终端机编号,并列出属于该终端机的程序的状况。
- ps u 以用户为主的格式来显示程序状况。
- ps x 显示所有程序,不以终端机来区分。
ps aux | more 指令
这个指令可以显示进程详细的状态。
参数解释:
- USER:进程的所有者。
- PID:进程的ID。
- PPID:父进程。
- %CPU:进程占用的CPU百分比。
- %MEM:进程占用的内存百分比。
- NI:进程的NICE值,数值越大,表示占用的CPU时间越少。
- VSZ:该进程使用的虚拟内存量(KB)。
- RSS:该进程占用的固定内存量(KB)。
- TTY:该进程在哪个终端上运行,若与终端无关,则显示?。若为pts/0等,则表示由网络连接主机进程。
- WCHAN:查看当前进程是否在运行,若为-表示正在运行。
- START:该进程被触发启动时间。
- TIME:该进程实际使用CPU运行的时间。
- COMMAND:命令的名称和参数。
- STAT状态位常见的状态字符:
D 无法中断的休眠状态(通常 IO 的进程);
R 正在运行可中在队列中可过行的;
S 处于休眠状态;
T 停止或被追踪;
W 进入内存交换 (从内核2.6开始无效);
X 死掉的进程 (基本很少見);
Z 僵尸进程;
< 优先级高的进程
N 优先级较低的进程
L 有些页被锁进内存;
s 进程的领导者(在它之下有子进程);
l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads);+ 位于后台的进程组;
ps aux | grep xxx命令
如果直接用ps命令,会显示所有进程的状态,通常结合grep命令查看某进程的状态。
grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
例如我想要查看Python 的所有进程,可以在终端输入如下命令:
ps aux | grep python
便可以把Python相关的进程全部都打印到终端供我们查看。相关参数和之前的ps aux | more一致。
进程结束命令
我们可以使用kill命令来结束进程。
如下面的指令所示:
kill PID //杀掉进程
kill -9 PID //强制杀死进程
----【开放性问题】----
这些问题基于Rocky的思考提出,希望除了能给大家带来面试的思考,也能给大家带来面试以外的思考。这些问题没有标准答案,我相信每个人心中都有自己灵光一现的创造,你的呢?
【一】业务侧,竞赛侧,研究侧成果如何互相转化?
这是一个非常有价值的问题,随着宏观环境的变化,各个公司更加注重现金流,纯研究院等部门会被持续优化,这时如何高效的转化竞赛侧与研究侧的实用性成果,以及如何将业务侧经验向竞赛侧与研究侧延伸,成为各个公司重点考虑的问题。
【二】深度学习的优势和局限?
深度学习发展至今,工业界,学术界,投资界都对其优势和局限有所判断了。作为面试者,也需要对深度学习的趋势有所把握,不仅仅能在面试中进行交流,也能作为职业发展规划的一个先验知识。
精致的结尾
最后,感谢大家读完这篇文章,希望能给大家带来帮助~后续Rocky会持续撰写“三年面试五年模拟”之独孤九剑的系列文章,大家敬请期待!
Rocky一直在运营技术交流群(WeThinkIn-技术交流群),这个群的初心主要聚焦于技术话题的讨论与学习,包括但不限于算法,开发,竞赛,科研以及工作求职等。群里有很多人工智能行业的大牛,欢迎大家入群一起学习交流~(请添加小助手微信Jarvis8866,拉你进群~)