目录
起点
托管说明
MobileNet v1
运行物体识别
终点线
下一步是什么?绒毛动物?
TensorFlow + JavaScript。现在,最流行,最先进的AI框架支持地球上使用最广泛的编程语言,因此,让我们在我们的web浏览器中通过深度学习实现奇迹,通过TensorFlow.js的WebGL GPU加速!
这是我们六个系列的第二篇文章:
在本文中,我们将深入探讨在Web浏览器中运行的计算机视觉。我将向您展示如何使用TensorFlow.js中经过预训练的MobileNet模型轻松快速地开始检测和识别图像中的对象。
要使用TensorFlow.js分析图像,我们首先需要:
这是我们的起点:
Dogs and Pizza: Computer Vision in the Browser with TensorFlow.js
Loading...
此Web代码导入TensorFlow.js和示例图像的集合,添加图像元素(设置为224px),然后添加具有设置图像功能的状态文本元素。您可以更新图像数组以匹配您下载的其他测试图像的文件名。
在浏览器中打开包含以上代码的页面。您应该看到图像每五秒钟更新一次,以随机选择。
在继续进行之前,我想指出,为了使此项目正常运行,必须从Web服务器提供网页和图像(由于HTML5画布限制)。
否则,当TensorFlow.js尝试读取图像像素时,您可能会遇到此错误:
DOMException: Failed to execute 'texImage2D' on 'WebGL2RenderingContext': Tainted canvases may not be loaded.
如果您没有运行像Apache或IIS这样的服务器,则可以使用WebWebWeb轻松在NodeJS中运行一个服务器,WebWebWeb是我为此目的而构建的NPM模块。
来自GitHub:“MobileNets是小型、低延迟、低功耗的模型,其参数化可以满足各种用例的资源约束。”
对于该项目,我们将使用MobileNet v1,该软件已经过数百万张图像的训练,可以识别1000种不同类别的物体,从不同的犬种到各种食物。该模型有多种变体,允许开发人员在复杂度/大小和预测准确性之间进行权衡。
幸运的是,Google将模型托管在其服务器上,因此我们可以在项目中直接使用它。对于224x224像素的图像输入,我们将使用最小的0.25色块变化。
让我们将其添加到脚本中,并使用TensorFlow.js加载模型。
// Mobilenet v1 0.25 224x224 model
const mobilenet = "https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_0.25_224/model.json";
let model = null;
(async () => {
// Load the model
model = await tf.loadLayersModel( mobilenet );
setInterval( pickImage, 5000 );
})();
在将图像传递到TensorFlow模型之前,我们需要将其从像素转换为张量。我们还必须将每个RGB像素颜色转换为-1.0到1.0之间的浮点值,因为这是MobileNet模型所训练的值范围。
TensorFlow.js具有内置功能,可帮助我们轻松执行这些操作。牢记内存管理,我们可以编写一个函数来运行模型并获取预测的对象标识符,如下所示:
async function predictImage() {
let result = tf.tidy( () => {
const img = tf.browser.fromPixels( document.getElementById( "image" ) ).toFloat();
const normalized = img.div( 127 ).sub( 1 ); // Normalize from [0,255] to [-1,1]
const input = normalized.reshape( [ 1, 224, 224, 3 ] );
return model.predict( input );
});
let prediction = await result.data();
result.dispose();
// Get the index of the highest value in the prediction
let id = prediction.indexOf( Math.max( ...prediction ) );
setText( labels[ id ] );
}
您会注意到,上面的函数引用labels数组以显示带有setText()的预测文本。该数组是ImageNet类别标签的预定义列表,这些列表与MobileNet所接受的预测相匹配。
如果您下载了它,请记住将它作为脚本包含在页面中的标记中,如下所示:
最后,通过在代码底部设置其onload处理程序,让图像元素调用在每次加载新图像时运行此预测函数:
(async () => {
// Load the model
model = await tf.loadLayersModel( mobilenet );
setInterval( pickImage, 5000 );
document.getElementById( "image" ).onload = predictImage;
})();
完成后,您的模型应该开始预测图像中的内容。
现在,您已经将所有部分组合在一起。这样,您就有了一个使用计算机视觉并可以识别对象的网页。还不错吧?
Dogs and Pizza: Computer Vision in the Browser with TensorFlow.js
Loading...
只需少量代码,我们就使用TensorFlow.js加载了预训练的模型,以在Web浏览器中识别列表中的对象。想象一下您可以做什么。也许创建一个可自动对成千上万张照片进行分类和分类的网络应用。
现在,如果我们想识别不在1000个类别列表中的其他对象怎么办?
请跟随本系列的下一篇文章一起学习如何扩展该项目,以快速训练卷积神经网络来识别...几乎任何您想要的东西。
https://www.codeproject.com/Articles/5272771/Dogs-and-Pizza-Computer-Vision-in-the-Browser-With