|
|
import cv2
|
|
|
import numpy as np
|
|
|
from PIL import Image
|
|
|
from src.model import get_transforms
|
|
|
|
|
|
def preprocess_image(image_path_or_np):
|
|
|
"""Preprocess single image for inference."""
|
|
|
if isinstance(image_path_or_np, str):
|
|
|
image = cv2.imread(image_path_or_np)
|
|
|
else:
|
|
|
image = image_path_or_np
|
|
|
|
|
|
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
|
|
|
image = Image.fromarray(image)
|
|
|
transform = get_transforms()
|
|
|
return transform(image).unsqueeze(0).numpy()
|
|
|
|
|
|
def camera_stream():
|
|
|
"""Generator for real-time camera feed."""
|
|
|
cap = cv2.VideoCapture(0)
|
|
|
while True:
|
|
|
ret, frame = cap.read()
|
|
|
if ret:
|
|
|
yield frame
|
|
|
else:
|
|
|
break
|
|
|
cap.release()
|
|
|
|
|
|
def overlay_heatmap(frame, heatmap, alpha=0.4):
|
|
|
"""Overlay Grad-CAM heatmap on frame."""
|
|
|
heatmap = cv2.resize(heatmap, (frame.shape[1], frame.shape[0]))
|
|
|
heatmap = np.uint8(255 * heatmap)
|
|
|
heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET)
|
|
|
superimposed = cv2.addWeighted(frame, 1 - alpha, heatmap, alpha, 0)
|
|
|
return superimposed |