计算机视觉已不再仅仅属于博士和研发人员了。 像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)。
这听起来很不错! 但这是什么意思? 好吧,这意味着我们可以喂任何图像给我们的模型,它将能够告诉我们它对图像的想法。 听起来像科幻小说,但你很快就会发现它很容易做到!
模型
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)]
结果不坏!
{猜测结果: 野公猪,食用猪,猪,小猪,野猪}
部署
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行代码。
用户评论
终于找到一个入门图像识别的教程了!
有9位网友表示赞同!
Keras真简单易学!这个案例讲解得很棒。
有5位网友表示赞同!
想学习一下图像识别,这个项目是个不错的起点!
有19位网友表示赞同!
Python结合Keras确实很强大,感觉可以做很多有意思的事情。
有13位网友表示赞同!
教程的代码示例非常清晰,很好理解。
有17位网友表示赞同!
小项目,大收获!学到了不少知识。
有18位网友表示赞同!
喜欢这种循序渐进的学习方式,一步步掌握图像识别概念!
有6位网友表示赞同!
感觉可以自己尝试修改代码,实现不同的识别功能!
有16位网友表示赞同!
项目案例很实用,以后说不定可以用来做一些小实验。
有17位网友表示赞同!
我对Keras这个框架一直比较好奇,这下可以好好学习一下了!
有5位网友表示赞同!
图像识别技术的应用越来越广泛,这个教程很有价值!
有5位网友表示赞同!
这个项目让我对深度学习充满了兴趣!
有18位网友表示赞同!
视频讲解很详细,很容易跟着学习。
有14位网友表示赞同!
希望将来能用Keras做一些更复杂、更有创意的图像识别项目!
有11位网友表示赞同!
感谢作者分享这个优秀的开源项目!
有9位网友表示赞同!
这是一个非常值得收藏和推荐的教程!
有12位网友表示赞同!
对于初学者来说,这个项目是非常友好和实用的入门材料!
有13位网友表示赞同!
通过这个项目,我更加了解了深度学习在图像识别中的应用!
有15位网友表示赞同!
Keras是Python机器学习开发中非常常用而且强大框架!
有16位网友表示赞同!