发布于 2026-01-06 0 阅读
0

冰淇淋还是斑点狗?谁能说得清?!构建机器学习驱动的 PWA DEV 全球展示挑战赛,由 Mux 呈现:展示你的项目!

冰淇淋还是斑点狗?谁能说得清?!构建一个基于机器学习的 PWA

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

图片由Karen Zack提供

使用 Vue.js 和自定义视觉 AI 创建一个用于图像推理的 PWA

提示!想在酷炫的互动环境中体验本教程并获得完成徽章吗?快去微软学习平台查看配套模块吧!

我一直以来都对Karen Zack(Instagram账号:@teenybiscuit)创作的一系列Instagram图片着迷不已——这种着迷难以言喻。她为近期被沉重新闻笼罩的人们提供了一项绝妙的服务:能够从鳄梨酱中辨认出鹦鹉,从百吉饼中辨认出腊肠犬,从炸鸡中辨认出拉布拉多犬等等。以下是她这项开创性作品的一个例子:

小猫大战焦糖

小猫大战焦糖

小狗大战百吉饼

小狗大战百吉饼

鹦鹉大战鳄梨酱

鹦鹉大战鳄梨酱

注意:您可以按照 Microsoft Learn 中的步骤构建应用,那里对此内容有更深入的讲解。快来看看吧!完整的代码库也在这里。

处理这类棘手的图像既能让我们放松心情,又能帮助我们探索测试各种图像识别和分类机器学习方法的新途径。在本教程中,你将学习如何使用一款名为Custom Vision AI 的简洁图像推理工具,这样就无需从头开始训练模型。你将构建一个 Web 应用程序,该程序可以循环处理这些图像,以确定模型是否能够做出正确的预测。

使用基于预训练模型的认知服务,是体验机器学习模型的绝佳方式。您可以利用一些优秀的Azure 机器学习认知服务(我最喜欢的认知服务平台),构建一个完全无用的 Web 应用(我最喜欢的类型),并从中获得乐趣(我最喜欢的活动)。让我们开始吧!

好消息!我们将把这个应用变成 PWA(渐进式 Web 应用)。这种应用可以离线在手机上运行,​​即使使用了机器学习模型——无需调用应用外部的任何 API!既然这是构建机器学习应用的巧妙方法,而且掌握这项技能也很有好处,我们不妨学习一下。

搭建你的 PWA

首先,创建一个纯净的 Vue.js 应用。你可以使用 vue.jsvue ui或 Vue CLI 来启动它,前提是你的本地机器上已经安装了所有必要的依赖项。如果你是通过 vue.js 启动 Vue CLI vue create my-tricky-app,请手动选择要添加到应用中的功能,并确保选择“PWA”:

cli

我们将创建一个基本的 Vue 网站,其中包含一些控制 PWA 行为的额外文件。具体来说,这些文件包括:

  • registerServiceWorker.js
  • service-worker.js
  • 多个可用于各种平台的图标
  • manifest.json 文件/public位于管理这些图标和其他重要元素的文件夹中

您可以使用浏览器的“开发者工具”>“审核”面板对 Web 应用运行 Lighthouse 审核。这将显示一些有趣的数据,例如应用在离线环境下的表现。请注意,您需要将应用运行在生产环境的 Web 服务器上才能查看完整的 Lighthouse 审核结果,因此您可以稍后返回此步骤以获取更详细的信息。

网页应用

现在,您可以开始构建应用程序的推理功能,该功能将使用您将在 Custom Vision AI 中构建的机器学习模型来测试各种图像。您将使用 Karen Zack 用来创作“斑点狗大战冰淇淋”拼贴画的图像,我已经将这些图像分成了 16 张。您可以点击此处下载并将它们添加到本地/src/assets/images文件夹。

有关以下代码片段背后的原理的更详细解释,请访问学习模块

构建您的界面

将默认<HelloWorld/>页面重命名为<DetectImage/>,并在 中这样引用它App.vue。然后,创建一个包含标题、图像和按钮的简单模板,并将 prop 的值更改msgWhat do you see?

  <template>
    <div class="hello">
      <h1>{{ msg }}</h1>
      <div>
        <img class="image" ref="img" :src="require('../assets/images/' + getImgIndex + '.jpg')" />
      </div>
      <div>
        <button class="button" @click="next()" :disabled="disable">Next</button>
      </div>
      <div
        v-for="pred in predictions"
        :key="pred.index"
      >{{ pred.label }}: {{ pred.probability.toFixed(0) + '%' }}</div>
      <div v-if="!predictions.length">hmm.....</div>
    </div>
  </template>
