Moses Olafenwa,DeepQuest AI的联合创始人和CEO作者徐驰骋译者

只要5行代码,就可以实现AI图像识别

在这篇文章中,我们将简要介绍人工智能领域,特别是计算机视觉领域中遇到的挑战,这些挑战的现有解决方法以及如何快捷地使用这些方法。

“知物由学”是网易云易盾打造的一个品牌栏目,词语出自汉·王充《论衡·实知》。人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道。“知物由学”希望通过一篇篇技术干货、趋势解读、人物思考和沉淀给你带来收获的同时,也希望打开你的眼界,成就不一样的你。当然,如果你有不错的认知或分享,也欢迎通过邮件投稿  :zhangyong02@corp.netease.com 

导语:在这篇文章中,我们将简要介绍人工智能领域,特别是计算机视觉领域中遇到的挑战,这些挑战的现有解决方法以及如何快捷地使用这些方法。

人工智能作为一个科学和工程的研究领域已经有数十年的历史了。它试图揭开机器和计算机感知世界的奥秘,以此来更好地为人类工作服务。这个研究工作最重要的部分是使得计算机理解我们周围每天产生的视觉信息(图像和视频)。这个使得计算机感知理解视觉信息的领域就是所谓的计算机视觉

人工智能兴起的二十世纪五十年代到八十年代,通过手动给计算机输入指令来识别图片中的事物以及需要关注的特征。这种方法使用传统算法,要求使用者必须识别物体在每一个独特场景中的特征,并用计算机可以理解的数学模型表示这些特征,因此被称为专家系统。这涉及到很多繁琐的工作,因为一个物体的表示方法有成百上千种,独立存在的不同场景和对象也有数千种甚至数百万种,找到优化准确的数学模型来表示每个物体和场景以及它们所有可能的特征是一个无止境的工作。

到了二十世纪九十年代,机器学习的概念被提出,它开创了计算机自主识别代替手工输入指令识别图像的新时代。就像一个孩子通过学习来认识他/她周围的环境,我们让计算机通过算法来自主学习认知事物。也就是说,机器学习开辟了计算机学习认知事物的新道路。

随着性能强大的计算机芯片比如NVIDIA  GPU和顶尖的图像识别深度学习算法的出现,比如Alex Krizhevsky等在2012年创造的AlexNet 算法、Kaeming  He等在2015年创造的ResNet 算法、Forrest Landola等在2016年创造的SqueezeNet 算法、Gao  Huang等在2016年创造的DenseNet 算法等,让自定义人工智能模型通过学习一组图片中的事物进而识别其他同类型事物成为可能。

训练一个可以识别图片中事物的人工智能模型涉及到很多应用数学和深度学习库的专业知识,更别说还要花费大量时间和承受巨大压力去写实现这种算法的代码以及使其和图像相匹配。这就是我们要解决的问题所在。

我们在AI Common的小组已经建立了一个只要五行代码就可以训练人工智能模型来识别任何物体的Python库,这个python库叫作ImageAI。建立这个库是为了让学生、开发者、研究人员等不同专业水平的人只用五行代码就能建立起拥有最顶尖的计算机视觉功能的系统和应用。现在,让我们开始建立你的第一个图像识别人工智能模型。

idenprof//train//chef// 900 images of chefs
idenprof//train//doctor// 900 images of doctors
idenprof//train//engineer// 900 images of engineer
idenprof//train//farmer// 900 images of farmers
idenprof//train//firefighter// 900 images of firefighters
idenprof//train//judge// 900 images of judges
idenprof//train//mechanic// 900 images of mechanics
idenprof//train//pilot// 900 images of pilots
idenprof//train//chef// 900 images of chef
idenprof//train//police// 900 images of police
idenprof//train//waiter// 900 images of waiters
idenprof//test//chef// 200 images of chefs
idenprof//test//doctor// 200 images of doctors
idenprof//test//engineer// 200 images of engineer
idenprof//test//farmer// 200 images of farmers
idenprof//test//firefighter// 200 images of firefighters
idenprof//test//judge// 200 images of judges
idenprof//test//mechanic// 200 images of mechanics
idenprof//test//pilot// 200 images of pilots
idenprof//test//chef// 200 images of chef
idenprof//test//police// 200 images of police
idenprof//test//waiter// 200 images of waiter

