@ -1960,105 +1960,95 @@ int ImgCheckAnalysisy::AI_Detect_Thread(const cv::Mat &img, cv::Mat &ResultImg)
long t1 , t2 , t3 ;
long t1 , t2 , t3 ;
t1 = CheckUtil : : getcurTime ( ) ;
t1 = CheckUtil : : getcurTime ( ) ;
SmallRoiList . clear ( ) ;
SmallRoiList . erase ( SmallRoiList . begin ( ) , SmallRoiList . end ( ) ) ;
cv : : Rect cutRoi ;
cutRoi . x = 0 ;
cutRoi . y = 0 ;
cutRoi . width = img . cols - 0 ;
cutRoi . height = img . rows - 0 ;
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 ( img . empty ( ) | | deal_image_width < = 0 | | deal_image_height < = 0 )
int re = CheckUtil : : cutSmallImg ( img , SmallRoiList , cutRoi , deal_image_width , deal_image_height , 0 , 0 ) ;
m_pdetlog - > AddCheckstr ( PrintLevel_1 , DET_LOG_LEVEL_3 , strBaseLog , " cutSmallImg Num %d " , SmallRoiList . size ( ) ) ;
if ( re ! = 0 | | SmallRoiList . size ( ) < = 0 )
{
{
m_pdetlog - > AddCheckstr ( PrintLevel_1 , DET_LOG_LEVEL_3 , strBaseLog , " cutSmallImg error %d" , re ) ;
m_pdetlog - > AddCheckstr ( PrintLevel_1 , DET_LOG_LEVEL_3 , strBaseLog , " img empty %d model input size error [w %d h %d] " , img . empty ( ) , deal_image_width , deal_image_height ) ;
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 " ) ;
return re ;
return 1 ;
/* code */
}
}
// 临时存图
// 不再拆分小图:整图 resize 到模型输入尺寸推理,输出 mask 再 resize 回原图尺寸
if ( DetImgInfo_shareP - > bsaveProcessImg )
cv : : Mat inputImg ;
{
cv : : resize ( img , inputImg , cv : : Size ( deal_image_width , deal_image_height ) ) ;
// 模型输入要求单通道;原图为彩色时按 BGR 顺序转灰度
cv : : Mat imshow = img . clone ( ) ; // 保持输入通道,不再灰度转假彩
if ( inputImg . channels ( ) = = 3 )
for ( int i = 0 ; i < SmallRoiList . size ( ) ; i + + )
{
{
cv : : rectangle ( imshow , SmallRoiList . at ( i ) , CheckUtil : : GetDrawColor ( imshow , cv : : Scalar ( 0 , 0 , 255 ) ) , 3 ) ;
cv : : cvtColor ( inputImg , inputImg , cv : : COLOR_BGR2GRAY ) ;
}
}
cv : : imwrite ( DetImgInfo_shareP - > strChannel + " _AI_Det_ROI.jpg " , imshow ) ;
else if ( inputImg . channels ( ) = = 4 )
{
cv : : cvtColor ( inputImg , inputImg , cv : : COLOR_BGRA2GRAY ) ;
}
}
ResultImg = cv : : Mat : : zeros ( img . size ( ) , CV_8UC1 ) ;
// 临时存图:模型输入
if ( DetImgInfo_shareP - > bsaveProcessImg )
const int totalTasks = SmallRoiList . size ( ) ;
int submitted = 0 ;
int completed = 0 ;
// std::string str_Root = m_strRootPath + pDetConfig->strProductID + "_" + pDetConfig->strchannel + "_";
t2 = CheckUtil : : getcurTime ( ) ;
while ( completed < totalTasks )
{
// 如果任务还没提交完,且当前处理任务数 < 2, 提交新任务
if ( submitted < totalTasks & & runner - > GetProcessingCount ( ) < 10 )
{
{
cv : : imwrite ( DetImgInfo_shareP - > strCameraName + " _AI_Det_in.png " , inputImg ) ;
}
// 提交整图推理任务并等待结果
std : : shared_ptr < AIMulThreadRunBase : : AITask > task = std : : make_shared < AIMulThreadRunBase : : AITask > ( ) ;
std : : shared_ptr < AIMulThreadRunBase : : AITask > task = std : : make_shared < AIMulThreadRunBase : : AITask > ( ) ;
task - > id = completed ;
task - > id = 0 ;
task - > roi = SmallRoiList. at ( submitted ) ;
task - > roi = cv : : Rect ( 0 , 0 , img . cols , img . rows ) ;
task - > input = i mg( SmallRoiList . at ( submitted ) ) . clone ( ) ;
task - > input = inputImg ;
task - > output = std : : make_shared < cv : : Mat > ( ) ;
task - > output = std : : make_shared < cv : : Mat > ( ) ;
task - > engine = pAIDet ;
task - > engine = pAIDet ;
t2 = CheckUtil : : getcurTime ( ) ;
runner - > SubmitTask ( task ) ;
runner - > SubmitTask ( task ) ;
submitted + + ;
}
// 尝试取结果
std : : shared_ptr < AIMulThreadRunBase : : AITask > result ;
std : : shared_ptr < AIMulThreadRunBase : : AITask > result ;
if ( runner - > PopResult ( result ) )
while ( ! runner - > PopResult ( result ) )
{
{
std : : this_thread : : sleep_for ( std : : chrono : : milliseconds ( 1 ) ) ;
}
t3 = CheckUtil : : getcurTime ( ) ;
cv : : Mat & outimg = * ( result - > output ) ; // 模型输出尺寸的 mask
// 输出 mask resize 回原图尺寸: mask 为缺陷二值图,用最近邻插值(避免插值晕圈被 Blob 当作缺陷多检出)
ResultImg = cv : : Mat : : zeros ( img . size ( ) , CV_8UC1 ) ;
if ( ! outimg . empty ( ) )
{
{
std : : lock_guard < std : : mutex > lock ( mtx_AIMaskImgBLobQueue ) ;
cv : : resize ( outimg , ResultImg , img . size ( ) , 0 , 0 , cv : : INTER_NEAREST ) ;
m_AIMaskImgBLobQueue . push ( result ) ;
}
else
{
m_pdetlog - > AddCheckstr ( PrintLevel_1 , DET_LOG_LEVEL_3 , strBaseLog , " model output mask is empty, result mask all zero " ) ;
}
}
cv : : Mat & outimg = * ( result - > output ) ;
m_pdetlog - > AddCheckstr ( PrintLevel_1 , DET_LOG_LEVEL_3 , strBaseLog , " AI Run Time: sum %ld pre %ld Run %ld model in [w %d h %d] mask [w %d h %d] -> [w %d h %d] " ,
if ( ! outimg . empty ( ) )
t3 - t1 , t2 - t1 , t3 - t2 , deal_image_width , deal_image_height , outimg . cols , outimg . rows , img . cols , img . rows ) ;
// 供 AIMaskDet 标记 mask 有缺陷的行(加速 Blob 计算):整图坐标 + 整图尺寸
{
{
outimg . copyTo ( ResultImg ( result - > roi ) , outimg ) ;
std : : shared_ptr < AIMulThreadRunBase : : AITask > maskTask = std : : make_shared < AIMulThreadRunBase : : AITask > ( ) ;
maskTask - > id = 0 ;
maskTask - > roi = cv : : Rect ( 0 , 0 , img . cols , img . rows ) ;
maskTask - > input = result - > input ;
maskTask - > output = std : : make_shared < cv : : Mat > ( ResultImg ) ;
maskTask - > engine = pAIDet ;
std : : lock_guard < std : : mutex > lock ( mtx_AIMaskImgBLobQueue ) ;
m_AIMaskImgBLobQueue . push ( maskTask ) ;
}
}
// 留存 AI 输入/输出(模型尺寸),供缺陷结果按中心点取 AI 图(GetAIDetImg)
{
{
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 = cv: : Rect ( 0 , 0 , img . cols , img . rows ) ;
temAIresult - > AI_inImg = result - > input ;
temAIresult - > AI_inImg = result - > input ;
temAIresult - > AI_mask = outimg ;
temAIresult - > AI_mask = outimg ;
m_pImageAllResult - > AI_Qx_MaskList . push_back ( temAIresult ) ;
m_pImageAllResult - > AI_Qx_MaskList . push_back ( temAIresult ) ;
}
}
completed + + ;
}
else
{
std : : this_thread : : sleep_for ( std : : chrono : : milliseconds ( 1 ) ) ;
}
}
t3 = CheckUtil : : getcurTime ( ) ;
float mean_AI = ( t3 - t2 ) / SmallRoiList . 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_0 , DET_LOG_LEVEL_3 , strBaseLog , " AI_Detect End " ) ;
m_pdetlog - > AddCheckstr ( PrintLevel_0 , DET_LOG_LEVEL_3 , strBaseLog , " AI_Detect End " ) ;
// 临时存图
// 临时存图
if ( DetImgInfo_shareP - > bsaveProcessImg )
if ( DetImgInfo_shareP - > bsaveProcessImg )
{
{
cv : : imwrite ( DetImgInfo_shareP - > strC hannel + " _AI_mask.png " , ResultImg ) ;
cv : : imwrite ( DetImgInfo_shareP - > strCameraName + " _AI_mask.png " , ResultImg ) ;
}
}
// getchar();
// getchar();