dev_update_off () // 关闭更新窗口
dev_get_window(WindowHandle)
*检查gpu是否存在
query_available_dl_devices (['runtime', 'runtime'], ['gpu', 'cpu'], DLDeviceHandles)
if (|DLDeviceHandles| == 0) // 如果不存在gpu
throw ('No supported device found to continue this example.')
endif
DLDevice := DLDeviceHandles[0] // 选择gpu
PreprocessParamFileName := 'F:/机器工业视觉/最终训练/2.hdict' // 模型前处理参数文件路径
RetrainedModelFileName := 'F:/机器工业视觉/最终训练/1.hdl' // 模型路径
BatchSizeInference := 1 //每次推理一张图片
MinConfidence := 0.6 // 最小置信度
MaxOverlap := 0.8 //如果两个预测框重叠到某个程度,将其合成一个框
*读取模型并设置参数
read_dl_model (RetrainedModelFileName, DLModelHandle) // 读取模型
set_dl_model_param (DLModelHandle, 'batch_size', BatchSizeInference) // 设置每次推理一张图
set_dl_model_param (DLModelHandle, 'device', DLDevice) // 设置设备(gpu)
set_dl_model_param (DLModelHandle, 'min_confidence', MinConfidence) // 最小置信度设置
set_dl_model_param (DLModelHandle, 'max_overlap', MaxOverlap) // 重叠框合并
read_dict (PreprocessParamFileName, [], [], DLPreprocessParam) // 读取前处理参数
*获取类别信息
get_dl_model_param (DLModelHandle, 'class_names', ClassNames)
get_dl_model_param (DLModelHandle, 'class_ids', ClassIDs)
*为每个类别定义不同的颜色(可根据需要修改)
ClassColors := []
ClassColors[0] := 'red' // 类别inclusion颜色
ClassColors[1] := 'black' // 类别patches颜色
ClassColors[2] := 'blue' // 类别crazing颜色
ClassColors[3] := 'green' // 类别patted颜色
ClassColors[4] := 'yellow' // 类别rolled_in颜色
ClassColors[5] := 'cyan' // 类别scratch颜色
* 如果类别超过5个,可以继续添加或使用颜色生成函数
list_files ('F:/机器工业视觉/最终训练/测试图像', ['files','follow_links','recursive'], ImageFiles) // 遍历图片
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Ind := 0 to |ImageFiles| - 1 by 1
read_image (Image, ImageFiles[Ind])
get_image_size(Image, Width, Height)
gen_dl_samples_from_images (Image, DLSampleBatch) // 把图像转为Batchimage
preprocess_dl_samples (DLSampleBatch, DLPreprocessParam) // 前处理代码
apply_dl_model (DLModelHandle, DLSampleBatch, [], DLResultBatch) //开始推理
dev_display(Image)
for SampleIndex := 0 to BatchSizeInference - 1 by 1
DLSample := DLSampleBatch[SampleIndex]
DLResult := DLResultBatch[SampleIndex]
DetectedClassIDs := DLResult.bbox_class_id
*获取坐标信息
get_dict_tuple (DLResult, 'bbox_row', BboxRow) // 中心点行坐标
get_dict_tuple (DLResult, 'bbox_col', BboxCol) // 中心点列坐标
get_dict_tuple (DLResult, 'bbox_phi', BboxPhi) // 旋转角度
get_dict_tuple (DLResult, 'bbox_length1', BboxLength1) // 长轴一半长度
get_dict_tuple (DLResult, 'bbox_length2', BboxLength2) // 短轴一半长度
get_dict_tuple (DLResult, 'bbox_confidence', BboxConfidences)
*坐标缩放
zoomX := Width / 256.0
zoomY := Height / 256.0
BboxRow := zoomY * BboxRow
BboxCol := zoomX * BboxCol
BboxLength1 := zoomX * BboxLength1
BboxLength2 := zoomY * BboxLength2
*对每个检测结果进行处理
for i := 0 to |DetectedClassIDs| - 1 by 1
* 获取类别索引和名称
classIndex := find(ClassIDs, DetectedClassIDs[i])
className := ClassNames[classIndex]
* 获取该类别对应的颜色
if (classIndex < |ClassColors|)
boxColor := ClassColors[classIndex]
textColor := ClassColors[classIndex]
else
* 如果类别数超过预定义颜色数,使用默认颜色
boxColor := 'white'
textColor := 'white'
endif
* 生成并显示带方向的检测框
gen_rectangle2_contour_xld (BboxRectangle, BboxRow[i], BboxCol[i], BboxPhi[i], BboxLength1[i], BboxLength2[i])
dev_set_color(boxColor)
dev_set_line_width(2)
dev_display(BboxRectangle)
* 计算文本显示位置(在中心点上方)
textRow := BboxRow[i] - BboxLength2[i] - 12
textCol := BboxCol[i]
* 确保文本位置在图像范围内
if (textRow < 0)
textRow := 0
endif
* 设置显示字体并显示类别名称
set_display_font (WindowHandle, 13, 'mono', 'true', 'false')
disp_text (WindowHandle, className, 'image', textRow, textCol, textColor, [], [])
endfor
stop ()
endfor
endfor
这是一段halcon模型推理源代码,请你将其改为cpp调用halconapi实现,有的没有的算子请用cpp写,要注意算子和halconcpp的对应
最新发布