|
import torch |
|
import os |
|
from torchvision import transforms |
|
import numpy as np |
|
|
|
|
|
if torch.backends.mps.is_available(): |
|
device = "mps" |
|
elif torch.cuda.is_available(): |
|
device = "cuda" |
|
else: |
|
device = "cpu" |
|
|
|
print(f"Using device: {device}") |
|
|
|
image_arr = [] |
|
for foldername, subfolders, filenames in os.walk("../FER/Images/"): |
|
for filename in filenames: |
|
|
|
file_path = os.path.join(foldername, filename) |
|
image_arr.append(f"{file_path}") |
|
|
|
|
|
def predict(model, image_path): |
|
from face_detection import face_detection |
|
|
|
with torch.no_grad(): |
|
transform = transforms.Compose( |
|
[ |
|
transforms.Resize((224, 224)), |
|
transforms.RandomHorizontalFlip(), |
|
transforms.ToTensor(), |
|
transforms.Normalize( |
|
mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225] |
|
), |
|
transforms.RandomErasing(p=1, scale=(0.05, 0.05)), |
|
] |
|
) |
|
face = face_detection(image_path) |
|
image_tensor = transform(face).unsqueeze(0) |
|
image_tensor = image_tensor.to(device) |
|
|
|
model.eval() |
|
img_pred = model(image_tensor) |
|
topk = (3,) |
|
with torch.no_grad(): |
|
maxk = max(topk) |
|
|
|
_, pred = img_pred.topk(maxk, 1, True, True) |
|
pred = pred.t() |
|
|
|
img_pred = pred |
|
img_pred = img_pred.squeeze().cpu().numpy() |
|
im_pre_label = np.array(img_pred) |
|
y_pred = im_pre_label.flatten() |
|
emotions = { |
|
0: "Surprise", |
|
1: "Fear", |
|
2: "Disgust", |
|
3: "Happy", |
|
4: "Sad", |
|
5: "Angry", |
|
6: "Neutral", |
|
} |
|
labels = [] |
|
for i in y_pred: |
|
labels.append(emotions.get(i)) |
|
|
|
print( |
|
f"-->Image Path {image_path} [!] The predicted labels are {y_pred} and the label is {labels}" |
|
) |
|
return |
|
|