作者:VincentMühler
编译:weakish
编者按:opencv4nodejs及face-recognition.js维护者Vincent Mühler介绍了如何在Node.js环境下使用训练好的神经网络模型识别图像中的物体。
今天我们将看看Node.js的OpenCV深度神经网络模块。
如果你希望释放神经网络的魔力,来辨识和分类图像中的物体,却对深度学习是如何工作的毫无头绪(像我一样),更不知道如何创建和训练神经网络,那么本文正适合你!
所以我们今天将创建什么?
在这一篇教程中,我们将了解如何通过OpenCV的DNN模块,从Tensorflow和Caffe加载预训练的模型,然后我们将深入两个基于Node.js和OpenCV进行物体识别的例子。
首先我们将使用Tensorflow的Inception模型来辨识图像中的物体,之后我们将使用COCO SSD模型检测和辨识同一图像中的多个不同物体。
你可以在我的github仓库上找到样例代码:justadudewhohacks/opencv4nodejs
Tensorflow Inception
训练过的Tensorflow Inception模型可以辨别约1000个分类的物体。如果你将图像传入网络,它将给出图像中的物体的每个分类的似然。
分类图像中的物品
为了分类图像中的物品,我们将编写以下帮助函数:
这一函数做了这些事:
准备输入图像
Tensorflow Inception网络接受224x224大小的输入图像。因此我们调整图像大小,使其最大边的大小为224,然后用白像素补齐。
让图像穿过网络
我们可以直接从图像创建blob,然后调用前向传播输入,然后获取输出blob.
从输出blob提取结果
为了通用性,输出blob的表达形式直接是矩阵(),而它的维度取决于模型。在Inception下这很简单。blob不过是一个1xN矩阵(其中N等于分类数),描述了所有分类的概率分布。每个条目为一个浮点数,表示相应分类的置信度。所有条目相加,总和为1.0(100%)。
我们想仔细看看图像可能性最大的分类,因此我们查看所有置信度大于(这个例子中是5%)。最后,我们根据置信度排序结果,并返回、对。
测试
现在我们将读取一些我们希望网络辨识的样本数据:
输出为:(你可以参考本文开头的图片)
很有趣。我们得到了爱基斯摩犬和香蕉图像非常准确的描述。对于汽车图像而言,汽车的具体类别不太准,但模型确实辨识出了图像中的汽车。当然,网络不可能在无限的分类上进行训练,因此它没有为最后一张图像返回“妇女”描述。然而,它确实辨识出了帽子。
COCO SSD
好,模型表现不错。但是我们如何处理包含多个物体的图像呢?为了辨识单一图像中的多个物体,我们将利用单图多盒检测器(Single Shot Multibox Detector, SSD)。在我们的第二个例子中,我们将查看一个在COCO(Common Object in Context)数据集上训练的SSD模型。我们使用的这一模型在84个不同分类上训练过。
这一模型来自Caffe,因此我们将加载二进制文件VGG_coco_SSD_300x300_iter_400000.caffemodel,以及protoxt文件deploy.prototxt:
基于COCO分类
我们的分类函数和基于Inception的分类函数几乎一样,不过这次输入将是300x300的图像,而输出将是1x1xNx7矩阵。
我不是很清楚为何输出是1x1xNx7矩阵,不过我们实际上只关心Nx7部分。我们可以使用flattenFloat工具函数映射第三、第四维至2D矩阵。与Inception输出矩阵相比,这次N不对应每个分类,而是检测到的每个物体。另外,每个物体对应7个条目。
为什么是7个条目?
记住,这里我们遇到的问题和之前有点不一样。我们想要检测单张图像中的多个物体,因此我们不可能仅仅给出每个分类的置信度。我们实际上想要得到的是一个指示每个物体在图中的位置的矩形。7个条目分别为:
我其实毫无头绪
物体的分类标签
分类的置信度
矩形左端的x
矩形底部的y
矩形右端的x
矩形顶部的y
输出矩阵给了我们不少关于结果的信息,这看起来相当整洁。我们同样可以根据置信度再次过滤结果,并为每个辨识出的物体在图像中绘制边框。
看看它的效果!
出于行文的简洁,我将跳过绘制矩形的代码,以及其他可视化的代码。如果你想知道具体是怎么做的,可以访问前面提到的github仓库。
让我们传入一张汽车图像到网络,然后过滤结果,看看是否检测到了分类:
很棒!下面提高一下难度。让我们试下……一张早餐桌?
很不错!
最后的话
如果你想进一步尝试,我建议你查看Caffe Model Zoo,其中提供了用于不同用例的已训练模型,你可以直接下载。
如果你基于OpenCV和DNN做了很棒的应用,我会很感兴趣!欢迎留言分享。
原文地址:https://medium.com/%40muehler.v/node-js-meets-opencvs-deep-neural-networks-fun-with-tensorflow-and-caffe-ff8d52a0f072
领取专属 10元无门槛券
私享最新 技术干货