feat 添加QueXi模型开关

dev_lsy
liusiyang 3 weeks ago
parent ad4bc5cfc7
commit d83ade76ca

@ -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<std::shared_ptr<AIModel_Base>> 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<AIModel_Base> 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<AIMulThreadRunBase::AITask> maskTask = std::make_shared<AIMulThreadRunBase::AITask>();
maskTask->id = static_cast<int>(m);

@ -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;

@ -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;

Loading…
Cancel
Save