diff --git a/example_workflows/Test_Load_Dataset.json b/example_workflows/Test_Load_Dataset.json index c8a9f66..4edc6c9 100644 --- a/example_workflows/Test_Load_Dataset.json +++ b/example_workflows/Test_Load_Dataset.json @@ -1 +1 @@ -{"id":"005f9807-4d92-44a8-8a4a-178d84b8dcb7","revision":0,"last_node_id":15,"last_link_id":11,"nodes":[{"id":3,"type":"PreviewAny","pos":[2370,1570],"size":[620,88],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"source","name":"source","type":"*","link":3}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.59","Node name for S&R":"PreviewAny","ue_properties":{"version":"7.0.1","widget_ue_connectable":{}}},"widgets_values":[]},{"id":10,"type":"SET_ImageLoad","pos":[2360,1800],"size":[276.734375,314],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"file_name","name":"file_name","type":"STRING","widget":{"name":"file_name"},"link":6},{"localized_name":"embed_transparency","name":"embed_transparency","shape":7,"type":"BOOLEAN","widget":{"name":"embed_transparency"},"link":null}],"outputs":[{"localized_name":"image","name":"image","type":"IMAGE","links":[7]},{"localized_name":"alpha_mask","name":"alpha_mask","type":"MASK","links":null}],"properties":{"cnr_id":"image-misc","ver":"1078a8a9e0702d28c73f6a3cbf0a90e5fb74b16a","Node name for S&R":"SET_ImageLoad","ue_properties":{"version":"7.0.1","widget_ue_connectable":{"file_name":true,"embed_transparency":true}}},"widgets_values":["",false]},{"id":11,"type":"PreviewImage","pos":[2770,1820],"size":[320,258],"flags":{},"order":6,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":7}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.59","Node name for S&R":"PreviewImage","ue_properties":{"version":"7.0.1","widget_ue_connectable":{}}},"widgets_values":[]},{"id":13,"type":"PreviewImage","pos":[2770,2170],"size":[320,258],"flags":{},"order":7,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":9}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.59","Node name for S&R":"PreviewImage","ue_properties":{"version":"7.0.1","widget_ue_connectable":{}}},"widgets_values":[]},{"id":12,"type":"SET_ImageLoad","pos":[2390,2150],"size":[276.734375,314],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"file_name","name":"file_name","type":"STRING","widget":{"name":"file_name"},"link":10},{"localized_name":"embed_transparency","name":"embed_transparency","shape":7,"type":"BOOLEAN","widget":{"name":"embed_transparency"},"link":null}],"outputs":[{"localized_name":"image","name":"image","type":"IMAGE","links":[9]},{"localized_name":"alpha_mask","name":"alpha_mask","type":"MASK","links":null}],"properties":{"cnr_id":"image-misc","ver":"1078a8a9e0702d28c73f6a3cbf0a90e5fb74b16a","Node name for S&R":"SET_ImageLoad","ue_properties":{"version":"7.0.1","widget_ue_connectable":{"file_name":true,"embed_transparency":true}}},"widgets_values":["",false]},{"id":4,"type":"SET_ImageDataset","pos":[1790,1580],"size":[270,218],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"source","name":"source","type":"STRING","widget":{"name":"source"},"link":null},{"localized_name":"pattern","name":"pattern","type":"STRING","widget":{"name":"pattern"},"link":null},{"localized_name":"destination","name":"destination","type":"STRING","widget":{"name":"destination"},"link":null},{"localized_name":"dest_ext","name":"dest_ext","type":"STRING","widget":{"name":"dest_ext"},"link":null},{"localized_name":"reference","name":"reference","shape":7,"type":"STRING","widget":{"name":"reference"},"link":null},{"localized_name":"sort_method","name":"sort_method","shape":7,"type":"COMBO","widget":{"name":"sort_method"},"link":null}],"outputs":[{"localized_name":"images","name":"images","shape":6,"type":"STRING","links":[3,6]},{"localized_name":"results","name":"results","shape":6,"type":"STRING","links":[]},{"localized_name":"references","name":"references","shape":6,"type":"STRING","links":[10]}],"properties":{"cnr_id":"image-misc","ver":"1d1b99ac4989ba2a5df143f6c81913ad20f3db0b","Node name for S&R":"SET_ImageDataset","ue_properties":{"version":"7.0.1","widget_ue_connectable":{"source":true,"pattern":true,"destination":true,"dest_ext":true,"reference":true,"sort_method":true}}},"widgets_values":["./DIS5K/DIS-VD/im",".*","./DIS5K/DIS-VD","png","./DIS5K/DIS-VD/gt","None"]},{"id":14,"type":"SET_ImageDownload","pos":[1640,2350],"size":[276.734375,362],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"image_bypass","name":"image_bypass","shape":7,"type":"IMAGE","link":null},{"localized_name":"mask_bypass","name":"mask_bypass","shape":7,"type":"MASK","link":null},{"localized_name":"base_url","name":"base_url","type":"STRING","widget":{"name":"base_url"},"link":null},{"localized_name":"filename","name":"filename","type":"STRING","widget":{"name":"filename"},"link":null},{"localized_name":"local_name","name":"local_name","shape":7,"type":"STRING","widget":{"name":"local_name"},"link":null},{"localized_name":"embed_transparency","name":"embed_transparency","shape":7,"type":"BOOLEAN","widget":{"name":"embed_transparency"},"link":null}],"outputs":[{"localized_name":"image","name":"image","type":"IMAGE","links":[11]},{"localized_name":"alpha_mask","name":"alpha_mask","type":"MASK","links":null}],"properties":{"cnr_id":"image-misc","ver":"1078a8a9e0702d28c73f6a3cbf0a90e5fb74b16a","Node name for S&R":"SET_ImageDownload"},"widgets_values":["https://raw.githubusercontent.com/set-soft/AudioSeparation/refs/heads/main/example_workflows/","audioseparation_logo.jpg","",false]},{"id":15,"type":"PreviewImage","pos":[2348.124755859375,2502.319580078125],"size":[140,246],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":11}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.59","Node name for S&R":"PreviewImage"},"widgets_values":[]}],"links":[[3,4,0,3,0,"*"],[6,4,0,10,0,"STRING"],[7,10,0,11,0,"IMAGE"],[9,12,0,13,0,"IMAGE"],[10,4,2,12,0,"STRING"],[11,14,0,15,0,"IMAGE"]],"groups":[],"config":{},"extra":{"ue_links":[],"ds":{"scale":0.9261636231874897,"offset":[-1503.5414324598712,-1660.8292931230108]},"links_added_by_ue":[]},"version":0.4} \ No newline at end of file +{"id":"005f9807-4d92-44a8-8a4a-178d84b8dcb7","revision":0,"last_node_id":32,"last_link_id":33,"nodes":[{"id":14,"type":"SET_ImageDownload","pos":[1640,2350],"size":[276.734375,362],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"image_bypass","name":"image_bypass","shape":7,"type":"IMAGE","link":null},{"localized_name":"mask_bypass","name":"mask_bypass","shape":7,"type":"MASK","link":null},{"localized_name":"base_url","name":"base_url","type":"STRING","widget":{"name":"base_url"},"link":null},{"localized_name":"filename","name":"filename","type":"STRING","widget":{"name":"filename"},"link":null},{"localized_name":"local_name","name":"local_name","shape":7,"type":"STRING","widget":{"name":"local_name"},"link":null},{"localized_name":"embed_transparency","name":"embed_transparency","shape":7,"type":"BOOLEAN","widget":{"name":"embed_transparency"},"link":null}],"outputs":[{"localized_name":"image","name":"image","type":"IMAGE","links":[11]},{"localized_name":"alpha_mask","name":"alpha_mask","type":"MASK","links":null}],"properties":{"cnr_id":"image-misc","ver":"1078a8a9e0702d28c73f6a3cbf0a90e5fb74b16a","Node name for S&R":"SET_ImageDownload","widget_ue_connectable":{"base_url":true,"filename":true,"local_name":true,"embed_transparency":true}},"widgets_values":["https://raw.githubusercontent.com/set-soft/AudioSeparation/refs/heads/main/example_workflows/","audioseparation_logo.jpg","",false]},{"id":4,"type":"SET_ImageDataset","pos":[1790,1580],"size":[270,314],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"source","name":"source","type":"STRING","widget":{"name":"source"},"link":null},{"localized_name":"pattern","name":"pattern","type":"STRING","widget":{"name":"pattern"},"link":null},{"localized_name":"destination","name":"destination","type":"STRING","widget":{"name":"destination"},"link":null},{"localized_name":"dest_ext","name":"dest_ext","type":"STRING","widget":{"name":"dest_ext"},"link":null},{"localized_name":"reference","name":"reference","shape":7,"type":"STRING","widget":{"name":"reference"},"link":null},{"localized_name":"sort_method","name":"sort_method","shape":7,"type":"COMBO","widget":{"name":"sort_method"},"link":null},{"localized_name":"image_load_cap","name":"image_load_cap","shape":7,"type":"INT","widget":{"name":"image_load_cap"},"link":null},{"localized_name":"skip_first_images","name":"skip_first_images","shape":7,"type":"INT","widget":{"name":"skip_first_images"},"link":null},{"localized_name":"select_every_nth","name":"select_every_nth","shape":7,"type":"INT","widget":{"name":"select_every_nth"},"link":null},{"localized_name":"random_seed","name":"random_seed","shape":7,"type":"INT","widget":{"name":"random_seed"},"link":null}],"outputs":[{"localized_name":"images","name":"images","shape":6,"type":"STRING","links":[3,6]},{"localized_name":"results","name":"results","shape":6,"type":"STRING","links":[15]},{"localized_name":"references","name":"references","shape":6,"type":"STRING","links":[10]}],"properties":{"cnr_id":"image-misc","ver":"1d1b99ac4989ba2a5df143f6c81913ad20f3db0b","Node name for S&R":"SET_ImageDataset","ue_properties":{"version":"7.0.1","widget_ue_connectable":{"source":true,"pattern":true,"destination":true,"dest_ext":true,"reference":true,"sort_method":true}},"widget_ue_connectable":{"source":true,"pattern":true,"destination":true,"dest_ext":true,"reference":true,"sort_method":true}},"widgets_values":["./DIS5K/DIS-VD/im",".*","./DIS5K/DIS-VD","png","./DIS5K/DIS-VD/gt","Random",1,0,1,3]},{"id":12,"type":"SET_ImageLoad","pos":[2390,2150],"size":[216.734375,362],"flags":{},"order":6,"mode":0,"inputs":[{"localized_name":"file_name","name":"file_name","type":"STRING","widget":{"name":"file_name"},"link":10},{"localized_name":"batch_size","name":"batch_size","type":"INT","widget":{"name":"batch_size"},"link":null},{"localized_name":"embed_transparency","name":"embed_transparency","shape":7,"type":"BOOLEAN","widget":{"name":"embed_transparency"},"link":null},{"localized_name":"show_preview","name":"show_preview","shape":7,"type":"BOOLEAN","widget":{"name":"show_preview"},"link":null}],"outputs":[{"localized_name":"image","name":"image","shape":6,"type":"IMAGE","links":[14]},{"localized_name":"alpha_mask","name":"alpha_mask","shape":6,"type":"MASK","links":null}],"properties":{"cnr_id":"image-misc","ver":"1078a8a9e0702d28c73f6a3cbf0a90e5fb74b16a","Node name for S&R":"SET_ImageLoad","ue_properties":{"version":"7.0.1","widget_ue_connectable":{"file_name":true,"embed_transparency":true}},"widget_ue_connectable":{"file_name":true,"embed_transparency":true}},"widgets_values":["",1,false,true]},{"id":15,"type":"PreviewImage","pos":[1975,2325],"size":[140,246],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":11}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.59","Node name for S&R":"PreviewImage","widget_ue_connectable":{}},"widgets_values":[]},{"id":23,"type":"AutoDownloadBiRefNetModel_SET","pos":[2675,1275],"size":[290.5611328125,166],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"model_name","name":"model_name","type":"COMBO","widget":{"name":"model_name"},"link":null},{"localized_name":"device","name":"device","type":"COMBO","widget":{"name":"device"},"link":null},{"localized_name":"dtype","name":"dtype","shape":7,"type":"COMBO","widget":{"name":"dtype"},"link":null}],"outputs":[{"localized_name":"model","name":"model","type":"SET_REMBG","links":[21]},{"localized_name":"train_w","name":"train_w","type":"INT","links":[22]},{"localized_name":"train_h","name":"train_h","type":"INT","links":[23]},{"localized_name":"norm_params","name":"norm_params","type":"NORM_PARAMS","links":null}],"properties":{"aux_id":"set-soft/ComfyUI_BiRefNet_SET","ver":"fe826fb9364ccc29ad5e01c06132f09fdf6bf9c5","Node name for S&R":"AutoDownloadBiRefNetModel_SET","widget_ue_connectable":{}},"widgets_values":["General (424 MiB)","AUTO","AUTO"]},{"id":10,"type":"SET_ImageLoad","pos":[2350,1750],"size":[216.734375,362],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"file_name","name":"file_name","type":"STRING","widget":{"name":"file_name"},"link":6},{"localized_name":"batch_size","name":"batch_size","type":"INT","widget":{"name":"batch_size"},"link":null},{"localized_name":"embed_transparency","name":"embed_transparency","shape":7,"type":"BOOLEAN","widget":{"name":"embed_transparency"},"link":null},{"localized_name":"show_preview","name":"show_preview","shape":7,"type":"BOOLEAN","widget":{"name":"show_preview"},"link":null}],"outputs":[{"localized_name":"image","name":"image","shape":6,"type":"IMAGE","links":[12,24]},{"localized_name":"alpha_mask","name":"alpha_mask","shape":6,"type":"MASK","links":null}],"properties":{"cnr_id":"image-misc","ver":"1078a8a9e0702d28c73f6a3cbf0a90e5fb74b16a","Node name for S&R":"SET_ImageLoad","ue_properties":{"version":"7.0.1","widget_ue_connectable":{"file_name":true,"embed_transparency":true}},"widget_ue_connectable":{"file_name":true,"embed_transparency":true}},"widgets_values":["",1,false,true]},{"id":16,"type":"SET_ImageSave","pos":[3025,1700],"size":[270,130],"flags":{},"order":7,"mode":4,"inputs":[{"localized_name":"image","name":"image","type":"IMAGE","link":12},{"localized_name":"filename","name":"filename","type":"STRING","widget":{"name":"filename"},"link":null},{"localized_name":"show_preview","name":"show_preview","shape":7,"type":"BOOLEAN","widget":{"name":"show_preview"},"link":null},{"localized_name":"save_prompt","name":"save_prompt","shape":7,"type":"BOOLEAN","widget":{"name":"save_prompt"},"link":null},{"localized_name":"save_workflow","name":"save_workflow","shape":7,"type":"BOOLEAN","widget":{"name":"save_workflow"},"link":null}],"outputs":[],"properties":{"cnr_id":"image-misc","ver":"a3a9872bf3e2fcffc644d053459dd672aeb51276","Node name for S&R":"SET_ImageSave","widget_ue_connectable":{}},"widgets_values":["ComfyUI",true,false,false]},{"id":22,"type":"SET_MaskDifference","pos":[3200,2250],"size":[270,78],"flags":{},"order":12,"mode":0,"inputs":[{"localized_name":"result","name":"result","type":"MASK","link":26},{"localized_name":"reference","name":"reference","type":"MASK","link":20},{"localized_name":"mode","name":"mode","type":"COMBO","widget":{"name":"mode"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[27]}],"properties":{"cnr_id":"image-misc","ver":"a57fe0cba3b96bee59470f3299868ad8bc9e9bdf","Node name for S&R":"SET_MaskDifference","widget_ue_connectable":{}},"widgets_values":["Simple (Red/Green)"]},{"id":26,"type":"PreviewImage","pos":[3750,1825],"size":[500,425],"flags":{},"order":15,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":27}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.66","Node name for S&R":"PreviewImage","widget_ue_connectable":{}},"widgets_values":[]},{"id":24,"type":"GetMaskByBiRefNet_SET","pos":[3175,1325],"size":[270,218],"flags":{},"order":8,"mode":0,"inputs":[{"localized_name":"model","name":"model","type":"SET_REMBG","link":21},{"localized_name":"images","name":"images","type":"IMAGE","link":24},{"localized_name":"depths","name":"depths","shape":7,"type":"MASK","link":null},{"localized_name":"width","name":"width","type":"INT","widget":{"name":"width"},"link":22},{"localized_name":"height","name":"height","type":"INT","widget":{"name":"height"},"link":23},{"localized_name":"upscale_method","name":"upscale_method","type":"COMBO","widget":{"name":"upscale_method"},"link":null},{"localized_name":"mask_threshold","name":"mask_threshold","type":"FLOAT","widget":{"name":"mask_threshold"},"link":null},{"localized_name":"batch_size","name":"batch_size","type":"INT","widget":{"name":"batch_size"},"link":null},{"localized_name":"out_dtype","name":"out_dtype","shape":7,"type":"COMBO","widget":{"name":"out_dtype"},"link":null}],"outputs":[{"localized_name":"masks","name":"masks","type":"MASK","links":[25,26,29]},{"localized_name":"depths","name":"depths","type":"MASK","links":null},{"localized_name":"edges","name":"edges","type":"MASK","links":null}],"properties":{"aux_id":"set-soft/ComfyUI_BiRefNet_SET","ver":"fe826fb9364ccc29ad5e01c06132f09fdf6bf9c5","Node name for S&R":"GetMaskByBiRefNet_SET","widget_ue_connectable":{}},"widgets_values":[1024,1024,"bicubic",0,1,"AUTO"]},{"id":3,"type":"PreviewAny","pos":[1975,1250],"size":[620,88],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"source","name":"source","type":"*","link":3}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.59","Node name for S&R":"PreviewAny","ue_properties":{"version":"7.0.1","widget_ue_connectable":{}},"widget_ue_connectable":{}},"widgets_values":[]},{"id":19,"type":"SET_MaskSave","pos":[4000,825],"size":[425,425],"flags":{},"order":11,"mode":4,"inputs":[{"localized_name":"mask","name":"mask","type":"MASK","link":16},{"localized_name":"filename","name":"filename","type":"STRING","widget":{"name":"filename"},"link":15},{"localized_name":"show_preview","name":"show_preview","shape":7,"type":"BOOLEAN","widget":{"name":"show_preview"},"link":null}],"outputs":[],"properties":{"cnr_id":"image-misc","ver":"81bf74ec1ff9ed095007aedf9c3c9d58a526581a","Node name for S&R":"SET_MaskSave","widget_ue_connectable":{}},"widgets_values":["ComfyUI",true]},{"id":25,"type":"MaskPreview","pos":[3525,1325],"size":[400,450],"flags":{},"order":10,"mode":0,"inputs":[{"localized_name":"mask","name":"mask","type":"MASK","link":25}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.66","Node name for S&R":"MaskPreview","widget_ue_connectable":{}},"widgets_values":[]},{"id":28,"type":"MaskPreview","pos":[3950,1325],"size":[400,450],"flags":{},"order":14,"mode":0,"inputs":[{"localized_name":"mask","name":"mask","type":"MASK","link":30}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.66","Node name for S&R":"MaskPreview","widget_ue_connectable":{}},"widgets_values":[]},{"id":18,"type":"ImageToMask","pos":[2650,2150],"size":[270,58],"flags":{},"order":9,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"IMAGE","link":14},{"localized_name":"channel","name":"channel","type":"COMBO","widget":{"name":"channel"},"link":null}],"outputs":[{"localized_name":"MASK","name":"MASK","type":"MASK","links":[16,20,28,30]}],"properties":{"cnr_id":"comfy-core","ver":"0.3.66","Node name for S&R":"ImageToMask","widget_ue_connectable":{}},"widgets_values":["red"]},{"id":32,"type":"PreviewAny","pos":[4100,2350],"size":[500,225],"flags":{},"order":16,"mode":0,"inputs":[{"localized_name":"source","name":"source","type":"*","link":33}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.66","Node name for S&R":"PreviewAny","widget_ue_connectable":{}},"widgets_values":[]},{"id":29,"type":"PreviewAny","pos":[3775,2450],"size":[210,88],"flags":{},"order":17,"mode":0,"inputs":[{"localized_name":"source","name":"source","type":"*","link":31}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.66","Node name for S&R":"PreviewAny","widget_ue_connectable":{}},"widgets_values":[]},{"id":30,"type":"PreviewAny","pos":[3775,2600],"size":[210,88],"flags":{},"order":18,"mode":0,"inputs":[{"localized_name":"source","name":"source","type":"*","link":32}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.66","Node name for S&R":"PreviewAny","widget_ue_connectable":{}},"widgets_values":[]},{"id":27,"type":"SET_SaliencyEvaluationMetrics","pos":[3200,2400],"size":[300,425],"flags":{},"order":13,"mode":0,"inputs":[{"localized_name":"prediction","name":"prediction","type":"MASK","link":29},{"localized_name":"ground_truth","name":"ground_truth","type":"MASK","link":28},{"localized_name":"mae_enable","name":"mae_enable","shape":7,"type":"BOOLEAN","widget":{"name":"mae_enable"},"link":null},{"localized_name":"max_f_mes_enable","name":"max_f_mes_enable","shape":7,"type":"BOOLEAN","widget":{"name":"max_f_mes_enable"},"link":null},{"localized_name":"s_mes_enable","name":"s_mes_enable","shape":7,"type":"BOOLEAN","widget":{"name":"s_mes_enable"},"link":null},{"localized_name":"e_mes_enable","name":"e_mes_enable","shape":7,"type":"BOOLEAN","widget":{"name":"e_mes_enable"},"link":null},{"localized_name":"wf_mes_enable","name":"wf_mes_enable","shape":7,"type":"BOOLEAN","widget":{"name":"wf_mes_enable"},"link":null}],"outputs":[{"localized_name":"all","name":"all","shape":6,"type":"DICT","links":[33]},{"localized_name":"MAE","name":"MAE","type":"FLOAT","links":[31]},{"localized_name":"Max_F-measure","name":"Max_F-measure","type":"FLOAT","links":[32]},{"localized_name":"S-measure","name":"S-measure","type":"FLOAT","links":null},{"localized_name":"E-measure","name":"E-measure","type":"FLOAT","links":null},{"localized_name":"Weighted_F-measure","name":"Weighted_F-measure","type":"FLOAT","links":null}],"properties":{"cnr_id":"image-misc","ver":"a57fe0cba3b96bee59470f3299868ad8bc9e9bdf","Node name for S&R":"SET_SaliencyEvaluationMetrics","widget_ue_connectable":{}},"widgets_values":[true,true,true,true,true,"
MAE0.0110
Fβmax0.9847
Sα0.9657
Eϕmean0.9863
Eϕmax0.9901
Eϕadp0.9900
Fβw0.9784
"]}],"links":[[3,4,0,3,0,"*"],[6,4,0,10,0,"STRING"],[10,4,2,12,0,"STRING"],[11,14,0,15,0,"IMAGE"],[12,10,0,16,0,"IMAGE"],[14,12,0,18,0,"IMAGE"],[15,4,1,19,1,"STRING"],[16,18,0,19,0,"MASK"],[20,18,0,22,1,"MASK"],[21,23,0,24,0,"SET_REMBG"],[22,23,1,24,3,"INT"],[23,23,2,24,4,"INT"],[24,10,0,24,1,"IMAGE"],[25,24,0,25,0,"MASK"],[26,24,0,22,0,"MASK"],[27,22,0,26,0,"IMAGE"],[28,18,0,27,1,"MASK"],[29,24,0,27,0,"MASK"],[30,18,0,28,0,"MASK"],[31,27,1,29,0,"*"],[32,27,2,30,0,"*"],[33,27,0,32,0,"*"]],"groups":[],"config":{},"extra":{"ue_links":[],"ds":{"scale":1.3559961607088098,"offset":[-2897.4640484594047,-2114.262350105353]},"links_added_by_ue":[]},"version":0.4} \ No newline at end of file diff --git a/example_workflows/Test_Load_Dataset_2.json b/example_workflows/Test_Load_Dataset_2.json new file mode 100644 index 0000000..c694c3c --- /dev/null +++ b/example_workflows/Test_Load_Dataset_2.json @@ -0,0 +1 @@ +{"id":"d50e2780-be2e-45f7-8499-5330507b50f1","revision":0,"last_node_id":38,"last_link_id":62,"nodes":[{"id":14,"type":"SET_ImageDownload","pos":[1640,2350],"size":[276.734375,362],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"image_bypass","name":"image_bypass","shape":7,"type":"IMAGE","link":null},{"localized_name":"mask_bypass","name":"mask_bypass","shape":7,"type":"MASK","link":null},{"localized_name":"base_url","name":"base_url","type":"STRING","widget":{"name":"base_url"},"link":null},{"localized_name":"filename","name":"filename","type":"STRING","widget":{"name":"filename"},"link":null},{"localized_name":"local_name","name":"local_name","shape":7,"type":"STRING","widget":{"name":"local_name"},"link":null},{"localized_name":"embed_transparency","name":"embed_transparency","shape":7,"type":"BOOLEAN","widget":{"name":"embed_transparency"},"link":null}],"outputs":[{"localized_name":"image","name":"image","type":"IMAGE","links":[11]},{"localized_name":"alpha_mask","name":"alpha_mask","type":"MASK","links":null}],"properties":{"cnr_id":"image-misc","ver":"1078a8a9e0702d28c73f6a3cbf0a90e5fb74b16a","Node name for S&R":"SET_ImageDownload","widget_ue_connectable":{"base_url":true,"filename":true,"local_name":true,"embed_transparency":true}},"widgets_values":["https://raw.githubusercontent.com/set-soft/AudioSeparation/refs/heads/main/example_workflows/","audioseparation_logo.jpg","",false]},{"id":15,"type":"PreviewImage","pos":[1975,2325],"size":[140,246],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":11}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.59","Node name for S&R":"PreviewImage","widget_ue_connectable":{}},"widgets_values":[]},{"id":16,"type":"SET_ImageSave","pos":[3025,1700],"size":[270,130],"flags":{},"order":7,"mode":4,"inputs":[{"localized_name":"image","name":"image","type":"IMAGE","link":12},{"localized_name":"filename","name":"filename","type":"STRING","widget":{"name":"filename"},"link":null},{"localized_name":"show_preview","name":"show_preview","shape":7,"type":"BOOLEAN","widget":{"name":"show_preview"},"link":null},{"localized_name":"save_prompt","name":"save_prompt","shape":7,"type":"BOOLEAN","widget":{"name":"save_prompt"},"link":null},{"localized_name":"save_workflow","name":"save_workflow","shape":7,"type":"BOOLEAN","widget":{"name":"save_workflow"},"link":null}],"outputs":[],"properties":{"cnr_id":"image-misc","ver":"a3a9872bf3e2fcffc644d053459dd672aeb51276","Node name for S&R":"SET_ImageSave","widget_ue_connectable":{}},"widgets_values":["ComfyUI",true,false,false]},{"id":22,"type":"SET_MaskDifference","pos":[3200,2250],"size":[270,78],"flags":{},"order":12,"mode":0,"inputs":[{"localized_name":"result","name":"result","type":"MASK","link":38},{"localized_name":"reference","name":"reference","type":"MASK","link":20},{"localized_name":"mode","name":"mode","type":"COMBO","widget":{"name":"mode"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[27]}],"properties":{"cnr_id":"image-misc","ver":"a57fe0cba3b96bee59470f3299868ad8bc9e9bdf","Node name for S&R":"SET_MaskDifference","widget_ue_connectable":{}},"widgets_values":["Simple (Red/Green)"]},{"id":26,"type":"PreviewImage","pos":[3750,1825],"size":[500,425],"flags":{},"order":15,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":27}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.66","Node name for S&R":"PreviewImage","widget_ue_connectable":{}},"widgets_values":[]},{"id":3,"type":"PreviewAny","pos":[1975,1250],"size":[620,88],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"source","name":"source","type":"*","link":3}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.59","Node name for S&R":"PreviewAny","ue_properties":{"version":"7.0.1","widget_ue_connectable":{}},"widget_ue_connectable":{}},"widgets_values":[]},{"id":19,"type":"SET_MaskSave","pos":[4000,825],"size":[425,425],"flags":{},"order":11,"mode":4,"inputs":[{"localized_name":"mask","name":"mask","type":"MASK","link":16},{"localized_name":"filename","name":"filename","type":"STRING","widget":{"name":"filename"},"link":15},{"localized_name":"show_preview","name":"show_preview","shape":7,"type":"BOOLEAN","widget":{"name":"show_preview"},"link":null}],"outputs":[],"properties":{"cnr_id":"image-misc","ver":"81bf74ec1ff9ed095007aedf9c3c9d58a526581a","Node name for S&R":"SET_MaskSave","widget_ue_connectable":{}},"widgets_values":["ComfyUI",true]},{"id":25,"type":"MaskPreview","pos":[3525,1325],"size":[400,450],"flags":{},"order":10,"mode":0,"inputs":[{"localized_name":"mask","name":"mask","type":"MASK","link":35}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.66","Node name for S&R":"MaskPreview","widget_ue_connectable":{}},"widgets_values":[]},{"id":28,"type":"MaskPreview","pos":[3950,1325],"size":[400,450],"flags":{},"order":13,"mode":0,"inputs":[{"localized_name":"mask","name":"mask","type":"MASK","link":30}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.66","Node name for S&R":"MaskPreview","widget_ue_connectable":{}},"widgets_values":[]},{"id":18,"type":"ImageToMask","pos":[2650,2150],"size":[270,58],"flags":{},"order":9,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"IMAGE","link":14},{"localized_name":"channel","name":"channel","type":"COMBO","widget":{"name":"channel"},"link":null}],"outputs":[{"localized_name":"MASK","name":"MASK","type":"MASK","links":[16,20,30,52]}],"properties":{"cnr_id":"comfy-core","ver":"0.3.66","Node name for S&R":"ImageToMask","widget_ue_connectable":{}},"widgets_values":["red"]},{"id":33,"type":"ImageToMask","pos":[2625,1625],"size":[270,58],"flags":{},"order":8,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"IMAGE","link":34},{"localized_name":"channel","name":"channel","type":"COMBO","widget":{"name":"channel"},"link":null}],"outputs":[{"localized_name":"MASK","name":"MASK","type":"MASK","links":[35,38,51]}],"properties":{"cnr_id":"comfy-core","ver":"0.3.66","Node name for S&R":"ImageToMask","widget_ue_connectable":{}},"widgets_values":["red"]},{"id":12,"type":"SET_ImageLoad","pos":[2390,2150],"size":[216.734375,362],"flags":{},"order":6,"mode":0,"inputs":[{"localized_name":"file_name","name":"file_name","type":"STRING","widget":{"name":"file_name"},"link":10},{"localized_name":"batch_size","name":"batch_size","type":"INT","widget":{"name":"batch_size"},"link":null},{"localized_name":"embed_transparency","name":"embed_transparency","shape":7,"type":"BOOLEAN","widget":{"name":"embed_transparency"},"link":null},{"localized_name":"show_preview","name":"show_preview","shape":7,"type":"BOOLEAN","widget":{"name":"show_preview"},"link":null}],"outputs":[{"localized_name":"image","name":"image","shape":6,"type":"IMAGE","links":[14]},{"localized_name":"alpha_mask","name":"alpha_mask","shape":6,"type":"MASK","links":null}],"properties":{"cnr_id":"image-misc","ver":"1078a8a9e0702d28c73f6a3cbf0a90e5fb74b16a","Node name for S&R":"SET_ImageLoad","ue_properties":{"version":"7.0.1","widget_ue_connectable":{"file_name":true,"embed_transparency":true}},"widget_ue_connectable":{"file_name":true,"embed_transparency":true}},"widgets_values":["",2,false,true]},{"id":10,"type":"SET_ImageLoad","pos":[2350,1725],"size":[216.734375,362],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"file_name","name":"file_name","type":"STRING","widget":{"name":"file_name"},"link":37},{"localized_name":"batch_size","name":"batch_size","type":"INT","widget":{"name":"batch_size"},"link":null},{"localized_name":"embed_transparency","name":"embed_transparency","shape":7,"type":"BOOLEAN","widget":{"name":"embed_transparency"},"link":null},{"localized_name":"show_preview","name":"show_preview","shape":7,"type":"BOOLEAN","widget":{"name":"show_preview"},"link":null}],"outputs":[{"localized_name":"image","name":"image","shape":6,"type":"IMAGE","links":[12,34]},{"localized_name":"alpha_mask","name":"alpha_mask","shape":6,"type":"MASK","links":null}],"properties":{"cnr_id":"image-misc","ver":"1078a8a9e0702d28c73f6a3cbf0a90e5fb74b16a","Node name for S&R":"SET_ImageLoad","ue_properties":{"version":"7.0.1","widget_ue_connectable":{"file_name":true,"embed_transparency":true}},"widget_ue_connectable":{"file_name":true,"embed_transparency":true}},"widgets_values":["",2,false,true]},{"id":32,"type":"PreviewAny","pos":[4200,2250],"size":[500,225],"flags":{},"order":16,"mode":0,"inputs":[{"localized_name":"source","name":"source","type":"*","link":54}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.66","Node name for S&R":"PreviewAny","widget_ue_connectable":{}},"widgets_values":[]},{"id":37,"type":"SET_ConsolidateMetrics","pos":[3775,2450],"size":[270,78],"flags":{},"order":17,"mode":0,"inputs":[{"localized_name":"metrics","name":"metrics","type":"DICT","link":57},{"localized_name":"img_name","name":"img_name","type":"STRING","link":58},{"localized_name":"destination","name":"destination","type":"STRING","widget":{"name":"destination"},"link":62}],"outputs":[],"properties":{"cnr_id":"image-misc","ver":"295681fbcba60676673a45dcc6523e34177d0de0","widget_ue_connectable":{},"Node name for S&R":"SET_ConsolidateMetrics"},"widgets_values":["./result"]},{"id":36,"type":"SET_SaliencyEvaluationMetrics","pos":[3200,2400],"size":[325,600],"flags":{},"order":14,"mode":0,"inputs":[{"localized_name":"prediction","name":"prediction","type":"MASK","link":51},{"localized_name":"ground_truth","name":"ground_truth","type":"MASK","link":52},{"localized_name":"img_name","name":"img_name","shape":7,"type":"STRING","link":53},{"localized_name":"result_save","name":"result_save","shape":7,"type":"BOOLEAN","widget":{"name":"result_save"},"link":null},{"localized_name":"mae_enable","name":"mae_enable","shape":7,"type":"BOOLEAN","widget":{"name":"mae_enable"},"link":null},{"localized_name":"mae_save","name":"mae_save","shape":7,"type":"BOOLEAN","widget":{"name":"mae_save"},"link":null},{"localized_name":"max_f_mes_enable","name":"max_f_mes_enable","shape":7,"type":"BOOLEAN","widget":{"name":"max_f_mes_enable"},"link":null},{"localized_name":"max_f_mes_save","name":"max_f_mes_save","shape":7,"type":"BOOLEAN","widget":{"name":"max_f_mes_save"},"link":null},{"localized_name":"s_mes_enable","name":"s_mes_enable","shape":7,"type":"BOOLEAN","widget":{"name":"s_mes_enable"},"link":null},{"localized_name":"s_mes_save","name":"s_mes_save","shape":7,"type":"BOOLEAN","widget":{"name":"s_mes_save"},"link":null},{"localized_name":"e_mes_enable","name":"e_mes_enable","shape":7,"type":"BOOLEAN","widget":{"name":"e_mes_enable"},"link":null},{"localized_name":"e_mes_save","name":"e_mes_save","shape":7,"type":"BOOLEAN","widget":{"name":"e_mes_save"},"link":null},{"localized_name":"wf_mes_enable","name":"wf_mes_enable","shape":7,"type":"BOOLEAN","widget":{"name":"wf_mes_enable"},"link":null},{"localized_name":"wf_mes_save","name":"wf_mes_save","shape":7,"type":"BOOLEAN","widget":{"name":"wf_mes_save"},"link":null}],"outputs":[{"localized_name":"all","name":"all","shape":6,"type":"DICT","links":[54,57]},{"localized_name":"img_name","name":"img_name","shape":6,"type":"STRING","links":[58]},{"localized_name":"MAE","name":"MAE","type":"FLOAT","links":[]},{"localized_name":"Max_F-measure","name":"Max_F-measure","type":"FLOAT","links":null},{"localized_name":"S-measure","name":"S-measure","type":"FLOAT","links":null},{"localized_name":"E-measure","name":"E-measure","type":"FLOAT","links":null},{"localized_name":"Weighted_F-measure","name":"Weighted_F-measure","type":"FLOAT","links":null}],"properties":{"cnr_id":"image-misc","ver":"a57fe0cba3b96bee59470f3299868ad8bc9e9bdf","Node name for S&R":"SET_SaliencyEvaluationMetrics","widget_ue_connectable":{}},"widgets_values":["",true,true,true,true,true,true,true,true,true,true,"
MAE0.0251
Fβmax1.8882
Sα1.8797
Eϕmean1.9324
Eϕmax1.9878
Eϕadp1.9197
Fβw1.6958
"]},{"id":4,"type":"SET_ImageDataset","pos":[1625,1575],"size":[500,325],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"source","name":"source","type":"STRING","widget":{"name":"source"},"link":59},{"localized_name":"pattern","name":"pattern","type":"STRING","widget":{"name":"pattern"},"link":null},{"localized_name":"destination","name":"destination","type":"STRING","widget":{"name":"destination"},"link":61},{"localized_name":"dest_ext","name":"dest_ext","type":"STRING","widget":{"name":"dest_ext"},"link":null},{"localized_name":"reference","name":"reference","shape":7,"type":"STRING","widget":{"name":"reference"},"link":null},{"localized_name":"sort_method","name":"sort_method","shape":7,"type":"COMBO","widget":{"name":"sort_method"},"link":null},{"localized_name":"image_load_cap","name":"image_load_cap","shape":7,"type":"INT","widget":{"name":"image_load_cap"},"link":null},{"localized_name":"skip_first_images","name":"skip_first_images","shape":7,"type":"INT","widget":{"name":"skip_first_images"},"link":null},{"localized_name":"select_every_nth","name":"select_every_nth","shape":7,"type":"INT","widget":{"name":"select_every_nth"},"link":null},{"localized_name":"random_seed","name":"random_seed","shape":7,"type":"INT","widget":{"name":"random_seed"},"link":null}],"outputs":[{"localized_name":"images","name":"images","shape":6,"type":"STRING","links":[3,37]},{"localized_name":"results","name":"results","shape":6,"type":"STRING","links":[15,53]},{"localized_name":"references","name":"references","shape":6,"type":"STRING","links":[10]}],"properties":{"cnr_id":"image-misc","ver":"1d1b99ac4989ba2a5df143f6c81913ad20f3db0b","Node name for S&R":"SET_ImageDataset","ue_properties":{"version":"7.0.1","widget_ue_connectable":{"source":true,"pattern":true,"destination":true,"dest_ext":true,"reference":true,"sort_method":true}},"widget_ue_connectable":{"source":true,"pattern":true,"destination":true,"dest_ext":true,"reference":true,"sort_method":true}},"widgets_values":["SOD/pred_maps/Method_1/Dataset_1",".*","SOD/pred_maps/Method_1/Dataset_1","png","SOD/gt/Dataset_1","Alphabetical (ASC)",4,0,1,3]},{"id":38,"type":"PrimitiveString","pos":[1075,1625],"size":[400,75],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"value","name":"value","type":"STRING","widget":{"name":"value"},"link":null}],"outputs":[{"localized_name":"STRING","name":"STRING","type":"STRING","links":[59,61,62]}],"properties":{"cnr_id":"comfy-core","ver":"0.3.66","widget_ue_connectable":{},"Node name for S&R":"PrimitiveString"},"widgets_values":["SOD/pred_maps/Method_1/Dataset_1"]}],"links":[[3,4,0,3,0,"*"],[10,4,2,12,0,"STRING"],[11,14,0,15,0,"IMAGE"],[12,10,0,16,0,"IMAGE"],[14,12,0,18,0,"IMAGE"],[15,4,1,19,1,"STRING"],[16,18,0,19,0,"MASK"],[20,18,0,22,1,"MASK"],[27,22,0,26,0,"IMAGE"],[30,18,0,28,0,"MASK"],[34,10,0,33,0,"IMAGE"],[35,33,0,25,0,"MASK"],[37,4,0,10,0,"STRING"],[38,33,0,22,0,"MASK"],[51,33,0,36,0,"MASK"],[52,18,0,36,1,"MASK"],[53,4,1,36,2,"STRING"],[54,36,0,32,0,"*"],[57,36,0,37,0,"DICT"],[58,36,1,37,1,"STRING"],[59,38,0,4,0,"STRING"],[61,38,0,4,2,"STRING"],[62,38,0,37,2,"STRING"]],"groups":[],"config":{},"extra":{"ue_links":[],"ds":{"scale":0.6958404381573986,"offset":[-1549.7727344595598,-1402.4171249369188]},"links_added_by_ue":[]},"version":0.4} \ No newline at end of file diff --git a/src/nodes/nodes_img.py b/src/nodes/nodes_img.py index a0124f3..87a4908 100644 --- a/src/nodes/nodes_img.py +++ b/src/nodes/nodes_img.py @@ -7,7 +7,9 @@ # Credits: # - ImagePad, ImageResize and ResizeMask are from Kijai (https://github.com/kijai/ComfyUI-KJNodes/) v1.1.7 # - Assisted by Gemini 2.5 Pro +from collections import defaultdict from copy import deepcopy +import csv import numpy as np import os from pathlib import Path @@ -686,7 +688,7 @@ class SaliencyEvaluationMetrics: "unique_id": "UNIQUE_ID", }, "optional": { - "img_name": ("STRING", {"forceInput" = True, "tooltip": "Name used as base to save the parameters"}), + "img_name": ("STRING", {"forceInput": True, "tooltip": "Name used as base to save the parameters"}), "result_save": ("BOOLEAN", {"default": False, "tooltip": "Save computed values to IMG_NAME.csv"}), "mae_enable": ("BOOLEAN", {"default": True, "tooltip": "Compute the MAE"}), "mae_save": ("BOOLEAN", {"default": False, "tooltip": "Save the MAE using IMG_NAME_MAE.csv"}), @@ -867,10 +869,150 @@ class SaliencyEvaluationMetrics: msg += f"Fβw{weighted_f_avg:.4f}" msg += "" send_progress_text(unique_id, msg) - logger.warning(unique_id) - logger.warning(msg) - return (all, mae_avg, f_measure_avg, s_measure_avg, e_measure_avg, weighted_f_avg) + return (all, img_name, mae_avg, f_measure_avg, s_measure_avg, e_measure_avg, weighted_f_avg) + + +class ConsolidateMetrics: + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "metrics": ("DICT",), + "img_name": ("STRING", {"forceInput": True, "tooltip": "File names for the evaluated images"}), + "destination": ("STRING", { + "default": "./result", + "tooltip": "Path for the result images.\nRelative to ComfyUI output\n" + "If this is a directory the file\nwill be named `consolidated.csv` inside it" + }), + }, + } + + INPUT_IS_LIST = True + FUNCTION = "execute" + CATEGORY = BASE_CATEGORY + "/" + "Analysis" + UNIQUE_NAME = "SET_ConsolidateMetrics" + DISPLAY_NAME = "Consolidate Metrics" + RETURN_TYPES = () + OUTPUT_NODE = True + + def execute(self, metrics, img_name, destination): + # --- 1. Input Validation and Flattening --- + + # The inputs are just lists no real need to do much + flat_metrics = metrics + flat_names = img_name + + if len(flat_metrics) != len(flat_names): + raise ValueError(f"Got {len(flat_metrics)} metrics and {len(flat_names)} file names. They must match.") + if len(destination) != 1: + raise ValueError("Only one `destination` is accepted.") + + # Resolve the final destination path for the CSV file. + dest_path = Path(get_output_directory(), destination[0]) + if dest_path.is_dir(): + dest_path = dest_path / 'consolidated.csv' + + # Ensure the parent directory exists. + dest_path.parent.mkdir(exist_ok=True) + + # --- 2. Load Existing Data from CSV (if it exists) --- + + existing_data = {} + header = [] + metric_keys_ordered = [] + + if dest_path.is_file(): + try: + with open(dest_path, 'r', newline='') as f: + reader = csv.reader(f) + + # Read the header to preserve column order. + header = next(reader) + + # Extract the internal metric keys from the display names in the header. + # This is crucial for correctly mapping new data to the existing columns. + reverse_sod_names = {v: k for k, v in SOD_NAMES.items()} + metric_keys_ordered = [reverse_sod_names.get(h) for h in header[1:]] + + # Load existing rows, stopping at any blank line (which precedes totals). + for row in reader: + if not row: # Stop if we hit a blank line + break + + # The first column is the image name (with quotes). + filename = row[0].strip('"') + + # Create a dictionary for the row's metrics. + metric_values = {metric_keys_ordered[i]: float(val) for i, val in enumerate(row[1:])} + existing_data[filename] = metric_values + except (IOError, StopIteration, IndexError, ValueError) as e: + logger.warning(f"Could not properly read existing file at {dest_path}. It will be overwritten. Error: {e}") + existing_data = {} # Reset on read error + + # --- 3. Consolidate New Metrics --- + + # Add or update the new metrics into our dictionary of existing data. + for i, new_metric_dict in enumerate(flat_metrics): + filename = Path(flat_names[i]).name + existing_data[filename] = new_metric_dict + + if not existing_data: + logger.warning("[Warning] No metrics to consolidate. Aborting file write.") + return () + + # --- 4. Prepare for Writing (Sort and Define Header if New) --- + + # If the file was new, define the header and key order now. + if not header: + # Get the keys from the first available metric dictionary. + first_item_keys = list(next(iter(existing_data.values())).keys()) + metric_keys_ordered = sorted(first_item_keys) # Sort for consistent order + # Create the header with display names. + header = ["Image"] + [SOD_NAMES.get(k, k) for k in metric_keys_ordered] + + # Sort the consolidated data alphabetically by filename. + sorted_filenames = sorted(existing_data.keys()) + + # --- 5. Compute New Totals (Averages) --- + + # Use defaultdict to handle missing metrics gracefully. + totals = defaultdict(float) + valid_counts = defaultdict(int) + + for filename in sorted_filenames: + for key, value in existing_data[filename].items(): + totals[key] += value + valid_counts[key] += 1 + + averages = {key: totals[key] / valid_counts[key] for key in metric_keys_ordered if valid_counts[key] > 0} + + # --- 6. Write Consolidated File --- + + with open(dest_path, 'w', newline='') as f: + writer = csv.writer(f) + + # Write the header. + writer.writerow(header) + + # Write the sorted data rows. + for filename in sorted_filenames: + metric_dict = existing_data[filename] + # Format the filename as required and get metric values in the correct order. + row_data = [filename] + [metric_dict.get(key, "") for key in metric_keys_ordered] + writer.writerow(row_data) + + # Write a blank line to separate data from totals. + writer.writerow([]) + + # Write the totals row. + total_row = ["Total"] + [f"{averages.get(key, 0.0):.4f}" for key in metric_keys_ordered] + writer.writerow(total_row) + + logger.info(f"Metrics consolidated and saved to {dest_path}") + + # This node doesn't produce an output for chaining, so return an empty tuple. + return () class CompositeFace: