diff --git a/AlgorithmModule/src/ImgCheckAnalysisy.cpp b/AlgorithmModule/src/ImgCheckAnalysisy.cpp index a861ff7..9f9c88f 100644 --- a/AlgorithmModule/src/ImgCheckAnalysisy.cpp +++ b/AlgorithmModule/src/ImgCheckAnalysisy.cpp @@ -2313,12 +2313,19 @@ int ImgCheckAnalysisy::AI_Detect_BQ() 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() < 10) + // 提交任务:满足并发限制和待处理限制 + if (submitted < totalTasks + && runner->GetProcessingCount() < MAX_CONCURRENT + && (submitted - completed) < MAX_PENDING) { std::shared_ptr task = std::make_shared(); task->id = submitted; @@ -2878,12 +2885,18 @@ int ImgCheckAnalysisy::AI_Detect_QX() cv::Mat shieldImg = m_pImageAllResult->AI_shieldImg; cv::Mat AIresultMask = pDetAIResult->AI_MaskImg; + // 资源控制:限制最大并发数和最大待处理数,防止GPU/CPU内存压力导致推理异常 + const int MAX_CONCURRENT = 5; // 最大同时在推理中的任务数(降低GPU并发压力) + const int MAX_PENDING = 5; // submitted - completed 最大差值(限制内存中待处理结果数) + t2 = CheckUtil::getcurTime(); while (completed < totalTasks) { - // 如果任务还没提交完,且当前处理任务数 < 2,提交新任务 - if (submitted < totalTasks && runner->GetProcessingCount() < 10) + // 如果任务还没提交完,且满足并发限制和待处理限制,提交新任务 + if (submitted < totalTasks + && runner->GetProcessingCount() < MAX_CONCURRENT + && (submitted - completed) < MAX_PENDING) { std::shared_ptr task = std::make_shared(); @@ -2934,6 +2947,8 @@ int ImgCheckAnalysisy::AI_Detect_QX() AIresult.copyTo(AIresultMask(result->roi), AIresult); } + // 仅在调试模式下保存 AI_Qx_MaskList,并限制数量 + if (DetImgInfo_shareP->bDebugsaveImg && pDetAIResult->AI_Qx_MaskList.size() < 200) { std::shared_ptr temAIresult = std::make_shared(); temAIresult->roi = result->roi; @@ -3039,11 +3054,18 @@ int ImgCheckAnalysisy::AI_Detect_127Cell() pDetAIResult->AI_MaskImg = cv::Mat::zeros(AI_detImage.size(), CV_8UC1); cv::Mat shieldImg = m_pImageAllResult->AI_shieldImg; cv::Mat AIresultMask = pDetAIResult->AI_MaskImg; + + // 资源控制:限制最大并发数和最大待处理数 + const int MAX_CONCURRENT = 5; + const int MAX_PENDING = 5; + t2 = CheckUtil::getcurTime(); while (completed < totalTasks) { - // 如果任务还没提交完,且当前处理任务数 < 2,提交新任务 - if (submitted < totalTasks && runner->GetProcessingCount() < 10) + // 如果任务还没提交完,且满足并发限制和待处理限制,提交新任务 + if (submitted < totalTasks + && runner->GetProcessingCount() < MAX_CONCURRENT + && (submitted - completed) < MAX_PENDING) { std::shared_ptr task = std::make_shared(); @@ -3111,6 +3133,24 @@ int ImgCheckAnalysisy::AI_Detect_127Cell() pDetAIResult->blobDetParam->AIMaskImgBLobQueue.push(temAIresult); } } + // AI检测残点图存图 + if (DetImgInfo_shareP->bDebugsaveImg) + { + bool bNeedSave = false; + std::string roi_ext = "[" + std::to_string(result->roi.x) + "," + std::to_string(result->roi.y) + "]"; + + bNeedSave = true; + + if (bNeedSave && !AIresult.empty()) + { + std::string strSaveDir = "/home/aidlux/BOE/FOG/AI_Detect_127/" + DetImgInfo_shareP->strImgProductID + "/"; + CheckUtil::CreateDir(strSaveDir); + std::string strSavePath_in = strSaveDir + m_strCurDetChannel +"_"+ roi_ext + "_"+ "in" + ".png"; + std::string strSavePath_out = strSaveDir + m_strCurDetChannel +"_"+ roi_ext + "_"+ "out" + ".png"; + cv::imwrite(strSavePath_in, result->input); + cv::imwrite(strSavePath_out, AIresult); + } + } } completed++; }