人臉識別:
完成以下人臉識別功能。
創建一個人臉庫,實現人臉庫的類FaceDatabase。
支持隨時向人臉庫中增加特徵向量,實現接口add(name, vector);
支持隨時刪除人臉庫中的人員,實現接口delete(name);
支持隨時更新人臉庫中的特徵向量,實現接口update(name, vector);
支持,從人臉庫中搜索所有相似度符合要求的人臉search(similarity, vector)。-- 返回值是人員名稱的數組。
特徵向量:每個人臉經過算法提取後,可以得到一串數據(浮點數),這裏是一個長度爲10的數組,如:
v1 = [0 , 1 , 2 , 3, 4 , 5 , 6 , 7 , 8 , 9];
v2 = [0 , 1 , 2 , 3, 4 , 5 , 6 , 7 , 8 , 9];
v1[i]和v2[i]是0到100之間的float
v1、v2相似度公式:
相似度s的範圍是0到100之間的float
示例:
var faceDB = new FaceDatabase();
//添加姓名爲lilei特徵向量(0,1,2,3,4,5,6,7,8,9)到人臉庫
faceDB.add(‘lilei’, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
//添加姓名爲hanmeimei特徵向量(0,1,2,3,4,5,6,7,8,9)到人臉庫
faceDB.add(‘hanmeimei’, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
//更新lilei的特徵向量爲(1,1,2,3,4,5,6,7,8,9)
faceDB.update(‘lilei’, [1, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
//搜索和(0,1,2,3,4,5,6,7,8,9)相似度90.0%(包含90.0%)以上的人
faceDB.search(90, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); //返回值[‘hangmeimei’]
faceDB.delete(‘hanmeimei’);
faceDB.search(0.0, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); //返回值[‘lilei’]
function FaceDatabase () {
var obj = {};
var vectors = [];
var names = [];
obj.add = function (name, vector) {
if (name === '') alert('name不能爲空');
vectors.push(vector);
names.push(name);
};
obj.delete = function (name) {
if (name === '') alert('name不能爲空');
if (names.indexOf(name) === -1) {//未找到
alert('未找到名字爲'+name+'的人臉庫');
}
var del_index = names.indexOf(name);//找出要刪除的位置
names.splice(del_index, 1);
vectors.splice(del_index, 1);
};
obj.update = function (name, vector) {
if (names.indexOf(name) === -1) {//未找到
alert('未找到名字爲'+name+'的人臉庫');
}
vectors[names.indexOf(name)] = vector;
};
obj.search = function (similarity, vector) {
var _sqrt = [];//用來存放根號下的數據
var _similarity = [];//用來存放vector和數組vectors裏每個數組比較後的相似度
var result = []; //存放符合的相似度
var index = [];//存放符合的相似度在vectors裏的位置
for (var i = 0; i < vectors.length; i++) {
_sqrt[i] = 0;
for (var j = 0; j < vectors[i].length; j++) {
_sqrt[i] += Math.pow(vectors[i][j] - (vector[j] || 0), 2);//i爲0表示當前
}
_similarity[i] = Math.max(0, 100-Math.sqrt(_sqrt[i]))//Math.sqrt(_sqrt[i])
}
for (var k = 0; k < _similarity.length; k++) {
if (_similarity[k] >= similarity) {
result.push(_similarity[k]);//滿足條件的相似度
index.push(k);//滿足條件相似度對應在vectors裏序號
}
}
var result_names = [];//找出所有的name
for (var x = 0; x < index.length; x++) {
result_names.push(names[x]);
}
return result_names;
};
return obj;
}
var faceDB = new FaceDatabase();
//添加姓名爲lilei特徵向量(0,1,2,3,4,5,6,7,8,9)到人臉庫
faceDB.add('lilei', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
//添加姓名爲hanmeimei特徵向量(0,1,2,3,4,5,6,7,8,9)到人臉庫
faceDB.add('hanmeimei', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
//更新lilei的特徵向量爲(1,1,2,3,4,5,6,7,8,9)
faceDB.update('lilei', [1, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
//搜索和(0,1,2,3,4,5,6,7,8,9)相似度90.0%(包含90.0%)以上的人
faceDB.search(90, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); //返回值[‘hangmeimei’]
faceDB.delete('hanmeimei');
faceDB.search(0.0, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); //返回值[‘lilei’]