From 1621a97f2bf85b53d40ae98fbc15b99239e1535f Mon Sep 17 00:00:00 2001 From: pansen <pansen626@sina.com> Date: 星期六, 26 一月 2019 16:11:59 +0800 Subject: [PATCH] 人脸对比优化 --- QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.cpp | 194 ++++++++++++++++++------------------------------ 1 files changed, 73 insertions(+), 121 deletions(-) diff --git a/QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.cpp b/QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.cpp index 4cab786..f592c31 100644 --- a/QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.cpp +++ b/QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.cpp @@ -45,7 +45,7 @@ m_dbRWLocks[key] = RWLock(); } RWLock &t_rwl = m_dbRWLocks[key]; - t_rwl.wrlock(); +// t_rwl.wrlock(); FaceResults t_result = topResult[key]; topResult.erase(key); t_rwl.unlock(); @@ -53,64 +53,41 @@ } //#todo map 1->2 modify 2->1 -bool FaceDBCompareServer::compare(thread::id key, AlarmData *alarmData, int topN) { +bool FaceDBCompareServer::compare(thread::id key, AlarmData *alarmData, int topN, float score) { if (m_dbRWLocks.find(key) == m_dbRWLocks.end()) { m_dbRWLocks[key] = RWLock(); } +// 閿佷换鍔$殑瀵规瘮缁撴灉 RWLock &t_rwl = m_dbRWLocks[key]; // ClockTimer clockTimer("compare "); RWLock t_rwLock; m_rwLock.rdlock(); mapFaceResults t_compareResults; - if (topN > 1) { - //topN - parallelFor(ParallelForThreardSize::CPU_Number, [&](string &key, FeatureData &data) { - //#todo - double sc = 0; - for (auto &t_fea : data.features) { - double t_sc = m_casiaFaceWapper.compareFeature(alarmData->feature, t_fea); - if (t_sc > sc) - sc = t_sc; - } + + parallelFor(ParallelForThreardSize::CPU_Number, [&](string &key, FeatureData &data) { + //#todo + double sc = 0; + for (auto &t_fea : data.features) { + double t_sc = m_casiaFaceWapper.compareFeature(alarmData->feature, t_fea); +// 鑾峰彇褰撳墠瀵规瘮鐨勬渶楂樺垎锛� + sc = t_sc > sc ? t_sc : sc; + } // FaceResult tface{data.face_id, data.uuid, alarmData->tableName, sc, false}; - FaceResult tface{0, data.uuid, alarmData->tableName, sc, data.faceUrl, data.idcard, ""}; - t_rwLock.wrlock(); - //#todo - if (sc < t_compareResults.end()->second.confidence) { - t_rwLock.unlock(); - return; - } - t_compareResults.insert(make_pair(tface.confidence, tface)); - //#todo 10 - if (t_compareResults.size() > topN) { - t_compareResults.erase((--t_compareResults.end()), t_compareResults.end()); - } + FaceResult tface{0, data.uuid, alarmData->tableName, sc, data.faceUrl, data.idcard, "", data.enabled}; + t_rwLock.wrlock(); +// 濡傛灉褰撳墠璁板綍鐨勬墍鏈夌壒寰佺殑鏈�楂樺垎灏忎簬缁撴灉涓殑鏈�浣庡垎鍒欎笉淇濆瓨 + if (sc < score || sc < t_compareResults.end()->second.confidence) { t_rwLock.unlock(); - }); - } else { - //Max - float maxScore = 0; - parallelFor(ParallelForThreardSize::CPU_Number, [&](string &key, FeatureData &data) { - //#todo - double sc = 0; - for (auto &t_fea : data.features) { - double t_sc = m_casiaFaceWapper.compareFeature(alarmData->feature, t_fea); - if (t_sc > sc) sc = t_sc; - } - FaceResult tface{0, data.uuid, alarmData->tableName, sc, data.faceUrl, data.idcard, ""}; - t_rwLock.wrlock(); - if (sc < maxScore) { - t_rwLock.unlock(); - return; - } else { - t_compareResults.clear(); - t_compareResults.insert(make_pair(tface.confidence, tface)); - maxScore = t_compareResults.begin()->second.confidence; - } - t_rwLock.unlock(); - }); - } + return; + } + t_compareResults.insert(make_pair(tface.confidence, tface)); + if (topN != 0 && t_compareResults.size() > topN) { + t_compareResults.erase((--t_compareResults.end()), t_compareResults.end()); + } + t_rwLock.unlock(); + }); + m_rwLock.unlock(); int maxSearchFaces = alarmData->num; @@ -124,58 +101,15 @@ // if (it.confidence <= 0.6) { // continue; // } - FaceResult t_CR{it.id, it.uuid, it.tableName, it.confidence, it.face_img_url, it.idCard, it.alarmRet}; + FaceResult t_CR{it.id, it.uuid, it.tableName, it.confidence, it.face_img_url, it.idCard, it.alarmRet, + it.enabled}; //cout << __FUNCTION__ << " -> " << __LINE__ << " -> scroe" << it.confidence << endl; t_topResult.push_back(t_CR); } while (topResult.size() > maxSearchFaces) t_topResult.pop_back(); - t_rwl.unlock(); - return true; -} - -bool FaceDBCompareServer::compare(std::thread::id key, AlarmData *alarmData) { - if (m_dbRWLocks.find(key) == m_dbRWLocks.end()) { - m_dbRWLocks[key] = RWLock(); - } - RWLock &t_rwl = m_dbRWLocks[key]; -// ClockTimer clockTimer("compare "); - t_rwl.wrlock(); - RWLock t_rwLock; - mapFaceResults t_compareResults; - m_rwLock.rdlock(); - parallelFor(ParallelForThreardSize::CPU_Number, [&](string &key, FeatureData &data) { - double sc = 0; - for (auto &t_fea : data.features) { - double t_sc = m_casiaFaceWapper.compareFeature(alarmData->feature, t_fea); - if (t_sc > sc)sc = t_sc; - } - FaceResult tface{data.face_id, data.uuid, alarmData->tableName, sc, data.faceUrl, data.idcard, ""}; -// FaceResult tface{0, data.uuid, alarmData->tableName, sc, data.faceUrl,false}; - t_rwLock.wrlock(); - if (sc < alarmData->threshold) { - t_rwLock.unlock(); - DBG("return"); - return; - } - if (t_compareResults.size() > alarmData->num) { - t_compareResults.erase((--t_compareResults.end()), t_compareResults.end()); - } - t_compareResults.insert(make_pair(tface.confidence, tface)); - t_rwLock.unlock(); - }); - m_rwLock.unlock(); - int maxSearchFaces = alarmData->num; - auto &t_topResult = topResult[key]; - t_topResult.clear(); - for (auto &item : t_compareResults) { - auto &it = item.second; - FaceResult t_CR{it.id, it.uuid, it.tableName, it.confidence, it.face_img_url, it.idCard, it.alarmRet}; -// FaceResult t_CR{it.id, it.uuid, it.tableName, it.confidence, it.face_img_url, ""}; - t_topResult.push_back(t_CR); - } -// while (t_topResult.size() > maxSearchFaces) -// t_topResult.pop_back(); +// 鑾峰彇缁撴灉鍚庨噴鏀� +// t_rwl.unlock(); return true; } @@ -191,46 +125,62 @@ m_rwLock.wrlock(); if (t_json["\"syncTpye\""].type() == Json::nullValue) { +// 鍚屾搴�/鐗瑰緛鏄痓ase64 +// #todo sqlite search data from file auto str_tab = t_json["\"tableName\""].asString(); m_tableName = str_tab.substr(1, str_tab.length() - 2);//.append("_fea"); - string tet = "./syncDBClient "; - string str_json = writer.write(t_json); - tet.append("\"" + str_json.substr(0, str_json.length() - 1) + "\" "); - INFO(tet); - system(tet.c_str()); + + +// string tet = "./syncDBClient "; +// string str_json = writer.write(t_json); +// tet.append("\"" + str_json.substr(0, str_json.length() - 1) + "\" "); +// INFO(tet); +// system(tet.c_str()); dataMap.clear(); try { // init - BISTL::BiMapFeaData biMapFeaData(m_tableName); - auto mymap = biMapFeaData.getMap(); - auto size = mymap->size(); - //#todo - for (auto it = mymap->begin(); it != mymap->end(); it++) { - string str_uuid(it->second.m_id.data()); - string ft(it->second.m_feature.data()); - string imgUrl(it->second.m_imgUrl.data()); - string strIdCard(it->second.m_idcard.data()); +// BISTL::BiMapFeaData biMapFeaData(m_tableName); +// auto mymap = biMapFeaData.getMap(); + + auto mymap = m_erlangDbTool->loadFaceFeaData(m_tableName); + for (auto &item : mymap) { + auto &it = item.second; string str2; - str2 = base64.Decode(ft.data(), ft.length()); + str2 = base64.Decode(it.feature.data(), it.feature.size()); std::vector<unsigned char> t_fea; t_fea.resize(str2.size()); memcpy(t_fea.data(), str2.data(), str2.size()); - auto &test = dataMap[str_uuid]; - test.uuid = str_uuid; + auto &test = dataMap[it.id]; + test.uuid = it.id; test.features.push_back(t_fea); - test.faceUrl = imgUrl; - test.idcard = strIdCard; + test.faceUrl = it.img; + test.idcard = it.idcard; } +// //#todo +// for (auto it = mymap->begin(); it != mymap->end(); it++) { +// string str_uuid(it->second.m_id.data()); +// string ft(it->second.m_feature.data()); +// string imgUrl(it->second.m_imgUrl.data()); +// string strIdCard(it->second.m_idcard.data()); +// string str2; +// str2 = base64.Decode(ft.data(), ft.length()); +// std::vector<unsigned char> t_fea; +// t_fea.resize(str2.size()); +// memcpy(t_fea.data(), str2.data(), str2.size()); +// auto &test = dataMap[str_uuid]; +// test.uuid = str_uuid; +// test.features.push_back(t_fea); +// test.faceUrl = imgUrl; +// test.idcard = strIdCard; +// } } catch (const std::exception &e) { printf("Exception:%s\n", e.what()); - BISTL::shared_memory_object::remove(m_tableName.c_str()); +// BISTL::shared_memory_object::remove(m_tableName.c_str()); } - BISTL::shared_memory_object::remove(m_tableName.c_str()); - appPref.setIntData(m_tableName, 1); - DBG(m_tableName << " size is " << dataMap.size()); +// BISTL::shared_memory_object::remove(m_tableName.c_str()); } else { - //#todo get sqlite3 data +// 鏈湴搴�/鐗瑰緛鏄痓lob m_tableName = t_json["tableName"].asCString(); auto t_res = m_sqliteFaceEncap->getFacesFromTable(m_tableName); auto t_faceInfoCache = m_sqliteFaceEncap->getFaceInfoFromTable(m_tableName); @@ -249,10 +199,12 @@ test.features.push_back(t_fea); test.faceUrl = t_sen.faceurl; test.idcard = t_faceInfoCache[t_sen.uuid].idCard; + test.enabled = t_sen.enable; } - appPref.setIntData(m_tableName, 1); - DBG(m_tableName << " size is " << dataMap.size()); } +// 鍛婅瘔鍒锋柊鍑芥暟锛屽綋鍓嶅簳搴撶殑鏁版嵁鍑嗗瀹屾垚 + appPref.setIntData(m_tableName, 1); + DBG(m_tableName << " size is " << dataMap.size()); m_rwLock.unlock(); } else { ERR("json format error :: " << str_config); -- Gitblit v1.8.0