1、问题场景
1.1、图像分类
用分类器,确定图像所属的分类,如汽车,杯子等。
1.2、图像检测
检测图像中存在的物体,比如人脸检测。
1.3、图像识别
识别物体的特征信息,如人脸识别,文字识别。
2、经典理论
2.1、常用图像处理手段
- 灰度处理,机器视觉的算法一般只处理灰度图像,色彩对处理结果影响不大
- 二值化,在灰度图像基础上,分离前景与背景
- 灰度直方图,用统计方法对比图像相似度
- 高斯滤波,去除图像噪声
- 边缘检测,提取图像中物体的轮廓,用于进一步物体检测
- 腐蚀与扩张,吞噬边缘噪点,是边缘更平滑
- 锐化,突出物体边缘
2.2、模式识别理论基础
- 距离定义:欧氏距离,曼哈顿距离,巴氏距离,矢量余弦,集合距离
- K近邻算法:KD树,R树
- K-Means:最简单的聚类算法
- 贝叶斯分类
- 支持向量机
2.3、图像常用特征
- 灰度直方图,统计特征
- SIFT:尺度不变特征转换
- LBP:局部二值模式
- HAAR,
- HOG:方向梯度直方图
3、神经网络
最近几年,基于神经网络的机器视觉有重大发展,相对传统特征分类算法有更好的表现。
3.1、基本概念
- 神经元,模拟生物神经元,对多个输入信号线性加权累加后,再通过一个非线性函数变换,输出信号
- 输入层,隐藏层,输出层,每一层都有很多神经元,相邻层之间的神经元全连接
- 权重参数,神经元连接的权重,也就是线性累加的权重,通过网络学习来调整逼近最优值
- 激活函数,非线性变换函数,有sigmoid,relu、tanh等
- 神经网络,多层神经元组成
- 回归,通过误差反馈,反向逐层调整网络权重参数
3.2、图像处理网络
- 卷积神经网络
处理3维数据的神经网络,图像的2维加上1个特征维,最简单的特征如RGB分量。因为考虑了位置信息,更适合图像处理领域(也适合二维游戏竞技领域)
- 循环神经网络
带记忆的网络,适合自然语言处理领域,如文字,语音识别
3.3、发展进程
- 目标分类领域:LeNet-5、AlexNet、VGG、Inception、ResNet、MobileNet
- 目标检测领域:R-CNN、Fast R-CNN、Faster R-CNN、Yolo、SSD、YoloV2, Yolo9000
- 自然语音领域:RNN、LSTM、GRU
3、软件框架
3.1、OpenCL
通用并行计算框架。图像处理涉及大量的张量计算,使用GPU、DSP等硬件手段是提升处理性能重要途径。
OpenCL是一组标准接口,NVDIA、AMD等芯片商都有各自的实现。
在部分移动平台也支持OpenCL,如部分Android手机。
很多图像处理框架提供基于OpenCL的处理加速。
3.2、OpenCV
跨平台的计算机视觉库,包含很多常用的图像处理算法的实现。
最常见的的使用是基于python环境,但是基础实现是基于C/C++,也提供IOS、Android平台的开发库。
自动基于OpenCL、CUDA硬件加速。
3.3、TensorFlow
用于各种感知和语言理解任务的机器学习,采用数据流图。支持python、android平台,但是只支持CUDA硬件加速,在移动平台只能基于CPU运算。
基本使用方式是构建神经网络,训练和检测,可以将训练过的网络保存为bp文件。
类似的软件框架有Caffe,ONNX
3.4、CNTK
微软认知工具库
3.5、cuDNN
NVIDIA CUDA 深度学习库
3.6、Keras
基于 Python 的深度学习库,能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键。
3.7、bazel
Google开源的一套编译构建工具,用来构建TensorFlow。单独列出来是他可以代替很多构建工具,学习一套就够了。
3.8、Mace
小米开源的深度学习引擎,支持TensorFlow模型,可以用OpenCL提示性能,但是提升不多(10%左右)。
3.9、dlib
另一个深度学习库,C++,python绑定
3.10、其他
python:panda、numpy、scipy、matplotlib、pickle