From d83ade76ca7d780c053e263d061deaea3de89ae3 Mon Sep 17 00:00:00 2001 From: liusiyang Date: Tue, 13 Oct 2026 16:45:09 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E6=B7=BB=E5=8A=A0QueXi=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AlgorithmModule/src/ImgCheckAnalysisy.cpp | 32 +++++++++++++++----- ConfigModule/include/CheckConfigDefine.h | 37 +++++++++++++++++++++++ ConfigModule/src/JsonConfig.cpp | 8 +++++ 3 files changed, 70 insertions(+), 7 deletions(-) diff --git a/AlgorithmModule/src/ImgCheckAnalysisy.cpp b/AlgorithmModule/src/ImgCheckAnalysisy.cpp index af6b93b..0376ace 100644 --- a/AlgorithmModule/src/ImgCheckAnalysisy.cpp +++ b/AlgorithmModule/src/ImgCheckAnalysisy.cpp @@ -1383,7 +1383,8 @@ int ImgCheckAnalysisy::ConfigCheck(cv::Mat img) int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg) { - // 依次使用多个检测模型,各模型输出 mask 取并集作为最终 outmask + // 依次使用多个检测模型,各模型输出 mask 取并集作为最终 outmask; + // Defect_QueXi 模型是否参与合并由基础参数 Merge_QueXi 开关控制 std::vector> pAIDetList; pAIDetList.push_back(AI_Factory->Defect); pAIDetList.push_back(AI_Factory->Defect_QueXi); @@ -1393,6 +1394,9 @@ int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg) pAIDetNameList.push_back(AI_DET_MODEL_NAME_Defect); pAIDetNameList.push_back(AI_DET_MODEL_NAME_QueXi); + // Defect_QueXi 模型是否参与最终结果并集(开关关闭时: 模型照常推理, 但结果不合并到 ResultImg) + bool bMerge_QueXi = (m_pbaseCheckFunction != NULL) && m_pbaseCheckFunction->Merge_QueXi.bOpen; + std::string strBaseLog = "AI_Detect"; m_pdetlog->AddCheckstr(PrintLevel_0, DET_LOG_LEVEL_3, strBaseLog, "AI_Detect Start"); @@ -1431,6 +1435,9 @@ int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg) std::shared_ptr pAIDet = pAIDetList[m]; std::string strModelName = (m < pAIDetNameList.size()) ? pAIDetNameList[m] : std::string(AI_DET_MODEL_NAME_UnKnown); + // 当前模型的 mask 是否合并进最终结果: Defect 模型始终合并; Defect_QueXi 由 Merge_QueXi 开关控制 + bool bMergeModel = (strModelName != AI_DET_MODEL_NAME_QueXi) || bMerge_QueXi; + int deal_image_width = pAIDet->input_0.width; int deal_image_height = pAIDet->input_0.height; if (deal_image_width <= 0 || deal_image_height <= 0) @@ -1483,11 +1490,21 @@ int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg) { cv::resize(modelMask, modelMaskFull, img.size(), 0, 0, cv::INTER_NEAREST); - // 多个模型的 mask 取并集 - cv::bitwise_or(ResultImg, modelMaskFull, ResultImg); + if (bMergeModel) + { + // 多个模型的 mask 取并集 + cv::bitwise_or(ResultImg, modelMaskFull, ResultImg); - // 当前模型自己的 mask 单独记录一份 - cv::bitwise_or(modelMaskList[m], modelMaskFull, modelMaskList[m]); + // 当前模型自己的 mask 单独记录一份(只记录参与并集的模型, 保证残点来源追溯与结果一致) + cv::bitwise_or(modelMaskList[m], modelMaskFull, modelMaskList[m]); + } + else + { + // Merge_QueXi 开关关闭: 不合并、不推加速队列、不记录残点来源 + m_pdetlog->AddCheckstr(PrintLevel_0, DET_LOG_LEVEL_3, strBaseLog, + " %s Merge_QueXi off, mask not merged (pixel num %d)", + strModelName.c_str(), cv::countNonZero(modelMaskFull)); + } } // AI 检测残点图存图:每个模型的结果都存,并增加一级 模型名称 目录, @@ -1495,7 +1512,7 @@ int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg) // 目录结构:/home/aidlux/BOE/ZB_SOCKET/AI_Detect/<模型名称>/<产品ID>/ if (m_pbaseCheckFunction->saveImg.bSaveAIDetImg && !modelMaskFull.empty()) { - std::string strSaveDir = "/home/aidlux/BOE/ZB_SOCKET/AI_Detect/" + strModelName + "/" + DetImgInfo_shareP->strImgProductID + "/"; + std::string strSaveDir = "/home/aidlux/BOE/AI_Detect/KK/" + strModelName + "/" + DetImgInfo_shareP->strImgProductID + "/"; CheckUtil::CreateDir(strSaveDir); std::string strSavePath_in = strSaveDir + m_strCurDetChannel + "_in.png"; std::string strSavePath_out = strSaveDir + m_strCurDetChannel + "_out.png"; @@ -1504,7 +1521,8 @@ int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg) } // 4、mask 结果放入队列,用于 AIMaskDet 加速 blob 计算(整图 ROI) - if (!modelMaskFull.empty()) + // 只推入参与并集的 mask, 保证行标志与最终结果 mask 一致 + if (bMergeModel && !modelMaskFull.empty()) { std::shared_ptr maskTask = std::make_shared(); maskTask->id = static_cast(m); diff --git a/ConfigModule/include/CheckConfigDefine.h b/ConfigModule/include/CheckConfigDefine.h index 7167b88..b01e6c7 100644 --- a/ConfigModule/include/CheckConfigDefine.h +++ b/ConfigModule/include/CheckConfigDefine.h @@ -1141,6 +1141,38 @@ struct Big_NG return str123; } }; + +struct Base_Function_Merge_QueXi +{ + bool bOpen; + Base_Function_Merge_QueXi() + { + Init(); + } + void Init() + { + bOpen = false; + } + void copy(Base_Function_Merge_QueXi tem) + { + this->bOpen = tem.bOpen; + } + void print(std::string str) + { + printf("%s>>bOpen %d \n", str.c_str(), + bOpen); + } + std::string GetInfo(std::string str) + { + char buffer[256]; + sprintf(buffer, "%s>>bOpen %d \n", str.c_str(), + bOpen); + std::string str123 = buffer; + return str123; + } + +}; + // 基础检测功能 大缺陷 NG struct Base_Function_BigNG { @@ -1242,6 +1274,7 @@ struct BaseCheckFunction Base_Function_ALign ALign_Config; Base_Function_Pin_Det pinDet; Base_Function_SaveImg saveImg; + Base_Function_Merge_QueXi Merge_QueXi; Base_Function_BigNG bigNG; BaseCheckFunction() { @@ -1252,6 +1285,7 @@ struct BaseCheckFunction ALign_Config.Init(); pinDet.Init(); saveImg.Init(); + Merge_QueXi.Init(); bigNG.Init(); } void copy(BaseCheckFunction tem) @@ -1259,6 +1293,7 @@ struct BaseCheckFunction this->ALign_Config.copy(tem.ALign_Config); this->pinDet.copy(tem.pinDet); this->saveImg.copy(tem.saveImg); + this->Merge_QueXi.copy(tem.Merge_QueXi); this->bigNG.copy(tem.bigNG); } void print(std::string str) @@ -1267,6 +1302,7 @@ struct BaseCheckFunction ALign_Config.print("ALign_Config"); pinDet.print("pinDet"); saveImg.print("saveImg"); + Merge_QueXi.print("Merge_QueXi"); bigNG.print("bigNG"); } std::string GetInfo(std::string str) @@ -1275,6 +1311,7 @@ struct BaseCheckFunction str123 += ALign_Config.GetInfo("ALign_Config"); str123 += pinDet.GetInfo("pinDet"); str123 += saveImg.GetInfo("saveImg"); + str123 += Merge_QueXi.GetInfo("Merge_QueXi"); str123 += bigNG.GetInfo("bigNG"); // str123 += "\n"; return str123; diff --git a/ConfigModule/src/JsonConfig.cpp b/ConfigModule/src/JsonConfig.cpp index 3c0664f..1cca0bf 100644 --- a/ConfigModule/src/JsonConfig.cpp +++ b/ConfigModule/src/JsonConfig.cpp @@ -858,6 +858,14 @@ int BaseFuntonConfigJson::GetFunction(Json::Value value) // _config.pinDet.print("pinDet"); // getchar(); } + if ("bMerge_QueXi" == strCode) + { + auto value_f = value; + // std::cout << value_f << std::endl; + // getchar(); + _config.Merge_QueXi.bOpen = value_f["isOpen"].asBool(); + } + if ("Big_NG" == strCode) { auto value_f = value;