chenshijun
2019-04-22 d5ae54ceb9770963fbe88aa0170c08d0ae648b05
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