百度2019校招计算机视觉方向笔试题
第一题:K-means聚类
-
K-means是有监督聚类还是无监督聚类?(2分)
答案:无监督聚类 -
写出将N个样本(X=(x1,…,xN))聚成K类的K-means聚类算法的优化目标函数。(6分)
答案:对于一个样本 x i x_{i} xi,计算其聚类损失为
l o s s i = a r g m i n ∣ ∣ x i − u j ∣ ∣ 2 loss_{i}=arg min||x_{i}-u_{j}||^2 lossi=argmin∣∣xi−uj∣∣2
其中 u j u_{j} uj表示第j类的质心。那么,整体的优化目标函数可以表示为:
l o s s = ∑ i N ∣ ∣ x i − u i ∣ ∣ 2 loss=\sum_{i}^N||x_{i}-u_{i}||^2 loss=i∑N∣∣xi−ui∣∣2
N N N表示样本的数量, u i u_{i} ui表示第i个类的质心。 -
请用伪代码写出聚类过程。(8分)
答案:
def Kmeans (输入数据,类簇的个数K):
初始计算K个质心点
repeat
计算数据中每个点到各个质心的距离,其中到质心距离最短的点被分为同一个簇,最后得到K个类簇
重新计算K个类簇的质心
until 直到所有样本的类簇不发生改变或达到最大迭代次数
- 假设样本特征维度为D,请描述Kmeans算法时间复杂度。(4分)
答案: KMeans聚类算法的时间复杂度为 O ( I ∗ n ∗ k ∗ m ) O(I*n*k*m) O(I∗n∗k∗m),其中m为每个元素字段个数,n为数据量,I为迭代次数。可以看到,无论是相对于数据量、特征维度、聚类数和迭代次数,KMeans聚类算法的时间复杂度都是线性的,是一个非常优雅高效的算法。
第二题:相机模型
相机模型有哪些参数,写出三维空间点到图像坐标投影公式。镜头畸变系数有哪几种,对应畸变矫正的公式表达?
答案:
-
相机模型的内参数重要有:主点,焦距,畸变系数。
-
三维空间点到二维图像的投影公式:
-
镜头畸变:径向畸变和切向畸变。
-
径向畸变矫正公式表达:
-
径向畸变矫正公式表达:
第三题:自动驾驶
在自动驾驶领域,障碍物的空间位置是很重要的信息。在不具备雷达等有测距能力传感器的情况下,如何仅通过单目相机计算出地面上目标的距离?
答案:TODO
第四题:目标检测
目前通过卷积神经网络进行检测的方法主要分为one-stage和two-stage,分别写出了解的对应的算法。在共性上两类检测算法有哪些差异?
答案:
- One-stage:yolov1、yolov2、yolov3、SSD、RetinaNet
Two-stage:Fast R-CNN、Faster R-CNN - Two-stage检测算法的共性,以faster r-cnn为例,使用了复杂的网络用于每个候选区域的分类和回归;ROI pooling后的feature channels数目较大,导致内存消耗和计算量都比较大。One-stage检测算法的共性,从网络结构上看只是多分类的rpn网络,相当于faster rcnn的第一阶段,因此one-stage主要的优势是速度快。
One-stage预测结果是从feature map回归出目标的位置及分类,有的也采用了anchor的概念。而two-stage对上述结果进行roi pooling后会进一步细化,因此two-stage算法检测精度一般相对较高。还有一种观点是,two-stage的rpn部分相当于做了正负样本均衡,这也是two-stage检测效果相对较好的一个原因。one-stage算法对小目标检测效果较差,如果所有的anchor都没有覆盖到这个目标,那么这个目标就会漏检。如果一个比较大的anchor覆盖了这个目标,那么较大的感受野会弱化目标的真实特征,得分也不会高。two-stage算法中的roi pooling会对目标做resize, 小目标的特征被放大,其特征轮廓也更为清晰,因此检测也更为准确。