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