既然你已经明白如何准备用于训练人工智能模型的图片数据集,我们将继续指导你使用ImageAI训练一个人用于识别职业的工智能模型。

首先你必须通过这个链接下载IdenProf 数据集压缩包。你也可以用下面的链接查看用于识别职业的人工智能模型的所有细节和样本结果。

https://github.com/OlafenwaMoses/IdenProf

因为训练人工智能模型需要高性能计算机系统,我强烈建议你确保用来做模型训练的计算机拥有NVIDIA GPU。你也可以使用Google Colab(谷歌实验室)来做这次实验,它可以提供一个免费的NVIDIA K80 GPU。

接下来你必须安装ImageAI 和它的依赖模块。

1)从Python官网下载和安装Pyhton3

https://python.org

2)使用pip安装如下依赖包

i. Tensorflow

pip install tensorflow

ii. Numpy

pip install numpy

iii. SciPy

pip install scipy

iv. OpenCV

pip install opencv-python

v. Pillow

pip install pillow

vi. Matplotlib

pip install matplotlib

vii. H5py

pip install h5py

viii. Keras

pip install keras

ix. ImageAI

pip3 installhttps://github.com/OlafenwaMoses/ImageAI/releases/download/2.0.2/imageai-2.0.2-py3-none-any.whl

新建一个python文件,比如“FirstTraining.py”,将IdenProf数据集压缩包拷贝到你的Python文件所在目录并解压。然后拷贝下面的代码到python文件。(比如FirstTraining.py)

from imageai.Prediction.Custom import ModelTraining 
model_trainer = ModelTraining() model_trainer.setModelTypeAsResNet() model_trainer.setDataDirectory("idenprof") model_trainer.trainModel(num_objects=10, num_experiments=200, enhance_data=True, batch_size=32, show_network_summary=True)

就是它!那是你训练人工智能模型所需的所有代码。运行前,让我们来解释下这些代码。

在第一行,导入ImageAI的模型训练类。在第二行,创建一个模型训练类实例。在第三行,我们设置模型类型为ResNet(这里有4个模型类型可供选择,分别为SqueezeNet,  ResNet, InceptionV3  和DenseNet)。在第四行,设置数据目录(数据集目录)为你解压的数据集文件夹。然后第五行,我们调用trainModel  函数,并给下列参数赋值:

  • number_objects :数据集中不同职业的分类数;
  • num_experiments  :为了获得最大准确率,模型学习数据集中所有图片的次数;
  • Enhance_data (可选) :用来告诉模型训练器创建数据集中修改好图片的副本来确保获得最大准确率;
  • batch_size:直到学习完所有图片前,训练器一次学习的图片数;
  • Show_network_summary (可选):用于显示你当前使用训练人工智能模型的类型结构;
  • 现在你可以开始运行Python文件开始训练了。当训练开始时,你可以看到如下的结果:
=====================================

Total params: 23,608,202

Trainable params: 23,555,082

Non-trainable params: 53,120

______________________________________

Using Enhanced Data Generation

Found 4000 images belonging to 4 classes.

Found 800 images belonging to 4 classes.

JSON Mapping for the model classes saved to  C:\Users\User\PycharmProjects\FirstTraining\idenprof\json\model_class.json

Number of experiments (Epochs) :  200

Epoch 1/100

 1/280 [>.............................] - ETA: 52s - loss: 2.3026 - acc: 0.2500

2/280 [>.............................] - ETA: 52s - loss: 2.3026 - acc: 0.2500

3/280 [>.............................] - ETA: 52s - loss: 2.3026 - acc: 0.2500

..............................,
..............................,
..............................,

279/280 [===========================>..] - ETA: 1s - loss: 2.3097 - acc: 0.0625Epoch 00000: saving model to C:\Users\User\PycharmProjects\FirstTraining\idenprof\models\model_ex-000_acc-0.100000.h5


280/280 [==============================] - 51s - loss: 2.3095 - acc: 0.0600 - val_loss: 2.3026 - val_acc: 0.1000

