图像特效
1. 灰度化、颜色反转、马赛克(选取左上角像素值作为10x10方块像素)、毛玻璃(随机选取附近像素值)、图片融合(带权重)、边缘检测、线段绘制
2. 边缘检测:灰度化 高斯滤波 Canny(双阈值)/Sobel(一阶微分算子:带权重/两个算子计算GxGy、图片卷积:算子&图片像素值、阈值判断sqrt(Gx*Gx+Gy*Gy)),经边缘检测后输出二值图像。
图像美化
1. 直方图均衡化(图片亮度、清晰度):
直方图用于统计每个像素值的概率 横坐标:0-255 纵坐标:概率0-1(rgb可分离)
直方图均衡化:分布函数(最终结果使像素值分布到0-255上),详见另一博客。像素映射 / 彩色图像需要进行通道分解,处理后,通道合成,颜色会有变化(可中间转化为YUV图片格式进行处理,不改变颜色)
2. 图片修补(cv2.inpaint方法)
3. 亮度增强:rgb分别up
4. 磨皮美白:cv2.bilateralFilter()方法双边滤波
滤波:去除一些小斑点
5. 高斯滤波:cv2.GaussianBlur()方法 每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到
6. 均值滤波:核6*6 像素值(rgb分别)取核均值,模糊化
7. 中值滤波:核 像素值(rgb分别)取核中值
机器学习
预备:视频《=》图片分解合成
1. 机器学习(训练样本+特征+分类器+预测、检验)&深度学习(海量训练样本+神经网络)
Haar+Adaboost=>人脸检测+眼睛检测:
OpenCV有已经训练好的分类器.xml文件,直接放入人脸图片,会计算Haar特征并进行检验预测
https://zhuanlan.zhihu.com/p/31427728
Hog+SVM=>行人检测、小狮子识别:先进行正负样本的训练,然后图片进行检验
2. Haar特征(像素运算的结果)
积分图构建算法去简化计算:使得固定大小的检测窗口在一幅图像中滑动(opencv中大小固定),每个检测窗口中产生不同的Haar特征,每个特征又拥有大量Haar子特征(数量计算见博客https://blog.csdn.net/u013403054/article/details/78461083),值随着Haar模板的类型、大小、位置的改变而改变。
OpenCV通过已经训练好的Adaboost对Haar特征进行阈值判断,最终判定该检测窗口中是否含有人脸。判断过程:在弱分类器中根据阈值判断得到不同的value值,强分类器中输出值等于各弱分类器输出之和,输出值>强分类器阈值,表示通过检验,之后,通过每个强分类器的检验,才可判定检测窗口含有人脸。
3. Adaboost(强分类器、弱分类器、node):Haar《=》node节点
Adaboost训练过程:集成分类器由各个基分类器*权重组成,以min(误检率)选定阈值,计算出误检率,得到基分类器权重,并不断进行样例的权重调整,增加检测错误样例的权重……循环训练。finally,get the th and the value according to the judgement of the th. More specifically, refer to blog. The links are below.
参考博客https://blog.csdn.net/u013403054/article/details/78461083
参考博客:Adaboost原理
https://www.cnblogs.com/liuwu265/p/4692347.html
https://zhuanlan.zhihu.com/p/27126737
OpenCV中调用.xml文件实现 标签 描述一个boost分类器 强分类器stage下含弱分类器,弱分类器中含阈值数据、Haar特征数据。
4. SVM:监督学习(含label)Support Vector Machine寻找最优超平面
OpenCV可直接创建SVM,加入训练数据(正负样本)+label进行训练,得到训练后的SVM,最后输入需要判断的数据进行预测或判断。
手写数字识别
1. KNN方法:这里写一点思路,具体代码可参见我的博客。
首先,训练集和测试集来自于mnist,可从网上下载。数据包括训练集(image,label)和测试集(image,label)。这里的image是经过归一化处理的灰度图像像素矩阵(数据预处理)。label利用10bits进行存储,如[0 0 0 1 0 0 0 0 0 0]表示对应的image的label值为3。这样的数据集处理有利于后续的计算(mnist已实现)。
KNN的思想:利用最近邻域的方法,计算每一张测试图片(例如测试图片5张)与每一张训练图片(例如训练图片500张)的对应像素(每一张图片像素shape28*28=784)差值,得到矩阵shape为5*500*784,将其第二维作sum处理,矩阵shape变为5*500,意为每个测试图片与每个训练图片的各个对应像素差之和。其中找出5*k个最小值,意为从500张训练图片中找出每一张测试图片像素值最接近的k张图片,计算这k张图片背后对应的label值,同一个label值数量最多的即认定为该测试图片的识别出来的label值(即最接近测试图片的k张训练图片中,数量最多的是label值为几的图片,就认定测试图片识别出来的数字为几)。与该测试图片已知的label值进行比对,即可知道是否识别正确,进而可计算5张测试图片正确识别的正确率有多少了。
2. BP(BackPropagation反向传播神经网络)
本质在于通过error不断调整w权重参数矩阵。具体推导过程见:https://zhuanlan.zhihu.com/p/42174696(main)或https://zhuanlan.zhihu.com/p/23270674
停止迭代有两种情况:(1). 迭代一定次数 (2). 误差小于所需要的精确度。两种情况的描述如下:
(1). 迭代一定次数:它并不是对于每一个样本都设定一个迭代的次数,而是对所有的样本。
也就是说,指定训练次数,在每一次中依次输入样本,每一次样本输入,都调整权值。
(2). 误差小于所需要的精确度
在更新完一个样本后,我们获得了对于第一个样本来说最优的权重参数,此时,以迭代完成的第一个样本的参数为基础继续更新。就是把第1步随机赋予权重换成第一个样本得到的最优权重,在此基础上,在新的样本输入上继续更新。在权重参数已经对第一个样本最优的情况下继续更新,的确会造成偏离第一个样本的最优权重,但是!我们的目标是使权重对所有的样本都最优。
3. CNN方法
卷积神经网络就是让权重在不同位置共享的神经网络。input layer=》covolutional layer(ReLu layer)=》 pooling layer=》fully-connected layer
每个filter会在width维, height维上,以局部连接和空间共享,并贯串整个depth维的方式得到一个Feature Map。filter内的权重矩阵W是网络根据数据学习得到的,也就是说,我们让神经网络自己学习以什么样的方式去观察图片。当我们增加一个filter后,就又可以得到一个Feature Map。 将不同filters所卷积得到的Feature Maps按顺序堆叠后,就得到了一个卷积层的最终输出。其中,卷积乘法不以常规扫描的方式一步步计算局部节点和filter的权重的点乘,而用两个大矩阵的乘法来一次性囊括所有计算。具体见下行链接。
https://zhuanlan.zhihu.com/p/27642620
卷积神经网络:局部连接、权值共享(空间共享):此处说明,由于CNN卷积层与前一层连接是权值共享方式,所以使得CNN权重在不同位置共享,即某一样本识别目标在某个位置时,loss前馈调整了某几个权重值,若是BP神经网络,当样本中识别目标在另一位置时(平移),则需要重新调整其他几个权重值,而由于CNN 的权重共享性,则不需要样本中识别目标在另一位置时而重新调整权值,实现了空间共享性。但是,三个channels的权重并不共享。
CNN的手写数字识别代码见教材视频。过程:输入 卷积 激励 池化 乘加(w、b)运算 softmax 计算出识别到每个数字的概率
定义loss,每次训练500张图片,训练10轮,输出每一轮的识别正确率,可以看到正确率在不断增加。
人脸识别
CNN刷脸识别学习。可利用爬虫网络获取/ffmpeg、opencv分解视频获取图片。可利用Haar+adaboost的xml文件识别图像中的人脸并将人脸抠出来变成一张图片进行数据的预处理=》归一化(255=》 0-1)。这里实例用tensorflow构建了一个比较简单的CNN,然后利用耶鲁的数据集Yale_64x64.mat进行人脸识别神经网络训练并检验。代码见代码记录的博客part3。
吴恩达学习视频《神经网路和深度学习》
一. 神经网络和深度学习
海量数据+硬件性能+算法创新(快速计算更大的神经网络)
1. 一些概念:
结构化数据:某些特征、统计数据(大小、数量等)
非结构化数据:音频、文本、图像
CNN:图像 RNN:时间序列,NLP
logistic线性回归 w*x+b=y sigmoid(y)映射到0-1 损失函数对单个样本、成本函数J对整个训练集的效果进行衡量
2. 梯度下降法
进行权值调整w、b:以一定步长(学习率),在梯度下降最快的地方(求导数向量),一步步移动,接近损失函数最小的最优解
3. 激活函数
sigmoid(输出层使用,可映射到0-1)
tanh=e^z-e^(-z)/e^z+e^(-z)更优秀,中心点(0,0)隐层使用
ReLU
2. 改善深层神经网络:超参数调试、正则化以及优化
3. 结构化机器学习项目
4. 卷积神经网络
5. 序列模型