小项目|Keras与Python图像识别
计算机视觉已不再仅仅属于博士和研发人员了。 像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允许你使用多个后端(例如Theano和Tensorflow)构建深层神经网络。 它提供了一个相当高级别同时易使用的的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 Yhat, YhatModel
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, (224, 224)).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
点击“阅读原文”查看数据应用学院核心课程