OpenCV+深度学习预训练模型,简单搞定图像识别 | 教程

简介:
本文来自AI新媒体量子位(QbitAI)

1b08f0283d953f27050da12a9c91f7641fd1c7ac

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,插入如下代码,来导入我们需要的包:

63966a84c9469701715cc07243a1fb1e97cd7e54

然后拆解命令行参数:

5320ffb9854096fde703c93e39896fc966e80aa4

其中第8行ap = argparse.ArgumentParser()是用来创建参数解析器的,接下来的代码用来创建4个命令行参数:

  • —image:输入图像的路径;
  • —prototxt:Caffe部署prototxt的路径
  • —model:预训练的Caffe模型,例如网络权重等;
  • —labels:ImageNet标签的路径,例如syn-sets。

我们在创建参数之后,将它们解析并存在一个变量args中,供稍后使用。

接下来,加载输入图像和标签:

5f13b6004c89c9b2d11ab87edfd89ab4a37d5d94

第20行从磁盘加载了图像,第23行和24行加载了这些标签:

64b78abe812d2c80c1d5c45ce1e7a4e561a0d900

搞定了标签之后,我们来看一下dnn模块:

063d7b0e03be65ac2a1e6b64e3fc12d4ec4f6319

注意上面代码中的注释,我们使用cv2.dnn.blobFromImage执行mean subtraction来对输入图像进行归一化,从而产生一个已知的blob形状。

然后从磁盘加载我们的模型:

2270e3622cb910fc8d50d342c349458056cba453

我们用cv2.dnn.readNetFromCaffe来加载Caffe模型定义prototxt,以及预训练模型。

接下来,我们以blob为输入,在神经网络中完成一次正向传播:

a7566d32f3b47c5d7014b99c77e65a94fc01f822

请注意:我们不是在训练CNN,而是在使用预训练模型,因此只需要将blob从网络中传递过去,来获取结果,不需要反向传播。

最后,我们来为输入图像取出5个排名最高的预测结果:

21ca367f040e9b10021729dd3ed5a2691b848008

我们可以用NumPy来选取排名前5的结果,然后将他们显示出来:

15c00dd20ab09621f327d218957711b91431a531

分类结果

我们已经在OpenCV中用Python代码实现了深度学习图像识别,现在,可以拿一些图片来试一试。

打开你的终端,执行以下命令:

6c258506f17b27d1c372128130a809a04e306b08

就会得到这样的结果:

80d5e7bb73784a8a5b391abaee0681d57478746c

OpenCV和GoogleLeNet正确地认出了比格小猎犬,排名第一的结果是正确的,之后的4项结果相关度也很高。

在CPU上运行这个算法,得到结果也只需要不到一秒钟。

再来一张:

0703003ebdfac625899c05496911290392fc8aec

结果如下:

5bd135aea6821292c8d3a9afaec9732e343433c1

再来:

ad26c007863f5ea4f3cc8126c5df92592205b6f4

结果依然不错:

73ebcfef2fba5df28ef5ab203262ab5ea3bba6c1

最后一个例子:

f76b038a158010f94659d850c7e36363d2330b53

也认得不错:

776918e9e0183bf5366e6487656df0dbaabc3f08

相关链接

教程原文:
http://www.pyimagesearch.com/2017/08/21/deep-learning-with-opencv/

相关代码:
在原文下填邮箱获取,或在量子位公众号(QbitAI)对话界面回复“OpenCV”获取。

