如何用Python和深度神经网络识别图像?

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

如何用Python和深度神经网络识别图像?只需要10几行Python代码,你就能自己构建机器视觉模型,对图片做出准确辨识和分类。快来试试吧!视觉进化的作用,让人类对图像的处理非常高效。这里,我给你展示一张照片。如果我这样问你:你能否分辨出图片中哪个是猫,哪个是狗?你可能立即会觉得自己遭受到了莫大的侮辱。并且大声质问我:你觉得我智商有问题吗?!息怒。换一个问法:你能否把自己分辨猫狗图片的方法,描述成严格的规则,教给计算机,以便让它替我们人类分辨成千上万张图片呢?对大多数人来说,此时感受到的,就不是羞辱,而是压力了。如果你是个有毅力的人,可能会尝试各种判别标准:图片某个位置的像素颜色、某个局部的边缘形状、某个水平位置的连续颜色长度……你把这些描述告诉计算机,它果然就可以判断出左边的猫和右边的狗了。问题是,计算机真的会分辨猫狗图片了吗?我又拿出一张照片给你。你会发现,几乎所有的规则定义,都需要改写。当机器好不容易可以用近似投机取巧的方法正确分辨了这两张图片里面的动物时,我又拿出来一张新图片……几个小时以后,你决定放弃。别气馁。人类没法把图片分辨的规则详细、具体而准确地描述给计算机,是不是意味着计算机不能辨识图片呢?当然不是。你早已听说过自动驾驶汽车的神奇吧?没有机器对图像的辨识,能做到吗?你的好友可能(不止一次)给你演示如何用新买的iPhoneX做面部识别解锁了吧?没有机器对图像的辨识,能做到吗?医学领域里,计算机对于科学影像(如X光片)的分析能力,已经超过有多年从业经验的医生了。没有机器对图像的辨识,能做到吗?你可能一下子觉得有些迷茫了——这难道是奇迹?不是。计算机所做的,是学习。通过学习足够数量的样本,机器可以从数据中自己构建模型。其中,可能涉及大量的判断准则。但是,人类不需要告诉机器任何一条。它是完全自己领悟和掌握的。你可能会觉得很兴奋。那么,下面我来告诉你一个更令你兴奋的消息——你自己也能很轻易地构建图片分类系统!不信?请跟着我下面的介绍,来试试看。数据咱们就不辨识猫和狗了,这个问题有点不够新鲜。咱们来分辨机器猫,好不好?对,我说的就是哆啦a梦。把它和谁进行区分呢?一提到机器人,我立刻就想起来了它。对,机器人瓦力(WALLE)。我给你准备好了119张哆啦a梦的照片,和80张瓦力的照片。图片已经上传到了这个Github项目。请点击这个链接,下载压缩包。然后在本地解压。作为咱们的演示目录。解压后,你会看到目录下有个image文件夹,其中包含两个子目录,分别是doraemon和walle。打开其中doraemon的目录,我们看看都有哪些图片。可以看到,哆啦a梦的图片真是五花八门。各种场景、背景颜色、表情、动作、角度……不一而足。这些图片,大小不一,长宽比例也各不相同。我们再来看看瓦力,也是类似的状况。数据已经有了,下面我们来准备一下环境配置。环境我们使用Python集成运行环境Anaconda。请到这个网址下载最新版的Anaconda。下拉页面,找到下载位置。根据你目前使用的系统,网站会自动推荐给你适合的版本下载。我使用的是macOS,下载文件格式为pkg。下载页面区左侧是Python3.6版,右侧是2.7版。请选择2.7版本。双击下载后的pkg文件,根据中文提示一步步安装即可。安装好Anaconda后,我们需要安装TuriCreate。请到你的“终端”(Linux,macOS)或者“命令提示符”(Windows)下面,进入咱们刚刚下载解压后的样例目录。执行以下命令,我们来创建一个Anaconda虚拟环境,名字叫做turi。condacreate-nturipython=2.7anaconda然后,我们激活turi虚拟环境。sourceactivateturi在这个环境中,我们安装最新版的TuriCreate。pipinstall-Uturicreate安装完毕后,执行:jupyternotebook这样就进入到了Jupyter笔记本环境。我们新建一个Python2笔记本。这样就出现了一个空白笔记本。点击左上角笔记本名称,修改为有意义的笔记本名“demo-python-image-classification”。准备工作完毕,下面我们就可以开始编写程序了。代码首先,我们读入TuriCreate软件包。它是苹果并购来的机器学习框架,为开发者提供非常简便的数据分析与人工智能接口。importturicreateastc我们指定图像所在的文件夹image。img_folder='image'前面介绍了,image下,有哆啦a梦和瓦力这两个文件夹。注意如果将来你需要辨别其他的图片(例如猫和狗),请把不同类别的图片也在image中分别存入不同的文件夹,这些文件夹的名称就是图片的类别名(cat和dog)。然后,我们让TuriCreate读取所有的图像文件,并且存储到data数据框。data=tc.image_analysis.load_images(img_folder,with_path=True)这里可能会有错误信息。Unsupportedimageformat.SupportedformatsareJPEGandPNGfile:/Users/wsy/Dropbox/var/wsywork/learn/demo本例中提示,有几个.DS_Store文件,TuriCreate不认识,无法当作图片来读取。这些.DS_Store文件,是苹果macOS系统创建的隐藏文件,用来保存目录的自定义属性,例如图标位置或背景颜色。我们忽略这些信息即可。下面,我们来看看,data数据框里面都有什么。data可以看到,data包含两列信息,第一列是图片的地址,第二列是图片的长宽描述。因为我们使用了119张哆啦a梦图片,80张瓦力图片,所以总共的数据量是199条。数据读取完整性验证通过。下面,我们需要让TuriCreate了解不同图片的标记(label)信息。也就是,一张图片到底是哆啦a梦,还是瓦力呢?这就是为什么一开始,你就得把不同的图片分类保存到不同的文件夹下面。此时,我们利用文件夹名称,来给图片打标记。data['label']=data['path'].apply(lambdapath:'doraemon'if'doraemon'inpathelse'walle')这条语句,把doraemon目录下的图片,在data数据框里打标记为doraemon。反之就都视为瓦力(walle)。我们来看看标记之后的data数据框。data可以看到,数据的条目数量(行数)是一致的,只是多出来了一个标记列(label),说明图片的类别。我们把数据存储一下。data.save('doraemon-walle.sframe')这个存储动作,让我们保存到目前的数据处理结果。之后的分析,只需要读入这个sframe文件就可以了,不需要从头去跟文件夹打交道了。从这个例子里,你可能看不出什么优势。但是想象一下,如果你的图片有好几个G,甚至几个T,每次做分析处理,都从头读取文件和打标记,就会非常耗时。我们深入探索一下数据框。TuriCreate提供了非常方便的explore()函数,帮助我们直观探索数据框信息。data.explore()这时候,TuriCreate会弹出一个页面,给我们展示数据框里面的内容。原先打印data数据框,我们只能看到图片的尺寸,此时却可以浏览图片的内容。如果你觉得图片太小,没关系。把鼠标悬停在某张缩略图上面,就可以看到大图。数据框探索完毕。我们回到notebook下面,继续写代码。这里我们让TuriCreate把data数据框分为训练集合和测试集合。train_data,test_data=data.random_split(0.8,seed=2)训练集合是用来让机器进行观察学习的。电脑会利用训练集合的数据自己建立模型。但是模型的效果(例如分类的准确程度)如何?我们需要用测试集来进行验证测试。这就如同老师不应该把考试题目都拿来给学生做作业和练习一样。只有考学生没见过的题,才能区分学生是掌握了正确的解题方法,还是死记硬背了作业答案。我们让TuriCreate把80%的数据分给了训练集,把剩余20%的数据拿到一边,等待测试。这里我设定了随机种子取值为2,这是为了保证数据拆分的一致性。以便重复验证我们的结果。好了,下面我们让机器开始观察学习训练集中的每一个数据,并且尝试自己建立模型。下面代码第一次执行的时候,需要等候一段时间。因为TuriCreate需要从苹果开发者官网上下载一些数据。这些数据大概100M左右。需要的时长,依你和苹果服务器的连接速度而异。反正在我这儿,下载挺慢的。好在只有第一次需要下载。之后的重复执行,会跳过下载步骤。model=tc.image_classifier.create(train_data,target='label')下载完毕后,你会看到TuriCreate的训练信息。Resizingimages...Performingfeatureextractiononresizedimages...Completed168/168PROGRESS:Creatingavalidationsetfrom5percentoftrainingdata.Thismaytakeawhile.Youcanset``validation_set=None``todisablevalidationtracking.你会发现,TuriCreateh会帮助你把图片进行尺寸变换,并且自动抓取图片的特征。然后它会从训练集里面抽取5%的数据作为验证集,不断迭代寻找最优的参数配置,达到最佳模型。这里可能会有一些警告信息,忽略就可以了。当你看到下列信息的时候,意味着训练工作已经顺利完成了。可以看到,几个轮次下来,不论是训练的准确度,还是验证的准确度,都已经非常高了。下面,我们用获得的图片分类模型,来对测试集做预测。predictions=model.predict(test_data)我们把预测的结果(一系列图片对应的标记序列)存入了predictions变量。然后,我们让TuriCreate告诉我们,在测试集上,我们的模型表现如何。先别急着往下看,猜猜结果正确率大概是多少?从0到1之间,猜测一个数字。猜完后,请继续。metrics=model.evaluate(test_data)print(metrics['accuracy'])这就是正确率的结果:0.967741935484我第一次看见的时候,震惊不已。我们只用了100多个数据做了训练,居然就能在测试集(机器没有见过的图片数据)上,获得如此高的辨识准确度。为了验证这不是准确率计算部分代码的失误,我们来实际看看预测结果。predictions这是打印出的预测标记序列:dtype:strRows:31['doraemon','doraemon','doraemon','doraemon','walle','doraemon','walle','doraemon','walle','walle','doraemon','doraemon','doraemon','doraemon','doraemon','walle','doraemon','doraemon','walle','walle','doraemon','doraemon','walle','walle','walle','doraemon','doraemon','walle','walle','doraemon','walle']再看看实际的标签。test_data['label']这是实际标记序列:dtype:strRows:31['doraemon','doraemon','doraemon','doraemon','walle','doraemon','walle','walle','walle','walle','doraemon','doraemon','doraemon','doraemon','doraemon','walle

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功