机器学习通常包含输入、特征提取、分类和输出4个步骤。深度学习通常分为输入、特征提取与分类和输出3个步骤,它将机器学习中的特征提取和分类合并在同一个步骤中完成。相对于机器学习,深度学习需要提供的输入数据量更大,计算量也更大。深度学习的“深度”体现在神经网络层次规模上,例如,ResNet及其变种实现的神经网络多达上百层。
OpenCV在3.1版本中引入了一个深度神经网络贡献模块(名称为dnn),并在3.3版本中将其迁移到了主库中。dnn模块目前实现前馈(推理)方法,只需要导入预训练模型即可实现基于深度学习的图像处理。OpenCV支持目前流行的深度学习框架,包括Caffe、TensorFlow和Torch/Pytorch等,以及基于开放神经网络交换(Open Neural Network Exchange,ONNX)的框架。在应用程序中,只需要导入预训练模型,即可用准备好的数据执行预测操作,获得需要的处理结果。
图像识别是将图像内容作为一个对象来识别其类型。使用OpenCV中的深度学习预训练模型进行图像识别的基本步骤如下。
(1)从配置文件和预训练模型文件中加载模型。
(2)将图像文件处理为块数据(blob)。
(3)将图像文件的块数据设置为模型的输入。
(4)执行预测。
(5)处理预测结果。
1.基于AlexNet和Caffe模型的图像识别
AlexNet由2012年ImageNet竞赛冠军获得者辛顿(Hinton)和他的学生阿莱克斯·克里泽夫斯基(Alex Krizhevsky)设计,其网络结构包含了5层卷积神经网络(Convolutional Neural Network,CNN),3层全连接网络,采用GPU来加速计算。在处理图像时,AlexNet使用的图像块大小为224×224。
Caffe的全称为快速特征嵌入的卷积结构(Convolutional Architecture for Fast Feature Embedding),是一个兼具表达性、速度和思维模块化的深度学习框架。Caffe由伯克利人工智能研究小组和伯克利视觉和学习中心开发。Caffe内核用C++实现,提供了Python和Matlab等接口。
下面的代码使用基于AlexNet和Caffe的预训练模型进行图像识别。
深度残差网络(Deep Residual Network,ResNet)由何凯明(Kaiming He)等人提出,其主要特点是在神经网络中增加了残差单元,可通过残差学习解决因网络深度增加带来的退化问题,提高预测准确率。
下面的代码使用基于ResNet和Caffe的预训练模型进行图像识别。