*推理程序:调用model_best.hdl推理test目录下测试图像,结果放在result目录;
TestImageDir := 'test/'
ConfidenceThreshold := 0.9
dev_update_off()
dev_close_window ()
read_dl_model ('model_best.hdl', DLModelHandle) //读取预训练模型
set_dl_model_param (DLModelHandle, 'batch_size', 1) //设置模型参数,batch_size将数据集分为较小的数据子集,称为批处理
GpuId := 0
if (GpuId > 0)
set_dl_model_param (DLModelHandle, 'gpu', GpuId)
endif
get_dl_model_param(DLModelHandle, 'image_dimensions', ImageDimensions) //获取图像的ImageDimensions
get_dl_model_param(DLModelHandle, 'class_ids', ClassIDs) //获取ClassIDs
file_exists('classes.txt', FileExists)
if(FileExists)
dlt_read_classnames ('classes.txt', ClassNames) //读取ClassNames
ClassNames := ['background', ClassNames] //设置classNames
endif
ResultDir := 'result/'
file_exists(ResultDir, FileExists)
if(FileExists)
remove_dir_recursively (ResultDir) //将已存在的result删除
*remove_dir_recursively (ResultDir + 'labels/')
endif
make_dir (ResultDir) //生成目录
*make_dir (ResultDir + 'labels/')
list_image_files (TestImageDir, 'default', ['recursive'], ImageFiles) //获得目录下所有 图片 文件
read_image (Image, ImageFiles[0]) //读取第一张图片
get_image_size(Image, Width, Height) //获取图片的大小
tuple_min2(Width, Width, Min) //计算两个元组的元素最小值。
Scale := Width / Min
dev_open_window(0, 0, Width / Scale, Height / Scale, 'black', WindowHandle)
dev_set_draw ('margin')
set_font(WindowHandle, 'Consolas-32')
dev_set_line_width(1)
Colors := ['red', 'green', 'blue', 'cyan', 'magenta', 'blue violet', 'firebrick', 'navy', 'yellow green', 'orange', 'forest green', 'cornflower blue', 'plum', 'tan', 'yellow', 'cadet blue', 'light blue', 'khaki']
create_dict (DLSample) //设置一个新字典
MinArea := 10
tics := []
for Index := 0 to |ImageFiles|-1 by 1
read_image (Image, ImageFiles[Index])
count_seconds(Start)
zoom_image_size (Image, ImagePreprocessed, ImageDimensions[0], ImageDimensions[1], 'constant') //图像缩放到定尺寸
convert_image_type (ImagePreprocessed, ImagePreprocessed, 'real') //转换图片的类型为:real
scale_image (ImagePreprocessed, ImagePreprocessed, 1, -127) //缩放图像的灰度值。
set_dict_object (ImagePreprocessed, DLSample, 'image') //在字典中添加一个键/对象对。
apply_dl_model (DLModelHandle, DLSample, [], DLResult) //在一组图像上应用基于深度学习的网络以进行推理。
get_dict_object (SegImage, DLResult, 'segmentation_image') //从字典中检索与键关联的对象。
get_dict_object (Confidence, DLResult, 'segmentation_confidence')
count_seconds(End)
tics := [tics, (End - Start)*1000] //计算测试时间
dev_clear_window()
dev_display (ImagePreprocessed)
Text := []
for I := 1 to |ClassIDs|-1 by 1
gen_empty_region (Region) //空数组
threshold (SegImage, Region, I, I) //阈值分割
connection (Region, ConnectedRegions) //连通区域
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', MinArea, 99999) //选择面积在1-99999的区域
union1 (SelectedRegions, Region) //返回所有输入区域的并集。
area_center (Region, Area, Row, Column) //返回区域的面积、宽、高
if (Area > 0) //面积大于零,显示面积,注意这款里是所有缺陷面积的总和
if (|ClassNames|)
Text[|Text|] := ClassNames[I] + ': ' + Area$'6d'
else
Text[|Text|] := 'Class' + (I) + ': ' + Area$'6d'
endif
endif
dev_set_color(Colors[I-1])
dev_display (Region)
endfor
dev_disp_text (Text, 'window', 'top', 'left', 'black', [], []) //Text的显示设置
parse_filename (ImageFiles[Index], BaseName, Extension, Directory) //将文件名解析为目录,基本文件名和扩展名
dump_window (WindowHandle, 'png', ResultDir + BaseName) //将窗口内容写入文件
*convert_image_type (SegImage, SegImage, 'byte')
*write_image(SegImage, 'png', 0, ResultDir + 'labels/' + BaseName)
endfor
tuple_mean(tics[1:(|tics|-1)], ImageProcTimeMs) //返回一个数字元组的平均值
Text := 'infer: ' + ImageDimensions[0] + '×' + ImageDimensions[1] + '×' + ImageDimensions[2] + '×' + |ImageFiles|
Text[|Text|] := 'speed: ' + ImageProcTimeMs$'.1f' + ' ms/image'
dev_disp_text (Text, 'window', 'center', 'left', 'blue', 'box', 'true')
dump_window (WindowHandle, 'png', 'speed')
参考文献: