pansen
2019-01-26 1621a97f2bf85b53d40ae98fbc15b99239e1535f
人脸对比优化
25个文件已修改
369 ■■■■■ 已修改文件
QiaoJiaSystem/EncodeServer/CMakeLists.txt 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/FaceSearchServer/AlarmServer.hpp 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/FaceSearchServer/CMakeLists.txt 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/FaceSearchServer/CasiaFaceWrapper/FaceData.hpp 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.cpp 194 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.h 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/FaceSearchServer/FaceFeatureSearchServerI.cpp 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/LocalDBTool/SqliteFaceEncap.cpp 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/LocalDBTool/SqliteToolkit.hpp 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/build/DataWebServer 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/build/EncodeServer 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/build/FaceDetectResourcesTest 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/build/FaceDetectServer 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/build/FaceExtractServer 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/build/FaceSearchServer 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/build/RapidStructureApp 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/build/RapidStructureAppRtsp 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/build/RecordVideo 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/build/StructureApp 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/build/VideoAnalysFromHC 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/build/YoloDetectClientTest 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/build/YoloServer 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/build/syncDBClient 补丁 | 查看 | 原始文档 | blame | 历史
syncDBTool/ErlangDbTool.cpp 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
syncDBTool/SyncDB.hpp 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/EncodeServer/CMakeLists.txt
@@ -56,12 +56,10 @@
    ../../../BasicPlatForm/basic/pipe/
    ../../../BasicPlatForm/libs/opencv/include
    ../../../BasicPlatForm/libs/ffmpeg/include
    ../../../BasicPlatForm/libs/jsoncpp/include
    /usr/include/x86_64-linux-gnu/qt5
@@ -77,22 +75,23 @@
    ../../../BasicPlatForm/libs/openssl/lib
    ../../../BasicPlatForm/libs/opencv/lib
    ../../../BasicPlatForm/libs/ffmpeg/lib
#    ../../../BasicPlatForm/libs/jsoncpp/lib
    #    ../../../BasicPlatForm/libs/jsoncpp/lib
#    ../../../BasicPlatForm/libs/libuuid/lib
    #    ../../../BasicPlatForm/libs/libuuid/lib
    ../../BasicPlatForm/libs/hiredis-master/lib
)
add_executable(${PROJECT_NAME}
      ../../../BasicPlatForm/basic/pipe_element/ffmpeg/VideoChangeScore.cpp
       ../../../BasicPlatForm/basic/pipe_element/ffmpeg/FfmpegElement.cpp
       ../StructureApp/NewRecordVideoElement.cpp
       EncodeVideoManager.cpp
       EncodeVideo.cpp
       ../StructureApp/HiredisTool.cpp
       main.cpp
    ../../../BasicPlatForm/basic/timer_counter/Clocktimer.cpp
    ../../../BasicPlatForm/basic/pipe_element/ffmpeg/VideoChangeScore.cpp
    ../../../BasicPlatForm/basic/pipe_element/ffmpeg/FfmpegElement.cpp
    ../StructureApp/NewRecordVideoElement.cpp
    EncodeVideoManager.cpp
    EncodeVideo.cpp
    ../StructureApp/HiredisTool.cpp
    main.cpp
    )
target_link_libraries(${PROJECT_NAME}
    ${LIBS}
QiaoJiaSystem/FaceSearchServer/AlarmServer.hpp
@@ -27,6 +27,7 @@
    std::vector<std::vector<unsigned char>> features;
    std::string faceUrl;
    std::string idcard;
    std::string enabled;
};
static std::vector<std::string> AlarmServerPropertyAnalyseByComma(std::string str_list) {
@@ -100,7 +101,7 @@
    //m_dbReady is false return,true go on
    //use parallelFor
    virtual bool compare(std::thread::id key, AlarmData *, int topN) = 0;
    virtual bool compare(std::thread::id key, AlarmData *, int topN, float score) = 0;
private:
    //init data,this is thread body
QiaoJiaSystem/FaceSearchServer/CMakeLists.txt
@@ -89,7 +89,6 @@
add_executable(${PROJECT_NAME}
    main.cpp
    rpc/FaceSearchServer.cpp
    FaceSearchServerResources.cpp
    FaceFeatureSearchServerI.cpp
    FaceFeatureSearchServerI.h
    CasiaFaceWrapper/CasiaFaceWrapperN.cpp
@@ -107,15 +106,13 @@
    ../../../BasicPlatForm/basic/timer_counter/Clocktimer.cpp
    #todo file path error
    ../LocalDBTool/SqliteFaceEncap.cpp
    ../../../BasicPlatForm/basic/db/sqlite/sqliteEncapsulation.cpp
    ../../../BasicPlatForm/basic/db/sqlite/sqliteEncapsulation.h
    #    ../../BasicPlatForm/basic/util/ShareMemory/SemTool.cpp
    ../../syncDBTool/ErlangDbTool.cpp
    #    ../../../Erlang/syncDBTool/ShareMemoryTool.hpp
    #    ../../../Erlang/syncDBTool/SyncDB.hpp
    )
target_link_libraries(${PROJECT_NAME}
QiaoJiaSystem/FaceSearchServer/CasiaFaceWrapper/FaceData.hpp
@@ -32,6 +32,7 @@
    std::string face_img_url;
    std::string idCard;
    std::string alarmRet;
    std::string enabled;
};
struct DbAction {
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) {
//            同步库/特征是base64
//            #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
//            本地库/特征是blob
            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);
QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.h
@@ -27,9 +27,7 @@
    ~FaceDBCompareServer();
    virtual bool compare(std::thread::id key, AlarmData *alarmData, int topN);
    bool compare(std::thread::id key, AlarmData *alarmData);
    virtual bool compare(std::thread::id key, AlarmData *alarmData, int topN, float score = 0.0);
    FaceResults getTopResult(std::thread::id key);
@@ -41,6 +39,7 @@
    std::string m_tableName;
    int fea_size;
//    锁数据刷新
    RWLock m_rwLock;
    std::mutex topResultMtx;
    std::map<std::thread::id, FaceResults> topResult;
QiaoJiaSystem/FaceSearchServer/FaceFeatureSearchServerI.cpp
@@ -55,69 +55,13 @@
    t_live_ret = false;
}
//#todo 优化
/***
 * @dep
 */
::FaceSearch::FaceResults
FaceFeatureSearchServerI::faceSearchMax(const ::FaceSearch::Data &feature, const ::std::string &info_json,
                                        const ::Ice::Current &) {
    thread::id key = std::this_thread::get_id();
    ClockTimer clockTimer("faceSearchMax");
    ::FaceSearch::FaceResults results;
    FaceResults t_TableCompareResult;
    AlarmData featureData;
    featureData.num = 1;
    featureData.feature.resize(feature.size());
    memcpy(featureData.feature.data(), feature.data(), feature.size());
    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) {
            bool alarmRet = atoi(t_tableInfo.bwType.c_str());
            //#todo 非同步库是否需要比较?
            t_FaceFC->compare(key, &featureData, 1);
            auto t_results = t_FaceFC->getTopResult(key);
            for (auto &t_item : t_results) {
                t_item.tableName = it.first;
                //#todo baojing zhuangtai ?
                t_item.alarmRet = ret;
                t_TableCompareResult.push_back(t_item);
            }
        }
    }