Enter fullscreen mode Exit fullscreen mode

现在你需要准备好你的应用程序,以便托管在 Custom Vision AI 中训练的模型。

训练你的模型

精彩的部分来了!访问 CustomVision.ai 并登录。在可用的资源组中创建一个项目(如果没有现成的资源组,请创建一个)。classification由于您要进行二元分类,因此应该创建一个项目。选择“多类”(MultiClass),因为每张图像只有一个标签,并选择“通用(紧凑)”(General (compact))域,以便您可以在 Web 上使用您的模型。将其导出为“基础平台”(Basic platform),因为您将在基于 TensorFlow.js 的环境中使用它。

创建项目

现在你要教预训练模型一些关于冰淇淋和斑点狗的知识!为此,你需要一些关于这两类事物的图片——先从每类大约十张开始。我搜索了“巧克力碎片冰淇淋”,​​并使用了一个很棒的插件从网页上抓取图片,创建了一个训练图像集。

请注意,我每个类别只用了六张图像进行训练。当然,对于精确的迁移学习来说,这个数据集太小了,但 Custom Vision AI 仍然能很好地处理这个小数据集。对于生产级模型,您当然需要更大的图像集。

将冰淇淋和斑点狗的图片分别保存在本地计算机上的两个文件夹中(分别命名为“冰淇淋”ice cream和“斑点狗dalmatian”)。在 Custom Vision AI 界面中,将文件夹逐个拖放到网页中。给狗狗图片dalmatian和冰淇淋图片分别添加标签ice cream

给你的图片添加标签

图片上传并添加标签后,即可开始训练。点击按钮train,观看模型构建过程!完成后,您将看到模型的准确率。用一张可爱的狗狗图片测试一下。您的模型准确率如何?

测试

现在您可以下载生成的模型文件,并将它们放置在您的 Web 应用程序中public/models

  • cvexport.清单
  • labels.txt
  • model.json
  • 权重.bin

为什么要把这些文件放在 `<script>` 文件夹里/public,而不是放在 `<script>`文件夹/assets或其他地方?publicVue.js 应用中的 `<script>` 文件夹用于存放不应该由 webpack 打包的静态资源。Custom Vision AI 构建过程生成的四个文件需要保持原样,并由您的应用按需提供,而无需通过 webpack 打包。

现在你可以在你的网页应用中使用这些功能了。

完成 Web 应用程序

您需要通过 npm 安装一些库来支持机器学习文件的使用。

  1. package.json你的 Web 应用程序根目录下的文件中,将以下内容添加"customvision-tfjs": "^1.0.1",dependencies列表中。
  2. 在同一个文件中,也要将其添加"raw-loader": "^4.0.0",devDependencies列表中。你需要这个包来管理 Vue 应用中 .txt 文件的读取。
  3. 在同一个文件中,最后将其添加"webpack-cli": "^3.3.10"devDependencies列表中,以便 webpack CLI 可以在应用程序中使用,这对于文本文件解析也是必要的。

有趣的是!CustomVision-tfjs 底层使用了 TensorFlow.js。

在 VS Code 的终端中,如果你的应用当前正在运行,请停止它(Ctrl-C),然后添加以下包:npm install。现在你可以开始构建<script>应用的底层结构了。

<template>在's' 结束标签下,创建一个新<script>标签,并添加以下代码:

<script>
import * as cvstfjs from "customvision-tfjs";
import labels from "raw-loader!../../public/models/labels.txt";
export default {
  name: "DetectImage",
  props: {
    msg: String
  },
  data() {
    return {
      labels: labels,
      model: null,
      predictions: [],
      image: 0,
      numImages: 16
    };
  },
  computed: {
    getImgIndex() {
      return this.image.toString();
    },
    disable() {
      if (this.image == this.numImages) {
        return true;
      } else return false;
    }
  },

  async mounted() {
    this.image++;
    //load up a new model
    this.model = new cvstfjs.ClassificationModel();
    await this.model.loadModelAsync("models/model.json");
    //parse labels
    this.labels = labels.split("\n").map(e => {
      return e.trim();
    });
    //run prediction
    this.predict();
  },

  methods: {
    async predict() {
      //execute inference
      let prediction = await this.model.executeAsync(this.$refs.img);
      let label = prediction[0];
      //build up a predictions object
      this.predictions = label.map((p, i) => {
        return { index: i, label: this.labels[i], probability: p * 100 };
      });
    },

    next() {
      this.image++;
      this.predictions = [];
      setTimeout(this.predict, 500);
    }
  }
};
</script>
Enter fullscreen mode Exit fullscreen mode

