目录

配置

获取实时视频源

使用KNN分类器

将代码放在一起

测试结果

下一步是什么?


  • 下载源-10.6 MB

使用支持HTML5的现代网络浏览器,我们可以轻松访问许多API,例如网络摄像头。当我们需要访问实时数据时,它特别有用。在本文中,我们将使用网络摄像头访问实时数据,并使用转移学习来检测脾气暴躁。

如果您一直在看本系列,那么本文中使用的代码应该看起来很熟悉。我们将使用相同的迁移学习技术,将预先训练的MobileNet模型与我们的自定义实时训练数据结合起来。

配置

创建一个HTML文档并通过导入所需的TensorFlow.js、MobileNet和KNN分类器模型开始。

<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs/dist/tf.min.js"> </script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/mobilenet"></script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/knn-classifier"></script>

我们将使用视频标签来使用来自实时摄像机的图像,而不是使用图像或画布标签。

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

我们还需要“脾气暴躁”和“中性”按钮,才能将实况视频的图像添加到我们的训练数据中:

<button id="grumpy">Grumpy</button>
<button id="neutral">Neutral</button>

让我们添加另一个标签,以在页面而不是控制台上输出我们的预测。

<div id="prediction"></div>

我们最终的HTML文件如下所示:

<html lang="en"><head><meta charset="UTF-8"><script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs/dist/tf.min.js"> </script><script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/mobilenet"></script><script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/knn-classifier"></script></head><body><div><h1>Real-Time Grumpiness detection using Tensorflow.js</h1><div style="width:100%"><video autoplay muted id="webcam" width="224" height="224" style=" margin: auto;"></video></div><h3>How are you feeling?</h3><button id="grumpy">Grumpy</button><button id="neutral">Neutral</button><div id="prediction"></div><script src="grumpinessClassifier.js"></script></div></body>
</html>

获取实时视频源

现在是时候转到JavaScript文件了,我们将通过设置一些重要的变量来开始:

let knn;
let model;const classes = ['Grumpy', 'Neutral'];
const video = document.getElementById('webcam');

我们还需要加载模型并创建KNN分类器的实例:

let knn;
let model;const classes = ['Grumpy', 'Neutral'];
const video = document.getElementById('webcam');

我们现在可以设置网络摄像头以获取视频图片:

const setupWebcam = async () => {return new Promise((resolve, reject) => {const _navigator = navigator;navigator.getUserMedia = navigator.getUserMedia ||_navigator.webkitGetUserMedia || _navigator.mozGetUserMedia ||_navigator.msGetUserMedia;if (navigator.getUserMedia) {navigator.getUserMedia({video: true},stream => {video.srcObject = stream;video.addEventListener('loadeddata', () => resolve(), false);},error => reject());}});
}

使用KNN分类器

现在我们从网络摄像头获取数据,我们将继续使用knn的addExample方法添加示例训练数据。

const addExample = label => {// getting the intermediate activation of MobileNet 'conv_preds' and passing that to the KNN classifier.const feature = model.infer(video, 'conv_preds');// Pass the intermediate activation to the classifierknn.addExample(feature, label);
};// add an example to the specified class on button click
document.getElementById('grumpy').addEventListener('click', () => addExample(0));
document.getElementById('neutral').addEventListener('click', () => addExample(1));

将代码放在一起

这是我们的grumpinessClassifier.js文件的最终外观:

let knn;
let model;knn = knnClassifier.create();
const classes = ['Grumpy', 'Neutral'];
const video = document.getElementById('webcam');async function loadKnnClassifier() {console.log('Model is Loading..');model = await mobilenet.load();console.log('Model loaded successfully!');await setupWebcam();// Reading the image from the webcam and associate the image with a specific class const addExample = label => {// getting the intermediate activation of MobileNet 'conv_preds' and passing that to the KNN classifier.const feature = model.infer(video, 'conv_preds');// Pass the intermediate activation to the classifierknn.addExample(feature, label);};// add an example to the specified class on button clickdocument.getElementById('grumpy').addEventListener('click', () => addExample(0));document.getElementById('neutral').addEventListener('click', () => addExample(1));while(true) {if (knn.getNumClasses() > 0) {// Getting activation from mobilenet for the webcam videoconst feature = model.infer(video, 'conv_preds');// getting the top prediction from the classifier moduleconst prediction = await knn.predictClass(feature);// printing the prediction with confidence score on the screendocument.getElementById('prediction').innerText = `Predicted emotion: ${classes[prediction.classIndex]}\nProbability of prediction: ${prediction.confidences[prediction.classIndex].toFixed(2)}`;}// wait for the next animation frame await tf.nextFrame();}
}const setupWebcam = async () => {return new Promise((resolve, reject) => {const _navigator = navigator;navigator.getUserMedia = navigator.getUserMedia ||_navigator.webkitGetUserMedia || _navigator.mozGetUserMedia ||_navigator.msGetUserMedia;if (navigator.getUserMedia) {navigator.getUserMedia({video: true},stream => {video.srcObject = stream;video.addEventListener('loadeddata', () => resolve(), false);},error => reject());}});
}loadKnnClassifier();

测试结果

在浏览器中打开文件,然后通过单击表情合适的按钮(脾气暴躁或中性)开始训练自定义分类器。仅捕获少量图像后,您将开始看到结果。

为了获得更好的预测,您必须将更多数据提供给自定义分类器。由于我们是在较小的数据集上训练模型的,因此当其他人尝试您的应用程序时,分类器的AI准确性会很低。为了获得更好的预测结果,您可以将很多不同的人的照片输入到分类器中。

