創建一個人臉函數實現增刪改查

人臉識別:
完成以下人臉識別功能。
創建一個人臉庫,實現人臉庫的類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’]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章