运行main.py文件,
测试不同模型时,给到相应的参数,初始化PlatformMetrics类,调用其process方法,得到相应评价结果,示例如main.py中 __name__ == '__main__'所示
该工程是为了通过python调用c#框架下的onnxruntime或者python框架下的onnxruntime,实现在AI平台上,取到测试图像,
测试模型的结果,得到测试文档中c#和python调用模型,所需的各种评价指标
主要的流程是:
读取平台上的标注信息,转成固定的格式,即gt file生成;
读取平台上的图像信息,调用不同框架下的onnxruntime进行推理,得到预测信息,转成固定的格式,即pred file生成;
将固定格式的gt file 和 相同格式的 pred file进行对比,得到所需的metrics,即评价指标
初始化PlatformMetrics参数说明:
PlatformMetrics(
token=token,
network_path=network_path,
is_python_model_onnxruntime=is_python_model_onnxruntime,
modelname = modelname,
gtfilegeneratetpye = gtfilegeneratetpye,
predfilegeneratetpye = predfilegeneratetpye,
metricstpye = metricstpye,
iscropped = iscropped,
numcpu = numcpu,
is_crop_region_affect_image_nums = is_crop_region_affect_image_nums,
crop_region_label = crop_region_label,
needed_imageresults_dict = needed_imageresults_dict,
needed_rois_dict = needed_rois_dict,
class_id_map = class_id_map,
iou_thres=0.5,
)
:param token: 平台所需的token
:param network_path: 测试模型的路径
:param is_python_model_onnxruntime: 是否调用python的onnxruntime
:param modelname: 模型的名称
:param gtfilegeneratetpye:选择所需的gtfile生成方法
:param predfilegeneratetpye:选择所需的predfile生成方法
:param metricstpye:选择所需的metrics类型
:param iscropped:是否裁切
:param numcpu:cpu推理数量
:param is_crop_region_affect_image_nums:crop_region_label不为空时,是否会影响图像数量计算
:param crop_region_label:需要crop region的roi标签title
:param needed_imageresults_dict:所需的image标签title 对应 预测模型的label,所形成的字典
:param needed_rois_dict: 所需的roi标签title 对应 预测模型的label,所形成的字典
:param class_id_map: 用于label改变的dict
:param iou_thres: iou阈值,分类时无用
关键参数设置含义说明:
is_python_model_onnxruntime bool类型
为True时,调用python框架下的onnxruntime,需要给定c#的XXX.emd模型相对应的XXX.onnx模型,
此时将前处理之后的databuffer做成python所需要的格式,送入python框架下的onnxruntime,然后将结果赋值给_detectedResultData;
为False时,调用c#框架下的onnxruntime,调用RunModel()
crop_region_label list类型
推理的模型,如果需要某个轮廓,则需要设置该参数,该参数必须为ROI标签的title,无需传入脏器轮廓,则为空
举例说明:肝脏那边,先是分类腹部图像,接着分割肝脏轮廓,然后在设定区域进行局灶性和弥漫性疾病的判断。
因此在肝脏弥漫性分类,肝脏局灶性分割,肝脏局灶性检测等任务中,需要肝脏的轮廓,由于所有的ROI标签并不区分是脏器还是病灶等,
因此需要指定哪些是作为所需要的额外脏器轮廓。
c#中,该参数影响InferenceNetworkInputImage的输入,该参数跟c#中的_useExtraBoundBoxAsRoi 相关,
_useExtraBoundBoxAsRoi为true, Resize时以输入的额外矩形框为准;_useExtraBoundBoxAsRoi为false, Resize时以输入的Roi框为准;
该参数跟c#中的 _useContoursAsMask相关(是否用轮廓生成掩膜,轮廓内的保留原始灰度值,轮廓外的全部为0),
_useContoursAsMask为true时,需要image.Contours,需要从InferenceNetworkInputImage中传入。
is_crop_region_affect_image_nums bool类型
跟crop_region_label配合使用,为True时,如果crop_region_label不为空,则会影响整体的图像数量;否则,不会影响图像数量。
举例说明:病灶前后景分割:如果一张图中有多个病灶,此时图像数量按照病灶数量而定,
因为根据InferenceNetworkInputImage的输入需要,所以需要多次传入原图和不同病灶的区域。
needed_imageresults_dict 和 needed_rois_dict
用于将标注信息中的图像标签、ROI标签,和预测信息中的Label相对应。以此来连接gt和pred的对应关系。
needed_imageresults_dict表示图像标签对应字典,needed_rois_dict表示ROI标签对应字典。
如果只需要其中一种标签,另一个设置为{}即可。
dict的多个keys的value可以一致,即标注了多个不同的标签,在测试结果中对应一个pred的Label。
举例说明:心肌分割那边:只返回单通道,Label设为0,预测结果那边设置了加一,因此有轮廓对应1;
(心肌那边暂时没有更新到AIDiagSystem中,未设置_labelInfos更改最终标签)
needed_imageresults_dict = {'非B模式图':0}
needed_rois_dict = {
'四腔心_心肌':1,
'心尖段_心肌':1,
'三腔心_心肌':1,
'基底段_心肌':1,
'乳头肌水平切面_心肌':1,
'两腔心_心肌':1
}
class_id_map dict类型
根据needed_imageresults_dict和needed_rois_dict中所有keys的value再进行一次映射,映射到所需的label中。
举例说明:乳腺的分级检测模型,为了测试良恶性,测试病灶检出率,通过class_id_map,将8个类别,进行良恶性的映射。
needed_imageresults_dict = {"未见明显异常":0}
needed_rois_dict = {
'脂肪瘤':1,
'BI-RADS 2':2,
'BI-RADS 3':3,
'BI-RADS 4a':4,
'BI-RADS 4b':5,
'BI-RADS 4c':6,
'BI-RADS 5':7}
class_id_map = {
0:0,
1:1,
2:1,
3:1,
4:2,
5:2,
6:2,
7:2
}