国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

yolov8熱力圖可視化

這篇具有很好參考價值的文章主要介紹了yolov8熱力圖可視化。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

yolov8熱力圖可視化,yolov5,yolov8 改進(jìn),創(chuàng)新,漲點(diǎn),YOLO
yolov8熱力圖可視化,yolov5,yolov8 改進(jìn),創(chuàng)新,漲點(diǎn),YOLO文章來源地址http://www.zghlxwxcb.cn/news/detail-674344.html

安裝pytorch_grad_cam

pip install grad-cam

自動化生成不同層的bash腳本


# 循環(huán)10次,將i的值從0到9
for i in $(seq 0 13)
do
    echo "Running iteration $i";
    python yolov8_heatmap.py $i;
done


熱力圖生成python代碼

import warnings
warnings.filterwarnings('ignore')
warnings.simplefilter('ignore')
import torch, yaml, cv2, os, shutil
import numpy as np
np.random.seed(0)
import sys
import matplotlib.pyplot as plt
from tqdm import trange
from PIL import Image
from ultralytics.nn.tasks import DetectionModel as Model
from ultralytics.yolo.utils.torch_utils import intersect_dicts
# from ultralytics.yolo.data.augment import LetterBox
from ultralytics.yolo.utils.ops import xywh2xyxy
from pytorch_grad_cam import GradCAMPlusPlus, GradCAM, XGradCAM
from pytorch_grad_cam.utils.image import show_cam_on_image
from pytorch_grad_cam.activations_and_gradients import ActivationsAndGradients

def letterbox(im, new_shape=(640, 640), color=(114, 114, 114), auto=True, scaleFill=False, scaleup=True, stride=32):
    # Resize and pad image while meeting stride-multiple constraints
    shape = im.shape[:2]  # current shape [height, width]
    if isinstance(new_shape, int):
        new_shape = (new_shape, new_shape)

    # Scale ratio (new / old)
    r = min(new_shape[0] / shape[0], new_shape[1] / shape[1])
    if not scaleup:  # only scale down, do not scale up (for better val mAP)
        r = min(r, 1.0)

    # Compute padding
    ratio = r, r  # width, height ratios
    new_unpad = int(round(shape[1] * r)), int(round(shape[0] * r))
    dw, dh = new_shape[1] - new_unpad[0], new_shape[0] - new_unpad[1]  # wh padding
    if auto:  # minimum rectangle
        dw, dh = np.mod(dw, stride), np.mod(dh, stride)  # wh padding
    elif scaleFill:  # stretch
        dw, dh = 0.0, 0.0
        new_unpad = (new_shape[1], new_shape[0])
        ratio = new_shape[1] / shape[1], new_shape[0] / shape[0]  # width, height ratios

    dw /= 2  # divide padding into 2 sides
    dh /= 2

    if shape[::-1] != new_unpad:  # resize
        im = cv2.resize(im, new_unpad, interpolation=cv2.INTER_LINEAR)
    top, bottom = int(round(dh - 0.1)), int(round(dh + 0.1))
    left, right = int(round(dw - 0.1)), int(round(dw + 0.1))
    im = cv2.copyMakeBorder(im, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color)  # add border
    return im, ratio, (dw, dh)


class yolov8_heatmap:
    def __init__(self, weight, cfg, device, method, layer, backward_type, conf_threshold, ratio):
        device = torch.device(device)
        ckpt = torch.load(weight)
        model_names = ckpt['model'].names
        csd = ckpt['model'].float().state_dict()  # checkpoint state_dict as FP32
        model = Model(cfg, ch=3, nc=len(model_names)).to(device)
        csd = intersect_dicts(csd, model.state_dict(), exclude=['anchor'])  # intersect
        model.load_state_dict(csd, strict=False)  # load
        model.eval()
        print(f'Transferred {len(csd)}/{len(model.state_dict())} items')
        
        target_layers = [eval(layer)]
        method = eval(method)

        colors = np.random.uniform(0, 255, size=(len(model_names), 3)).astype(np.int64)
        self.__dict__.update(locals())
    
    def post_process(self, result):
        logits_ = result[:, 4:]
        boxes_ = result[:, :4]
        sorted, indices = torch.sort(logits_.max(1)[0], descending=True)
        return torch.transpose(logits_[0], dim0=0, dim1=1)[indices[0]], torch.transpose(boxes_[0], dim0=0, dim1=1)[indices[0]], xywh2xyxy(torch.transpose(boxes_[0], dim0=0, dim1=1)[indices[0]]).cpu().detach().numpy()
    
    def draw_detections(self, box, color, name, img):
        xmin, ymin, xmax, ymax = list(map(int, list(box)))
        cv2.rectangle(img, (xmin, ymin), (xmax, ymax), tuple(int(x) for x in color), 2)
        cv2.putText(img, str(name), (xmin, ymin - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.8, tuple(int(x) for x in color), 2, lineType=cv2.LINE_AA)
        return img
    def crop(self,box,img):
        xmin, ymin, xmax, ymax = list(map(int, list(box)))

        return img[ymin:ymax,xmin:xmax].copy()

    def __call__(self, img_path, save_path):
        # remove dir if exist
        if os.path.exists(save_path):
            shutil.rmtree(save_path)
        # make dir if not exist
        os.makedirs(save_path, exist_ok=True)

        # img process
        image = cv2.imread(img_path)
        img,(wratio,hratio), (dw, dh) = letterbox(image)
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        img = np.float32(img) / 255.0
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        image = np.float32(image) / 255.0
        tensor = torch.from_numpy(np.transpose(img, axes=[2, 0, 1])).unsqueeze(0).to(self.device)

        # init ActivationsAndGradients
        grads = ActivationsAndGradients(self.model, self.target_layers, reshape_transform=None)

        # get ActivationsAndResult
        result = grads(tensor)
        activations = grads.activations[0].cpu().detach().numpy()

        # postprocess to yolo output
        post_result, pre_post_boxes, post_boxes = self.post_process(result[0])
        for i in trange(int(post_result.size(0) * self.ratio)):
            if float(post_result[i].max()) < self.conf_threshold:
                break

            self.model.zero_grad()
            # get max probability for this prediction
            if self.backward_type == 'class' or self.backward_type == 'all':
                score = post_result[i].max()
                score.backward(retain_graph=True)

            if self.backward_type == 'box' or self.backward_type == 'all':
                for j in range(4):
                    score = pre_post_boxes[i, j]
                    score.backward(retain_graph=True)

            # process heatmap
            if self.backward_type == 'class':
                gradients = grads.gradients[0]
            elif self.backward_type == 'box':
                gradients = grads.gradients[0] + grads.gradients[1] + grads.gradients[2] + grads.gradients[3]
            else:
                gradients = grads.gradients[0] + grads.gradients[1] + grads.gradients[2] + grads.gradients[3] + grads.gradients[4]
            b, k, u, v = gradients.size()
            weights = self.method.get_cam_weights(self.method, None, None, None, activations, gradients.detach().numpy())
            weights = weights.reshape((b, k, 1, 1))
            saliency_map = np.sum(weights * activations, axis=1)
            saliency_map = np.squeeze(np.maximum(saliency_map, 0))
            saliency_map = cv2.resize(saliency_map, (tensor.size(3), tensor.size(2)))
            saliency_map_min, saliency_map_max = saliency_map.min(), saliency_map.max()
            # 如果不生成圖像 注釋掉下面兩行
            if (saliency_map_max - saliency_map_min) == 0:
                continue
            saliency_map = (saliency_map - saliency_map_min) / (saliency_map_max - saliency_map_min)

            saliency_map = cv2.resize(saliency_map[int(dh):-int(dh),:], (image.shape[1],image.shape[0]))
            winv_ratio = 1.0 / wratio
            hinv_ratio = 1.0 / hratio
            det_box_restored = [
                int((post_boxes[i][0] - (dw+0.1)) * winv_ratio),
                int((post_boxes[i][1] - (dh+0.1)) * hinv_ratio),
                int((post_boxes[i][2] - (dw-0.1)) * winv_ratio),
                int((post_boxes[i][3] - (dh-0.1)) * hinv_ratio)
            ]
            det_box_restored = [int(coord) for coord in det_box_restored]
            # add heatmap and box to image
            cam_image = show_cam_on_image(image.copy(), saliency_map, use_rgb=True)
            crop_cam_image = self.crop(det_box_restored,cam_image)
            crop_cam_image = Image.fromarray(crop_cam_image)
            crop_cam_image.save(f'{save_path}/{i}_crop.png')
            cam_image = self.draw_detections(det_box_restored, self.colors[int(post_result[i, :].argmax())], f'{self.model_names[int(post_result[i, :].argmax())]} {float(post_result[i].max()):.2f}', cam_image)
            cam_image = Image.fromarray(cam_image)
            cam_image.save(f'{save_path}/{i}.png')

def get_params():
    params = {
        'weight': '../runs/detect/my-person73-small/weights/best.pt',
        'cfg': 'models/small-yolov8.yaml',
        'device': 'cuda:0',
        'method': 'GradCAM', # GradCAMPlusPlus, GradCAM, XGradCAM
        'layer': f'model.model[{sys.argv[1]}]',
        'backward_type': 'all', # class, box, all
        'conf_threshold': 0.6, # 0.6
        'ratio': 0.02 # 0.02-0.1
    }
    return params

if __name__ == '__main__':

    model = yolov8_heatmap(**get_params())
    model(r'1.jpg', f'result/{sys.argv[1]}')

到了這里,關(guān)于yolov8熱力圖可視化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • YOLOv5可視化界面

    YOLOv5可視化界面

    激活之前的虛擬環(huán)境 yolov5 在該環(huán)境的終端輸入以下命令 輸入 where python 找到當(dāng)前使用的Python的路徑 找到該路徑下的designer.exe文件(/Lib/site-packages/PySide6/designer.exe),然后發(fā)送到桌面創(chuàng)建快捷方式 打開designer 選擇Main Window 移除菜單欄 拖兩個label個一個line進(jìn)來 拖兩個button進(jìn)入

    2024年02月13日
    瀏覽(25)
  • YOLOv5 使用tensorboard查看可視化訓(xùn)練結(jié)果

    YOLOv5 使用tensorboard查看可視化訓(xùn)練結(jié)果

    1.1.找的models/yolo.py文件中,將最下面有關(guān) Tensorboard 的注釋打開 2.進(jìn)入項目根目錄 比如你訓(xùn)練的是第20個版本,那么 tensorboard --logdir=./runs/train/exp20 就可以查看當(dāng)前訓(xùn)練的可視化結(jié)果了 3.通過瀏覽器查看可視化訓(xùn)練結(jié)果

    2024年02月16日
    瀏覽(24)
  • YoloV8 +可視化界面+GUI+交互式界面目標(biāo)檢測與跟蹤

    YoloV8 +可視化界面+GUI+交互式界面目標(biāo)檢測與跟蹤

    本項目旨在基于 YoloV8 目標(biāo)檢測算法開發(fā)一個直觀的可視化界面,使用戶能夠輕松上傳圖像或視頻,并對其進(jìn)行目標(biāo)檢測。 通過圖形用戶界面,用戶可以方便地調(diào)整檢測參數(shù)、查看檢測結(jié)果,并將結(jié)果保存或?qū)С?。同時,該界面還將提供實(shí)時目標(biāo)檢測功能,讓用戶能夠在視頻

    2024年02月20日
    瀏覽(20)
  • YOLOv8 推理腳本--置信度保留多位浮點(diǎn)數(shù) & 特征圖可視化

    YOLOv8 推理腳本--置信度保留多位浮點(diǎn)數(shù) & 特征圖可視化

    特征圖可視化: 4位浮點(diǎn)數(shù): 原始2位浮點(diǎn)數(shù) 4位浮點(diǎn)數(shù) 在進(jìn)行改動前,請大家先閱讀下 基礎(chǔ)入門篇 | YOLOv8 項目【訓(xùn)練】【驗(yàn)證】【推理】最簡單教程 | YOLOv8必看 | 最新更新,直接打印 FPS,mAP50,75,95 ,確保會用我給的推理腳本。 YOLO( ) :這里寫你推理使用的

    2024年04月11日
    瀏覽(159)
  • Pyqt搭建YOLOv5目標(biāo)檢測系統(tǒng)(可視化界面+功能介紹+源代碼)

    Pyqt搭建YOLOv5目標(biāo)檢測系統(tǒng)(可視化界面+功能介紹+源代碼)

    軟件界面如下所示: 功能: 模型選擇 輸入選擇(本地文件、攝像頭、RTSP視頻流) IoU調(diào)整 置信度調(diào)整 幀間延時調(diào)整 播放/暫停/結(jié)束 統(tǒng)計檢測結(jié)果 詳細(xì)介紹: 1.首先進(jìn)行模型的選擇(官網(wǎng)可下載),包含四種,分別是yolov5s.pt、yolov5m.pt、yolov5l.pt和yolov5x.pt。 2.選擇置信度、IoU和

    2023年04月08日
    瀏覽(179)
  • YOLOV5 部署:QT的可視化界面推理(根據(jù)UI窗口編寫內(nèi)部函數(shù))

    YOLOV5 部署:QT的可視化界面推理(根據(jù)UI窗口編寫內(nèi)部函數(shù))

    上一章,UI的可視化界面已經(jīng)創(chuàng)建好了。并且通過UI文件編譯成了python可以處理的py文件,為了方便使用,我們新建了qt_inference 對ui的py腳本進(jìn)行調(diào)用,效果如下 UI可視化的生成:YOLOV5 部署:QT的可視化界面推理(創(chuàng)建UI,并編譯成py文件)-CSDN博客 本章將接著上面操作,完成一

    2024年04月08日
    瀏覽(27)
  • 卷積神經(jīng)網(wǎng)絡(luò)中的圖像特征——以YOLOv5為例進(jìn)行可視化

    卷積神經(jīng)網(wǎng)絡(luò)中的圖像特征——以YOLOv5為例進(jìn)行可視化

    一、圖像特征 1. 圖像低層特征 圖像低層特征指的是:邊緣、顏色和紋理等特征。 低層特征的分辨率較高,包含較多的位置、細(xì)節(jié)信息,但其包含的語義信息較少,噪聲較多。 原始圖像和淺層卷積網(wǎng)絡(luò)輸出的特征圖屬于低層特征,從低層特征圖中可以看清輪廓、邊緣等信息。

    2024年02月05日
    瀏覽(32)
  • YOLOv8的目標(biāo)對象的分類,分割,跟蹤和姿態(tài)估計的多任務(wù)檢測實(shí)踐(Netron模型可視化)

    YOLOv8的目標(biāo)對象的分類,分割,跟蹤和姿態(tài)估計的多任務(wù)檢測實(shí)踐(Netron模型可視化)

    YOLOv8是目前最新版本,在以前YOLO版本基礎(chǔ)上建立并加入了一些新的功能,以進(jìn)一步提高性能和靈活性,是目前最先進(jìn)的模型。YOLOv8旨在快速,準(zhǔn)確,易于使用,使其成為廣泛的 目標(biāo)檢測和跟蹤,實(shí)例分割,圖像分類和姿態(tài)估計任務(wù) 的絕佳選擇。 YOLOv8的安裝條件 Python=3.8 Py

    2024年02月11日
    瀏覽(25)
  • YOLOv5系列(二十八) 本文(2萬字) | 可視化工具 | Comet | ClearML | Wandb | Visdom |

    點(diǎn)擊進(jìn)入專欄: 《人工智能專欄》 Python與Python | 機(jī)器學(xué)習(xí) | 深度學(xué)習(xí) | 目標(biāo)檢測 | YOLOv5及其改進(jìn) | YOLOv8及其改進(jìn) | 關(guān)鍵知識點(diǎn) | 各種工具教程

    2024年02月03日
    瀏覽(104)
  • 【YOLOV5 入門】——Pyside6/PyQt5可視化UI界面&后端邏輯

    【YOLOV5 入門】——Pyside6/PyQt5可視化UI界面&后端邏輯

    聲明:筆記是做項目時根據(jù)B站博主視頻學(xué)習(xí)時自己編寫,請勿隨意轉(zhuǎn)載! VScode/Pycharm 終端進(jìn)入虛擬環(huán)境后,輸入下面代碼安裝 pyside6 ,若用的 Pycharm 作為集成開發(fā)環(huán)境,也下載個 pyqt5 : 安裝完 pyside6 時其實(shí)一并安裝了 qtdesigner ,這個工具可讓我們以拖拽的方式設(shè)計界面,按

    2024年04月16日
    瀏覽(173)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包