TensorFlow.js图片分类的迁移学习

来源:https://codelabs.developers.google.com/codelabs/tensorflowjs-teachablemachine-codelab/index.html

1.简介

在此代码实验室中,您将学习如何构建一个简单的“可教学的机器”,这是一个自定义图像分类器,您将使用TensorFlow.js(一个功能强大且灵活的Java机器学习库)在浏览器中进行训练。首先,您将加载并运行一个流行的预训练模型MobileNet,以在浏览器中进行图像分类。然后,您将使用一种称为“转移学习”的技术,该技术使用预先训练的MobileNet模型引导我们的训练,并对其进行自定义以针对您的应用程序进行训练。

该代码实验室将不会讲授可教机器应用背后的理论。如果您对此感到好奇,请查看本教程
您将学到什么

  • 如何加载预先训练的MobileNet模型并预测新数据
  • 如何通过网络摄像头做出预测
  • 如何使用MobileNet的中间激活来在您使用网络摄像头动态定义的一组新类上进行迁移学习

因此,让我们开始吧!

2.要求

要完成此代码实验室,您将需要:

  1. Chrome的最新版本或其他现代浏览器。
  2. 文本编辑器,可以通过CodepenGlitch之类在您的计算机上本地运行,也可以在网络上运行。
  3. 了解HTML,CSS,JavaScript和Chrome DevTools(或您喜欢的浏览器devtools)。
  4. 对神经网络的高级概念理解。如果您需要介绍或复习,请考虑观看3blue1brown的视频Ashi Krishnan的Java深度学习视频

注意:如果您在CodeLab信息亭中,我们建议使用glitch.com完成此Codelab。我们为您设置了一个入门项目,以重新混合以加载tensorflow.js。

3.加载TensorFlow.js和MobileNet模型

在编辑器中打开index.html并添加以下内容:

<html>
  <head>
    <!-- Load the latest version of TensorFlow.js -->
    <script src="https://unpkg.com/@tensorflow/tfjs"></script>
    <script src="https://unpkg.com/@tensorflow-models/mobilenet"></script>
  </head>
  <body>
    <div id="console"></div>
    <!-- Add an image that we will use to test -->
    <img id="img" crossorigin src="https://i.imgur.com/JlUvsxa.jpg" width="227" height="227"/>
    <!-- Load index.js after the content of the page -->
    <script src="index.js"></script>
  </body>
</html>

4.设置MobileNet以在浏览器中进行推断

接下来,在代码编辑器中打开/创建文件index.js,并包含以下代码:

let net;

async function app() {
  console.log('Loading mobilenet..');

  // Load the model.
  net = await mobilenet.load();
  console.log('Successfully loaded model');

  // Make a prediction through the model on our image.
  const imgEl = document.getElementById('img');
  const result = await net.classify(imgEl);
  console.log(result);
}

app();

5.在浏览器中测试MobileNet推理

要运行该网页,只需在Web浏览器中打开index.html。如果使用的是云控制台,只需刷新预览页面即可。

您应该在开发人员工具的Javascript控制台中看到一只狗的图片,这是MobileNet的最高预测!请注意,下载模型可能需要一点时间,请耐心等待!

图像是否正确分类?

还值得注意的是,这也可以在手机上使用!

6.在浏览器中通过网络摄像头图像运行MobileNet推理

现在,让我们使其更具交互性和实时性。让我们设置网络摄像头,以对通过网络摄像头拍摄的图像进行预测。

首先设置网络摄像头视频元素。打开index.html文件,并在<body>部分中添加以下行,并删除用于加载狗图像的<img>标签:

<video autoplay playsinline muted id="webcam" width="224" height="224"></video>

打开index.js文件,并将webcamElement添加到文件的顶部

const webcamElement = document.getElementById('webcam');

现在,在之前添加的app()函数中,您可以通过图像删除预测,而是创建一个无限循环,该无限循环通过网络摄像头元素进行预测。

