update 完善缺陷列表映射

dev_lsy
liusiyang 3 weeks ago
parent 2e9abdf857
commit 6357f12f79

@ -9,35 +9,21 @@
#ifndef AICommonDefine_H_
#define AICommonDefine_H_
// AI缺陷分类缺陷的种类
// AI缺陷分类缺陷的种类(只含主检测+分类的缺陷;支架偏移/支架缺失/把手缺失为传统算法检出,铜箔标签(TBBQ)由标签检测上报,均不走AI分类)
enum AI_CLass_QX_NAME_
{
AI_CLass_QX_NAME_aotudian, // 凹凸点
AI_CLass_QX_NAME_other, // 其他
AI_CLass_QX_NAME_line, // 线状
AI_CLass_QX_NAME_zangwu, // 脏污
AI_CLass_QX_NAME_dianzhuang, // 点状
AI_CLass_QX_NAME_posun, // 破损
AI_CLass_QX_NAME_xianwei, // 纤维
AI_CLass_QX_NAME_shuizi, // 水渍
AI_CLass_QX_NAME_danban, // 淡斑
AI_CLass_QX_NAME_fuchen, // 浮尘
AI_CLass_QX_NAME_CGMark, // 把手标记
AI_CLass_QX_NAME_BQBMark, // 补强板标记
AI_CLass_QX_NAME_TBMark, // 铜箔标记
AI_CLass_QX_NAME_count,
};
// 缺陷项对应在参数中的名称
// 缺陷项对应在参数中的名称(顺序需与分类模型输出的label顺序一致)
static const std::string AI_CLass_QX_NAME_Names[] =
{
"aotudian",
"qx",
"line",
"zangwu",
"dianzhuang",
"posun",
"xianwei",
"shuizi",
"danban",
"fuchen",
"CGMark",
"BQBMark",
"TBMark",
};
#endif

@ -44,23 +44,17 @@ struct VERSION_INFO
int ResultVersion = RESULT_VERSION;
int InterfaceVersion = 0;
};
// 检测错误代码
// 检测错误代码(与缺陷列表一致;支架偏移/支架缺失/把手缺失为传统算法检出,无AI分类)
enum ERROR_TYPE_
{
ERROR_TYPE_OK, // 1 疑是
ERROR_TYPE_aotudian, // 2 凹凸点
ERROR_TYPE_other, // 3 其他
ERROR_TYPE_line, // 4 线状
ERROR_TYPE_zangwu, // 5 脏污
ERROR_TYPE_edge, // 6 边缘
ERROR_TYPE_ymhs, // 7 研磨划伤
ERROR_TYPE_dianzhuang, // 8 点状
ERROR_TYPE_posun, // 9 破损
ERROR_TYPE_xianwei, // 10 纤维
ERROR_TYPE_shuizi, // 11 水渍
ERROR_TYPE_danban, // 12 淡斑
ERROR_TYPE_fuchen, // 13 浮尘
ERROR_TYPE_tag, // 14 标签
ERROR_TYPE_OK, // 0 好品
ERROR_TYPE_ZJ_PianYi, // 1 支架偏移
ERROR_TYPE_ZJ_QueShi, // 2 支架缺失
ERROR_TYPE_CGMo_QueShi, // 3 把手缺失
ERROR_TYPE_CGMark, // 4 把手标记
ERROR_TYPE_BQBMark, // 5 补强板标记
ERROR_TYPE_TBBQ, // 6 铜箔标签
ERROR_TYPE_TBMark, // 7 铜箔标记
ERROR_TYPE_COUNT,
};
extern std::vector<std::string> QX_Result_Names;