//    DBG("t_TableCompareResult size" << t_TableCompareResult.size());
    for (auto itor = t_TableCompareResult.begin(); itor != t_TableCompareResult.end(); ++itor) {
        float new_confidence = itor->confidence;
        auto rtTR = results.rbegin();
        if (!results.empty()) {
            auto temp = rtTR->confidence;
            while (new_confidence > temp) {
                ++rtTR;
                if (rtTR == (results.rend() + 1)) {
                    rtTR--;
                    break;
                } else {
//                    DBG(" sc is "<< new_confidence << "  > " << temp);
                }
                temp = rtTR->confidence;
            }
        } else {
//            INFO("topResult is null");
        }
        auto itTR(rtTR.base());
        ::FaceSearch::FaceResult t_faceCR;
        t_faceCR.id = itor->id;
        t_faceCR.uuid = itor->uuid;
        t_faceCR.tableName = itor->tableName;
        t_faceCR.confidence = itor->confidence;
        DBG("compare results tablename is " << t_faceCR.tableName << " id is " << t_faceCR.uuid << " sc is"
                                            << t_faceCR.confidence);
        results.insert(itTR, t_faceCR);
    }
    //#todo send message
    return results;
    return ::FaceSearch::FaceResults();
}
//#todo 优化
@@ -126,9 +70,13 @@
                                         ::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());
@@ -140,40 +88,49 @@
    if (reader.parse(info_json, value)) {
        //#todo
        m_rwLock.rdlock();
        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
//        遍历不同的底库类#TODO是否要做一次大范围对比然后给出结果再筛选?
        for (auto &it : m_faceFCMAP) {
            auto &t_FaceFC = it.second;
//            表的信息#TODO待移出和业务解耦
            auto t_tableInfo = m_tableType[it.first];
            bool ret = getRet(t_tableInfo.startTime, t_tableInfo.endTime);
//            判断表的生效状态,决定是否进行对比/时间和启用状态
            bool ret = (t_tableInfo.enabled == "1" && getRet(t_tableInfo.startTime, t_tableInfo.endTime));
            if (ret) {
//                需要对比
//                表的类型/黑白名单
                string t_alarmRet = t_tableInfo.bwType;
//                bool alarmRet = atoi(t_tableInfo.bwType.c_str());
                //#todo 非同步库是否需要比较?
                DBG("m_faceFCMAP compare start " << it.first);
//                对比函数
                t_FaceFC->compare(key, &featureData, topN);
                DBG("m_faceFCMAP compare end " << it.first);
//                获取对比结果
                auto t_results = t_FaceFC->getTopResult(key);
//                遍历结果并添加补充字段
                for (auto &t_item : t_results) {
                    t_item.tableName = it.first;
                    t_item.alarmRet = t_alarmRet;
//                    放入本次任务的对比缓存
                    t_TableCompareResult.push_back(t_item);
//                    DBG("t_results item : uuid is " << t_item.uuid << " confidence " << t_item.confidence << it.first);
                }
            } else {
//                不需要对比
                INFO("m_faceFCMAP ret is false " << it.first);
            }
        }
        m_rwLock.unlock();
        DBG("auto &it : m_faceFCMAP end");
//        本次任务的对比结果数量
        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();
@@ -206,19 +163,27 @@
            results.insert(itTR, t_faceCR);
        }
        bool retface = true;
//        cout << __FUNCTION__ << " -> " << __LINE__ << " ->  " << results.size() << endl;
        //#todo send message