async function app() {
  console.log('Loading mobilenet..');

  // Load the model.
  net = await mobilenet.load();
  console.log('Successfully loaded model');
  
  // Create an object from Tensorflow.js data API which could capture image 
  // from the web camera as Tensor.
  const webcam = await tf.data.webcam(webcamElement);
  while (true) {
    const img = await webcam.capture();
    const result = await net.classify(img);

    document.getElementById('console').innerText = `
      prediction: ${result[0].className}\n
      probability: ${result[0].probability}
    `;
    // Dispose the tensor to release the memory.
    img.dispose();

    // Give some breathing room by waiting for the next animation frame to
    // fire.
    await tf.nextFrame();
  }
}

如果您在网页中打开控制台,现在应该会看到MobileNet预测,并具有在摄像头中收集的每个帧的概率。

这些可能是荒谬的,因为ImageNet数据集看起来与通常出现在网络摄像头中的图像不太相似。一种测试方法是,将手机上的狗的图片放在笔记本电脑摄像头前。

7.在MobileNet预测之上添加自定义分类器

现在,让我们使其更有用。我们将使用网络摄像头动态创建自定义的3类对象分类器。我们将通过MobileNet进行分类,但是这次我们将对特定摄像头图像进行模型的内部表示(激活),并将其用于分类。

我们将使用一个称为“ K最近邻居分类器”的模块,该模块可以有效地使我们将网络摄像头图像(实际上是其MobileNet激活)放入不同的类别(或“类别”)中,并且当用户要求做出预测时,只需选择与我们预测的活动最相似的课程。

在index.html的<head>标记的导入末尾添加KNN分类器的导入(您仍将需要MobileNet,因此请不要删除该导入):

...
<script src="https://unpkg.com/@tensorflow-models/knn-classifier"></script>
...

在video元素下方的index.html中为每个按钮添加3个按钮。这些按钮将用于向模型添加训练图像。

...
<button id="class-a">Add A</button>
<button id="class-b">Add B</button>
<button id="class-c">Add C</button>
...

在index.js的顶部,创建分类器:

const classifier = knnClassifier.create();

更新app函数:

async function app() {
  console.log('Loading mobilenet..');

  // Load the model.
  net = await mobilenet.load();
  console.log('Successfully loaded model');

  // Create an object from Tensorflow.js data API which could capture image 
  // from the web camera as Tensor.
  const webcam = await tf.data.webcam(webcamElement);

  // Reads an image from the webcam and associates it with a specific class
  // index.
  const addExample = async classId => {
    // Capture an image from the web camera.
    const img = await webcam.capture();

    // Get the intermediate activation of MobileNet 'conv_preds' and pass that
    // to the KNN classifier.
    const activation = net.infer(img, 'conv_preds');

    // Pass the intermediate activation to the classifier.
    classifier.addExample(activation, classId);

    // Dispose the tensor to release the memory.
    img.dispose();
  };

  // When clicking a button, add an example for that class.
  document.getElementById('class-a').addEventListener('click', () => addExample(0));
  document.getElementById('class-b').addEventListener('click', () => addExample(1));
  document.getElementById('class-c').addEventListener('click', () => addExample(2));

  while (true) {
    if (classifier.getNumClasses() > 0) {
      const img = await webcam.capture();

      // Get the activation from mobilenet from the webcam.
      const activation = net.infer(img, 'conv_preds');
      // Get the most likely class and confidences from the classifier module.
      const result = await classifier.predictClass(activation);

      const classes = ['A', 'B', 'C'];
      document.getElementById('console').innerText = `
        prediction: ${classes[result.label]}\n
        probability: ${result.confidences[result.label]}
      `;

      // Dispose the tensor to release the memory.
      img.dispose();
    }

    await tf.nextFrame();
  }
}

现在,当您加载index.html页面时,可以使用公共对象或面部/身体手势来捕获这三个类中的每一个的图像。每次单击“添加”按钮之一时,会将一幅图像添加到该班级作为训练示例。在执行此操作时,模型将继续对即将到来的网络摄像头图像进行预测,并实时显示结果。

8.可选:扩展示例

现在尝试添加另一个不表示任何操作的类!

9.您学到了什么

在此代码实验室中,您使用TensorFlow.js实现了一个简单的机器学习Web应用程序。您加载并使用了预先训练的MobileNet模型对网络摄像头中的图像进行分类。然后,您可以自定义模型,以将图像分为三个自定义类别。

请确保访问js.tensorflow.org以获取更多示例和带有代码的演示,以了解如何在应用程序中使用TensorFlow.js。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容