查看原文
其他

小项目|Keras与Python图像识别

2017-12-01 唐欣 大数据应用

计算机视觉已不再仅仅属于博士和研发人员了。 像Tensorflow,Keras和OpenCV这样的开源库让计算机视觉变得更易于访问和更容易实现。 如果与深度神经网络等算法的进步相结合,它会变得更加容易!


在这篇文章中,我们将引导您构建一个深层神经网络,它可以识别图像中包含的内容,并告诉您如何将其部署到Web应用程序中。

我们的模型

我们使用的模型来自一个学术论文,详细介绍了如何使用深层神经网络进行图像识别。文中包括一些Python代码,你可以用来实际加载和执行模型 。


我不打算深入论文的细节(因为它已经超出了我的范围),但如果你对代码有兴趣,可点击原文链接查看。它还包含我们将使用的源代码和模型文件的链接。


Very Deep Convolutional Networks for Large-Scale Image Recognition - K. Simonyan, A. Zisserman

Paper: https://arxiv.org/pdf/1409.1556.pdf

Code: https://gist.github.com/baraldilorenzo/07d7802847aaad0a35d3


Keras的快速入门

正如你可能看到的,该模型使用了一个新的并且很棒的Python库称为Keras。 Keras允许你使用多个后端(例如TheanoTensorflow)构建深层神经网络。 它提供了一个相当高级别同时易使用的的API,并有相当直观的函数/类名,这些很有帮助。



由于我们制作了一个图像识别模型,你可以猜测我们将要使用什么数据:images! 我们需要一个以矩阵形式表示的图像的“mathy”版本。 为此,我们将使用cv2。 请看以下示例:

你可以使用Keras来做图像识别(如我们现在做的),自然语言处理和时间序列分析。 有关详细信息,可查看资料或阅读一些教程。


数据

由于我们制作了一个图像识别模型,你可以猜测我们将要使用什么数据:images! 我们需要一个以矩阵形式表示的图像的“mathy”版本。 为此,我们将使用cv2。 请看以下示例:

pig = cv2.imread('images/pig.jpg')

cv2.imshow(pig)

我们的模型将能够弄清楚这张图片上是什么。当被问到这张照片是什么,大多数人看着这张照片会说这是一头猪, 这不令人惊讶或让人印象深刻,因为我们许多人一直这样做,就像你可以拉动这个可以发出疯狂农庄声音的玩具的拉杆,它告诉你每种动物的叫声:

VGG模型(在牛津的Visual Geometry Group)在开放源ILSVRC数据集上训练。 依据调查结果,使用密集单尺度评估(最小图像侧重新缩放到384),ILSVRC-2012验证集前5的分类错误为8.1%(参见arXiv论文中的表3)。


这听起来很不错! 但这是什么意思? 好吧,这意味着我们可以喂任何图像给我们的模型,它将能够告诉我们它对图像的想法。 听起来像科幻小说,但你很快就会发现它很容易做到!


模型

好了,说了足够的背景,让我们开始落地实践。 我将在这里采取简单的路线,只需将模型代码直接从论述上复制粘贴到我的Python中。 这的确有点长,但别被吓到。 它大部分代码只是建立神经网络,当它是明确的,我认为这是一件好事。 神经网络本身够模糊和奇怪的,我们最不需要的是一个图书馆,它太抽象,使神经网络更模糊。


OK,我们现在有VGG_16这个函数,现在我需要调用它来加载我的模型。 为了做到这一点,我需要一个“权重文件”。 这实际上是我们的论文中的预构建模型。 您可以从Google云端硬盘中下载vgg16_weights.h5 ahem G套件。


好!我们需要做的最后一件事是指定我们将使用的优化器,此时我们选择的将是SGD(随机梯度下降)。 加载那个小狗图像,然后运行model.compile函数。

model = VGG_16('data/vgg16_weights.h5')sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)

model.compile(optimizer=sgd, loss='categorical_crossentropy')


预测

有了数据,有了模型,现在让我们来使用! 执行keras模型很简单。 只需使用预测函数(predict function)来生成预测。 预测( predict function)将会导出一系列1000个可检测事件的序列的概率。 观察当我们在Pilget上运行时会发生什么:

 out = model.predict(im)
pred = dict(zip(labels, model.predict_proba(im)[0]))
...other guesses go here...

 best_guess = labels[np.argmax(out)]

 结果不坏!

{猜测结果: 野公猪,食用猪,猪,小猪,野猪}


部署

好的,最后一步了。由于我们正在开发一个应用程序,我们需要在这个地方部署这个模型。 正如你可能猜到的,我们将使用Yhat自己的ScienceOps产品来做到这一点。 其实没有太复杂:导入Yhat,将上面的代码复制/粘贴到执行(execute)函数中,然后运行deploy()

from yhat import YhatYhatModel
from PIL import Image
from StringIO import StringIO

import base64
 
def image_from_base64(img64):
      binaryimg = base64.decodestring(img64)
      pilImage = Image.open(StringIO(binaryimg))
      return np.array(pilImage)
 
class ImageRecognizer(YhatModel):
      REQUIREMENTS = ["opencv"]
      def execute(self, data):
            img64 = data['image64']
            image = image_from_base64(img64)
 
             # VGG specific stuff
             resized_image = cv2.resize(image, (224224)).astype(np.float32)
             resized_image[:,:,0] -= 103.939
             resized_image[:,:,1] -= 116.779
             resized_image[:,:,2] -= 123.68
             resized_image = resized_image.transpose((2,0,1))
             resized_image = np.expand_dims(resized_image, axis=0)
 
             # make a prediction and our best guess
             out = model.predict(resized_image)
             pred = dict(zip(labels, model.predict_proba(im)[0]))
             best_guess = labels[np.argmax(out)]
             # some verbose logging
             print "It's a %s" % best_guess
             return { "guess": best_guess }

嘭!我们有了一个API:你可以用之发送图像,并得到我们模型猜测图片内容的最好结果。 如此顺畅!

{"guess""hog, pig, grunter, squealer, Sus scrofa"}
{"guess""flagpole, flagstaff"}
{"guess""jeep, landrover"}


应用程序

为了把所有的东西放在一起,我装了一个简单的web应用程序(只是一些Javascript和HTML),你可以上传图片。 图片上传后,它会自动使用我们的模型的API在ScienceOps上尝试检测图片中的内容。


如果你喜欢你看到的,你还可以玩转信用建模,产品推荐,图像分类,和我们在我们的应用程序演示页装配好的得分应用程序。 每个应用程序包括技术细节(例如POST / cURL请求,github链接到完整的代码仓库)和非技术解释。


总结

现在你完成学习了! 我们已经构建了一个应用程序,可以看到任意图像,并尽最大能力弄清楚图片的内容。 还行的的<250行代码。

 

想更多地了解图像识别,keras或cv2? 查看这些资源:


Keras文档 https://keras.io/

使用Keras深度学习简介http://machinelearningmastery.com/introduction-python-deep-learning-library-keras/

OpenCV教程:图片入门

http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_image_display/py_image_display.html


原文作者: Greg

翻译:Tang Xin

编辑:Matilda

转载请联系大数据应用后台


您也许还想看看

有一天我给自己发了五千万个红包,得出来这样一个规律

【求职专栏】机器学习面试的那些事儿

使用深度学习对狗狗品种进行分类——常被弄混的居然是这两种?

每日一练 | Data Scientist & Business Analyst & Leetcode 面试题 239

只知道比特币?——区块链到底是什么?对大数据又有哪些意义?




点击“阅读原文”查看数据应用学院核心课程


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存