完成目标
- 理解人脸图像特征提取的各种方法(至少包括HoG、Dlib和卷积神经网络特征);
- 掌握笑脸数据集(genki4k)正负样本的划分、模型训练和测试的过程(至少包括SVM、CNN),输出模型训练精度和测试精度(F1-score和ROC);
- 完成一个摄像头采集自己人脸、并对表情(笑脸和非笑脸)的实时分类判读(输出分类文字)的程序;
- 将笑脸数据集换成口罩数据集,完成对口罩佩戴与否的模型训练,采取合适的特征提取方法,重新做上述2-3部。
背景知识
HOG
方向梯度直方图(英语:Histogram of oriented gradient,简称HOG) 是应用在计算机视觉和图像处理领域,用于目标检测的特征描述器。这项技术是用来计算局部图像梯度的方向信息的统计值。这种方法跟边缘方向直方图(edge orientation histograms)、尺度不变特征变换(scale-invariant feature transform descriptors)以及形状上下文方法( shape contexts)有很多相似之处,但与它们的不同点是:HOG描述器是在一个网格密集的大小统一的细胞单元(dense grid of uniformly spaced cells)上计算,而且为了提高性能,还采用了重叠的局部对比度归一化(overlapping local contrast normalization)技术。
CNN
卷积神经网络(Convolutional Neural Network, CNN) 是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。
卷积神经网络由一个或多个卷积层和顶端的全连通层(对应经典的神经网络)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网络能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网络在图像和语音识别方面能够给出更好的结果。
SVM
在机器学习中,支持向量机(英语:support vector machine,常简称为SVM,又名支持向量网络[1])是在分类与回归分析中分析数据的监督式学习模型与相关的学习算法。给定一组训练实例,每个训练实例被标记为属于两个类别中的一个或另一个,SVM训练算法创建一个将新的实例分配给两个类别之一的模型,使其成为非概率二元线性分类器。
TensorFlow.js
TensorFlow.js 是一个 JavaScript 库,用于在浏览器和 Node.js 训练和部署机器学习模型。
前提准备
TensorFlow.js的环境安装
- cdn方式
在index.html
文件之中<!-- Import TensorFlow.js --> <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.0.0/dist/tf.min.js"></script> <!-- Import tfjs-vis --> <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-vis@1.0.2/dist/tfjs-vis.umd.min.js"></script>
- npm install方式
简单代码示例:npm install @tensorflow/tfjs
import * as tf from '@tensorflow/tfjs'; //定义一个线性回归模型。 const model = tf.sequential(); model.add(tf.layers.dense({units: 1, inputShape: [1]})); model.compile({loss: 'meanSquaredError', optimizer: 'sgd'}); // 为训练生成一些合成数据 const xs = tf.tensor2d([1, 2, 3, 4], [4, 1]); const ys = tf.tensor2d([1, 3, 5, 7], [4, 1]); // 使用数据训练模型 model.fit(xs, ys, {epochs: 10}).then(() => { // 在该模型从未看到过的数据点上使用模型进行推理 model.predict(tf.tensor2d([5], [1, 1])).print(); // 打开浏览器开发工具查看输出 });
笑脸检测的CNN代码实现
笑脸数据集
GENKI数据集是由加利福尼亚大学的机器概念实验室收集。该数据集包含GENKI-R2009a,GENKI-4K,GENKI-SZSL三个部分。GENKI-R2009a包含11159个图像,GENKI-4K包含4000个图像,分为“笑”和“不笑”两种,每个图片的人脸的尺度大小,姿势,光照变化,头的转动等都不一样,专门用于做笑脸识别。GENKI-SZSL包含3500个图像,这些图像包括广泛的背景,光照条件,地理位置,个人身份和种族等。
github地址: https://github.com/watersink/GENKI
点击 DownLoad Zip,解压之后:
1. 加载数据并进行数据集
通过 REAMME.md
文档的阅读: GENKI-4K_Labels
txt文件中, 笑为1,不笑为0
项目相应文件目录:
建立一个data.js
文件,进行数据的读取,处理
数据读取与数据集划分:
const fs = require('fs');
const readline = require('readline');
const image = fs.createReadStream('./Images.txt');
const label = fs.createReadStream('./Labels.txt');
const listUrl = []
const listLabel = []
const listAll = []
async function setData() {
const Image = readline.createInterface({
input: image
})
for await (const line of Image) {
listUrl.push(`./files/${line}`);
}
Image.close();
const Label = readline.createInterface({
input: label
})
for await (const line of Label) {
listLabel.push(line);
}
Label.close();
// 进行 listALL整合
for (let i = 0; i < listUrl.length; i++) {
let list = {
url: listUrl[i],
label: listLabel[i].slice(0,1)
}
listAll.push(list);
}
console.log(listAll);
}
setData();
搭建一个简易服务器,便于前端获取图片
const koa = require('koa')
const serve = require('koa-static')
const cors = require('koa2-cors')
const app = new koa();
// 允许 跨域访问
app.use(cors({
origin: "*",
maxAge: 5, //指定本次预检请求的有效期,单位为秒。
credentials: true, //是否允许发送Cookie
allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], //设置所允许的HTTP请求方法
allowHeaders: ['Content-Type', 'Authorization', 'Accept'], //设置服务器支持的所有头信息字段
exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'] //设置获取其他自定义字段
}))
app.use(serve('./dist'))
app.listen(3000);
启动代码,进行测试:
2. 搭建模型架构
3. 训练
4. 评估
摄像头采集,进行人脸笑脸检测
1. 加载模型
2. 实时检测
口罩佩戴与否检测
1. 加载数据
2. 搭建模型架构
3. 训练
4. 评估
参考资料
- tensorflow.js
- face-api.js github仓库
- 使用卷积神经网络进行手写数字识别 tengsorlow教程
- 人脸特征点提取方法综述 - 计算机学报
- 方向梯度直方图 wiki