龙空技术网

小骨子对图像算法工程师的面试准备

DeepBit 196

前言:

今天大家对“图像算法工程师入门”都比较讲究,兄弟们都想要了解一些“图像算法工程师入门”的相关知识。那么小编也在网络上搜集了一些对于“图像算法工程师入门””的相关知识,希望小伙伴们能喜欢,兄弟们一起来学习一下吧!

基础

1.语言:c,python,c++

2.目标检测,图像分类,图像识别,图像分割

3.图像处理算法及opencv

4.深度学习算法

5.机器学习常用算法

项目点了解

1.tensorflow

2.yoloV3

3.keras

4.Inceptionv3和v4

5.LeNet

6.tensorflow下slim

7.tensorflow下object detection

8.图像预处理:图像增强和降噪,亮度直方图均衡化,大小修改

9.tensorflow下layer模块

10.ssd_moblienet_v2

11.边界框对图片进行裁剪

12.PIL库进行方格绘制

13.fashion net

机器学习算法=模型表征 + 模型评估 + 优化算法(百面机器学习)

1.随机梯度下降(SGD)

说一说随机梯度下降(SGD),面试的时候总是会被问道这是什么?

随机梯度下降的过程可以类比一个人下山的过程。以他当前的所处的位置为基准,寻找方向,然后朝着山的高度下降最快的地方走。但是因为选择方向的原因,我们找到的的最低点可能不是真正的最低点。梯度的方向是函数在给定点上升最快的方向,那么梯度的反方向就是函数在给定点下降最快的方向。

这是一个经典的优化算法,批量梯度下降(Batch Gradient Descent)、随机梯度下降(Stochastic Gradient Descent)以及小批量梯度下降(Mini-Batch Gradient Descent)

批量梯度下降法是最原始的形式,它是指在每一次迭代时使用所有样本来进行梯度的更新。批量梯度下降每次学习都使用整个训练集,因此其优点在于每次更新都会朝着正确的方向进行,最后能够保证收敛于极值点(凸函数收敛于全局极值点,非凸函数可能会收敛于局部极值点),但是其缺点在于每次学习时间过长,并且如果训练集很大以至于需要消耗大量的内存,并且全量梯度下降不能进行在线模型参数更新。

随机梯度下降算法每次只随机选择一个样本来更新模型参数,因此每次的学习是非常快速的,并且可以进行在线更新。随机梯度下降最大的缺点在于每次更新可能并不会按照正确的方向进行,因此可以带来优化波动(扰动)

Mini-batch 梯度下降综合了 batch 梯度下降与 stochastic 梯度下降,在每次更新速度与更新次数中间取得一个平衡,其每次更新从训练集中随机选择 m,m<n 个样本进行学习。mini-batch梯度下降可以保证收敛性,常用于神经网络中。

Mini-batch 梯度下降 batcha_size的选择带来的影响:
  (1)在合理地范围内,增大batch_size的好处:
    a. 内存利用率提高了,大矩阵乘法的并行化效率提高。
    b. 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
    c. 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。
  (2)盲目增大batch_size的坏处:
    a. 内存利用率提高了,但是内存容量可能撑不住了。
    b. 跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
    c. Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。

参考

如果你的数据特征是稀疏的,那么你最好使用自适应学习速率SGD优化方法(Adagrad、Adadelta、RMSprop与Adam)。Adam可能是目前最好的SGD优化方法。

2.学习率衰减

在模型训练初期,会使用较大的学习率进行模型优化,随着迭代次数增加,学习率会逐渐进行减小,保证模型在训练后期不会有太大的波动,从而更加接近最优解。
学习率设置过小,那么学习速度会非常慢,会大大降低优化速度,需要很多轮的迭代才能达到一个比较理想的优化效果。

学习率衰减的类型有很多种,大致可以分为两类:

一是通过人为经验进行设定,如到达多少轮后,设定具体的学习率为多少;二是随着迭代轮数的增加学习率自动发生衰减,这类有比较常用的指数型衰退。