//        拼接需要发送的消息
//        特征编码为base64用于上传,#todo 拆解到外面去做
        std::string feature_base64;
        feature_base64 = base64.Encode(feature.data(), feature.size());
        if (results.size() > 0) {
//            找到相似人 可能对比分数不满足条件
//            #TODO多条对比结果拼接成一个标签
            for (auto &item : results) {
                //#todo 得分比较,应该在compare中进行
//                小于指定的阈值则认为没有找到是陌生人
                if (item.confidence < score) {
                    //#todo test
                    auto str_uuid = value["Id"].asString();
                    value["personIsHub"] = "4";
                    value["likePer"] = 0.0;
//                    DBG(value.toStyledString());
                    cout << __FUNCTION__ << " -> " << __LINE__ << " ->  " << "value.toStyledString()  "
                         << value.toStyledString() << endl;
                    DBG("value.toStyledString()  " << value.toStyledString());
                    value["FaceFeature"] = feature_base64;
                    retface = pManagerEsDB.insertData("videopersons", "perVideoPicture", value.toStyledString(),
                                                      str_uuid);
                    break;
@@ -239,14 +204,16 @@
                value["personPicUrl"] = item.imgUrl.size() > 0 ? item.imgUrl : "";//diku tupian
                value["idcard"] = item.idcard.size() > 0 ? item.idcard : "";//diku tupian
                //如果 alarmRet 不为空把 他的值 放入 personIsHub,否则为4
//                #TODO 如果启用则正常判断,未布控则认为是未知?
//                if () {
//
//                }
                value["personIsHub"] = item.alarmRet.size() > 0 ? item.alarmRet : "4";
                auto str_uuid = value["Id"].asString();
//                DBG(value.toStyledString());
                DBG("value.toStyledString()  " << value.toStyledString());
                value["FaceFeature"] = feature_base64;
                cout << __FUNCTION__ << " -> " << __LINE__ << " ->  " << "value.toStyledString()  "
                     << value.toStyledString() << "\n score   " << score << endl;
//                DBG("score  " << score);
                retface = pManagerEsDB.insertData("videopersons", "perVideoPicture", value.toStyledString(),
                                                  str_uuid);
                break;
@@ -256,6 +223,7 @@
            value["personIsHub"] = "4";
            value["likePer"] = 0.0;
            DBG(value.toStyledString());
            value["FaceFeature"] = feature_base64;
//            cout << __FUNCTION__ << " -> " << __LINE__ << " ->  " << "value.toStyledString()  "
//                 << value.toStyledString() << endl;
            retface = pManagerEsDB.insertData("videopersons", "perVideoPicture", value.toStyledString(),
@@ -269,13 +237,6 @@
    } else {
        ERR("json is error" << info_json);
    }
//    for (auto &item : t_tables) {
//        DBG(item);
//    }
    return results;
}
QiaoJiaSystem/LocalDBTool/SqliteFaceEncap.cpp
@@ -346,6 +346,7 @@
                memcpy(t_feas.faceFeature.data(), t_fea.data(), t_fea.size());
//            string create_time = query.value(2).toString().toStdString();
                t_feas.faceurl = query.value(3).toString().toStdString();
                t_feas.enable = query.value(5).toString().toStdString();
            }
        }
    }
@@ -380,7 +381,7 @@
            tableInfo.cmpThreshold = query.value(7).toString().toStdString();
            tableInfo.enabled = query.value(8).toString().toStdString();
            tableInfo.createBy = query.value(9).toString().toStdString();
            tableInfos.push_back(tableInfo);
        }
    }
QiaoJiaSystem/LocalDBTool/SqliteToolkit.hpp
@@ -65,6 +65,7 @@
    std::string uuid;
    std::string faceurl;
    FaceFeature faceFeature;
    std::string enable;
};
typedef std::map<std::string, FaceFeatureWithUrl> FeatureDBWithUrlCache;
@@ -86,7 +87,7 @@
    //
    std::string getFacesFromTableSql(std::string tableName) {
        std::string sql =
            "select uuid,feature,create_time,faceUrl,del_flag from '" + tableName +
            "select uuid,feature,create_time,faceUrl,del_flag,enabled from '" + tableName +
            "_fea' where feature is not null ";
        return sql;
    }
