方向梯度直方图(英语: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)技术。
卷积神经网络(Convolutional Neural Network, CNN) 是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。
卷积神经网络由一个或多个卷积层和顶端的全连通层(对应经典的神经网络)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网络能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网络在图像和语音识别方面能够给出更好的结果。
在机器学习中,支持向量机(英语:support vector machine,常简称为SVM,又名支持向量网络[1])是在分类与回归分析中分析数据的监督式学习模型与相关的学习算法。给定一组训练实例,每个训练实例被标记为属于两个类别中的一个或另一个,SVM训练算法创建一个将新的实例分配给两个类别之一的模型,使其成为非概率二元线性分类器。
TensorFlow.js 是一个 JavaScript 库,用于在浏览器和 Node.js 训练和部署机器学习模型。
index.html
文件之中
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/[email protected]/dist/tf.min.js">script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/[email protected]/dist/tfjs-vis.umd.min.js">script>
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();
// 打开浏览器开发工具查看输出
});
GENKI数据集是由加利福尼亚大学的机器概念实验室收集。该数据集包含GENKI-R2009a,GENKI-4K,GENKI-SZSL三个部分。GENKI-R2009a包含11159个图像,GENKI-4K包含4000个图像,分为“笑”和“不笑”两种,每个图片的人脸的尺度大小,姿势,光照变化,头的转动等都不一样,专门用于做笑脸识别。GENKI-SZSL包含3500个图像,这些图像包括广泛的背景,光照条件,地理位置,个人身份和种族等。
github地址: https://github.com/watersink/GENKI
点击 DownLoad Zip,解压之后:
通过 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);