def _work(process_id, infer_dataset, args):
visualize_intermediate_cam = False
databin = infer_dataset[process_id]
infer_data_loader = DataLoader(databin, shuffle=False, num_workers=0, pin_memory=False)
for iter, pack in enumerate(infer_data_loader):
img_name = voc12.dataloader.decode_int_filename(pack['name'][0])
img = pack['img'][0].numpy()
cam_dict = np.load(os.path.join(args.cam_out_dir, img_name + '.npy'), allow_pickle=True).item()
cams = cam_dict['high_res'] # cams 是一个高分辨率的CAM
keys = np.pad(cam_dict['keys'] + 1, (1, 0), mode='constant')
# keys 是类别标识,经过从1开始的增量处理并在前面添加一个额外的0(填充)
# 1. find confident fg & bg
fg_conf_cam = np.pad(cams, ((1, 0), (0, 0), (0, 0)), mode='constant', constant_values=args.conf_fg_thres)
# 使用numpy的 pad 函数在 cams 数组前添加一层,该层所有值为 args.conf_fg_thres(前景置信度阈值),用于处理前景置信度
fg_conf_cam = np.argmax(fg_conf_cam, axis=0) # 取argmax来确定每个像素最有可能的前景类别。
pred = imutils.crf_inference_label(img, fg_conf_cam, n_labels=keys.shape[0]) # 使用CRF对前景置信度结果进行精细化
fg_conf = keys[pred]
bg_conf_cam = np.pad(cams, ((1, 0), (0, 0), (0, 0)), mode='constant', constant_values=args.conf_bg_thres)
bg_conf_cam = np.argmax(bg_conf_cam, axis=0) # 对背景重复相同的过程,但使用 args.conf_bg_thres 作为填充值
pred = imutils.crf_inference_label(img, bg_conf_cam, n_labels=keys.shape[0]) # 使用CRF对背景置信度结果进行精细化
bg_conf = keys[pred]
# 2. combine confident fg & bg
conf = fg_conf.copy() # 创建一个 conf 数组作为最终输出,初始值为 fg_conf 的拷贝
conf[fg_conf == 0] = 255 # 对于前景信任度为0的区域,设置 conf 为255(通常代表未知或边界)
conf[bg_conf + fg_conf == 0] = 0 # 对于既不属于前景也不属于背景的区域,设置 conf 为0(背景)
imageio.imwrite(os.path.join(args.ir_label_out_dir, img_name + '.png'), conf.astype(np.uint8))
# 将 conf 数组保存为图像,命名规则为 {img_name}.png,保存在指定的输出目录
if process_id == args.num_workers - 1 and iter % (len(databin) // 20) == 0:
print("%d " % ((5 * iter + 1) // (len(databin) // 20)), end='')
弱监督语义分割WSSS中cam生成的npy文件是如何转换成ir label的
最新推荐文章于 2025-11-29 16:24:14 发布
2505

被折叠的 条评论
为什么被折叠?