让我们详细解释下以上内容:

1.“JSON  Mapping for the model classes saved to  C:\Users\User\PycharmProjects\FirstTraining\idenprof\json\model_class.json”这段话表示模型训练器已经被保存为JSON文件,可以使用自定义图像预测类来识别其他图片(后面将对其进一步解释)。

2.Epoch 1/200这行表示网络执行了目标值200个训练的第一个训练。

3.1/280 [>………………………..] — ETA: 52s — loss: 2.3026 — acc: 0.2500 这行表示当前实验已经训练的批次。

4.Epoch  00000: saving model to  C:\Users\User\PycharmProjects\FirstTraining\idenprof\models\model_ex-000_acc-0.100000.h5这行表示当前训练后保存的模型。ex_000表示当前阶段的实验,acc0.100000和valacc表示当前实验后的模型准确率(最高准确率为1.0)。这个结果帮助我们知道哪个图像预测模型是表现最好的。训练完模型后,你可以使用准确率最高模型的“CustomImagePrediction”类进行图片预测。

以防你缺少NVIDIA GPU而无法进行人工智能模型训练,出于本教程的目标,我们提供了一个用IdenProf数据集训练好的人工智能模型,你可以用它来进行数据集中图片的职业预测。

这个模型在训练61次后已经取得了79%的准确率。点击此链接下载该模型。
同样,如果你没有进行模型训练,通过链接下载IdenProf模型的JSON文件。然后,你就可以跟随如下指令,使用模型进行图像识别了。

下一步,创建一个Python文件并命名比如FirstCustomImageRecognition.py   ,拷贝你下载的人工智能模型或者你训练的准确率最高的模型,将其复制到你新建Python文件所在目录。同样拷贝下载的或者训练产生的JSON文件,将其复制到新建Python文件所在目录。

拷贝一个或多个属于IdenProf数据集中职业种类的图片到新建Python文件所在目录。然后拷贝下面的代码到你的Python文件中。

from imageai.Prediction.Custom import CustomImagePrediction import os 
execution_path = os.getcwd() 
prediction = CustomImagePrediction() prediction.setModelTypeAsResNet() prediction.setModelPath("idenprof_061-0.7933.h5") prediction.setJsonPath("idenprof_model_class.json") prediction.loadModel(num_objects=10) 
predictions, probabilities = prediction.predictImage("image.jpg", result_count=3) 
for eachPrediction, eachProbability in zip(predictions, probabilities): print(eachPrediction , " : " , eachProbability)

请看如下的样本图片和结果。

  • Waiter(服务员):99.99997615814209
  • Chef(厨师):1.568847380895022e-05
  • Judge(法官):1.0255866556008186e-05

是不是很简单!现在让我们解释上面产生这个预测结果的代码。

第一和第二行代码分别导入了ImageAI中用于图像识别的CustomImagePrediction   类(自定义图像预测类)和os类。第三行代码创建了一个变量并赋值了一个路径,该路径下包含Python文件(比如FirstCustomImageRecognition.py文件)和下载或训练的ResNet模型文件。

以上,我们用第4行代码创建了一个ImagePrediction()类实例,然后在第5行代码通过调用.setModelTypeAsResNet()  来设置预测对象的模型类型为ResNet  。然后在第6行,我们设置模型路径为拷贝到项目文件夹的人工智能模型路径(idenprof_061–0.7933.h5)。在第7行,我们设置JSON文件路径,在第8行加载模型。最后进行图像预测并打印结果到命令行。

自此,你已经学会了如何使用ImageAI 便捷地训练你的人工智能模型,用于预测图片中的对象或对象集合。

你可以在官方GitHub资源库找到所有使用ImageAI 训练自定义人工智能模型以及其他包含在ImageAI 中的计算机视觉特性的详细信息和文档:https://github.com/OlafenwaMoses/ImageAI

网易云易盾
网易云易盾

网易云易盾是网易旗下安全产品,提供内容安全、业务安全、移动安全、网络安全等一站式云安全服务,依托团队20年的技术积累及对网易数十条业务线的保障经验,拥有海量特征库和成熟的安全机制,并结合超强云计算及人工智能技术,形成对游戏、金融、电商、娱乐等场景化解决方案,目前已服务集团内外上千家客户。 本专栏依托网易云易盾20年的专业技术积累,定期为各位盾友提供安全领域的技术类文章,欢迎围观。

