QiaoJiaSystem/DataManagerServer/http_configserver.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
QiaoJiaSystem/DataManagerServer/http_configserver.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
QiaoJiaSystem/FaceDetectServer/FaceDetectServerI.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
QiaoJiaSystem/FaceSearchServer/FaceFeatureSearchServerI.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
QiaoJiaSystem/FaceSearchServer/FaceFeatureSearchServerI.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
QiaoJiaSystem/VptServer/VptDetectWrapper.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
QiaoJiaSystem/DataManagerServer/http_configserver.cpp
@@ -2140,9 +2140,12 @@ // auto resType = erlangDbTool->findAllTypeInfo(); string json = "["; for (auto &item : resDB) { //-------------------maybe delete ?------------------------ if (item.second.tableName.find("lt_") == 0) { continue; } //-------------------maybe delete end---------------------- string subJson = "{ "; subJson.append("\"uuid\":\"" + item.second.uuid + "\","); subJson.append("\"tableName\":\"" + item.second.tableName + "\","); @@ -3334,8 +3337,7 @@ rule.strLine = value["strLine"].asCString(); rule.strExLine = value["strExLine"].asCString(); if(!value["strPerimeterObjType"].empty()) { if (!value["strPerimeterObjType"].empty()) { rule.strPerimeterObjType = value["strPerimeterObjType"].asCString(); } if (rule.strCamId.isEmpty()) { QiaoJiaSystem/DataManagerServer/http_configserver.h
@@ -121,7 +121,7 @@ std::string createDatabase(std::string ip, unsigned int port, std::string content, PResponse &response); /** * 删除数据地库 * 删除数据 底库 * @param ip * @param port * @param content @@ -130,23 +130,97 @@ */ std::string deleteDatabase(std::string ip, unsigned int port, std::string content, PResponse &response); /*** * 更新数据 底库 * @param ip * @param port * @param content * @param response * @return */ std::string updateDatabase(std::string ip, unsigned int port, std::string content, PResponse &response); /** * 查询所有同步库 * @param ip * @param port * @param content * @param response * @return */ std::string findAllDatabase(std::string ip, unsigned int port, std::string content, PResponse &response); /** * 查询所有本地库 * @param ip * @param port * @param content * @param response * @return */ std::string findLocalDatabase(std::string ip, unsigned int port, std::string content, PResponse &response); /*** * 上传人员 * @param ip * @param port * @param content * @param response * @return */ std::string addPerson(std::string ip, unsigned int port, std::string content, PResponse &response); //#todo 批量添加人员借口 /*** * 向同步库批量添加人员及更新人员 * feature_addPersonTracking 分支中更新功能分离为新借口 * @param ip * @param port * @param content * @param response * @return */ std::string addPersons(std::string ip, unsigned int port, std::string content, PResponse &response); /*** * 判断同步库中人员是否存在 * @param ip * @param port * @param content * @param response * @return */ std::string personIsExists(std::string ip, unsigned int port, std::string content, PResponse &response); /** * 更新同步库中的人员 * @param ip * @param port * @param content * @param response * @return */ std::string updatePersonByOldId(std::string ip, unsigned int port, std::string content, PResponse &response); /** * 删除人员 * @param ip * @param port * @param content * @param response * @return */ std::string delPerson(std::string ip, unsigned int port, std::string content, PResponse &response); /** * 加载特征 * @param ip * @param port * @param content * @param response * @return */ std::string loadFaceFeaData(std::string ip, unsigned int port, std::string content, PResponse &response); QiaoJiaSystem/FaceDetectServer/FaceDetectServerI.h
@@ -10,6 +10,10 @@ ~FaceDetectServerI(); // FaceDetectServer interface public: /** * 人脸检测 * @return */ virtual FaceDetect::Faces faceDetect(Ice::Int, Ice::Int, const std::string &, const Ice::Current &) override; private: @@ -19,6 +23,10 @@ // FaceDetectServer interface public: /** * 人脸二次属性提取 * @return */ virtual FaceDetect::ThftResult faceProperty(Ice::Int, Ice::Int, const FaceDetect::FacePos &, const std::string &, const Ice::Current &) override; private: QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.cpp
@@ -62,6 +62,7 @@ DBG("m_dbRWLocks ok"); m_dbRWLocks_Lock.unlock(); // ClockTimer clockTimer("compare "); //保护 t_compareResults RWLock t_rwLock; m_rwLock.rdlock(); @@ -80,12 +81,15 @@ 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 // 只保留最高的n个对比结果 if (t_compareResults.size() > topN) { t_compareResults.erase((--t_compareResults.end()), t_compareResults.end()); } @@ -123,6 +127,7 @@ auto &t_topResult = topResult[key]; DBG("topResult[key] ok"); t_topResult.clear(); // 对比结果转换 for (auto &item : t_compareResults) { auto &it = item.second; //#todo @@ -203,16 +208,8 @@ m_tableName = str_tab.substr(1, str_tab.length() - 2);//.append("_fea"); DBG("m_tableName is " << m_tableName); // 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 mymap = m_erlangDbTool->loadFaceFeaData(m_tableName); DBG(m_tableName << " db size is " << mymap.size()); @@ -231,29 +228,10 @@ test.enabled = it.enable; test.monLevel = it.monLevel; } // //#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()); } appPref.setIntData(m_tableName, 1); // BISTL::shared_memory_object::remove(m_tableName.c_str()); } else { //#todo get sqlite3 data m_tableName = t_json["tableName"].asCString(); QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.h
@@ -21,19 +21,35 @@ public: FaceDBCompareServer(); /** * 本地库构造 */ FaceDBCompareServer(SqliteFaceEncap *); /*** * 同步库构造 */ FaceDBCompareServer(ErlangTool::ErlangDbTool *); ~FaceDBCompareServer(); virtual bool compare(std::thread::id key, AlarmData *alarmData, int topN); /*** * @deprecated * @param key * @param alarmData * @return */ bool compare(std::thread::id key, AlarmData *alarmData); FaceResults getTopResult(std::thread::id key); private: /** * 加载特征 * @param str_config */ virtual void loadDBData(std::string str_config); protected: @@ -41,10 +57,14 @@ std::string m_tableName; int fea_size; // 保护父类的dataMap RWLock m_rwLock; std::mutex topResultMtx; std::map<std::thread::id, FaceResults> topResult; // 保护m_dbRWLocks RWLock m_dbRWLocks_Lock; // 保护 topResult std::map<std::thread::id, RWLock> m_dbRWLocks; ErlangTool::ErlangDbTool *m_erlangDbTool; @@ -54,8 +74,9 @@ static bool getRet(std::string startTime, std::string endTime) { auto crrentTime = AppUtil::getTimeSecString(); if (crrentTime.compare(startTime) > 0 && (crrentTime.compare(endTime) < 0 || endTime == "0000-00-00 00:00:00")) { // 根据当前时间是否在设置的时间内或永久生效 if (crrentTime.compare(startTime) > 0 && (crrentTime.compare(endTime) < 0 || endTime == "0000-00-00 00:00:00")) { return true; } return false; QiaoJiaSystem/FaceSearchServer/FaceFeatureSearchServerI.cpp
@@ -123,14 +123,25 @@ } //#todo 优化 /** * * @param feature 需要对比的特征 * @param info_json 需要插入数据库的json字段 * @param topN 获取前几位 * @param score 对比的阈值 * @return */ ::FaceSearch::FaceResults FaceFeatureSearchServerI::faceSearchTopN(const ::FaceSearch::Data &feature, const ::std::string &info_json, ::Ice::Int topN, ::Ice::Float score, const ::Ice::Current &) { ClockTimer clockTimer("faceSearchTopN " + to_string(score) + " :"); INFO("faceSearchTopN start"); // 获取当前线程id thread::id key = std::this_thread::get_id(); ::FaceSearch::FaceResults results; FaceResults t_TableCompareResult; // 进行对比的数据结构 AlarmData featureData; featureData.num = topN; featureData.feature.resize(feature.size()); @@ -142,14 +153,19 @@ if (reader.parse(info_json, value)) { //#todo m_rwLock.rdlock(); // 特征转化为base64存入到json中 std::string feature_base64; feature_base64 = base64.Encode(feature.data(), feature.size()); value["FaceFeature"] = feature_base64; //--------------------------- DBG("auto &it : m_faceFCMAP start " << m_faceFCMAP.size()); //#todo lock // 遍历不同的底库进行比对 for (auto &it : m_faceFCMAP) { auto &t_FaceFC = it.second; auto t_tableInfo = m_tableType[it.first]; // 获取底库的报警状态 bool ret = getRet(t_tableInfo.startTime, t_tableInfo.endTime); if (ret) { string t_alarmRet = t_tableInfo.bwType; @@ -157,10 +173,12 @@ //#todo 非同步库是否需要比较? DBG("m_faceFCMAP compare start " << it.first); // 对比 t_FaceFC->compare(key, &featureData, topN); DBG("m_faceFCMAP compare end " << it.first); // 根据当前线程id获取对比结果 auto t_results = t_FaceFC->getTopResult(key); // 对比结果转换 for (auto &t_item : t_results) { t_item.tableName = it.first; t_item.alarmRet = t_alarmRet; @@ -176,6 +194,7 @@ DBG("t_TableCompareResult size" << t_TableCompareResult.size()); //sort_all_results // 排序 for (auto itor = t_TableCompareResult.begin(); itor != t_TableCompareResult.end(); ++itor) { float new_confidence = itor->confidence; auto rtTR = results.rbegin(); @@ -194,6 +213,7 @@ ERR("topResult is null"); } auto itTR(rtTR.base()); // 数据转化 ::FaceSearch::FaceResult t_faceCR; t_faceCR.id = itor->id; t_faceCR.uuid = itor->uuid; @@ -208,9 +228,10 @@ results.insert(itTR, t_faceCR); } bool retface = true; // cout << __FUNCTION__ << " -> " << __LINE__ << " -> " << results.size() << endl; //#todo send message if (results.size() > 0) { // 根据传入的对比阈值做筛选 // 本分支只保存了第一个对比结果 for (auto &item : results) { //#todo 得分比较,应该在compare中进行 if (item.confidence < score) { @@ -226,15 +247,6 @@ break; } value["personId"] = item.uuid.size() > 0 ? item.uuid : "";//关联底库人员id,人脸id // string tmp_tableName = item.tableName; // if (tmp_tableName.find("lt_") == 0) { // tmp_tableName = tmp_tableName.insert(tmp_tableName.find("lt_") + 3, "::"); // value["BaseName"] = tmp_tableName;//关联底库表名 // } else { // value["BaseName"] = item.tableName.size() > 0 ? item.tableName : "";//关联底库表名 // } value["BaseName"] = item.tableName.size() > 0 ? item.tableName : "";//关联底库表名 value["likePer"] = item.confidence > 0 ? item.confidence : 0.0; @@ -244,10 +256,8 @@ value["personIsHub"] = item.alarmRet.size() > 0 ? item.alarmRet : "4"; auto str_uuid = value["Id"].asString(); // DBG(value.toStyledString()); cout << __FUNCTION__ << " -> " << __LINE__ << " -> " << "value.toStyledString() " << value.toStyledString() << "\n score " << score << endl; DBG("value.toStyledString() " << value.toStyledString() << "\n score " << score); // DBG("score " << score); retface = pManagerEsDB.insertData("videopersons", "perVideoPicture", value.toStyledString(), str_uuid); @@ -258,37 +268,35 @@ value["personIsHub"] = "4"; value["likePer"] = 0.0; DBG(value.toStyledString()); // cout << __FUNCTION__ << " -> " << __LINE__ << " -> " << "value.toStyledString() " // << value.toStyledString() << endl; retface = pManagerEsDB.insertData("videopersons", "perVideoPicture", value.toStyledString(), str_uuid); } if (!retface) { ERR("insert error"); } else { cout << __FUNCTION__ << " -> " << __LINE__ << " -> " << "retface " << retface << endl; ERR("retface " << retface); }; } else { ERR("json is error" << info_json); } // for (auto &item : t_tables) { // DBG(item); // } return results; } bool FaceFeatureSearchServerI::loadFeatureData(FaceFeatureSearchServerI *faceFea) { // 加载底库数据 ErlangTool::map_TabDataCache dataBaseCache = faceFea->m_erlangDbTool.findAllDatabase(); if (dataBaseCache.size() < 0 && faceFea->m_retUpdatePthread) { // 这里进不来吧? faceFea->m_retUpdatePthread = false; //控制下方线程只启动一次 std::thread thd(dataUpdate, faceFea); thd.detach(); } // 获取表信息 auto typeInfoCache = faceFea->m_erlangDbTool.findAllTypeInfo(); //清除旧数据 faceFea->m_tableType.clear(); string str_config = faceFea->m_erlangDbTool.getConfigJsonString(); @@ -368,6 +376,7 @@ faceFea->m_inTime = getTimeLong(); if (faceFea->m_retUpdatePthread) { faceFea->m_retUpdatePthread = false; //控制下方线程只启动一次 std::thread thd(dataUpdate, faceFea); // faceFea->m_erlangDbTool.test(faceFea, erlangCallBackFunc); @@ -418,6 +427,10 @@ // pthread_mutex_unlock(&(func_cond_mutex)); //} /** * 等待底库加载完成,并等待信号触发新的数据刷新 * @param faceFea */ void FaceFeatureSearchServerI::dataUpdate(FaceFeatureSearchServerI *faceFea) { long inTime = faceFea->m_inTime; // modify all db ready start update, <10s QiaoJiaSystem/FaceSearchServer/FaceFeatureSearchServerI.h
@@ -24,6 +24,8 @@ //}; static bool t_live_ret = true; //全局的信号量,如果数据刷新延迟过高可以改为使用nsq消息队列。 static pthread_cond_t func_cond(PTHREAD_COND_INITIALIZER); static pthread_mutex_t func_cond_mutex(PTHREAD_MUTEX_INITIALIZER); @@ -39,44 +41,71 @@ virtual ~FaceFeatureSearchServerI(); public: /** * @deprecated * @return */ virtual ::FaceSearch::FaceResults faceSearchMax(const ::FaceSearch::Data &, const ::std::string &, const ::Ice::Current & = ::Ice::emptyCurrent); /*** * 对比获取第n大的人员 * @return */ virtual ::FaceSearch::FaceResults faceSearchTopN(const ::FaceSearch::Data &, const ::std::string &, ::Ice::Int, ::Ice::Float, const ::Ice::Current & = ::Ice::emptyCurrent); private: /** * @deprecated * @param nodeName * @param cookie * @return */ bool initErlang(std::string nodeName, std::string cookie); //#todo delete cache //#todo loadData /** * 加载人脸属性 * @param faceFea * @return */ static bool loadFeatureData(FaceFeatureSearchServerI *faceFea); /** * 数据更新线程,有信号触发才会更新 * @param faceFea */ static void dataUpdate(FaceFeatureSearchServerI *faceFea); /*** * 等待底库表加载成功 * @param faceFea * @param loop */ static void waitTables(FaceFeatureSearchServerI *faceFea, int loop = -1); // void erlangCallBackFunc(std::string); private: long m_inTime; // 特征对比类 std::map<std::string, FaceDBCompareServer *> m_faceFCMAP; // 底库类型,生效时间等 std::map<std::string, TableInfo> m_tableType; // 对 m_faceFCMAP 加读写锁 // 当对比时,数据刷新会等待 RWLock m_rwLock; ErlangTool::ErlangDbTool m_erlangDbTool; SqliteFaceEncap m_sqliteFaceEncap; std::mutex m_mutex; bool m_retUpdatePthread; Base64 base64; // Ice::ObjectPrx base_FaceMemoryData; // IceRpcClient<::FaceSearch::FaceMemoryDataPrx> m_faceMemoryClient; // ::FaceSearch::FaceMemoryDataPrx serverFaceMemoryData; // func_cond_mutex(PTHREAD_MUTEX_INITIALIZER), func_cond(PTHREAD_COND_INITIALIZER) EsDBTool pManagerEsDB;//(appPref.getStringData("ipAdd"), appPref.getIntData("ipPort")); }; QiaoJiaSystem/VptServer/VptDetectWrapper.cpp
@@ -215,5 +215,6 @@ break; } return vptDetectResults; } }