让我们来逐段分析这段代码。首先,我们cvstfjs从之前安装的 npm 库中导入一些模块,以便管理我们构建的自定义视觉模型。

然后,我们加载标签.txt文件。这会用到该raw-loader包。你需要告诉 webpack 如何处理这种类型的文本文件,所以如果根目录下没有该文件,请添加一个新文件,并使用webpack.config.js以下代码调用它:

module.exports = {
  module: {
    rules: [
      {
        test: /\.txt$/i,
        use: 'raw-loader',
      },
    ],
  },
};
Enter fullscreen mode Exit fullscreen mode

您的数据对象存储了在构建推理方法时将使用的变量的引用。

此外,还有一些计算属性。这些属性用于计算各种用户界面元素,例如正在显示的图像索引,以及当没有更多图像要显示时,“下一页”按钮需要禁用的时刻。

在异步mounted生命周期钩子中,您需要加载模型。模型可能很大,因此最好等到模型和标签文件(也需要解析)一起加载完毕后再开始推理。最后,当一切就绪后,调用 ` predict.`

Predict()它也采用异步方式,并使用 Custom Vision 的 npm 库将预测结果与标签进行匹配。预测完成后,next点击按钮即可开始对后续图像进行预测。请注意,您需要使用一种setTimeout方法来减缓预测的启动速度,直到图像加载完毕。

当您对模型的性能及其预测结果感到满意后,您可以将 Web 应用程序发布到 Azure 网站等托管提供商。

还记得你的应用是 PWA 吗?应用构建并发布后,你可以使用开发者工具切换到“离线”模式,并观察如何继续使用推理方法。Custom Vision AI 还允许你为模型创建端点,但使用这些端点需要一定的在线延迟。

将应用发布到 Azure 网站

最简单的方法是通过 GitHub Action。按照以下说明创建工作流并将 Azure 门户连接到 GitHub。每次应用发生更改时,它都会重新构建。这是一种只需向 GitHub 推送即可刷新模型的好方法。

但是等等!如果您要发布到 Azure,则需要在根目录中添加一个文件,该web.config文件将启用.json文件解析功能,因此请创建此文件并将以下代码添加到其中:

<?xml version="1.0" encoding="utf-8"?>
  <configuration>
    <system.webServer>
      <staticContent>
        <remove fileExtension=".json"/>
        <mimeMap fileExtension=".json" mimeType="application/json"/>
      </staticContent>
    </system.webServer>
</configuration>
Enter fullscreen mode Exit fullscreen mode

哦,还有一件事!您还需要做最后一个更改,即启用 Service Worker 的构建。您需要在应用程序的根文件夹中创建一个名为 `.service.js` 的文件,vue.config.js其中可以包含以下代码:

module.exports = {
    pwa: {
        workboxOptions: {
            exclude: [/\.map$/, /web\.config$/],
        },
    },
};
Enter fullscreen mode Exit fullscreen mode

该文件告诉 service worker 忽略你之前添加的 web.config 文件,该文件的存在会给 service worker 构建过程带来问题。

现在,当您的应用发布到 Web 服务器后,您就可以在在线和离线状态下查看其运行情况了!

网站上的一只达尔马提亚犬

结论

本文介绍了如何构建一个基于机器学习模型的 Vue.js Web 应用,该应用采用嵌入式文件,因此即使离线也能运行。此外,您还学习了如何将此类应用部署到 Azure,从而获得满足图像推理需求的端到端解决方案。如果您正在寻找优秀的图像处理解决方案,我建议您尝试CustomVision.ai ,因为它是处理图像推理的绝佳方式,而从零开始构建图像推理并非易事。请在下方评论区分享您的成果!如果您想观看我讲解构建此应用相关元素的视频,请观看下方视频。

文章来源:https://dev.to/azure/ice-cream-or-dalmatian-who-can-tell-building-a-machine-learning-powered-pwa-35g7