QiaoJiaSystem/build/DataWebServer
Binary files differ
QiaoJiaSystem/build/EncodeServer
Binary files differ
QiaoJiaSystem/build/FaceDetectResourcesTest
Binary files differ
QiaoJiaSystem/build/FaceDetectServer
Binary files differ
QiaoJiaSystem/build/FaceExtractServer
Binary files differ
QiaoJiaSystem/build/FaceSearchServer
Binary files differ
QiaoJiaSystem/build/RapidStructureApp
Binary files differ
QiaoJiaSystem/build/RapidStructureAppRtsp
Binary files differ
QiaoJiaSystem/build/RecordVideo
Binary files differ
QiaoJiaSystem/build/StructureApp
Binary files differ
QiaoJiaSystem/build/VideoAnalysFromHC
Binary files differ
QiaoJiaSystem/build/YoloDetectClientTest
Binary files differ
QiaoJiaSystem/build/YoloServer
Binary files differ
QiaoJiaSystem/build/syncDBClient
Binary files differ
syncDBTool/ErlangDbTool.cpp
@@ -1592,7 +1592,7 @@
    }
    if (str_tableUuid.size() > 0) {
        QString sql = QString::fromStdString(
            "Select a.uuid as id ,a.faceUrl as img,a.feature,b.idCard as idcard from '" + str_tableUuid +
            "Select a.uuid as id ,a.faceUrl as img,a.feature,b.idCard as idcard,a.enable from '" + str_tableUuid +
            "_fea' as a ,'" + str_tableUuid + "' as b  where a.uuid = b.uuid and ( a.del_flag=0 AND b.del_flag=0);");
        QSqlQuery query(g_syncDbFile);
        query.prepare(sql);
@@ -1605,6 +1605,7 @@
                t_feature_info.img = query.value(1).toString().toStdString();
                t_feature_info.feature = query.value(2).toString().toStdString();
                t_feature_info.idcard = query.value(3).toString().toStdString();
                t_feature_info.enable = query.value(4).toString().toStdString();
                dataCache.insert(std::make_pair(t_feature_info.id, t_feature_info));
            }
@@ -1630,7 +1631,7 @@
    }
    if (str_tableUuid.size() > 0) {
        QString sql = QString::fromStdString(
            "Select b.uuid as id,b.faceUrl as img,a.idCard as idcard from '" + str_tableUuid + "' as a, '" +
            "Select b.uuid as id,b.faceUrl as img,a.idCard as idcard,a.enable from '" + str_tableUuid + "' as a, '" +
            str_tableUuid + "_fea' As b  where a.uuid = b.uuid and ( a.del_flag=0 AND b.del_flag=0);");
        QSqlQuery query(g_syncDbFile);
        query.prepare(sql);
@@ -1642,6 +1643,7 @@
                t_feature_info.id = query.value(0).toString().toStdString();
                t_feature_info.img = query.value(1).toString().toStdString();
                t_feature_info.idcard = query.value(2).toString().toStdString();
                t_feature_info.enable = query.value(4).toString().toStdString();
                dataCache.insert(std::make_pair(t_feature_info.id, t_feature_info));
            }
syncDBTool/SyncDB.hpp
@@ -21,6 +21,7 @@
        update_time,
        img,
        idcard,
        enable,
        evEnd
    };
@@ -36,6 +37,7 @@
        map_Fea_InfoString2Values["update_time"] = Feature_InfoStringValue::update_time;
        map_Fea_InfoString2Values["img"] = Feature_InfoStringValue::img;
        map_Fea_InfoString2Values["idcard"] = Feature_InfoStringValue::idcard;
        map_Fea_InfoString2Values["enable"] = Feature_InfoStringValue::enable;
        map_Fea_InfoString2Values["end"] = evEnd;
    }
@@ -81,6 +83,9 @@
                    case Feature_InfoStringValue::idcard:
                        idcard = value;
                        break;
                    case Feature_InfoStringValue::enable:
                        enable = value;
                        break;
                    default:
                        ERR(key << " is an invalid string. s_mapStringValues now contains "
                                << map_Fea_InfoString2Values.size() << " entries.");
@@ -102,6 +107,8 @@
        std::string update_time;
        std::string img;
        std::string idcard;
        std::string enable;
//        value is a atom: atomSize:19, atomValue:test@192.168.50.216
//        value is a list:2018-08-08 20:17:11