在机器学习中,监督式学习通过定义一个模型,并根据训练集上的数据估计最优参数。梯度下降法是一个广泛被用来最小化模型误差的参数优化算法。梯度下降法通过多次迭代,并在每一步中最小化成本函数(cost 来估计模型的参数。学习率 (learning rate),在迭代过程中会控制模型的学习进度。
在模型优化中,常用到的几种学习率衰减方法有:分段常数衰减、多项式衰减、指数衰减、自然指数衰减、余弦衰减、线性余弦衰减、噪声线性余弦衰减

参考

3.Dropout

训练一个大型的神经网络,训练数据很少的话,那么容易引起过拟合。

Dropout说的简单一点就是我们让在前向传导的时候,让某个神经元的激活值以一定的概率p,让其停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征。

4.批量标准化

BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

参考

优点

①不仅仅极大提升了训练速度,收敛过程大大加快;②还能增加分类效果,一种解释是这是类似于Dropout的一种防止过拟合的正则化表达方式,所以不用Dropout也能达到相当的效果;③另外调参过程也简单多了,对于初始化要求没那么高,而且可以使用大的学习率等。

5.图像处理基本算法

(1)图像增强

图像增强是对一副图像进行某种操作,使其结果在特定应用中比原始图像更适合进行处理。

keras.preprocessing.image.ImageDataGenerator(featurewise_center=False, samplewise_center=False, featurewise_std_normalization=False, samplewise_std_normalization=False, zca_whitening=False, zca_epsilon=1e-06, rotation_range=0.0, width_shift_range=0.0, height_shift_range=0.0, brightness_range=None, shear_range=0.0, zoom_range=0.0, channel_shift_range=0.0, fill_mode='nearest', cval=0.0, horizontal_flip=False, vertical_flip=False, rescale=None, preprocessing_function=None, data_format=None, validation_split=0.0)参数: featurewise_center: Boolean. 对输入的图片每个通道减去每个通道对应均值。 samplewise_center: Boolan. 每张图片减去样本均值, 使得每个样本均值为0。 featurewise_std_normalization(): Boolean() samplewise_std_normalization(): Boolean() zca_epsilon(): Default 12-6 zca_whitening: Boolean. 去除样本之间的相关性 rotation_range(): 旋转范围 width_shift_range(): 水平平移范围 height_shift_range(): 垂直平移范围 shear_range(): float, 透视变换的范围 zoom_range(): 缩放范围 fill_mode: 填充模式, constant, nearest, reflect cval: fill_mode == 'constant'的时候填充值 horizontal_flip(): 水平反转 vertical_flip(): 垂直翻转 preprocessing_function(): user提供的处理函数 data_format(): channels_first或者channels_last validation_split(): 多少数据用于验证集作者:ItchyHacker链接:

(2)图像降噪

噪声是图像干扰的重要原因。一幅图像在实际应用中可能存在各种各样的噪声,这些噪声可能在传输中产生,也可能在量化等处理中产生。

去除脉冲干扰及椒盐噪声最常用的算法是中值滤波。

中值滤波法:一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。

均值滤波:典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标象素为中心的周围n个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。

高斯滤波:是一种线性滤波,是常用的一种滤波算法,利用二维高斯函数的分布方式来对图像进行平滑。

(3)直方图正规化

假如图像的灰度分布不均匀,其灰度分布集中在较窄的范围内,使图像的细节不够清晰,对比度较低。通常采用直方图均衡化及直方图规定化两种变换,使图像的灰度范围拉开或使灰度均匀分布,从而增大反差,使图像细节清晰,以达到增强的目的。
直方图均衡化,对图像进行非线性拉伸,重新分配图像的灰度值,使一定范围内图像的灰度值大致相等。这样,原来直方图中间的峰值部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个较为平坦的直方图。

图像的灰度直方图能够很直观的展示图像中灰度级的整体分布情况,对图像的后续处理有很好的指导作用。直方图的均衡化的是将一幅图像的直方图变平,使各个灰度级的趋于均匀分布,这样能够很好的增强图像对比度。直方图均衡化是一种自动化的变换,仅需要输入图像,就能够确定图像的变换函数。但是直方图的均衡化操作也有一定的确定,在均衡化的过程中对图像中的数据不加选择,这样有可能会增强图像的背景;变换后图像的灰度级减少,有可能造成某些细节的消失;会压缩图像直方图中的高峰,造成处理后图像对比度的不自然等。直方图规定化,也称为直方图匹配,经过规定化处理将原图像的直方图变换为特定形状的直方图(上面中的示例,就是将图像的直方图变换为另一幅图像的直方图)。它可以按照预先设定的某个形状来调整图像的直方图,运用均衡化原理的基础上,通过建立原始图像和期望图像之间的关系,选择地控制直方图,使原始图像的直方图变成规定的形状它可以按照预先设定的某个形状来调整图像的直方图。直方图规定化是在运用均衡化原理的基础上,通过建立原始图像和期望图像之间的关系,选择地控制直方图,使原始图像的直方图变成规定的形状,从而弥补直方图均衡化的一些缺点.

(4)图像分割

参考

大多数分割算法基于灰度值的两个基本性质之一:不连续性和相似性。对于不连续的灰度,方法是以灰度突变为基本分割一副图像,比如图像的边缘。对于相似的灰度,主要方法是根据一组预定义的准则把一副图像分割为相似的区域。阈值处理,区域生长,区域分裂和区域聚合都是这类方法的例子。

语义分割(semantic segmentation)开始,慢慢进阶到更复杂的实例分割(instance segmentation)。语义图像分割是为图像中的每个像素分配语义类别标签的任务,它不分割对象实例。

基于边缘的图像分割算法:

基于区域分割的算法:基于区域提取方法有两种基本形式:一种是区域生长,从单个像素出发,逐步合并以形成所需要的分割区域;另一种是从全局出发,逐步切割至所需的分割区域。

区域生长是从一组代表不同生长区域的种子像素开始,接下来将种子像素邻域里符合条件的像素合并到种子像素所代表的生长区域中,并将新添加的像素作为新的种子像素继续合并过程,知道找不到符合条件的新像素为止

分裂合并可以说是区域生长的逆过程,从整幅图像出发,不断的分裂得到各个子区域,然后再把前景区域合并,得到需要分割的前景目标,进而实现目标的提取。

区域分裂合并算法优缺点:

(1)对复杂图像分割效果好;

(2)算法复杂,计算量大;

(3)分裂有可能破坏区域的边界。

基于阈值的分割方法:基于图像的灰度特征来计算一个或多个灰度阈值,并将图像中每个像素的灰度值与阈值作比较,最后将像素根据比较结果分到合适的类别中。只考虑像素点灰度值本身的特征,一般不考虑空间特征,因此对噪声比较敏感,鲁棒性不高。

6.TF-slim

TF-slim是TensorFlow的一个新的轻量级的高级API接口是TensorFlow的一个新的轻量级的高级API接口。它将很多常见的TensorFlow函数进行了二次封装,使得代码变得更加简洁,特别适用于构建复杂结构的深度神经网络,它可以用了定义、训练、和评估复杂的模型。

7.

标签: #图像算法工程师入门