工程深度学习机器学习计算机视觉图像识别
2
相关数据
网易机构

网易成立于1997年6月24日,是中国领先的互联网技术公司,为用户提供免费邮箱、游戏、搜索引擎服务,开设新闻、娱乐、体育等30多个内容频道,及博客、视频、论坛等互动交流,网聚人的力量。

https://www.163.com/
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

专家系统技术

专家系统(ES)是人工智能最活跃和最广泛的领域之一。专家系统定义为:使用人类专家推理的计算机模型来处理现实世界中需要专家作出解释的复杂问题,并得出与专家相同的结论。简言之,如图1所示,专家系统可视作“知识库(knowledge base)”和“推理机(inference machine)” 的结合。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

感知技术

知觉或感知是外界刺激作用于感官时,脑对外界的整体的看法和理解,为我们对外界的感官信息进行组织和解释。在认知科学中,也可看作一组程序,包括获取信息、理解信息、筛选信息、组织信息。与感觉不同,知觉反映的是由对象的各样属性及关系构成的整体。

人工智能技术

在学术研究领域,人工智能通常指能够感知周围环境并采取行动以实现最优的可能结果的智能体(intelligent agent)

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

张量技术

张量是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 维空间内,有 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。称为该张量的秩或阶(与矩阵的秩和阶均无关系)。 在数学里,张量是一种几何实体,或者说广义上的“数量”。张量概念包括标量、矢量和线性算子。张量可以用坐标系统来表达,记作标量的数组,但它是定义为“不依赖于参照系的选择的”。张量在物理和工程学中很重要。例如在扩散张量成像中,表达器官对于水的在各个方向的微分透性的张量可以用来产生大脑的扫描图。工程上最重要的例子可能就是应力张量和应变张量了,它们都是二阶张量,对于一般线性材料他们之间的关系由一个四阶弹性张量来决定。

计算机视觉技术

计算机视觉(CV)是指机器感知环境的能力。这一技术类别中的经典任务有图像形成、图像处理、图像提取和图像的三维推理。目标识别和面部识别也是很重要的研究领域。

世代(单位)技术

神经网络训练中常见的一个单位,一般是指所有训练样本在一个神经网络中经历一次正向+一次翻新传播的训练

准确率技术

分类模型的正确预测所占的比例。在多类别分类中,准确率的定义为:正确的预测数/样本总数。 在二元分类中,准确率的定义为:(真正例数+真负例数)/样本总数

映射技术

映射指的是具有某种特殊结构的函数,或泛指类函数思想的范畴论中的态射。 逻辑和图论中也有一些不太常规的用法。其数学定义为:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,y称为元素x在映射f下的象,记作:y=f(x)。x称为y关于映射f的原象*。*集合A中所有元素的象的集合称为映射f的值域,记作f(A)。同样的,在机器学习中,映射就是输入与输出之间的对应关系。

OpenCV技术

OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。

Alex网络技术

AlexNet是一个卷积神经网络的名字,最初是与CUDA一起使用GPU支持运行的,AlexNet是2012年ImageNet竞赛冠军获得者Alex Krizhevsky设计的。该网络达错误率大大减小了15.3%,比亚军高出10.8个百分点。AlexNet是由SuperVision组设计的,由Alex Krizhevsky, Geoffrey Hinton和Ilya Sutskever组成。

密集型连接网络技术

Gao Huang等研究者提出了DenseNet,该论文获得了CVPR 2017的最佳论文。DenseNet的目标是提升网络层级间信息流与梯度流的效率,并提高参数效率。它也如同ResNet那样连接前层特征图与后层特征图,但DenseNet并不会像ResNet那样对两个特征图求和,而是直接将特征图按深度相互拼接在一起。DenseNet最大的特点即每一层的输出都会作为后面所有层的输入,这样最后一层将拼接前面所有层级的输出特征图。这种结构确保了每一层能从损失函数直接访问到梯度,因此可以训练非常深的网络。

暂无评论
暂无评论~