NeuralVista / yolov8.py
BhumikaMak's picture
Debug: yolov8 target lyr
200f76c
raw
history blame
2.28 kB
from ultralytics import YOLO
import cv2
import numpy as np
from PIL import Image
import torch
from torchcam.methods import GradCAM
from torchcam.utils import overlay_mask
# Set random colors for detection bounding boxes
COLORS = np.random.uniform(0, 255, size=(80, 3))
def parse_detections_yolov8(results):
boxes, colors, names = [], [], []
detections = results.boxes
for box in detections:
confidence = box.conf[0].item()
if confidence < 0.2: # Filter out low-confidence detections
continue
xmin, ymin, xmax, ymax = map(int, box.xyxy[0].tolist())
category = int(box.cls[0].item())
name = results.names[category]
boxes.append((xmin, ymin, xmax, ymax))
colors.append(COLORS[category])
names.append(name)
return boxes, colors, names
def draw_detections(boxes, colors, names, img):
for box, color, name in zip(boxes, colors, names):
xmin, ymin, xmax, ymax = box
cv2.rectangle(img, (xmin, ymin), (xmax, ymax), color, 2)
cv2.putText(img, name, (xmin, ymin - 5),
cv2.FONT_HERSHEY_SIMPLEX, 0.8, color, 2,
lineType=cv2.LINE_AA)
return img
def xai_yolov8(image):
# Load YOLOv8 model
model = YOLO('yolov8n.pt') # Load YOLOv8 nano model
model.to('cpu')
model.eval()
# Run YOLO detection
results = model(image)
boxes, colors, names = parse_detections_yolov8(results[0])
detections_img = draw_detections(boxes, colors, names, image.copy())
# Convert image to PyTorch tensor for Grad-CAM
image_tensor = torch.tensor(np.array(image)).permute(2, 0, 1).unsqueeze(0).float() / 255.0
image_tensor = image_tensor.to('cpu')
print(model.model) # Output model layers to find the target layer
grad_cam = GradCAM(model.model, target_layer='model.model.model[-4]')
# Perform Grad-CAM
cam_map = grad_cam(image_tensor)
# Overlay Grad-CAM mask onto original image
cam_image = overlay_mask(image, cam_map.squeeze(0).cpu().numpy(), alpha=0.5)
# Combine original image and Grad-CAM image
final_image = np.hstack((np.array(image), cam_image))
caption = "Results using YOLOv8 and Grad-CAM via torchcam"
return Image.fromarray(final_image), caption