diff --git a/AlgorithmModule/include/ImageDetConfig.h b/AlgorithmModule/include/ImageDetConfig.h index f57b1e0..1860db6 100644 --- a/AlgorithmModule/include/ImageDetConfig.h +++ b/AlgorithmModule/include/ImageDetConfig.h @@ -346,6 +346,7 @@ struct BQ_Result int nresult = 1; bool bShield_BQ = true; // 是否屏蔽标签 bool bBQ_AI_Det = false; // 是否启用标签独立AI检测 + bool bsaveAll = false; // 是否保存所有的检测结果 std::vector pBQ_roiList; // 标签的原始区域 std::vector pBQ_expandedRoiList; // 标签的扩展后区域(用于AI检测) std::vector pBQ_cropImages; // 标签扩展区域图像 diff --git a/AlgorithmModule/src/CameraCheckAnalysisy.cpp b/AlgorithmModule/src/CameraCheckAnalysisy.cpp index a9fddb5..ebcbe63 100644 --- a/AlgorithmModule/src/CameraCheckAnalysisy.cpp +++ b/AlgorithmModule/src/CameraCheckAnalysisy.cpp @@ -694,8 +694,13 @@ int CameraCheckAnalysisy::preDet_BQ(const cv::Mat &L255CutImg, std::shared_ptrcameraBaseResult->pBQ_Result = std::make_shared(); - m_pCheck_Result->cameraBaseResult->pBQ_Result->bShield_BQ = m_AnalysisyConfig.commonCheckConfig.baseConfig.bShield_BQ; - m_pCheck_Result->cameraBaseResult->pBQ_Result->bBQ_AI_Det = m_pbaseCheckFunction->Det_BQ.bBQ_AI_Det; + + ChannelCheckFunction *pChannelFuntion_BQ = GetChannelFuntion(L255->strChannel); + if (pChannelFuntion_BQ) + { + m_pCheck_Result->cameraBaseResult->pBQ_Result->bBQ_AI_Det = pChannelFuntion_BQ->function.f_Det_BQ.bBQ_AI_Det; + m_pCheck_Result->cameraBaseResult->pBQ_Result->bsaveAll = pChannelFuntion_BQ->function.f_Det_BQ.bsaveAll; + } cv::Rect Det_CropRoi = m_pCheck_Result->cameraBaseResult->pEdgeDetResult->cutRoi; @@ -716,15 +721,13 @@ int CameraCheckAnalysisy::preDet_BQ(const cv::Mat &L255CutImg, std::shared_ptrcameraBaseResult->pBQ_Result->bShield_BQ) + // 默认屏蔽标签 { - m_pdetlog->AddCheckstr(PrintLevel_2, "preDet_BQ", "shieldBQ is Open"); cv::Mat detImg_mask = m_pCheck_Result->cameraBaseResult->pEdgeDetResult->shieldMask; for (int i = 0; i < m_pCheck_Result->cameraBaseResult->pBQ_Result->pBQ_roiList.size(); i++) { cv::Rect boundingRect = m_pCheck_Result->cameraBaseResult->pBQ_Result->pBQ_roiList.at(i); - int BQ_expand = m_pbaseCheckFunction->Det_BQ.BQ_expand; + int BQ_expand = pChannelFuntion_BQ ? pChannelFuntion_BQ->function.f_Det_BQ.BQ_expand : 0; boundingRect.x -= BQ_expand; boundingRect.y -= BQ_expand; boundingRect.width += 2 * BQ_expand; @@ -732,13 +735,12 @@ int CameraCheckAnalysisy::preDet_BQ(const cv::Mat &L255CutImg, std::shared_ptr 0 && boundingRect.height > 0) { - // 同时屏蔽主AI,避免重复检测 detImg_mask(boundingRect).setTo(255); + m_pCheck_Result->cameraBaseResult->pBQ_Result->pBQ_expandedRoiList.push_back(boundingRect); // 保存裁剪图像供独立BQ AI检测 - if (m_pbaseCheckFunction->Det_BQ.bBQ_AI_Det) + if (pChannelFuntion_BQ && pChannelFuntion_BQ->function.f_Det_BQ.bBQ_AI_Det) { - m_pCheck_Result->cameraBaseResult->pBQ_Result->pBQ_expandedRoiList.push_back(boundingRect); cv::Mat bqCrop = L255CutImg(boundingRect).clone(); m_pCheck_Result->cameraBaseResult->pBQ_Result->pBQ_cropImages.push_back(bqCrop); } @@ -749,10 +751,6 @@ int CameraCheckAnalysisy::preDet_BQ(const cv::Mat &L255CutImg, std::shared_ptrcameraBaseResult->pEdgeDetResult->shieldMask); } } - else - { - m_pdetlog->AddCheckstr(PrintLevel_2, "preDet_BQ", "shieldBQ is false"); - } std::shared_ptr pBQ_Result = m_pCheck_Result->cameraBaseResult->pBQ_Result; // BQ 检测结果 pBQ_Result->BQ_centerPoint.erase(pBQ_Result->BQ_centerPoint.begin(), pBQ_Result->BQ_centerPoint.end()); for (int i = 0; i < pBQ_Result->pBQ_roiList.size(); i++) diff --git a/AlgorithmModule/src/ImageResultJudge.cpp b/AlgorithmModule/src/ImageResultJudge.cpp index aad38fc..d4d2414 100644 --- a/AlgorithmModule/src/ImageResultJudge.cpp +++ b/AlgorithmModule/src/ImageResultJudge.cpp @@ -447,33 +447,28 @@ int ImageResultJudge::ResultJudge(std::shared_ptr pImageResult) } } // 暗点 3S 分析 对 好品 或者 是 疑是的缺陷进行3S分析。S数量分析。 3S的暗点直接NG. - // if ((nerrortype == 0 || checkFlage != ANALYSIS_TYPE_TF) && - // config_qx_type == CONFIG_QX_NAME_AD && pFuntion && - // pFuntion->function.f_AD_Check.bOpen && - // pFuntion->function.f_AD_Check.analysis_s.bOpen && - // pFuntion->function.f_AD_Check.analysis_s.NG_3s && bpreSucc) if ((nerrortype == 0 || checkFlage != ANALYSIS_TYPE_TF) && - config_qx_type == CONFIG_QX_NAME_AD && m_pbaseCheckFunction && + config_qx_type == CONFIG_QX_NAME_AD && pFuntion != NULL && m_pbaseCheckFunction && m_pbaseCheckFunction->ad_check.bOpen && m_pbaseCheckFunction->ad_check.analysis_s.bOpen && m_pbaseCheckFunction->ad_check.analysis_s.NG_3s && bpreSucc) { Judge_Status = true; int det_s_Vale = 0; - if (JudgArea >= pFuntion->function.f_AD_Check.S_standard_3s.area && - flen >= pFuntion->function.f_AD_Check.S_standard_3s.len) + if (JudgArea >= m_pbaseCheckFunction->ad_check.S_standard_3s.area && + flen >= m_pbaseCheckFunction->ad_check.S_standard_3s.len && (strChannel == "L127" || strChannel == "L255")) { nerrortype = 1; checkFlage = ANALYSIS_TYPE_TF; bNG_Status = true; pQxLog->AddCheckstr(PrintLevel_3, DET_LOG_LEVEL_3, "info", " AD 3S result NG, det area %f len %f >=3s param area %f len %f ", - JudgArea, flen, pFuntion->function.f_AD_Check.S_standard_3s.area, pFuntion->function.f_AD_Check.S_standard_3s.len); + JudgArea, flen, m_pbaseCheckFunction->ad_check.S_standard_3s.area, m_pbaseCheckFunction->ad_check.S_standard_3s.len); } else { pQxLog->AddCheckstr(PrintLevel_3, DET_LOG_LEVEL_3, "info", " AD 3S result OK, det area %f len %f < 3s param area %f len %f ", - JudgArea, flen, pFuntion->function.f_AD_Check.S_standard_3s.area, pFuntion->function.f_AD_Check.S_standard_3s.len); + JudgArea, flen, m_pbaseCheckFunction->ad_check.S_standard_3s.area, m_pbaseCheckFunction->ad_check.S_standard_3s.len); } } diff --git a/AlgorithmModule/src/ImgCheckAnalysisy.cpp b/AlgorithmModule/src/ImgCheckAnalysisy.cpp index 0159cd4..e6c3c69 100644 --- a/AlgorithmModule/src/ImgCheckAnalysisy.cpp +++ b/AlgorithmModule/src/ImgCheckAnalysisy.cpp @@ -2175,7 +2175,7 @@ int ImgCheckAnalysisy::AI_Detect_BQ() { return 0; } - if (!m_pImageAllResult->cameraBaseResult->pBQ_Result->bBQ_AI_Det) + if (!m_pFuntion->function.f_Det_BQ.bBQ_AI_Det) { return 0; } @@ -2189,77 +2189,179 @@ int ImgCheckAnalysisy::AI_Detect_BQ() m_pdetlog->AddCheckstr(PrintLevel_1, strBaseLog, "============= Start, BQ num = %d", bqNum); long ts = CheckUtil::getcurTime(); + std::string BQ_save_path = "/home/aidlux/BOE/FOG/BQ_AI_Det/"+ m_pImageAllResult->productBaseResult->strproductName + "/"; + CheckUtil::CreateDir(BQ_save_path); + // 初始化BQ AI检测结果 m_pImageAllResult->bq_DetAIResult = std::make_shared(); std::shared_ptr pDetAIResult = m_pImageAllResult->bq_DetAIResult; - // 使用与主检测相同的AI模型(后续更改为BQ AI模型) + // 使用BQ AI std::shared_ptr pAI_Model = AI_Factory->AI_defect_Tag; int AIInputImg_width = pAI_Model->input_0.width; int AIInputImg_height = pAI_Model->input_0.height; - cv::Size modelInputSize(AIInputImg_width, AIInputImg_height); + + int AIOutputImg_width = pAI_Model->output_0.width; + int AIOutputImg_height = pAI_Model->output_0.height; + + // 是否需要 resize到输入图大小进行后续处理 + bool bResizeToSrc = false; + if (AIOutputImg_width != AIInputImg_width || AIOutputImg_height != AIInputImg_height) + { + bResizeToSrc = true; + } + + cv::Size src_sz; + src_sz.width = AIInputImg_width; + src_sz.height = AIInputImg_height; // 创建全图大小的AI mask(与主检测detImg同尺寸) cv::Mat AI_detImage = m_pImageAllResult->AI_detImg; pDetAIResult->AI_MaskImg = cv::Mat::zeros(AI_detImage.size(), CV_8UC1); + cv::Mat AIresultMask = pDetAIResult->AI_MaskImg; - // 先提交所有BQ AI推理任务(仿照AI_Detect_QX的提交-收集模式) - int submitted = 0; - int completed = 0; - while (completed < bqNum) + // 为每个BQ区域生成小ROI列表,仿照AI_Detect_QX的裁剪小块方式 + std::vector BQ_SmallRoiList; + for (int i = 0; i < bqNum; i++) { - // 提交任务(限制并发数不超过2,避免占用过多资源) - if (submitted < bqNum && runner->GetProcessingCount() < 2) + cv::Rect bqRoi = m_pImageAllResult->cameraBaseResult->pBQ_Result->pBQ_expandedRoiList.at(i); + cv::Rect validRoi = bqRoi & cv::Rect(0, 0, AI_detImage.cols, AI_detImage.rows); + if (validRoi.width <= 0 || validRoi.height <= 0) continue; + + // 如果BQ区域大于等于模型输入尺寸,切分成小块 + if (validRoi.width >= AIInputImg_width && validRoi.height >= AIInputImg_height) { - cv::Mat bqCrop = m_pImageAllResult->cameraBaseResult->pBQ_Result->pBQ_cropImages.at(submitted); - if (!bqCrop.empty()) + std::vector smallList; + int re = CheckUtil::cutSmallImg(AI_detImage, smallList, validRoi, AIInputImg_width, AIInputImg_height, 0, 0); + if (re == 0) { - cv::Mat resizedCrop; - cv::resize(bqCrop, resizedCrop, modelInputSize); + for (const auto& roi : smallList) + { + BQ_SmallRoiList.push_back(roi); + } + } + } + else + { + // BQ区域小于模型输入尺寸,以BQ区域中心创建模型输入大小的ROI + int cx = validRoi.x + validRoi.width / 2; + int cy = validRoi.y + validRoi.height / 2; + cv::Rect newRoi; + newRoi.x = cx - AIInputImg_width / 2; + newRoi.y = cy - AIInputImg_height / 2; + newRoi.width = AIInputImg_width; + newRoi.height = AIInputImg_height; + // 裁剪到图像边界 + if (newRoi.x < 0) newRoi.x = 0; + if (newRoi.y < 0) newRoi.y = 0; + if (newRoi.x + newRoi.width > AI_detImage.cols) newRoi.x = AI_detImage.cols - newRoi.width; + if (newRoi.y + newRoi.height > AI_detImage.rows) newRoi.y = AI_detImage.rows - newRoi.height; + if (newRoi.x < 0) { newRoi.x = 0; newRoi.width = AI_detImage.cols; } + if (newRoi.y < 0) { newRoi.y = 0; newRoi.height = AI_detImage.rows; } + BQ_SmallRoiList.push_back(newRoi); + } + } + + const int totalTasks = BQ_SmallRoiList.size(); + if (totalTasks <= 0) + { + m_pdetlog->AddCheckstr(PrintLevel_2, strBaseLog, "no valid small roi for BQ"); + return 0; + } - std::shared_ptr task = std::make_shared(); - task->id = submitted; - task->roi = cv::Rect(0, 0, modelInputSize.width, modelInputSize.height); - task->input = resizedCrop; - task->output = std::make_shared(); - task->engine = pAI_Model; + m_pdetlog->AddCheckstr(PrintLevel_2, strBaseLog, "BQ small roi num = %d", totalTasks); + + // 调试存图:原图 + BQ小ROI框 + if (m_pFuntion->function.f_Det_BQ.bsaveAll) + { + cv::Mat debugImg; + if (AI_detImage.channels() == 1) + { + cv::cvtColor(AI_detImage, debugImg, cv::COLOR_GRAY2BGR); + } + else + { + debugImg = AI_detImage.clone(); + } + for (size_t i = 0; i < BQ_SmallRoiList.size(); i++) + { + cv::rectangle(debugImg, BQ_SmallRoiList.at(i), cv::Scalar(0, 0, 255), 2); + } + cv::imwrite(BQ_save_path + m_strCurDetCamChannel + "_BQ_original_with_rois.png", debugImg); + } - runner->SubmitTask(task); + int submitted = 0; + int completed = 0; + + // 资源控制:限制最大并发数和最大待处理数 + const int MAX_CONCURRENT = 5; + const int MAX_PENDING = 5; + + long t2 = CheckUtil::getcurTime(); + + while (completed < totalTasks) + { + // 提交任务:满足并发限制和待处理限制 + if (submitted < totalTasks + && runner->GetProcessingCount() < MAX_CONCURRENT + && (submitted - completed) < MAX_PENDING) + { + std::shared_ptr task = std::make_shared(); + task->id = submitted; + task->roi = BQ_SmallRoiList.at(submitted); + task->input = AI_detImage(task->roi).clone(); + task->output = std::make_shared(); + task->engine = pAI_Model; + + // 调试存图:保存每个小块 + if (m_pFuntion->function.f_Det_BQ.bsaveAll) + { + cv::imwrite(BQ_save_path +m_strCurDetCamChannel + "_" + std::to_string(submitted) + "_BQ_crop_in.png", task->input); } + + runner->SubmitTask(task); submitted++; } - // 收集已完成的结果 + // 收集结果 std::shared_ptr result; if (runner->PopResult(result)) { - int idx = result->id; - if (idx >= 0 && idx < bqNum) + cv::Mat &outimg = *(result->output); + if (!outimg.empty()) { - cv::Rect bqRoi = m_pImageAllResult->cameraBaseResult->pBQ_Result->pBQ_expandedRoiList.at(idx); - cv::Rect validRoi = bqRoi & cv::Rect(0, 0, AI_detImage.cols, AI_detImage.rows); + // 调试存图:保存模型原始输出mask + if (m_pFuntion->function.f_Det_BQ.bsaveAll) + { + cv::imwrite(BQ_save_path + m_strCurDetCamChannel+ "_" + std::to_string(result->id) + "_BQ_crop_out.png", outimg); + } - if (validRoi.width > 0 && validRoi.height > 0) + cv::Mat AIresult; + if (bResizeToSrc) { - cv::Mat &outMask = *(result->output); - if (!outMask.empty()) - { - // 将AI输出mask resize回BQ裁剪图原始尺寸 - cv::Mat resizedMask; - cv::resize(outMask, resizedMask, cv::Size(bqRoi.width, bqRoi.height)); + cv::resize(outimg, AIresult, src_sz, 0, 0, 0); + } + else + { + AIresult = outimg; + } - // 将BQ的mask结果放到全图mask的对应位置 - resizedMask.copyTo(pDetAIResult->AI_MaskImg(validRoi), resizedMask); + cv::Rect srcsize_roi = result->roi; + AIresult.copyTo(AIresultMask(srcsize_roi), AIresult); - m_pdetlog->AddCheckstr(PrintLevel_2, strBaseLog, "BQ[%d] AI done, roi=[%d,%d,%d,%d]", - idx, validRoi.x, validRoi.y, validRoi.width, validRoi.height); - } - else - { - m_pdetlog->AddCheckstr(PrintLevel_2, strBaseLog, "BQ[%d] AI output empty", idx); - } + // 调试存图:保存resize后的mask + if (m_pFuntion->function.f_Det_BQ.bsaveAll && bResizeToSrc) + { + cv::imwrite(BQ_save_path + m_strCurDetCamChannel + "_BQ_mask_resized_" + std::to_string(result->id) + ".png", AIresult); } + + m_pdetlog->AddCheckstr(PrintLevel_2, strBaseLog, "BQ[%d] AI done, roi=[%d,%d,%d,%d]", + result->id, srcsize_roi.x, srcsize_roi.y, srcsize_roi.width, srcsize_roi.height); + } + else + { + m_pdetlog->AddCheckstr(PrintLevel_2, strBaseLog, "BQ[%d] AI output empty", result->id); } completed++; } @@ -2270,12 +2372,13 @@ int ImgCheckAnalysisy::AI_Detect_BQ() } long te = CheckUtil::getcurTime(); - m_pdetlog->AddCheckstr(PrintLevel_1, strBaseLog, "============= End, time=%ld ms", te - ts); + float mean_AI = (te - t2) / totalTasks; + m_pdetlog->AddCheckstr(PrintLevel_1, strBaseLog, "============= End; AI Run Time: sum %ld pre %ld Run %ld mean One Small Img %f", te - ts, t2 - ts, te - t2, mean_AI); // 调试存图 - if (DetImgInfo_shareP->bDebugsaveImg) + if (m_pFuntion->function.f_Det_BQ.bsaveAll) { - cv::imwrite(m_strCurDetCamChannel + "_AI_BQ_mask.png", pDetAIResult->AI_MaskImg); + cv::imwrite(BQ_save_path + m_strCurDetCamChannel + "_AI_BQ_mask.png", pDetAIResult->AI_MaskImg); } return 0; diff --git a/ConfigModule/include/CheckConfigDefine.h b/ConfigModule/include/CheckConfigDefine.h index 233c5f8..5f6033b 100644 --- a/ConfigModule/include/CheckConfigDefine.h +++ b/ConfigModule/include/CheckConfigDefine.h @@ -469,6 +469,7 @@ struct BasicConfig height_max = 999999; bDrawShieldRoi = false; bShield_ZF = false; + bShield_BQ = true; bDrawPreRoi = false; fUP_IOU = 0.9; bCal_ImageScale = false; @@ -797,6 +798,7 @@ struct Function_YXDet { bool bOpen; // 是否开启 std::string strModle; + int minArea; Function_YXDet() { Init(); @@ -805,20 +807,22 @@ struct Function_YXDet { bOpen = false; strModle = ""; + minArea = 0; } void copy(Function_YXDet tem) { this->bOpen = tem.bOpen; this->strModle = tem.strModle; + this->minArea = tem.minArea; } void print(std::string str) { - // printf("%s>>bOpen %d strModle %s\n", str.c_str(), bOpen, strModle.c_str()); + // printf("%s>>bOpen %d strModle %s minArea %d\n", str.c_str(), bOpen, strModle.c_str(), minArea); } std::string GetInfo(std::string str) { char buffer[64]; - sprintf(buffer, "%s>>bOpen %d strModle %s\n", str.c_str(), bOpen, strModle.c_str()); + sprintf(buffer, "%s>>bOpen %d strModle %s minArea %d\n", str.c_str(), bOpen, strModle.c_str(), minArea); std::string str123 = buffer; return str123; } @@ -1290,8 +1294,19 @@ struct Function_Image_Align { printf("pointArry1 == 0 \n\n\n"); } - feature_Roi = feature_Roi & cv::Rect(0, 0, img_W, img_H); - feature_Mask = tem_feature_Mask(feature_Roi).clone(); + // 防御:feature_Roi 相对图像尺寸 img_W x img_H 可能越界, + // 越界会导致 cv::Mat(Mat, Rect) 断言失败并抛 cv::Exception,进而 abort。 + cv::Rect roi = feature_Roi & cv::Rect(0, 0, img_W, img_H); + if (roi.width <= 0 || roi.height <= 0) + { + printf("[ToMaskImg] WARNING feature_Roi (%d,%d,%d,%d) out of range, img %dx%d\n", + feature_Roi.x, feature_Roi.y, feature_Roi.width, feature_Roi.height, img_W, img_H); + feature_Mask = tem_feature_Mask.clone(); + } + else + { + feature_Mask = tem_feature_Mask(roi).clone(); + } } } void print(std::string str) @@ -1567,74 +1582,80 @@ struct AD_Analysisy_IOU return str123; } }; -// 暗点检测功能 -struct Function_AD_Check +struct AD_Analysisy_Bind { + bool bUse; + std::vector main_channel_2s; + std::vector second_channel_2s; + std::vector main_channel_3s; + std::vector second_channel_3s; + std::vector correlated_channels; - bool bOpen; // 是否开启 - AD_S_Standard S_standard_3s; // 3s 标准 - AD_S_Standard S_standard_2s; // 2s 标准 - AD_S_Standard S_standard_1s; // 1s 标准 - AD_Analysisy_Num analysis_num; // 数量分析 - AD_Analysisy_Dis analysis_dis; // 距离分析 - AD_Analysisy_S analysis_s; // s 标准分析 - AD_Analysisy_IOU analysis_iou; // IOU 分析 - - Function_AD_Check() + AD_Analysisy_Bind() { Init(); } void Init() { - bOpen = false; - S_standard_3s.Init(); - S_standard_2s.Init(); - S_standard_1s.Init(); - analysis_num.Init(); - analysis_dis.Init(); - analysis_s.Init(); - analysis_iou.Init(); + bUse = false; + main_channel_2s.clear(); + second_channel_2s.clear(); + main_channel_3s.clear(); + second_channel_3s.clear(); + correlated_channels.clear(); } - - void copy(Function_AD_Check tem) + void copy (AD_Analysisy_Bind tem) { - this->bOpen = tem.bOpen; - this->S_standard_3s.copy(tem.S_standard_3s); - this->S_standard_2s.copy(tem.S_standard_2s); - this->S_standard_1s.copy(tem.S_standard_1s); - this->analysis_num.copy(tem.analysis_num); - this->analysis_dis.copy(tem.analysis_dis); - this->analysis_s.copy(tem.analysis_s); - this->analysis_iou.copy(tem.analysis_iou); - } - void print(std::string str) - { - printf("%s>>bOpen %d %s %s %s %s %s %s %s\n", str.c_str(), - bOpen, S_standard_3s.GetInfo("3S").c_str(), - S_standard_2s.GetInfo("2S").c_str(), - S_standard_1s.GetInfo("1S").c_str(), - analysis_num.GetInfo("analysis_num").c_str(), - analysis_dis.GetInfo("analysis_dis").c_str(), - analysis_s.GetInfo("analysis_s").c_str(), - analysis_iou.GetInfo("analysis_iou").c_str()); + this->bUse = tem.bUse; + this->main_channel_2s = tem.main_channel_2s; + this->second_channel_2s = tem.second_channel_2s; + this->main_channel_3s = tem.main_channel_3s; + this->second_channel_3s = tem.second_channel_3s; + this->correlated_channels = tem.correlated_channels; } std::string GetInfo(std::string str) { char buffer[256]; - sprintf(buffer, "%s>>bOpen %d ", str.c_str(), bOpen); + sprintf(buffer, "%s:bUse %d;", str.c_str(), + bUse); std::string str123 = buffer; - str123 += S_standard_3s.GetInfo("3S"); - str123 += S_standard_2s.GetInfo("2S"); - str123 += S_standard_1s.GetInfo("1S"); - str123 += analysis_num.GetInfo("analysis_num"); - str123 += analysis_dis.GetInfo("analysis_dis"); - str123 += analysis_s.GetInfo("analysis_s"); - str123 += analysis_iou.GetInfo("analysis_iou"); - return str123; } }; +struct AD_Analysisy_SF +{ + std::vector s_sf; + std::vector region_sf; + + AD_Analysisy_SF() + { + Init(); + } + void Init() + { + s_sf.clear(); + region_sf.clear(); + } + void copy (AD_Analysisy_SF tem) + { + this->s_sf = tem.s_sf; + this->region_sf = tem.region_sf; + } + std::string GetInfo(std::string str) + { + std::string str123; + for (int i = 0; i < s_sf.size(); i++) + { + str123 += str + ":s_sf " + s_sf[i] + ";"; + } + for (int i = 0; i < region_sf.size(); i++) + { + str123 += str + ":region_sf " + region_sf[i] + ";"; + } + return str123; + } +}; // 异物检测功能 struct Function_POL_Check { @@ -1723,6 +1744,44 @@ struct Function_Edge_Det return str123; } }; +struct Function_Det_BQ +{ + bool bBQ_AI_Det; // 是否启用标签独立AI检测 + int BQ_expand; + bool bsaveAll; + + Function_Det_BQ() + { + Init(); + } + void Init() + { + BQ_expand = 0; + bBQ_AI_Det = false; + bsaveAll = false; + } + void copy(Function_Det_BQ tem) + { + this->BQ_expand = tem.BQ_expand; + this->bBQ_AI_Det = tem.bBQ_AI_Det; + this->bsaveAll = tem.bsaveAll; + } + void print(std::string str) + { + printf("%d BQ_expand %d bBQ_AI_Det %d bsaveAll %d\n", str.c_str(), + BQ_expand, bBQ_AI_Det, bsaveAll); + } + std::string GetInfo(std::string str) + { + char buffer[256]; + sprintf(buffer, "%d BQ_expand %d bBQ_AI_Det %d bsaveAll %d\n", str.c_str(), + BQ_expand, bBQ_AI_Det, bsaveAll); + std::string str123 = buffer; + return str123; + } + +}; + // 检测功能 struct CheckFunction { @@ -1739,9 +1798,9 @@ struct CheckFunction Function_Image_Align f_Image_Align; // 图片特征对齐 Function_Detect_LackPol f_Dectect_LackPol; // 缺失POL检测 Function_SecondDet f_SecondDetect; // 二次检测分析 - Function_AD_Check f_AD_Check; // 暗点的检测功能 Function_POL_Check f_POL_Check; // 异物的检测功能 Function_Edge_Det f_dege_Det; + Function_Det_BQ f_Det_BQ; CheckFunction() { Init(); @@ -1761,9 +1820,9 @@ struct CheckFunction f_Image_Align.Init(); f_Dectect_LackPol.Init(); f_SecondDetect.Init(); - f_AD_Check.Init(); f_POL_Check.Init(); f_dege_Det.Init(); + f_Det_BQ.Init(); } void copy(CheckFunction tem) { @@ -1781,9 +1840,9 @@ struct CheckFunction this->f_Image_Align.copy(tem.f_Image_Align); this->f_Dectect_LackPol.copy(tem.f_Dectect_LackPol); this->f_SecondDetect.copy(tem.f_SecondDetect); - this->f_AD_Check.copy(tem.f_AD_Check); this->f_POL_Check.copy(tem.f_POL_Check); this->f_dege_Det.copy(tem.f_dege_Det); + this->f_Det_BQ.copy(tem.f_Det_BQ); } void print(std::string str) { @@ -1801,9 +1860,9 @@ struct CheckFunction f_Image_Align.print("Image_Align"); f_Dectect_LackPol.print("Dectect_LackPol"); f_SecondDetect.print("SecondDetect"); - f_AD_Check.print("f_AD_Check"); f_POL_Check.print("f_POL_Check"); f_dege_Det.print("f_dege_Det"); + f_Det_BQ.print("f_Det_BQ"); } std::string GetInfo(std::string str) { @@ -1822,9 +1881,9 @@ struct CheckFunction str123 += f_Image_Align.GetInfo("Image_Align"); str123 += f_Dectect_LackPol.GetInfo("Dectect_LackPol"); str123 += f_SecondDetect.GetInfo("SecondDetect"); - str123 += f_AD_Check.GetInfo("f_AD_Check"); str123 += f_POL_Check.GetInfo("f_POL_Check"); str123 += f_dege_Det.GetInfo("f_dege_Det"); + str123 += f_Det_BQ.GetInfo("f_Det_BQ"); return str123; } }; @@ -2209,6 +2268,9 @@ struct Base_Function_AD_Check AD_Analysisy_Dis analysis_dis; // 距离分析 AD_Analysisy_S analysis_s; // s 标准分析 AD_Analysisy_IOU analysis_iou; // IOU 分析 + AD_Analysisy_Bind analysis_bind; // 绑定分析 + AD_Analysisy_SF analysis_sf; // 同画面参数分析 + Base_Function_AD_Check() { @@ -2224,6 +2286,8 @@ struct Base_Function_AD_Check analysis_dis.Init(); analysis_s.Init(); analysis_iou.Init(); + analysis_bind.Init(); + analysis_sf.Init(); } void copy(Base_Function_AD_Check tem) @@ -2236,17 +2300,21 @@ struct Base_Function_AD_Check this->analysis_dis.copy(tem.analysis_dis); this->analysis_s.copy(tem.analysis_s); this->analysis_iou.copy(tem.analysis_iou); + this->analysis_bind.copy(tem.analysis_bind); + this->analysis_sf.copy(tem.analysis_sf); } void print(std::string str) { - printf("%s>>bOpen %d %s %s %s %s %s %s\n", str.c_str(), + printf("%s>>bOpen %d %s %s %s %s %s %s %s %s %s\n", str.c_str(), bOpen, S_standard_3s.GetInfo("3S").c_str(), S_standard_2s.GetInfo("2S").c_str(), S_standard_1s.GetInfo("1S").c_str(), analysis_num.GetInfo("analysis_num").c_str(), analysis_dis.GetInfo("analysis_dis").c_str(), analysis_s.GetInfo("analysis_s").c_str(), - analysis_iou.GetInfo("analysis_iou").c_str()); + analysis_iou.GetInfo("analysis_iou").c_str(), + analysis_bind.GetInfo("analysis_bind").c_str(), + analysis_sf.GetInfo("analysis_sf").c_str()); } std::string GetInfo(std::string str) { @@ -2260,45 +2328,13 @@ struct Base_Function_AD_Check str123 += analysis_dis.GetInfo("analysis_dis"); str123 += analysis_s.GetInfo("analysis_s"); str123 += analysis_iou.GetInfo("analysis_iou"); + str123 += analysis_bind.GetInfo("analysis_time"); + str123 += analysis_sf.GetInfo("analysis_sf"); return str123; } }; -struct Base_Function_Det_BQ -{ - int BQ_expand; - bool bBQ_AI_Det; // 是否启用标签独立AI检测,汇入主流程分类 - - Base_Function_Det_BQ() - { - Init(); - } - void Init() - { - BQ_expand = 0; - bBQ_AI_Det = false; - } - void copy(Base_Function_Det_BQ tem) - { - this->BQ_expand = tem.BQ_expand; - this->bBQ_AI_Det = tem.bBQ_AI_Det; - } - void print(std::string str) - { - printf("%d BQ_expand %d bBQ_AI_Det %d\n", str.c_str(), - BQ_expand, bBQ_AI_Det); - } - std::string GetInfo(std::string str) - { - char buffer[256]; - sprintf(buffer, "%d BQ_expand %d bBQ_AI_Det %d\n", str.c_str(), - BQ_expand, bBQ_AI_Det); - std::string str123 = buffer; - return str123; - } - -}; // 基础检测功能 struct BaseCheckFunction { @@ -2308,7 +2344,6 @@ struct BaseCheckFunction Base_Function_BigNG bigNG; Base_Function_EdgeChannel edgeChannel; Base_Function_AD_Check ad_check; - Base_Function_Det_BQ Det_BQ; BaseCheckFunction() { Init(); @@ -2321,7 +2356,6 @@ struct BaseCheckFunction bigNG.Init(); edgeChannel.Init(); ad_check.Init(); - Det_BQ.Init(); } void copy(BaseCheckFunction tem) { @@ -2331,7 +2365,6 @@ struct BaseCheckFunction this->bigNG.copy(tem.bigNG); this->edgeChannel.copy(tem.edgeChannel); this->ad_check.copy(tem.ad_check); - this->Det_BQ.copy(tem.Det_BQ); } void print(std::string str) { @@ -2342,7 +2375,6 @@ struct BaseCheckFunction bigNG.print("bigNG"); edgeChannel.print("edgeChannel"); ad_check.print("ad_check"); - Det_BQ.print("Det_BQ"); } std::string GetInfo(std::string str) { @@ -2353,7 +2385,6 @@ struct BaseCheckFunction str123 += bigNG.GetInfo("bigNG"); str123 += edgeChannel.GetInfo("edgeChannel"); str123 += ad_check.GetInfo("ad_check"); - str123 += Det_BQ.GetInfo("Det_BQ"); // str123 += "\n"; return str123; } diff --git a/ConfigModule/src/JsonConfig.cpp b/ConfigModule/src/JsonConfig.cpp index dea8864..b06c3c1 100644 --- a/ConfigModule/src/JsonConfig.cpp +++ b/ConfigModule/src/JsonConfig.cpp @@ -536,6 +536,10 @@ int ChannelFuntonConfigJson::GetFunction(Json::Value value, CheckFunction &funct { function.f_YXDet.strModle = value_f["form"]["YX_Det"]["AI_Model"].asString(); } + if (value_f["form"]["YX_Det"]["minArea"]) + { + function.f_YXDet.minArea = value_f["form"]["YX_Det"]["minArea"].asInt(); + } // function.f_UseUpQX.print("UpQX"); } @@ -980,89 +984,6 @@ int ChannelFuntonConfigJson::GetFunction(Json::Value value, CheckFunction &funct } // getchar(); } - // 暗点检测 - if ("AD_Check" == strCode) - { - auto value_f = value[i]; - // std::cout << value_f << std::endl; - function.f_AD_Check.bOpen = value_f["isOpen"].asBool(); - if (function.f_AD_Check.bOpen) - { - if (value_f["form"]["AD_S_Standard"]["AD_3S_Area"]) - { - function.f_AD_Check.S_standard_3s.area = value_f["form"]["AD_S_Standard"]["AD_3S_Area"].asFloat(); - } - if (value_f["form"]["AD_S_Standard"]["AD_3S_Len"]) - { - function.f_AD_Check.S_standard_3s.len = value_f["form"]["AD_S_Standard"]["AD_3S_Len"].asFloat(); - } - if (value_f["form"]["AD_S_Standard"]["AD_2S_Area"]) - { - function.f_AD_Check.S_standard_2s.area = value_f["form"]["AD_S_Standard"]["AD_2S_Area"].asFloat(); - } - if (value_f["form"]["AD_S_Standard"]["AD_2S_Len"]) - { - function.f_AD_Check.S_standard_2s.len = value_f["form"]["AD_S_Standard"]["AD_2S_Len"].asFloat(); - } - if (value_f["form"]["AD_S_Standard"]["AD_1S_Area"]) - { - function.f_AD_Check.S_standard_1s.area = value_f["form"]["AD_S_Standard"]["AD_1S_Area"].asFloat(); - } - if (value_f["form"]["AD_S_Standard"]["AD_1S_Len"]) - { - function.f_AD_Check.S_standard_1s.len = value_f["form"]["AD_S_Standard"]["AD_1S_Len"].asFloat(); - } - - if (value_f["form"]["AD_Check_Num"]["Open"]) - { - function.f_AD_Check.analysis_num.bOpen = value_f["form"]["AD_Check_Num"]["Open"].asBool(); - } - if (value_f["form"]["AD_Check_Num"]["Num"]) - { - function.f_AD_Check.analysis_num.numT = value_f["form"]["AD_Check_Num"]["Num"].asInt(); - } - - if (value_f["form"]["AD_Check_Dis"]["Open"]) - { - function.f_AD_Check.analysis_dis.bOpen = value_f["form"]["AD_Check_Dis"]["Open"].asBool(); - } - if (value_f["form"]["AD_Check_Dis"]["Dis"]) - { - function.f_AD_Check.analysis_dis.disT = value_f["form"]["AD_Check_Dis"]["Dis"].asFloat(); - } - - if (value_f["form"]["AD_Check_S"]["Open"]) - { - function.f_AD_Check.analysis_s.bOpen = value_f["form"]["AD_Check_S"]["Open"].asBool(); - } - if (value_f["form"]["AD_Check_S"]["S_value"]) - { - function.f_AD_Check.analysis_s.Check_s_Value = value_f["form"]["AD_Check_S"]["S_value"].asInt(); - } - if (value_f["form"]["AD_Check_S"]["NG_3s"]) - { - function.f_AD_Check.analysis_s.NG_3s = value_f["form"]["AD_Check_S"]["NG_3s"].asBool(); - } - if (value_f["form"]["AD_Check_S"]["Num"]) - { - function.f_AD_Check.analysis_s.Check_s_Num = value_f["form"]["AD_Check_S"]["Num"].asInt(); - } - - if (value_f["form"]["AD_Check_IOU"]["AD_IOU"]) - { - function.f_AD_Check.analysis_iou.AD_IOU = value_f["form"]["AD_Check_IOU"]["AD_IOU"].asFloat(); - } - if (value_f["form"]["AD_Check_IOU"]["AD_Expand"]) - { - function.f_AD_Check.analysis_iou.AD_Expand = value_f["form"]["AD_Check_IOU"]["AD_Expand"].asFloat(); - } - } - else - { - function.f_AD_Check.Init(); - } - // getchar(); - } // 异物检测 if ("POL_Cam" == strCode) { @@ -1116,6 +1037,24 @@ int ChannelFuntonConfigJson::GetFunction(Json::Value value, CheckFunction &funct // function.f_markDet.print("UpQX"); // getchar(); } + // 标签配置参数 + if ("Det_BQ" == strCode) + { + auto value_f = value[i]; + // std::cout << value_f << std::endl; + // getchar(); + function.f_Det_BQ.bBQ_AI_Det = value_f["isOpen"].asBool(); + { + if (value_f["form"]["BQ_Param"]["BQ_expand"]) + { + function.f_Det_BQ.BQ_expand = value_f["form"]["BQ_Param"]["BQ_expand"].asInt(); + } + if (value_f["form"]["BQ_Param"]["bsaveAll"]) + { + function.f_Det_BQ.bsaveAll = value_f["form"]["BQ_Param"]["bsaveAll"].asBool(); + } + } + } } } return 0; @@ -1408,6 +1347,7 @@ int BaseFuntonConfigJson::GetFunction(Json::Value value) _config.ad_check.bOpen = value_f["isOpen"].asBool(); if (_config.ad_check.bOpen) { + // S标准 if (value_f["form"]["AD_S_Standard"]["AD_3S_Area"]) { _config.ad_check.S_standard_3s.area = value_f["form"]["AD_S_Standard"]["AD_3S_Area"].asFloat(); @@ -1435,6 +1375,7 @@ int BaseFuntonConfigJson::GetFunction(Json::Value value) _config.ad_check.S_standard_1s.len = value_f["form"]["AD_S_Standard"]["AD_1S_Len"].asFloat(); } + // 数量分析 if (value_f["form"]["AD_Check_Num"]["Open"]) { _config.ad_check.analysis_num.bOpen = value_f["form"]["AD_Check_Num"]["Open"].asBool(); @@ -1444,6 +1385,7 @@ int BaseFuntonConfigJson::GetFunction(Json::Value value) _config.ad_check.analysis_num.numT = value_f["form"]["AD_Check_Num"]["Num"].asInt(); } + // S数量分析 if (value_f["form"]["AD_Check_Dis"]["Open"]) { _config.ad_check.analysis_dis.bOpen = value_f["form"]["AD_Check_Dis"]["Open"].asBool(); @@ -1453,6 +1395,7 @@ int BaseFuntonConfigJson::GetFunction(Json::Value value) _config.ad_check.analysis_dis.disT = value_f["form"]["AD_Check_Dis"]["Dis"].asFloat(); } + // 距离分析 if (value_f["form"]["AD_Check_S"]["Open"]) { _config.ad_check.analysis_s.bOpen = value_f["form"]["AD_Check_S"]["Open"].asBool(); @@ -1470,27 +1413,95 @@ int BaseFuntonConfigJson::GetFunction(Json::Value value) { _config.ad_check.analysis_s.Check_s_Num = value_f["form"]["AD_Check_S"]["Num"].asInt(); } + + // IOU分析 + if (value_f["form"]["AD_Check_IOU"]["AD_IOU"]) + { + _config.ad_check.analysis_iou.AD_IOU = value_f["form"]["AD_Check_IOU"]["AD_IOU"].asFloat(); + } + if (value_f["form"]["AD_Check_IOU"]["AD_Expand"]) + { + _config.ad_check.analysis_iou.AD_Expand = value_f["form"]["AD_Check_IOU"]["AD_Expand"].asFloat(); + } + + // 通道绑定 + if (value_f["form"]["Bind_Channel"]["bUse_bind"]) + { + _config.ad_check.analysis_bind.bUse = value_f["form"]["Bind_Channel"]["bUse_bind"].asBool(); + } + auto value_qx = value_f["form"]["Bind_Channel"]["2s_main_channel"]; + if (value_qx.isArray()) + { + for (int idx = 0; idx < value_qx.size(); idx++) + { + std::string channel = value_qx[idx].asString(); + _config.ad_check.analysis_bind.main_channel_2s.push_back(channel); + } + } + value_qx = value_f["form"]["Bind_Channel"]["2s_second_channel"]; + if (value_qx.isArray()) + { + for (int idx = 0; idx < value_qx.size(); idx++) + { + std::string channel = value_qx[idx].asString(); + _config.ad_check.analysis_bind.second_channel_2s.push_back(channel); + } + } + + value_qx = value_f["form"]["Bind_Channel"]["3s_main_channel"]; + if (value_qx.isArray()) + { + for (int idx = 0; idx < value_qx.size(); idx++) + { + std::string channel = value_qx[idx].asString(); + _config.ad_check.analysis_bind.main_channel_3s.push_back(channel); + } + } + value_qx = value_f["form"]["Bind_Channel"]["3s_second_channel"]; + if (value_qx.isArray()) + { + for (int idx = 0; idx < value_qx.size(); idx++) + { + std::string channel = value_qx[idx].asString(); + _config.ad_check.analysis_bind.second_channel_3s.push_back(channel); + } + } + + value_qx = value_f["form"]["Bind_Channel"]["correlated_channels"]; + if (value_qx.isArray()) + { + for (int idx = 0; idx < value_qx.size(); idx++) + { + std::string channel = value_qx[idx].asString(); + _config.ad_check.analysis_bind.correlated_channels.push_back(channel); + } + } + + // 同画面分析 + value_qx = value_f["form"]["Single_Channel"]["s_channel"]; + if (value_qx.isArray()) + { + for (int idx = 0; idx < value_qx.size(); idx++) + { + std::string channel = value_qx[idx].asString(); + _config.ad_check.analysis_sf.s_sf.push_back(channel); + } + } + value_qx = value_f["form"]["Single_Channel"]["region1_channel"]; + if (value_qx.isArray()) + { + for (int idx = 0; idx < value_qx.size(); idx++) + { + std::string channel = value_qx[idx].asString(); + _config.ad_check.analysis_sf.region_sf.push_back(channel); + } + } } else { _config.ad_check.Init(); } } - // 标签配置参数 - if ("Det_BQ" == strCode) - { - auto value_f = value; - // std::cout << value_f << std::endl; - // getchar(); - _config.Det_BQ.bBQ_AI_Det = value_f["isOpen"].asBool(); - { - if (value_f["form"]["bShield_BQ"]["BQ_expand"]) - { - _config.Det_BQ.BQ_expand = value_f["form"]["bShield_BQ"]["BQ_expand"].asInt(); - } - } - // _config.edgeDet.print("edgeDet"); - // getchar(); - } + return 0; }