介绍4款开放的人工智能模型,包含图像分类、姿势检测、目标检测、声音识别
创建和训练自己的机器学习模型并不容易。你不仅需要知道模型应该是什么样子,还需要收集和准备大量好的训练数据。
有时依靠现有的训练模型更实际。亚马逊、IBM、谷歌、微软和阿里巴巴等大型云服务提供商的产品组合中有越来越多的机器学习产品。
这些服务的缺点是您需要访问internet。尤其是如果你为移动设备编写应用程序,这可能是一个问题。
这个领域的一个有趣的提议来自Firebase和ML-Kit。这些是本地Android和iOS应用程序的库。这些库中提供的某些服务能够在设备上本地运行,而无需向后端服务发送任何信息。有关更多信息,请访问产品页面:https://firebase.google.com/products/ml-kit/
在这篇博客文章中,我们将看到一组JavaScript库,它们在浏览器中本地运行,不需要后端服务。这对于移动web应用程序尤其有用。
所有这些库都来自tfjs模型项目。这些是为Tensorflow.js构建的预先训练的模型。所有这些模型都在浏览器中本地运行,但它们必须从internet下载模型。所有这些模型都存储在Google云存储上,并且相当大(介于5MB到28MB之间)。
一、图像分类MobileNet
这个模型是用来自ImageNet的图像训练的。ImageNet是目前根据WordNet层次结构组织的超过1400万张图像的集合。数据库是开放的,你可以用它进行自己的研究。npm install @tensorflow-models/mobilenet npm install @tensorflow/tfjs代码如下
import * as mobilenet from '@tensorflow-models/mobilenet'; //加载模型 this.modelPromise = mobilenet.load(); //分类图片 this.predictions = model.classify(this.image.nativeElement, 4).then(predictions => { loading.dismiss(); console.log(predictions); return predictions; });
该模型的大小约为16.3MB,load()方法从Google云存储下载它。
classify()方法可以将任何图像元素(<img>,<video>,<canvas>)作为输入,并返回最可能的预测及其置信度的数组。可以将第二个可选参数传递给classifiy()方法。这是一个数字,告诉该方法应该返回多少个最高概率。默认情况下,该方法返回3个标签。
classify()返回的对象是一个具有类名和概率分数属性的对象数组。如下
[ {
className: "lynx, catamount",
probability: 0.35078904032707214
}, {
className: "Egyptian cat",
probability: 0.33066123723983765
}, {
className: "carton",
probability: 0.09258472919464111
}, {
className: "tiger cat",
probability: 0.027597373351454735
} ]
二、目标检测 (coco-ssd)
该模型试图定位和识别图像中的多个对象。该模型基于上下文中COCO公共对象的数据集,能够检测90类对象。npm install @tensorflow-models/coco-ssd npm install @tensorflow/tfjs代码如下
import * as cocoSsd from '@tensorflow-models/coco-ssd'; //加载模型 this.modelPromise = cocoSsd.load(); //检测 const predictions = await model.detect(img);load()从谷歌云存储下载大小约为28MB的模型。
[ {
bbox: [159.52301025390625, 74.1237481534481, 280.68275451660156, 304.24583235383034],
class: "apple",
score: 0.9868752956390381
}, {
bbox: [411.81201934814453, 116.7046831548214, 363.41304779052734, 381.84274533391],
class: "orange",
score: 0.9685460329055786
} ]
三、姿势识别posenet
个库包含一个运行实时身体姿势估计的模型。npm install @tensorflow-models/posenet npm install @tensorflow/tfjs代码如下
import * as posenet from '@tensorflow-models/posenet'; //加载模型 this.modelPromise = posenet.load(); //识别模型To detect a pose you pass image data from a <img>, <video> and <canvas> element to the estimatePoses() method and get back an object with the detected positions. const poses = await model.estimatePoses(img, { flipHorizontal, decodingMethod: 'single-person' }); const pose = poses && poses[0];返回值是一个具有两个属性得分的对象,即总体置信得分和关键点,一个具有不同身体部位坐标的数组。keypoints数组中的每个元素都是一个对象,具有零件名称、x、y像素坐标和置信度。
{
score: 0.9003790126127356,
keypoints: [ {
part: "nose",
position: {x: 454.15630186870425, y: 72.40642578710468},
score: 0.9945268034934998
},
{score: 0.9955940842628479, part: "leftEye", position: {…}},
{score: 0.9914423823356628, part: "rightEye", position: {…}},
{score: 0.7791908383369446, part: "leftEar", position: {…}},
{score: 0.7425264120101929, part: "rightEar", position: {…}},
{score: 0.9854977130889893, part: "leftShoulder", position: {…}},
{score: 0.9964697360992432, part: "rightShoulder", position: {…}},
{score: 0.9371750354766846, part: "leftElbow", position: {…}},
...
]
四、语音识别Speech Command Recognizer
语音命令识别器是一个能够识别语音命令的库和预先训练的模型。它只能从很小的词汇量中理解简单孤立的英语单词。该模型目前理解的单词是从“0”到“9”、“向上”、“向下”、“左”、“右”、“去”、“停”、“是”和“否”的十位数。虽然这非常有限,但对于控制一个简单的web应用程序或一个简单的游戏来说是有用的。npm install @tensorflow-models/speech-commands npm install @tensorflow/tfjs代码如下
import * as speechCommands from '@tensorflow-models/speech-commands'; this.recognizer = speechCommands.create('BROWSER_FFT');// this.wordLabels = this.recognizer.wordLabels();// // ["_background_noise_", "_unknown_", "down", "eight", "five", "four", "go", "left", "nine", "no", "one", "right", "seven", "six", "stop", "three", "two", "up", "yes", "zero"] this.recognizer.ensureModelLoaded().then(() => { this.recognizer.listen(result => { // ... }, { includeSpectrogram: false, probabilityThreshold: 0.75 }); }
创建语音识别器的实例并从Google云存储(5.6mb)加载模型
方法wordLabels()返回模型能够识别的所有当前支持单词的数组。
在这个演示中,我移植了一个在GitHub上找到的简单的snake游戏,并对其进行了修改,这样就可以用语音命令而不是键盘输入来控制它。开始游戏时说“开始”,然后用“向下”、“向左”、“向右”、“向上”改变蛇的方向,停止蛇时说“停止”。
要启动识别过程,请调用方法listen()并将回调函数作为参数传递。只要识别出一个单词,就调用这个回调函数。
如果不想侦听就调用下面的函数
this.recognizer.stopListening();
效果如下
网友评论0