下一步是什么?

在本文中,我们学习了如何使用转移学习来扩展经过预先训练的MobileNet模型,以检测实时网络摄像头数据上的脾气暴躁检测。我们的应用程序现在可以从实时视频帧中识别用户的表情。但是我们仍然必须向应用程序提供表达式才能开始使用它。如果不先进行明确培训就可以启动并运行我们的应用程序,这会很好又方便吗?

在下一篇文章中,我们将使用另一个经过预先训练的模型face-api.js来检测表情而无需自己进行任何训练。

使用TensorFlow.js从网络摄像头进行实时AI情感检测相关推荐

  1. three.js 调用网络摄像头

    three.js 调用网络摄像头 <!DOCTYPE html> <html lang="en"><head><title>thre ...

  2. CV:基于keras利用cv2自带两步检测法对《跑男第六季第五期》之如花片段(或调用摄像头)进行实时性别脸部表情检测

    CV:基于keras利用cv2自带两步检测法对<跑男第六季第五期>之如花片段(或调用摄像头)进行实时性别&脸部表情检测 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心 ...

  3. 用TensorFlow.js在浏览器中进行实时语义分割 | MixLab算法系列

    语义分割是监测和描绘图像中每个感兴趣对象的问题 当前,有几种方法可以解决此问题并输出结果 如下图示: 语义分割示例 这种分割是对图像中的每个像素进行预测,也称为密集预测. 十分重要且要注意的是,同一类 ...

  4. 多路海康网络摄像头数据实时回调(采用软解码方式)

    由于项目中需要访问多路海康摄像头的原始图像进行相关处理,搜索了大量的博客,对于多路海康摄像头回调都没有写的很清楚明白,看到此博客的你,静下心来研读下面的内容,你将会很容易调取多路海康网络摄像头. (1 ...

  5. 使用迁移学习和TensorFlow.js在浏览器中进行AI情感检测

    目录 KNN分类器 迁移学习 我们的技术栈 配置 使用KNN分类器 将代码放在一起 测试结果 下一步是什么? 下载源-10.6 MB 在上一篇文章中,我们已经看到了加载预训练模型有多么容易.在本文中, ...

  6. 边缘设备上的实时AI人员检测:检测视频中的人员

    下载数据-19.3 MB 下载模型-43.5 MB 下载结果-36.66 MB 从本系列的前几篇文章中,我们获得了使用SSD DNN模型检测图像中人物的Python代码.而且我们已经展示了该代码可以在 ...

  7. Node.js 通过https服务器利用js调用网络摄像头

    前言 最近写了一个js调用摄像头的代码,整体实现是非常简单,但是放到服务器上,通过外网访问后就会出现一个警告 我们需要通过js调用摄像头,但在此之前我们需要创建一个https服务器.所以,这篇博文就是 ...

  8. python调用海康网络摄像头,实时显示监控内容

    用网线将海康威视摄像头与电脑连接在一起:(或者用交换机,在一个交换机下面) 海康摄像头的默认ip是192.168.1.64 效果:和通过海康摄像头网址效果一样 rtsp://用户名:密码@ip地址/S ...

  9. html5网络摄像头,js调用网络摄像头

    不支持IE浏览器(需要使用flash插件),支持移动端,未经过完全测试 PC端使用的时候,HTML页面需要预留video标签,canvas标签 移动端使用的时候,HTML页面需要预留file标签,ca ...

最新文章

  1. httpurlconnect设置中文参数_CNC数控机床三菱系统参数的设置及报警解除
  2. linux HZ Tick Jiffies
  3. 总在说 Spring Boot 内置了 Tomcat 启动,那它的原理你说的清楚吗?
  4. 深入ASP.NET数据绑定(中)——数据双向绑定机理
  5. 3DSlicer10:体系结构1
  6. 花费一天时间基于Vue创建的epub小说阅读器效果展示及源码分享
  7. Google https服务被屏蔽
  8. Android开发之自定义ImageView圆角图片的方法
  9. Idea新建modules后无法自动导入pom.xml
  10. 带有Oracle Digital Assistant和Fn Project的会话式UI。 第二部分
  11. java字节码提取if语句_终于找到了!有了它你就可以读懂字节码了!
  12. Linux SSh scp使用【远程文件/目录的传输】
  13. REX-Ray 了解
  14. 【转】如何有效地记忆与学习
  15. php下载安装教程,PHP下载安装教程
  16. 西门子cnc sinumerik_2020邯郸cnc加工中心编程要多久就是工厂傅
  17. 在Mac上安装ie10浏览器
  18. 23岁女工为600元全勤奖带伤加班3天 一周后身亡
  19. 面试求职-你们想知道的腾讯面经
  20. 怎么把字母缩小当符号_必收藏干货!谭编教你轻松输入这些论文中的特殊符号:...

热门文章

  1. 7 环境变量 立即生效_不服已经生效的刑事判决书该怎么办?刑事案件如何执行?...
  2. 常见的php 字符串函数,php 常用字符串函数总结
  3. 合成创意海报灵感|比技术更重要的是创意!
  4. 完美摄影作品展,它可以是你作品的风格
  5. 设计素材|C4D别高质量模型包
  6. 【UI设计师必备】可临摹精美的APP UI Kit模板
  7. Python爬虫时中文乱码的处理
  8. Maple:把计算结果保存出来
  9. 大页内存的使用:HugePages(大内存页)的原理与使用
  10. FD.io VPP基本介绍-理解VPP软件架构