@ -1297,12 +1297,10 @@ 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 )
{
{
std : : shared_ptr < AIModel_Base > pAIDet ;
// 依次使用多个检测模型,各模型输出 mask 取并集作为最终 outmask
// printf("=====>>>>AI_Detect_Thread m_strCurDetChannel %s \n", m_strCurDetChannel.c_str());
std : : vector < std : : shared_ptr < AIModel_Base > > pAIDetList ;
{
pAIDetList . push_back ( AI_Factory - > Defect ) ;
// printf("=====>>>>AI_Detect_Thread USE CA %s \n", m_strCurDetChannel.c_str());
pAIDetList . push_back ( AI_Factory - > Defect_QueXi ) ;
pAIDet = AI_Factory - > Defect ;
}
std : : string strBaseLog = " AI_Detect " ;
std : : string strBaseLog = " AI_Detect " ;
@ -1318,8 +1316,8 @@ int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg)
cutRoi . width = img . cols - 0 ;
cutRoi . width = img . cols - 0 ;
cutRoi . height = img . rows - 0 ;
cutRoi . height = img . rows - 0 ;
int deal_image_width = pAIDet - > input_0 . width ;
int deal_image_width = pAIDet List[ 0 ] - > input_0 . width ;
int deal_image_height = pAIDet - > input_0 . height ;
int deal_image_height = pAIDet List[ 0 ] - > input_0 . height ;
int re = CheckUtil : : cutSmallImg ( img , SmallRoiList , cutRoi , deal_image_width , deal_image_height , 0 , 0 ) ;
int re = CheckUtil : : cutSmallImg ( img , SmallRoiList , cutRoi , deal_image_width , deal_image_height , 0 , 0 ) ;
@ -1355,19 +1353,24 @@ int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg)
ResultImg = cv : : Mat : : zeros ( img . size ( ) , CV_8UC1 ) ;
ResultImg = cv : : Mat : : zeros ( img . size ( ) , CV_8UC1 ) ;
const int totalTasks = SmallRoiList . size ( ) ;
const int totalTasks = SmallRoiList . size ( ) ;
int submitted = 0 ;
int completed = 0 ;
// std::string str_Root = m_strRootPath + pDetConfig->strProductID + "_" + pDetConfig->strchannel + "_";
// std::string str_Root = m_strRootPath + pDetConfig->strProductID + "_" + pDetConfig->strchannel + "_";
t2 = CheckUtil : : getcurTime ( ) ;
t2 = CheckUtil : : getcurTime ( ) ;
// 依次用多个模型做检测,所有模型输出的 mask 取并集作为最终 outmask
for ( size_t m = 0 ; m < pAIDetList . size ( ) ; m + + )
{
std : : shared_ptr < AIModel_Base > pAIDet = pAIDetList [ m ] ;
int submitted = 0 ;
int completed = 0 ;
while ( completed < totalTasks )
while ( completed < totalTasks )
{
{
// 如果任务还没提交完,且当前处理任务数 < 2, 提交新任务
// 如果任务还没提交完,且当前处理任务数 < 10 ,提交新任务
if ( submitted < totalTasks & & runner - > GetProcessingCount ( ) < 10 )
if ( submitted < totalTasks & & runner - > GetProcessingCount ( ) < 10 )
{
{
std : : shared_ptr < AIMulThreadRunBase : : AITask > task = std : : make_shared < AIMulThreadRunBase : : AITask > ( ) ;
std : : shared_ptr < AIMulThreadRunBase : : AITask > task = std : : make_shared < AIMulThreadRunBase : : AITask > ( ) ;
task - > id = comple ted;
task - > id = submit ted;
task - > roi = SmallRoiList . at ( submitted ) ;
task - > roi = SmallRoiList . at ( submitted ) ;
task - > input = img ( SmallRoiList . at ( submitted ) ) . clone ( ) ;
task - > input = img ( SmallRoiList . at ( submitted ) ) . clone ( ) ;
task - > output = std : : make_shared < cv : : Mat > ( ) ;
task - > output = std : : make_shared < cv : : Mat > ( ) ;
@ -1390,13 +1393,28 @@ int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg)
cv : : Mat & outimg = * ( result - > output ) ;
cv : : Mat & outimg = * ( result - > output ) ;
if ( ! outimg . empty ( ) )
if ( ! outimg . empty ( ) )
{
{
outimg . copyTo ( ResultImg ( result - > roi ) , outimg ) ;
// 多个模型的结果取并集
cv : : Mat roiMat = ResultImg ( result - > roi ) ;
cv : : bitwise_or ( roiMat , outimg , roiMat ) ;
}
// 同一 roi 的多个模型结果取并集后存入 AI_Qx_MaskList
bool bFind = false ;
for ( auto & item : m_pImageAllResult - > AI_Qx_MaskList )
{
if ( item - > roi = = result - > roi )
{
cv : : bitwise_or ( item - > AI_mask , outimg , item - > AI_mask ) ;
bFind = true ;
break ;
}
}
}
if ( ! bFind )
{
{
std : : shared_ptr < ImageAllResult : : AI_Det_MaskImg > temAIresult = std : : make_shared < ImageAllResult : : AI_Det_MaskImg > ( ) ;
std : : shared_ptr < ImageAllResult : : AI_Det_MaskImg > temAIresult = std : : make_shared < ImageAllResult : : AI_Det_MaskImg > ( ) ;
temAIresult - > roi = result - > roi ;
temAIresult - > roi = result - > roi ;
temAIresult - > AI_inImg = result - > input ;
temAIresult - > AI_inImg = result - > input ;
temAIresult - > AI_mask = outimg ;
temAIresult - > AI_mask = outimg . clone ( ) ;
m_pImageAllResult - > AI_Qx_MaskList . push_back ( temAIresult ) ;
m_pImageAllResult - > AI_Qx_MaskList . push_back ( temAIresult ) ;
}
}
completed + + ;
completed + + ;
@ -1406,9 +1424,10 @@ int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg)
std : : this_thread : : sleep_for ( std : : chrono : : milliseconds ( 1 ) ) ;
std : : this_thread : : sleep_for ( std : : chrono : : milliseconds ( 1 ) ) ;
}
}
}
}
}
t3 = CheckUtil : : getcurTime ( ) ;
t3 = CheckUtil : : getcurTime ( ) ;
float mean_AI = ( t3 - t2 ) / SmallRoiList . size ( ) ;
float mean_AI = ( t3 - t2 ) / ( SmallRoiList . size ( ) * pAIDetList . size ( ) ) ;
m_pdetlog - > AddCheckstr ( PrintLevel_1 , DET_LOG_LEVEL_3 , strBaseLog , " AI Run Time: sum %ld pre %ld Run %ld mean One Small Img %f " , t3 - t1 , t2 - t1 , t3 - t2 , mean_AI ) ;
m_pdetlog - > AddCheckstr ( PrintLevel_1 , DET_LOG_LEVEL_3 , strBaseLog , " AI Run Time: sum %ld pre %ld Run %ld mean One Small Img %f " , t3 - t1 , t2 - t1 , t3 - t2 , mean_AI ) ;
m_pdetlog - > AddCheckstr ( PrintLevel_0 , DET_LOG_LEVEL_3 , strBaseLog , " AI_Detect End " ) ;
m_pdetlog - > AddCheckstr ( PrintLevel_0 , DET_LOG_LEVEL_3 , strBaseLog , " AI_Detect End " ) ;