OpenCV+深度学习预训练模型,简单搞定图像识别 | 教程
李林 编译自 pyimagesearch 作者 Adrian Rosebrock 量子位 报道 | 公众号 QbitAI
OpenCV是一个2000年发布的开源计算机视觉库,有进行物体识别、图像分割、人脸识别、动作识别等多种功能,可以在Linux、Windows、Android、Mac OS等操作系统上运行,以轻量级、高效著称,且提供多种语言接口。
而OpenCV最近一次版本更新,为我们带来了更好的深度学习支持,在OpenCV中使用预训练的深度学习模型变得非常容易。
pyimagesearch网站今天发布了一份用OpenCV+深度学习预训练模型做图像识别的教程,量子位编译整理如下:
最近,OpenCV 3.3刚刚正式发布,对深度学习(dnn模块)提供了更好的支持,dnn模块目前支持Caffe、TensorFlow、Torch、PyTorch等深度学习框架。
另外,新版本中使用预训练深度学习模型的API同时兼容C++和Python,让系列操作变得非常简便:
- 从硬盘加载模型;
- 对输入图像进行预处理;
- 将图像输入网络,获取输出的分类。
当然,我们不能、也不该用OpenCV训练深度学习模型,但这个新版本让我们能把用深度学习框架训练好了的模型拿来,高效地用在OpenCV之中。
这篇文章就展示了如何用ImageNet上预训练的深度学习模型来识别图像。
OpenCV 3.3中的深度学习
自OpenCV 3.1版以来,dnn模块一直是opencv_contrib库的一部分,在3.3版中,它被提到了主仓库中。
用OpenCV 3.3,可以很好地利用深度学习预训练模型,将它们作为分类器。
新版OpenCV兼容以下热门网络架构:
- AlexNet
- GoogLeNet v1(也叫Inception-5h)
- ResNet-34/50/…
- SqueezeNet v1.1
- VGG-based FCN
- ENet
- VGG-based SSD
- MobileNet-based SSD
该模块的主要贡献者Rynikov Alexander,对这个模块有远大的计划,不过,他写的release notes是俄语的,感兴趣的同学请自行谷歌翻译着读:https://habrahabr.ru/company/intel/blog/333612/
我认为,dnn模块会对OpenCV社区产生很大的影响。
函数和框架
在OpenCV中使用深度学习预训练模型,首先要安装OpenCV 3.3,安装过程量子位就不再详细描述了……
下面是我们将用到的一些函数。
在dnn中从磁盘加载图片:
cv2.dnn.blobFromImage
cv2.dnn.blobFromImages
用“create”方法直接从各种框架中导出模型:
cv2.dnn.createCaffeImporter
cv2.dnn.createTensorFlowImporter
cv2.dnn.createTorchImporter
使用“读取”方法从磁盘直接加载序列化模型:
cv2.dnn.readNetFromCaffe
cv2.dnn.readNetFromTensorFlow
cv2.dnn.readNetFromTorch
cv2.dnn.readhTorchBlob
从磁盘加载完模型之后,可以用.forward方法来向前传播我们的图像,获取分类结果。
用OpenCV和深度学习给图像分类
接下来,我们来学习如何用Python、OpenCV和一个预训练过的Caffe模型来进行图像识别。
下文用到的深度学习模型是在ImageNet上预训练过的GoogleLeNet。GoogleLeNet出自Szegedy等人2014年的论文Going Deeper with Convolutions,详情见:https://arxiv.org/abs/1409.4842
首先,打开一个新文件,将其命名为deep_learning_with_opencv.py,插入如下代码,来导入我们需要的包:
然后拆解命令行参数:
其中第8行ap = argparse.ArgumentParser()是用来创建参数解析器的,接下来的代码用来创建4个命令行参数:
- —image:输入图像的路径;
- —prototxt:Caffe部署prototxt的路径
- —model:预训练的Caffe模型,例如网络权重等;
- —labels:ImageNet标签的路径,例如syn-sets。
我们在创建参数之后,将它们解析并存在一个变量args中,供稍后使用。
接下来,加载输入图像和标签:
第20行从磁盘加载了图像,第23行和24行加载了这些标签:
搞定了标签之后,我们来看一下dnn模块:
注意上面代码中的注释,我们使用cv2.dnn.blobFromImage执行mean subtraction来对输入图像进行归一化,从而产生一个已知的blob形状。
然后从磁盘加载我们的模型:
我们用cv2.dnn.readNetFromCaffe来加载Caffe模型定义prototxt,以及预训练模型。
接下来,我们以blob为输入,在神经网络中完成一次正向传播:
请注意:我们不是在训练CNN,而是在使用预训练模型,因此只需要将blob从网络中传递过去,来获取结果,不需要反向传播。
最后,我们来为输入图像取出5个排名最高的预测结果:
我们可以用NumPy来选取排名前5的结果,然后将他们显示出来:
分类结果
我们已经在OpenCV中用Python代码实现了深度学习图像识别,现在,可以拿一些图片来试一试。
打开你的终端,执行以下命令:
就会得到这样的结果:
OpenCV和GoogleLeNet正确地认出了比格小猎犬,排名第一的结果是正确的,之后的4项结果相关度也很高。
在CPU上运行这个算法,得到结果也只需要不到一秒钟。
再来一张:
结果如下:
再来:
结果依然不错:
最后一个例子:
也认得不错:
相关链接
教程原文: http://www.pyimagesearch.com/2017/08/21/deep-learning-with-opencv/
相关代码: 在原文下填邮箱获取,或在量子位公众号(QbitAI)对话界面回复“OpenCV”获取。
- 位运算的方法,小结
- Golang语言--多线程求和
- AlphaGo Zero代码迟迟不开源,TF等不及自己推了一个
- nyoj---快速查找素数
- 转--Golang图像处理工具库,图像相似度计算,图像二值化
- HDUOJ----湫湫系列故事——减肥记I
- HDUOJ----Eddy's research I
- 【亚马逊加盟对抗谷歌联盟ONNX】微软Facebook深度学习开源联盟再添盟友
- HDUOJ--8球胜负
- HDUOJ--点球大战
- Golang语言社区--使用百度API获取经纬度
- HDUOJ---The number of divisors(约数) about Humble Numbers
- HDUOJ----最少拦截系统
- Go语言截取字符串函数用法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CentOS6.5安装python3.7详细步骤
- Centos7.5配置IP地址的实现
- linux里daily_routine实例代码详解
- 类Linux环境安装jdk1.8及环境变量配置详解
- CentOS7yum安装PHP7.2的操作方法
- CentOS 7中 Apache Web 服务器安装配置教程
- Win10安装Linux系统的教程图解
- 浅谈ubuntu执行.sh文件几种方式区别
- CentOS7使用yum安装PostgreSQL和PostGIS的方法
- Linux Windows下设置定时执行任务的方法
- 详解ssh免密码登录配置方法(图示加命令)
- centos 7 修改sshd | 禁止 root登录及sshd端口脚本定义
- Linux 全能系统监控工具dstat的实例详解
- 解决-BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: 权限不够问题
- linux常用工具vi/vim的使用完整版