日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Grad-CAM在语义分割中的pytorch实现

發布時間:2023/12/31 编程问答 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Grad-CAM在语义分割中的pytorch实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

利用pytorch,實現在語義分割任務中得到某個類別的Grad-CAM
主要參考
github:pytorch-grad-cam
首先將pytorch-grad-cam中提供的 pytorch-grad-cam/ 路徑下所有的代碼文件下載至本地,將在腳本中作為庫調用。
pytorch-grad-cam本身提供了在語義分割任務中得到Grad-CAM的腳本和教程:Tutorial: Class Activation Maps for Semantic Segmentation。建議閱讀此腳本和教程,筆者也是閱讀之后參考這個腳本進行修改得到的自己的腳本。

python腳本

import warnings from torchvision.models.segmentation import deeplabv3_resnet50 import torch import torch.functional as F import numpy as np import requests import torchvision from PIL import Image from pytorch_grad_cam.utils.image import show_cam_on_image, preprocess_image from pytorch_grad_cam import GradCAM warnings.filterwarnings('ignore') warnings.simplefilter('ignore') import logging from utils.my_data_parallel import MyDataParallel import network from optimizer import restore_snapshot import argparse from datasets import dataset_XXX from config import assert_and_infer_cfg from torch.backends import cudnnparser = argparse.ArgumentParser(description='evaluation') parser.add_argument('--snapshot', required=True, type=str, default='') parser.add_argument('--arch', type=str, default='', required=True) parser.add_argument('--dataset_cls', type=str, default='cityscapes', help='cityscapes') args = parser.parse_args()# 此處讀取數據集的描述文件,如沒有也可以自己寫一個,添加本代碼中需要的參數就可以了 args.dataset_cls = dataset_XXX assert_and_infer_cfg(args, train_mode=False) args.apex = False # No support for apex eval cudnn.benchmark = False # 此處添加需要得到CAM的文件名 img_name_list = ["XXX", "XXX", "XXX", "XXX"]def get_net():"""Get Network for evaluation"""logging.info('Load model file: %s', args.snapshot)net = network.get_net(args, criterion=None)net = torch.nn.DataParallel(net).cuda()net, _ = restore_snapshot(net, optimizer=None,snapshot=args.snapshot, restore_optimizer_bool=False)net.eval()return netfor img_name in img_name_list:# 因為筆者的網絡是RGB+MASK四通道的,所以需要分別讀取圖片和掩膜并進行合并img_path = "./tmp/grad_cam/pick/raw/" + img_name + ".png"mask_path = "./tmp/grad_cam/pick/mask/" + img_name + ".png"image = np.array(Image.open(img_path))mask = np.array(Image.open(mask_path))rgb_img = np.float32(image) / 255rgb_mask = np.float32(mask) / 255# 此處添加數據集歸一化的均值和方差tensor_img = preprocess_image(rgb_img,mean=[0.000, 0.000, 0.000],std=[0.000, 0.000, 0.000])tensor_mask = preprocess_image(rgb_mask,mean=[0.000],std=[0.000])input_tensor = torch.cat((tensor_img, tensor_mask), dim=0).unsqueeze(0)# Taken from the torchvision tutorial# https://pytorch.org/vision/stable/auto_examples/plot_visualization_utils.htmlmodel = get_net()if torch.cuda.is_available():model = model.cuda()input_tensor = input_tensor.cuda()class SegmentationModelOutputWrapper(torch.nn.Module):def __init__(self, model):super(SegmentationModelOutputWrapper, self).__init__()self.model = modeldef forward(self, x):return self.model(x)model = SegmentationModelOutputWrapper(model)output = model(input_tensor)normalized_masks = torch.nn.functional.softmax(output, dim=1).cpu()# 此處添加類名sem_classes = ['background', 'XXX', 'YYY']sem_class_to_idx = {cls: idx for (idx, cls) in enumerate(sem_classes)}# 將需要進行CAM的類名寫至此處plaque_category = sem_class_to_idx["YYY"]plaque_mask = normalized_masks[0, :, :, :].argmax(axis=0).detach().cpu().numpy()plaque_mask_uint8 = 255 * np.uint8(plaque_mask == plaque_category)plaque_mask_float = np.float32(plaque_mask == plaque_category)both_images = np.hstack((image, np.repeat(plaque_mask_uint8[:, :, None], 3, axis=-1)))Image.fromarray(both_images)class SemanticSegmentationTarget:def __init__(self, category, mask):self.category = categoryself.mask = torch.from_numpy(mask)if torch.cuda.is_available():self.mask = self.mask.cuda()def __call__(self, model_output):return (model_output[self.category, :, :] * self.mask).sum()# 此處修改希望得到特征圖所在的網絡層target_layers = [model.model.backbone.layer4]targets = [SemanticSegmentationTarget(plaque_category, plaque_mask_float)]with GradCAM(model=model,target_layers=target_layers,use_cuda=torch.cuda.is_available()) as cam:grayscale_cam = cam(input_tensor=input_tensor,targets=targets)[0, :]cam_image = show_cam_on_image(rgb_img, grayscale_cam, use_rgb=True)img = Image.fromarray(cam_image)# 保存位置img.save("./tmp/grad_cam/final/" + img_name + ".png")

bash腳本

運行此腳本需要添加網絡名稱和模型名稱的參數,分別是–arch和–snapshot,于是撰寫bash腳本添加參數:

#!/usr/bin/env bashpython3 grad_cam.py \--arch network.deepv3.DeepR50V3PlusD_m1_deeply \--snapshot last_epoch_XXX_mean-iu_0.XXXXX.pth

運行腳本就可以得到語義分割的Grad-CAM圖啦!

運行效果

總結

以上是生活随笔為你收集整理的Grad-CAM在语义分割中的pytorch实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧洲一二三区 | 欧美色图17p| 18岁毛片| 精品久久蜜桃 | 亚洲一区自拍偷拍 | 9l视频自拍九色9l视频 | 久久久久久国产 | 精品无码久久久久 | 熟妇人妻一区二区三区四区 | 国产香蕉尹人视频在线 | 91视频网| 激情五月五月婷婷 | 女同性69囗交 | 在线播放精品视频 | 性做久久久久久久久 | 日本少妇性生活 | 欧美a∨亚洲欧美亚洲 | 久久精品一 | 日韩有色| 青青草国产成人av片免费 | 国产老女人精品毛片久久 | 亚洲精品嫩草 | 国产成人99久久亚洲综合精品 | 欧美乱轮视频 | 纯爱无遮挡h肉动漫在线播放 | 亚洲最大福利视频 | 欧美精品日韩在线 | 日本不卡视频 | 国产精成人品 | 欧美日韩视频无码一区二区三 | av在线麻豆 | 日本美女交配 | 国产精品久久久久久久久免费看 | 香蕉视频网址 | 天天综合中文字幕 | 91免费版黄| 亚洲国产成人91porn | 天天天天躁天天爱天天碰2018 | 久久久av片| 男人网站在线观看 | 一本色道久久88综合无码 | 日韩电影二区 | 久久婷婷国产麻豆91天堂 | 一区成人 | 精品国产一区二 | 欧美色亚洲色 | 99re这里只有精品首页 | 欧美日韩亚洲国产综合 | 国产永久免费视频 | 飘花影院伦理片 | 亚洲精品在线观看视频 | √天堂中文官网8在线 | 天天拍天天射 | 性欧美大战久久久久久久 | 久久久久久久久久久久久久久久久久久久 | 精品人妻少妇一区二区三区 | 秋霞福利网 | 成人午夜视频免费看 | 成人性生交大片免费看r链接 | 清草视频 | 草视频在线观看 | 亚洲一区二区三区视频在线 | 蜜臀av性久久久久av蜜臀妖精 | 一级片自拍 | www.日韩在线观看 | 欧洲黄色片 | 国产区精品在线观看 | 国产欧美日韩 | 精品一区国产 | 日本黄色美女视频 | 久久91亚洲精品中文字幕奶水 | 日批视频在线免费看 | 九色porny自拍视频 | 午夜免费一区二区 | 久久综合狠狠综合久久综合88 | 午夜精品美女久久久久av福利 | 亚洲日本在线观看视频 | 亚洲一卡二卡在线观看 | 女人扒开腿让男人桶爽 | 一亲二脱三插 | 美日韩三级 | 三级理论电影 | 日韩欧美一区二区三区久久婷婷 | www免费视频 | 午夜精品福利电影 | 色婷婷狠狠操 | 午夜偷拍视频 | 日韩三级黄色片 | 国产视频一区在线 | 大胸美女无遮挡 | 中日韩黄色大片 | 亚洲美女自拍偷拍 | 波多野结衣在线观看一区 | 午夜精品久久久久久久无码 | 一区二区三区网 | 亚洲天堂一区在线观看 | 久久国产黄色片 | 天天摸天天干天天操 | 蜜桃av成人永久免费 |