|
|
|
@ -40,7 +40,8 @@ ImgCheckAnalysisy::ImgCheckAnalysisy()
|
|
|
|
m_pbaseCheckFunction = &m_AnalysisyConfig.baseFunction;
|
|
|
|
m_pbaseCheckFunction = &m_AnalysisyConfig.baseFunction;
|
|
|
|
|
|
|
|
|
|
|
|
m_strLastDate = "";
|
|
|
|
m_strLastDate = "";
|
|
|
|
m_strRootPath_KK_cls = "/home/aidlux/BOE/Cls/KK/";
|
|
|
|
m_strRootPath_TA_cls = "/home/aidlux/BOE/Cls/TA/";
|
|
|
|
|
|
|
|
m_strRootPath_CA_cls = "/home/aidlux/BOE/Cls/CA/";
|
|
|
|
creatsavedir();
|
|
|
|
creatsavedir();
|
|
|
|
m_pImageStorage = ImageStorage::getInstance();
|
|
|
|
m_pImageStorage = ImageStorage::getInstance();
|
|
|
|
m_nConfigIdx = -1;
|
|
|
|
m_nConfigIdx = -1;
|
|
|
|
@ -201,10 +202,12 @@ int ImgCheckAnalysisy::creatsavedir()
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
m_strLastDate = curDate;
|
|
|
|
m_strLastDate = curDate;
|
|
|
|
m_strRootPath_KK_cls += m_strLastDate + "/";
|
|
|
|
m_strRootPath_TA_cls += m_strLastDate + "/";
|
|
|
|
|
|
|
|
m_strRootPath_CA_cls += m_strLastDate + "/";
|
|
|
|
for (int i = 0; i < AI_CLass_QX_NAME_count; i++)
|
|
|
|
for (int i = 0; i < AI_CLass_QX_NAME_count; i++)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
CheckUtil::CreateDir(m_strRootPath_KK_cls + std::to_string(i) + "/");
|
|
|
|
CheckUtil::CreateDir(m_strRootPath_TA_cls + std::to_string(i) + "/");
|
|
|
|
|
|
|
|
CheckUtil::CreateDir(m_strRootPath_CA_cls + std::to_string(i) + "/");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -1383,8 +1386,7 @@ int ImgCheckAnalysisy::ConfigCheck(cv::Mat img)
|
|
|
|
|
|
|
|
|
|
|
|
int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg)
|
|
|
|
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;
|
|
|
|
std::vector<std::shared_ptr<AIModel_Base>> pAIDetList;
|
|
|
|
pAIDetList.push_back(AI_Factory->Defect);
|
|
|
|
pAIDetList.push_back(AI_Factory->Defect);
|
|
|
|
pAIDetList.push_back(AI_Factory->Defect_QueXi);
|
|
|
|
pAIDetList.push_back(AI_Factory->Defect_QueXi);
|
|
|
|
@ -1394,9 +1396,6 @@ 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_Defect);
|
|
|
|
pAIDetNameList.push_back(AI_DET_MODEL_NAME_QueXi);
|
|
|
|
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";
|
|
|
|
std::string strBaseLog = "AI_Detect";
|
|
|
|
m_pdetlog->AddCheckstr(PrintLevel_0, DET_LOG_LEVEL_3, strBaseLog, "AI_Detect Start");
|
|
|
|
m_pdetlog->AddCheckstr(PrintLevel_0, DET_LOG_LEVEL_3, strBaseLog, "AI_Detect Start");
|
|
|
|
@ -1435,9 +1434,6 @@ int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg)
|
|
|
|
std::shared_ptr<AIModel_Base> pAIDet = pAIDetList[m];
|
|
|
|
std::shared_ptr<AIModel_Base> pAIDet = pAIDetList[m];
|
|
|
|
std::string strModelName = (m < pAIDetNameList.size()) ? pAIDetNameList[m] : std::string(AI_DET_MODEL_NAME_UnKnown);
|
|
|
|
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_width = pAIDet->input_0.width;
|
|
|
|
int deal_image_height = pAIDet->input_0.height;
|
|
|
|
int deal_image_height = pAIDet->input_0.height;
|
|
|
|
if (deal_image_width <= 0 || deal_image_height <= 0)
|
|
|
|
if (deal_image_width <= 0 || deal_image_height <= 0)
|
|
|
|
@ -1490,21 +1486,11 @@ int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
cv::resize(modelMask, modelMaskFull, img.size(), 0, 0, cv::INTER_NEAREST);
|
|
|
|
cv::resize(modelMask, modelMaskFull, img.size(), 0, 0, cv::INTER_NEAREST);
|
|
|
|
|
|
|
|
|
|
|
|
if (bMergeModel)
|
|
|
|
// 多个模型的 mask 取并集
|
|
|
|
{
|
|
|
|
cv::bitwise_or(ResultImg, modelMaskFull, ResultImg);
|
|
|
|
// 多个模型的 mask 取并集
|
|
|
|
|
|
|
|
cv::bitwise_or(ResultImg, modelMaskFull, ResultImg);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 当前模型自己的 mask 单独记录一份(只记录参与并集的模型, 保证残点来源追溯与结果一致)
|
|
|
|
// 当前模型自己的 mask 单独记录一份
|
|
|
|
cv::bitwise_or(modelMaskList[m], modelMaskFull, modelMaskList[m]);
|
|
|
|
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 检测残点图存图:每个模型的结果都存,并增加一级 模型名称 目录,
|
|
|
|
// AI 检测残点图存图:每个模型的结果都存,并增加一级 模型名称 目录,
|
|
|
|
@ -1512,7 +1498,7 @@ int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg)
|
|
|
|
// 目录结构:/home/aidlux/BOE/ZB_SOCKET/AI_Detect/<模型名称>/<产品ID>/
|
|
|
|
// 目录结构:/home/aidlux/BOE/ZB_SOCKET/AI_Detect/<模型名称>/<产品ID>/
|
|
|
|
if (m_pbaseCheckFunction->saveImg.bSaveAIDetImg && !modelMaskFull.empty())
|
|
|
|
if (m_pbaseCheckFunction->saveImg.bSaveAIDetImg && !modelMaskFull.empty())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
std::string strSaveDir = "/home/aidlux/BOE/AI_Detect/KK/" + strModelName + "/" + DetImgInfo_shareP->strImgProductID + "/";
|
|
|
|
std::string strSaveDir = "/home/aidlux/BOE/ZB_SOCKET/AI_Detect/" + strModelName + "/" + DetImgInfo_shareP->strImgProductID + "/";
|
|
|
|
CheckUtil::CreateDir(strSaveDir);
|
|
|
|
CheckUtil::CreateDir(strSaveDir);
|
|
|
|
std::string strSavePath_in = strSaveDir + m_strCurDetChannel + "_in.png";
|
|
|
|
std::string strSavePath_in = strSaveDir + m_strCurDetChannel + "_in.png";
|
|
|
|
std::string strSavePath_out = strSaveDir + m_strCurDetChannel + "_out.png";
|
|
|
|
std::string strSavePath_out = strSaveDir + m_strCurDetChannel + "_out.png";
|
|
|
|
@ -1521,8 +1507,7 @@ int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 4、mask 结果放入队列,用于 AIMaskDet 加速 blob 计算(整图 ROI)
|
|
|
|
// 4、mask 结果放入队列,用于 AIMaskDet 加速 blob 计算(整图 ROI)
|
|
|
|
// 只推入参与并集的 mask, 保证行标志与最终结果 mask 一致
|
|
|
|
if (!modelMaskFull.empty())
|
|
|
|
if (bMergeModel && !modelMaskFull.empty())
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
std::shared_ptr<AIMulThreadRunBase::AITask> maskTask = std::make_shared<AIMulThreadRunBase::AITask>();
|
|
|
|
std::shared_ptr<AIMulThreadRunBase::AITask> maskTask = std::make_shared<AIMulThreadRunBase::AITask>();
|
|
|
|
maskTask->id = static_cast<int>(m);
|
|
|
|
maskTask->id = static_cast<int>(m);
|
|
|
|
@ -1663,31 +1648,31 @@ int ImgCheckAnalysisy::AI_QX_Class_Thread()
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case 1:
|
|
|
|
case 1:
|
|
|
|
cls_num = AI_CLass_QX_NAME_PIN_QueShi;
|
|
|
|
cls_num = AI_CLass_QX_NAME_BTB_DuanLie;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case 2:
|
|
|
|
case 2:
|
|
|
|
cls_num = AI_CLass_QX_NAME_BTB_DuanLie;
|
|
|
|
cls_num = AI_CLass_QX_NAME_LianXi;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case 3:
|
|
|
|
case 3:
|
|
|
|
cls_num = AI_CLass_QX_NAME_LianXi;
|
|
|
|
cls_num = AI_CLass_QX_NAME_QueXi;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case 4:
|
|
|
|
case 4:
|
|
|
|
cls_num = AI_CLass_QX_NAME_QueXi;
|
|
|
|
cls_num = AI_CLass_QX_NAME_YiWu;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case 5:
|
|
|
|
case 5:
|
|
|
|
cls_num = AI_CLass_QX_NAME_YiWu;
|
|
|
|
cls_num = AI_CLass_QX_NAME_C_BianXing;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case 6:
|
|
|
|
case 6:
|
|
|
|
cls_num = AI_CLass_QX_NAME_C_BianXing;
|
|
|
|
cls_num = AI_CLass_QX_NAME_Panel;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
default:
|
|
|
|
cls_num = AI_CLass_QX_NAME_count; // 无效类别, 不参与缺陷分析
|
|
|
|
cls_num = AI_CLass_QX_NAME_Panel;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -1695,13 +1680,18 @@ int ImgCheckAnalysisy::AI_QX_Class_Thread()
|
|
|
|
// printf("AI Class num %d = %s %f\n", cls_num, strclassName.c_str(), result->cls_score);
|
|
|
|
// printf("AI Class num %d = %s %f\n", cls_num, strclassName.c_str(), result->cls_score);
|
|
|
|
|
|
|
|
|
|
|
|
// 分类存图 开启。
|
|
|
|
// 分类存图 开启。
|
|
|
|
if (m_pbaseCheckFunction->saveImg.bSaveClsImg)
|
|
|
|
if (m_pbaseCheckFunction->saveImg.bSaveAlginImg)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
std::string saveimgpaht = "";
|
|
|
|
std::string saveimgpaht = "";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (m_strCurDetChannel == "TA")
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
saveimgpaht = m_strRootPath_TA_cls + std::to_string(cls_num) + "/" + std::to_string(CheckUtil::getcurTime()) + "_" + std::to_string(result->cls_score) + ".png";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
saveimgpaht = m_strRootPath_KK_cls + std::to_string(cls_num) + "/" + std::to_string(CheckUtil::getcurTime()) + "_" + std::to_string(result->cls_score) + ".png";
|
|
|
|
saveimgpaht = m_strRootPath_CA_cls + std::to_string(cls_num) + "/" + std::to_string(CheckUtil::getcurTime()) + "_" + std::to_string(result->cls_score) + ".png";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
@ -1956,9 +1946,6 @@ int ImgCheckAnalysisy::AIClassTypeToConfigType(int nAIQXType)
|
|
|
|
case AI_CLass_QX_NAME_PIN_PoSun:
|
|
|
|
case AI_CLass_QX_NAME_PIN_PoSun:
|
|
|
|
resultError_type = CONFIG_QX_NAME_PIN_PoSun;
|
|
|
|
resultError_type = CONFIG_QX_NAME_PIN_PoSun;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case AI_CLass_QX_NAME_PIN_QueShi:
|
|
|
|
|
|
|
|
resultError_type = CONFIG_QX_NAME_PIN_QueShi;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case AI_CLass_QX_NAME_BTB_DuanLie:
|
|
|
|
case AI_CLass_QX_NAME_BTB_DuanLie:
|
|
|
|
resultError_type = CONFIG_QX_NAME_BTB_DuanLie;
|
|
|
|
resultError_type = CONFIG_QX_NAME_BTB_DuanLie;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
@ -1974,6 +1961,9 @@ int ImgCheckAnalysisy::AIClassTypeToConfigType(int nAIQXType)
|
|
|
|
case AI_CLass_QX_NAME_C_BianXing:
|
|
|
|
case AI_CLass_QX_NAME_C_BianXing:
|
|
|
|
resultError_type = CONFIG_QX_NAME_C_BianXing;
|
|
|
|
resultError_type = CONFIG_QX_NAME_C_BianXing;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case AI_CLass_QX_NAME_Panel:
|
|
|
|
|
|
|
|
resultError_type = CONFIG_QX_NAME_Panel;
|
|
|
|
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -1999,7 +1989,6 @@ int ImgCheckAnalysisy::Pin_Qx_Det(const cv::Mat &img)
|
|
|
|
|
|
|
|
|
|
|
|
m_Edge_DetConfig.Init();
|
|
|
|
m_Edge_DetConfig.Init();
|
|
|
|
m_Edge_DetConfig.strChannel = m_strCurDetChannel;
|
|
|
|
m_Edge_DetConfig.strChannel = m_strCurDetChannel;
|
|
|
|
m_Edge_DetConfig.strProductID = DetImgInfo_shareP->strImgProductID;
|
|
|
|
|
|
|
|
m_Edge_DetConfig.pBaseCheckFunction = m_pbaseCheckFunction;
|
|
|
|
m_Edge_DetConfig.pBaseCheckFunction = m_pbaseCheckFunction;
|
|
|
|
|
|
|
|
|
|
|
|
m_Edge_DetConfig.bSaveResultImg = false;
|
|
|
|
m_Edge_DetConfig.bSaveResultImg = false;
|
|
|
|
@ -2943,7 +2932,6 @@ int ImgCheckAnalysisy::AI_Edge(const cv::Mat &img, cv::RotatedRect &outerRoi, cv
|
|
|
|
config.bSaveResultImg = true;
|
|
|
|
config.bSaveResultImg = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
config.strChannel = DetImgInfo_shareP->strChannel;
|
|
|
|
config.strChannel = DetImgInfo_shareP->strChannel;
|
|
|
|
config.strProductID = DetImgInfo_shareP->strImgProductID;
|
|
|
|
|
|
|
|
config.pBaseCheckFunction = m_pbaseCheckFunction;
|
|
|
|
config.pBaseCheckFunction = m_pbaseCheckFunction;
|
|
|
|
int re = m_pAI_Edge_Algin.Detect(img, &config, m_pEdge_Align_Result);
|
|
|
|
int re = m_pAI_Edge_Algin.Detect(img, &config, m_pEdge_Align_Result);
|
|
|
|
if (re != 0)
|
|
|
|
if (re != 0)
|
|
|
|
|