Matlab实现图像识别(八)

这节实现图像的预处理。

在最开始的时候,我们仅仅是把图像进行灰度化,并为了训练效率,强行缩小了图像,导致损失了许多图像信息,实际上,有更多的方法来保存这些信息。

现在流行的图像预处理算法非常多,例如图像反转,灰度线性变换,非线性变换,直方图均衡化,线性平滑滤波器,中值滤波器,Sobel算子和拉普拉斯对图像锐化,梯度算子检测边缘,LOG算子检测边缘,Canny算子检测边缘,边界跟踪(bwtraceboundary函数),Hough变换,直方图阈值法,自动阈值法:Otsu法,膨胀操作,腐蚀操作,开启和闭合操作,开启和闭合组合操作,形态学边界提取等等。

例如对于车牌识别或者指纹检测,我们可以使用图像锐化的方法,这样更容易提取出特征,但是对于一般图像检测的话,锐化可能导致信息丢失,究竟用什么预处理方法,最好的方法就是挨个试一下,哪个有用就用哪个。

说实在的,既然把图像都压缩到60*80大小了,而且还不能变大,变大那么运算力就会吃紧,导致丢失大量信息,另外就是图片也是灰度化的,完全丢失了颜色信息,任何要增加信息量的方法都必然会使运算负担加重,导致图像预处理也就是并没有太大作用了,锐化了的图像就一定能比不锐化的图像识别的更成功吗?不一定,但是可以预见的是,即便是精度有损失,也不一定会损失多少。

因此,我的结论是,对图像不进行图形学上的预处理,直接进行卷积池化获得特征。

在一开始我们怎么压缩的图片呢?是这样的:

img = imresize(img, [60, 80]);

这个imresize是怎么调整到任意大小的呢?它是按照双三次插值,这仍是图形学上的操作,我们用卷积来代替,会得到更多的信息。

卷积参数和池化参数怎么确定呢?这里面可以调整的参数太多了,只能说一个一个试,现在随便选择一个。先把图像大小固定到28*28,用20个9*9的卷积过滤器,池化层为2*2的平均池化,隐藏层100个节点,输出层10个节点,那么,我们需要训练的就只有三个参数,分别是卷积时候的参数,隐藏层的参数和输出层的参数。整个运算过程就可以直接用一个函数代表了。我们可以这样用:


那么这里就会有一个问题,就是一般是有一个b,但是这里没有b的位置了,为了代码清晰,就没用,实际上,既然都这么不准了,或者说,整个网络都没有什么特别清晰的判定标准,多一个b,少一个b又能降低多少精确度呢?you never know.
其中X是输出数据,L为标签,这样,每次输入一个批量的数据,返还修改后的参数,然后循环个几千遍,就算好了。

下节讲代码。









 

你可能感兴趣的:(机器学习)