tensorflow遥感图像分类_基于 TensorFlow.js 的迁移学习图像分类器
引 言在本文中,你将学习如何建立一个简单的“可学习机器”。这是一个自定义的图像分类器,你将使用 TensorFlow.js 这个强大而灵活的 Javascript 机器学习库,在浏览器中即时训练。首先,你将加载并运行一个名为 MobileNet 的流行的预训练模型来在浏览器中进行图像分类。然后,你将使用“迁移学习”技术,这项技术将使用预训练好的 MobileNet 模型为你的应用定制...
引 言
在本文中,你将学习如何建立一个简单的“可学习机器”。这是一个自定义的图像分类器,你将使用 TensorFlow.js 这个强大而灵活的 Javascript 机器学习库,在浏览器中即时训练。首先,你将加载并运行一个名为 MobileNet 的流行的预训练模型来在浏览器中进行图像分类。然后,你将使用“迁移学习”技术,这项技术将使用预训练好的 MobileNet 模型为你的应用定制以及引导训练。
你将学到什么?
√ 如何加载预训练的 MobileNet 模型并对新数据进行预测
√ 如何通过网络摄像头进行预测
√ 如何使用 MobileNet 模型的内部激活值,在一套由网络摄像头动态定义的新类上做迁移学习
让我们开始吧!
准备
你将需要如下准备:
1.Chrome 或其他现代浏览器的最新版本。
2.一个文本编辑器,可以在你的机器上本地运行,也可以通过 Codepen 或 Glitch 等在 Web 上运行。
3.了解 HTML、CSS、JavaScripe 和 Chrome 开发者工具(或你首选浏览器的开发者工具)。
4.理解神经网络的高级概念。如果你需要一个介绍或回顾,可以考虑观看 3blue1brown 的视频。
加载 TensorFlow.js
和 MobileNet 模型
在编辑器中打开 index.html 并添加以下内容:
<html>
<head>
<script src="https://unpkg.com/@tensorflow/tfjs">script>
<script src="https://unpkg.com/@tensorflow-models/mobilenet">script>
head>
<body>
<div id="console">div>
<img id="img" crossOrigin src="https://i.imgur.com/JlUvsxa.jpg" width=227 height=227/>
<script src="index.js">script>
body>
html>
在浏览器中
设置 MobileNet 用于预测
接下来,在代码编辑器中打开/创建 index.js 文件,添加以下代码:
let net;
async function app() {
console.log('Loading mobilenet..');
// 加载模型
net = await mobilenet.load();
console.log('Sucessfully loaded model');
// 通过模型预测图像
const imgEl = document.getElementById('img');
const result = await net.classify(imgEl);
console.log(result);
}
app();
在浏览器中
测试 MobileNet 的预测
如果要运行该网页,你只需要在 Web 浏览器中打开 index.html 即可。如果你正在使用云控制台,只需刷新预览页面。
你应该会在开发者工具的 JavaScipt 控制台中看到一张狗的照片,这是 MobileNet 的预测结果!注意,这可能需要一点时间来下载模型,请耐心等待!
这个图像是否被正确分类?
值得注意的是,这也适用于手机!
通过网络摄像头图像
在浏览器中执行 MobileNet 预测
现在,让我们让它更具交互性和实时性。让我们设置网络摄像头来预测由网络摄像头传输的图像。
首先要设置网络摄像头的视频元素。打开 index.html 文件,在 部分中添加如下行,并删除我们用于加载狗图像的 标签。
<video autoplay playsinline muted id="webcam" width="224" height="224">video>
打开 index.js 文件并将 webcamElement 添加到文件的最顶部。
const webcamElement = document.getElementById('webcam');
在同一个 index.js 文件中,在调用 “app()” 函数之前添加网络摄像头的设置函数:
async function setupWebcam() {
return new Promise((resolve, reject) => {
const navigatorAny = navigator;
navigator.getUserMedia = navigator.getUserMedia ||
navigatorAny.webkitGetUserMedia || navigatorAny.mozGetUserMedia ||
navigatorAny.msGetUserMedia;
if (navigator.getUserMedia) {
navigator.getUserMedia({video: true},
stream => {
webcamElement.srcObject = stream;
webcamElement.addEventListener('loadeddata', () => resolve(), false);
},
error => reject());
} else {
reject();
}
});
}
现在,在之前添加的 app() 函数中,你可以删除通过图像预测的部分,用一个无限循环,通过网络摄像头预测代替。
async function app() {
console.log('Loading mobilenet..');
// Load the model.
net = await mobilenet.load();
console.log('Sucessfully loaded model');
await setupWebcam();
while (true) {
const result = await net.classify(webcamElement);
document.getElementById('console').innerText = `
prediction: ${result[0].className}\n
probability: ${result[0].probability}
`;
// 给自己一些喘息的空间
// 等待下一个动画帧开始
await tf.nextFrame();
}
}
如果你在网页中打开控制台,现在你应该会看到 MobileNet 的预测和网络摄像头收集到的每一帧图像。
这可能有些荒谬,因为 ImageNet 数据集看起来不太像出现在网络摄像头中的图像。你可以把狗的照片放在你的手机上,再放在笔记本电脑的摄像头前来测试这一点。
在 MobileNet 预测的基础上
添加一个自定义的分类器
现在,让我们把它变得更加实用。我们使用网络摄像头动态创建一个自定义的 3 对象的分类器。我们将通过 MobileNet 进行分类,但这次我们将使用特定网络摄像头图像在模型的内部表示(激活值)来进行分类。
我们将使用一个叫做 "K-Nearest Neighbors Classifier" 的模块,他将有效的让我们把摄像头采集的图像(实际上是 MobileNet 中的激活值)分成不同的类别,当用户要求做出预测时,我们只需选择拥有与待预测图像最相似的激活值的类即可。
在 index.html 的 标签的末尾添加 KNN 分类器的导入(你仍然需要 MobileNet,所以不要删除它的导入):
...
<script src="https://unpkg.com/@tensorflow-models/knn-classifier">script>
...
在 index.html 视频部分下面添加三个按钮。这些按钮将用于向模型添加训练图像。
...
<button id="class-a">Add Abutton>
<button id="class-b">Add Bbutton>
<button id="class-c">Add Cbutton>
...
在 index.js 的顶部,创建一个分类器
const classifier = knnClassifier.create();
更新 app 函数
async function app() {
console.log('Loading mobilenet..');
// Load the model.
net = await mobilenet.load();
console.log('Sucessfully loaded model');
await setupWebcam();
// 从网络摄像头中读取图像并将其与特定的类关联
// 并将其与特定的类关联
const addExample = classId => {
// 获取 MobileNet 中间的 'conv_preds' 的激活值
// 并将其传递给 KNN 分类器
const activation = net.infer(webcamElement, 'conv_preds');
// 将中间激活值传递给分类器
classifier.addExample(activation, classId);
};
// 单击该按钮是,为该类添加一个实例
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) {
// 获取 MobileNet 在网络摄像头中图像上的激活值
const activation = net.infer(webcamElement, 'conv_preds');
// 从分类器模块上获取最可能的类
const result = await classifier.predictClass(activation);
const classes = ['A', 'B', 'C'];
document.getElementById('console').innerText = `
prediction: ${classes[result.classIndex]}\n
probability: ${result.confidences[result.classIndex]}
`;
}
await tf.nextFrame();
}
}
现在,当你加载 index.html 页面时,你可以使用常用对象或面部表情/手势为这三个类中的每一个类捕获图像。每次单击其中一个 "Add" 按钮,就会向该类添加一个图像作为训练实例。当你这样做的时候,模型会继续预测网络摄像头的图像,并实时显示结果。
可选项:扩展示例
现在尝试添加另一个代表没有动作的类!
你学到了什么
你使用 Tensorflow.js 实现了一个简单的机器学习 Web 应用程序。你加载并使用了一个预训练过的 MobileNet 模型来对来自网络摄像头中的图像进行分类然后自定义了模型,将图像分类为三个自定义的类别。
原文链接:https://codelabs.developers.google.com/codelabs/tensorflowjs-teachablemachine-codelab/#0
2020 InnoCamp 冬令营,还缺一个你

万众期待的 2020 InnoCamp 冬令营只剩下不到一周的报名时间啦,想不想像工程师那样制作自己的领航者小车?想不想让机械臂随你所想而动?想不想指挥传感器征服“千军万马”?想不想让传送带找你所想?那就抓紧时间阅读报名须知并填写报名表吧!在 InnoCamp 冬令营里,你的那些脑洞有可能会变成现实!

为了让大家储备技术,由黑胡桃实验室和 TensorFlow 团队工程师共同开发的 TensorFlow 速成课程已开放给大家学习!大家务必使用电脑访问 https://blackwalnut.tech/tfboost/introduce ,页面底端的通关指南会帮助你学习,当然你也可以参考个人中心的任务列表一步一步前进。如果你最终完成了任务列表的全部任务,就可获得 TensorFlow Boost 学习认证证书!
更多推荐
所有评论(0)