本文作者: Adrian Rosebrock
原文发布时间:2017-08-22
相关实践学习
基于函数计算实现AI推理
本场景基于函数计算建立一个TensorFlow Serverless AI推理平台。
相关文章
|
1天前
|
机器学习/深度学习 数据采集 人工智能
深度学习中的大模型「幻觉」问题:解析、原因及未来展望
深度学习中的大模型「幻觉」问题:解析、原因及未来展望
8 0
|
1天前
|
机器学习/深度学习 边缘计算 人工智能
揭秘深度学习在图像识别中的核心技术与挑战
【5月更文挑战第13天】 随着计算机视觉技术的飞速进步,深度学习已成为推动图像识别领域革新的主要动力。本文深入剖析了深度学习在图像识别任务中的核心算法和技术,包括卷积神经网络(CNN)的架构优化、数据增强的重要性、损失函数的选择以及模型压缩和加速策略。同时,文章也指出了当前技术面临的主要挑战,如数据集偏差、模型泛化能力、对抗性攻击等,并探讨了潜在的解决方案。通过综合分析和讨论,旨在为研究者和实践者提供指导,促进图像识别技术的发展和应用。
|
1天前
|
机器学习/深度学习 计算机视觉
深度学习在图像识别中的应用与挑战
【5月更文挑战第13天】 随着计算机视觉和人工智能技术的飞速发展,深度学习已成为推动图像识别领域进步的核心动力。本文将探讨深度学习技术在图像识别中的应用,并分析其面临的主要挑战。我们将从卷积神经网络(CNN)的基础出发,探索其在图像分类、目标检测和语义分割等方面的应用实例,并针对数据偏差、模型泛化能力、计算资源需求等关键问题展开讨论。通过案例分析和性能比较,我们旨在为读者提供一个关于深度学习在图像识别中应用的全面视角,同时指出未来的研究方向和技术趋势。
|
1天前
|
机器学习/深度学习 数据可视化 计算机视觉
深度学习在图像识别中的应用与挑战
【5月更文挑战第13天】 随着人工智能技术的飞速发展,深度学习已经成为图像识别领域的核心技术。本文将探讨深度学习在图像识别中的应用,以及在实际应用中面临的挑战。我们将介绍深度学习的基本原理,以及如何将其应用于图像识别任务。此外,我们还将讨论在实际应用中可能遇到的问题,以及如何解决这些问题。
6 2
|
1天前
|
机器学习/深度学习 计算机视觉
深度学习在图像识别中的应用与挑战
【5月更文挑战第13天】随着人工智能技术的飞速发展,深度学习已成为图像识别领域的核心技术。本文将探讨深度学习在图像识别中的应用,以及面临的挑战和未来发展趋势。我们将介绍卷积神经网络(CNN)的基本原理,以及如何通过迁移学习和数据增强等技术提高模型性能。此外,我们还将讨论深度学习在图像识别中面临的一些挑战,如对抗性攻击、数据偏见和计算资源需求等。
7 1
|
2天前
|
机器学习/深度学习 监控 自动驾驶
深度学习在图像识别中的应用与挑战
【5月更文挑战第12天】 随着计算机视觉和人工智能技术的迅猛发展,深度学习已成为图像识别领域的核心技术。本文将探讨深度学习在图像识别中的应用,包括卷积神经网络(CNN)的基本原理、关键技术及其在不同领域中的应用案例。同时,我们将分析当前面临的主要挑战,如数据集偏差、模型泛化能力和计算资源要求,并提出可能的解决方案。通过综合评述,旨在为读者提供一个关于深度学习在图像识别中应用的全面视角。
|
2天前
|
机器学习/深度学习 数据采集 监控
基于深度学习的图像识别技术在智能监控系统中的应用
【5月更文挑战第12天】 随着人工智能技术的迅猛发展,深度学习在图像处理领域已经取得了显著的成就。尤其是在图像识别任务中,卷积神经网络(CNN)等先进模型的应用极大提高了识别精度与效率。本文旨在探讨基于深度学习的图像识别技术如何被集成到智能监控系统中,以增强其自动检测和响应异常事件的能力。通过分析现有文献和最新研究成果,文章将详细阐述相关技术原理、系统架构、以及在实际场景中的应用效果,并讨论了面临的主要挑战和未来的发展方向。
|
2天前
|
机器学习/深度学习 边缘计算 人工智能
深度学习在图像识别中的应用与挑战
【5月更文挑战第12天】 随着人工智能的迅速发展,深度学习技术在图像识别领域取得了显著的进步。本文旨在探讨深度学习模型如何有效地解决图像识别任务,并分析当前面临的主要挑战。文中将详细介绍卷积神经网络(CNN)的基础结构及其在图像分类、目标检测和语义分割中的应用。同时,将讨论数据增强、迁移学习、对抗性网络等优化策略。此外,本文也将指出模型泛化能力不足、计算资源消耗大、对小样本学习的挑战等问题,并提供可能的解决方案。
|
2天前
|
机器学习/深度学习 传感器 人工智能
基于深度学习的图像识别技术在自动驾驶系统中的应用
【5月更文挑战第12天】 随着人工智能技术的飞速发展,深度学习已成为推动多个科技领域前进的关键力量。特别是在图像处理和识别方面,深度学习模型已经展现出了超越传统算法的性能。本文将探讨一种基于深度卷积神经网络(CNN)的图像识别技术,并分析其在自动驾驶系统中的应用。我们将重点介绍该技术如何提高自动驾驶汽车对周围环境的感知能力,以及它在未来交通生态中的潜在影响。
|
2天前
|
机器学习/深度学习 监控 算法
深度学习在图像识别中的应用与挑战
【5月更文挑战第12天】 随着人工智能技术的飞速发展,深度学习已成为推动计算机视觉领域进步的核心技术之一。特别是在图像识别任务中,深度神经网络通过学习海量数据中的抽象特征,显著提升了识别的准确性和效率。然而,尽管取得了显著进展,深度学习在图像识别应用中仍面临一系列挑战,包括但不限于数据集偏差、模型泛化能力、计算资源消耗以及对抗性攻击的脆弱性。本文将深入探讨深度学习技术在图像识别领域的应用现状,分析存在的挑战,并对未来发展趋势进行展望。
14 9