@ -445,8 +445,8 @@ int ImageResultJudge::ResultJudge(std::shared_ptr<ImageAllResult> pImageResult)
}
}
// 标签缺陷:检测到标签直接判 NG
if (config_qx_type == CONFIG_QX_NAME_cell_tag)
// 标签缺陷(TBBQ):检测到标签直接判 NG
if (config_qx_type == CONFIG_QX_NAME_cell_TBBQ)
{
bNG_Status = true;
Judge_Status = true;
@ -1132,75 +1132,13 @@ int ImageResultJudge::addInDrawBlob(int errortype, int blobidx, QX_ERROR_INFO_ *
int ImageResultJudge::ConfigTypeToResultType(int nconfigType)
{
bool bdesc = false;
int resultError_type = ERROR_TYPE_OK;
if(nconfigType < CONFIG_QX_NAME_Names.size())
// 缺陷类型(CONFIG_QX_NAME_)与结果列表(QX_Result_Names/QX_Result_Code)按配置顺序一一对应,直接按下标映射
if (nconfigType >= 0 && nconfigType < CONFIG_QX_NAME_count &&
nconfigType < (int)QX_Result_Names.size())
{
string cqn = CONFIG_QX_NAME_Names[nconfigType];
for(int i = 0; i < m_FlawCodeList.size(); i++)
{
for(int j = 0; j < m_FlawCodeList.at(i).config_flaw_name.size(); j++)
{
if(cqn == m_FlawCodeList.at(i).config_flaw_name[j])
{
resultError_type = i;
bdesc = true;
break;
}
}
}
}
// 如果描述没有配置,用默认值
if(!bdesc)
{
switch (nconfigType)
{
case CONFIG_QX_NAME_cell_aotudian:
resultError_type = ERROR_TYPE_aotudian;
break;
case CONFIG_QX_NAME_cell_other:
resultError_type = ERROR_TYPE_other;
break;
case CONFIG_QX_NAME_cell_line:
resultError_type = ERROR_TYPE_line;
break;
case CONFIG_QX_NAME_cell_zangwu:
resultError_type = ERROR_TYPE_zangwu;
break;
case CONFIG_QX_NAME_cell_edge:
resultError_type = ERROR_TYPE_edge;
break;
case CONFIG_QX_NAME_cell_ymhs:
resultError_type = ERROR_TYPE_ymhs;
break;
case CONFIG_QX_NAME_cell_dianzhuang:
resultError_type = ERROR_TYPE_dianzhuang;
break;
case CONFIG_QX_NAME_cell_posun:
resultError_type = ERROR_TYPE_posun;
break;
case CONFIG_QX_NAME_cell_xianwei:
resultError_type = ERROR_TYPE_xianwei;
break;
case CONFIG_QX_NAME_cell_shuizi:
resultError_type = ERROR_TYPE_shuizi;
break;
case CONFIG_QX_NAME_cell_danban:
resultError_type = ERROR_TYPE_danban;
break;
case CONFIG_QX_NAME_cell_fuchen:
resultError_type = ERROR_TYPE_fuchen;
break;
case CONFIG_QX_NAME_cell_tag:
resultError_type = ERROR_TYPE_tag;
break;
default:
break;
}
return nconfigType;
}
return resultError_type;
return ERROR_TYPE_OK;
}
int ImageResultJudge::sendTask(std::shared_ptr<DrawInfo> task)

@ -1042,7 +1042,7 @@ int ImgCheckAnalysisy::CheckRun()
temerror.flen = (w > h ? w : h) * m_fImgage_Scale_X;
temerror.fbreadth = (w > h ? h : w) * m_fImgage_Scale_Y;
temerror.nconfig_qx_type = CONFIG_QX_NAME_support_offset;
temerror.nconfig_qx_type = CONFIG_QX_NAME_cell_ZJ_PianYi;
temerror.qx_name = CONFIG_QX_NAME_Names[temerror.nconfig_qx_type];
temerror.result = QX_RESULT_TYPE_NG;
temerror.result_name = QX_RESULT_TYPE_Names[QX_RESULT_TYPE_NG];
@ -1101,8 +1101,8 @@ int ImgCheckAnalysisy::CheckRun()
float h = roi.height;
temerror.flen = (w > h ? w : h) * m_fImgage_Scale_X;
temerror.fbreadth = (w > h ? h : w) * m_fImgage_Scale_Y;
temerror.nconfig_qx_type = CONFIG_QX_NAME_handle_loss;
temerror.qx_name = CONFIG_QX_NAME_Names[CONFIG_QX_NAME_handle_loss];
temerror.nconfig_qx_type = CONFIG_QX_NAME_cell_CGMo_QueShi;
temerror.qx_name = CONFIG_QX_NAME_Names[CONFIG_QX_NAME_cell_CGMo_QueShi];
temerror.result = QX_RESULT_TYPE_NG;
temerror.result_name = QX_RESULT_TYPE_Names[QX_RESULT_TYPE_NG];
@ -1158,8 +1158,8 @@ int ImgCheckAnalysisy::CheckRun()
float th = tagRoi.size.height;
temerror.flen = (tw > th ? tw : th) * m_fImgage_Scale_X;
temerror.fbreadth = (tw > th ? th : tw) * m_fImgage_Scale_Y;
temerror.nconfig_qx_type = CONFIG_QX_NAME_cell_tag;
temerror.qx_name = CONFIG_QX_NAME_Names[CONFIG_QX_NAME_cell_tag];
temerror.nconfig_qx_type = CONFIG_QX_NAME_cell_TBBQ;
temerror.qx_name = CONFIG_QX_NAME_Names[CONFIG_QX_NAME_cell_TBBQ];
temerror.result = QX_RESULT_TYPE_NG;
temerror.result_name = QX_RESULT_TYPE_Names[QX_RESULT_TYPE_NG];
@ -2091,7 +2091,8 @@ int ImgCheckAnalysisy::AI_QX_Class_Thread()
ERROR_DOTS_BLOB_DATA *pblob = &blobs.blobTab[submitted];
if (pblob->ErrType == ERR_TYPE_2)
{
pblob->AIclasstype = CONFIG_QX_NAME_cell_ymhs;
// ERR_TYPE_2不参与分类,按默认AI类别(把手标记)处理
pblob->AIclasstype = CONFIG_QX_NAME_cell_CGMark;
submitted++;
completed++;
continue;
@ -2135,50 +2136,23 @@ int ImgCheckAnalysisy::AI_QX_Class_Thread()
int temClass = result->cls_label;
int cls_num = 0;
// 分类模型label顺序:0-把手标记(CGMark) 1-补强板标记(BQBMark) 2-铜箔标记(TBMark)
switch (temClass)
{
case 0:
cls_num = AI_CLass_QX_NAME_aotudian;
cls_num = AI_CLass_QX_NAME_CGMark;
break;
case 1:
cls_num = AI_CLass_QX_NAME_other;
cls_num = AI_CLass_QX_NAME_BQBMark;
break;
case 2:
cls_num = AI_CLass_QX_NAME_line;
break;
case 3:
cls_num = AI_CLass_QX_NAME_zangwu;
break;
case 4:
cls_num = AI_CLass_QX_NAME_dianzhuang;
break;
case 5:
cls_num = AI_CLass_QX_NAME_posun;
break;
case 6:
cls_num = AI_CLass_QX_NAME_xianwei;
break;
case 7:
cls_num = AI_CLass_QX_NAME_shuizi;
break;
case 8:
cls_num = AI_CLass_QX_NAME_danban;
break;
case 9:
cls_num = AI_CLass_QX_NAME_fuchen;
cls_num = AI_CLass_QX_NAME_TBMark;
break;
default:
cls_num = AI_CLass_QX_NAME_zangwu;
cls_num = AI_CLass_QX_NAME_CGMark;
break;
}
@ -2419,38 +2393,18 @@ int ImgCheckAnalysisy::DrawResult_Step_1()
int ImgCheckAnalysisy::AIClassTypeToConfigType(int nAIQXType)
{
int resultError_type = CONFIG_QX_NAME_cell_aotudian;
// 只有主检测+分类的缺陷在映射表中;支架偏移/支架缺失/把手缺失(传统检出)、铜箔标签(标签检测)不走AI分类
int resultError_type = CONFIG_QX_NAME_cell_CGMark;
switch (nAIQXType)
{
case AI_CLass_QX_NAME_aotudian:
resultError_type = CONFIG_QX_NAME_cell_aotudian;
break;
case AI_CLass_QX_NAME_other:
resultError_type = CONFIG_QX_NAME_cell_other;
break;
case AI_CLass_QX_NAME_line:
resultError_type = CONFIG_QX_NAME_cell_line;
break;
case AI_CLass_QX_NAME_zangwu:
resultError_type = CONFIG_QX_NAME_cell_zangwu;
break;
case AI_CLass_QX_NAME_dianzhuang:
resultError_type = CONFIG_QX_NAME_cell_dianzhuang;
break;
case AI_CLass_QX_NAME_posun:
resultError_type = CONFIG_QX_NAME_cell_posun;
break;
case AI_CLass_QX_NAME_xianwei:
resultError_type = CONFIG_QX_NAME_cell_xianwei;
break;
case AI_CLass_QX_NAME_shuizi:
resultError_type = CONFIG_QX_NAME_cell_shuizi;
case AI_CLass_QX_NAME_CGMark:
resultError_type = CONFIG_QX_NAME_cell_CGMark;
break;
case AI_CLass_QX_NAME_danban:
resultError_type = CONFIG_QX_NAME_cell_danban;
case AI_CLass_QX_NAME_BQBMark:
resultError_type = CONFIG_QX_NAME_cell_BQBMark;
break;
case AI_CLass_QX_NAME_fuchen:
resultError_type = CONFIG_QX_NAME_cell_fuchen;
case AI_CLass_QX_NAME_TBMark:
resultError_type = CONFIG_QX_NAME_cell_TBMark;
break;
default:
break;

@ -39,43 +39,25 @@ static const std::string WHITE_BLCAK_Names[] =
// 检测缺陷的种类
enum CONFIG_QX_NAME_
{
CONFIG_QX_NAME_cell_aotudian, // 分类 凹凸点
CONFIG_QX_NAME_cell_other, // 分类 其他
CONFIG_QX_NAME_cell_line, // 分类 线状
CONFIG_QX_NAME_cell_zangwu, // 分类 脏污
CONFIG_QX_NAME_cell_edge, // 分类 边缘
CONFIG_QX_NAME_cell_ymhs, // 分类 异物
CONFIG_QX_NAME_cell_dianzhuang, // 分类 点状
CONFIG_QX_NAME_cell_posun, // 分类 破损
CONFIG_QX_NAME_cell_xianwei, // 分类 纤维
CONFIG_QX_NAME_cell_shuizi, // 分类 水渍
CONFIG_QX_NAME_cell_danban, // 分类 淡斑
CONFIG_QX_NAME_cell_fuchen, // 分类 浮尘
CONFIG_QX_NAME_cell_tag, // 分类 标签
CONFIG_QX_NAME_support_offset, // 支架偏移
CONFIG_QX_NAME_support_loss, // 支架缺失
CONFIG_QX_NAME_handle_loss, // 把手缺失
CONFIG_QX_NAME_cell_ZJ_PianYi, // 分类 支架偏移
CONFIG_QX_NAME_cell_ZJ_QueShi, // 分类 支架缺失
CONFIG_QX_NAME_cell_CGMo_QueShi, // 分类 把手缺失
CONFIG_QX_NAME_cell_CGMark, // 分类 把手标记
CONFIG_QX_NAME_cell_BQBMark, // 分类 补强板标记
CONFIG_QX_NAME_cell_TBBQ, // 分类 铜箔标签
CONFIG_QX_NAME_cell_TBMark, // 分类 铜箔标记
CONFIG_QX_NAME_count,
};
// 缺陷项对应在参数中的名称
static std::vector<std::string> CONFIG_QX_NAME_Names =
{
"aotudian",
"other",
"line",
"zangwu",
"edge",
"ymhs",
"dianzhuang",
"posun",
"xianwei",
"shuizi",
"danban",
"fuchen",
"tag",
"support_offset",
"support_loss",
"handle_loss",
"ZJ_PianYi",
"ZJ_QueShi",
"CGMo_QueShi",
"CGMark",
"BQBMark",
"TBBQ",
"TBMark",
};
// 分析类型

@ -24,37 +24,23 @@ std::vector<ReadFlawCode> m_FlawCodeList;
std::vector<std::string> QX_Result_Names =
{
"OK",
"aotudian",
"other",
"line",
"zangwu",
"edge",
"ymhs",
"dianzhuang",
"posun",
"xianwei",
"shuizi",
"danban",
"fuchen",
"tag",
"ZJ_PianYi",
"ZJ_QueShi",
"CGMo_QueShi",
"CGMark",
"BQBMark",
"TBBQ",
"TBMark",
};
std::vector<std::string> QX_Result_Code =
{
"P0000",
"MA507",
"MA508",
"MA506",
"MA504",
"MA503",
"MA502",
"MA505",
"MA501",
"P0001",
"P0002",
"P0003",
"P0004",
"P0005",
"M701201",
"M200214",
"M200215",
"M200216",
"M200217",
"M200218",
"M200219",
};
int ReadFlawCodeConfig(std::string json_path)

@ -1010,125 +1010,20 @@ int BaseFuntonConfigJson::GetFunction(Json::Value value)
_config.bigNG.bOpen = value_f["isOpen"].asBool();
if (_config.bigNG.bOpen)
{
if (value_f["form"]["aotudian"]["open"])
// 大缺陷参数按缺陷列表循环解析(表单键名与CONFIG_QX_NAME_Names一致)
for (int i = 0; i < CONFIG_QX_NAME_count; i++)
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_aotudian].bOpen = value_f["form"]["aotudian"]["open"].asBool();
}
if (value_f["form"]["aotudian"]["Area"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_aotudian].fArea = value_f["form"]["aotudian"]["Area"].asFloat();
}
_config.bigNG.qx[CONFIG_QX_NAME_cell_aotudian].strname = "aotudian";
if (value_f["form"]["other"]["open"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_other].bOpen = value_f["form"]["other"]["open"].asBool();
}
if (value_f["form"]["other"]["Area"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_other].fArea = value_f["form"]["other"]["Area"].asFloat();
}
_config.bigNG.qx[CONFIG_QX_NAME_cell_other].strname = "other";
if (value_f["form"]["line"]["open"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_line].bOpen = value_f["form"]["line"]["open"].asBool();
}
if (value_f["form"]["line"]["Area"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_line].fArea = value_f["form"]["line"]["Area"].asFloat();
}
_config.bigNG.qx[CONFIG_QX_NAME_cell_line].strname = "line";
if (value_f["form"]["zangwu"]["open"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_zangwu].bOpen = value_f["form"]["zangwu"]["open"].asBool();
}
if (value_f["form"]["zangwu"]["Area"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_zangwu].fArea = value_f["form"]["zangwu"]["Area"].asFloat();
}
_config.bigNG.qx[CONFIG_QX_NAME_cell_zangwu].strname = "zangwu";
if (value_f["form"]["edge"]["open"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_edge].bOpen = value_f["form"]["edge"]["open"].asBool();
}
if (value_f["form"]["edge"]["Area"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_edge].fArea = value_f["form"]["edge"]["Area"].asFloat();
}
_config.bigNG.qx[CONFIG_QX_NAME_cell_edge].strname = "edge";
if (value_f["form"]["ymhs"]["open"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_ymhs].bOpen = value_f["form"]["ymhs"]["open"].asBool();
}
if (value_f["form"]["ymhs"]["Area"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_ymhs].fArea = value_f["form"]["ymhs"]["Area"].asFloat();
}
_config.bigNG.qx[CONFIG_QX_NAME_cell_ymhs].strname = "ymhs";
if (value_f["form"]["dianzhuang"]["open"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_dianzhuang].bOpen = value_f["form"]["dianzhuang"]["open"].asBool();
}
if (value_f["form"]["dianzhuang"]["Area"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_dianzhuang].fArea = value_f["form"]["dianzhuang"]["Area"].asFloat();
}
_config.bigNG.qx[CONFIG_QX_NAME_cell_dianzhuang].strname = "dianzhuang";
if (value_f["form"]["posun"]["open"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_posun].bOpen = value_f["form"]["posun"]["open"].asBool();
}
if (value_f["form"]["posun"]["Area"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_posun].fArea = value_f["form"]["posun"]["Area"].asFloat();
}
_config.bigNG.qx[CONFIG_QX_NAME_cell_posun].strname = "posun";
if (value_f["form"]["xianwei"]["open"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_xianwei].bOpen = value_f["form"]["xianwei"]["open"].asBool();
}
if (value_f["form"]["xianwei"]["Area"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_xianwei].fArea = value_f["form"]["xianwei"]["Area"].asFloat();
}
_config.bigNG.qx[CONFIG_QX_NAME_cell_xianwei].strname = "xianwei";
if (value_f["form"]["shuizi"]["open"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_shuizi].bOpen = value_f["form"]["shuizi"]["open"].asBool();
}
if (value_f["form"]["shuizi"]["Area"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_shuizi].fArea = value_f["form"]["shuizi"]["Area"].asFloat();
}
_config.bigNG.qx[CONFIG_QX_NAME_cell_shuizi].strname = "shuizi";
if (value_f["form"]["danban"]["open"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_danban].bOpen = value_f["form"]["danban"]["open"].asBool();
}
if (value_f["form"]["danban"]["Area"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_danban].fArea = value_f["form"]["danban"]["Area"].asFloat();
}
_config.bigNG.qx[CONFIG_QX_NAME_cell_danban].strname = "danban";
if (value_f["form"]["fuchen"]["open"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_fuchen].bOpen = value_f["form"]["fuchen"]["open"].asBool();
}
if (value_f["form"]["fuchen"]["Area"])
{
_config.bigNG.qx[CONFIG_QX_NAME_cell_fuchen].fArea = value_f["form"]["fuchen"]["Area"].asFloat();
std::string strqx_name = CONFIG_QX_NAME_Names[i];
if (value_f["form"][strqx_name]["open"])
{
_config.bigNG.qx[i].bOpen = value_f["form"][strqx_name]["open"].asBool();
}
if (value_f["form"][strqx_name]["Area"])
{
_config.bigNG.qx[i].fArea = value_f["form"][strqx_name]["Area"].asFloat();
}
_config.bigNG.qx[i].strname = strqx_name;
}
_config.bigNG.qx[CONFIG_QX_NAME_cell_fuchen].strname = "fuchen";
}
else
{

Loading…
Cancel
Save