|
|
|
|
|
|
|
|
|
import cv2 |
|
import torch |
|
import torchvision |
|
import numpy as np |
|
from torchvision import transforms |
|
from PIL import Image |
|
|
|
num_cls = 2 |
|
classes = ['female', 'male'] |
|
|
|
def model_struct(): |
|
model = torchvision.models.vgg16(pretrained=True) |
|
|
|
last_dim = len(model.classifier) - 1 |
|
num_fc = model.classifier[last_dim].in_features |
|
|
|
model.classifier[last_dim] = torch.nn.Linear(num_fc, num_cls) |
|
|
|
model.classifier.append(torch.nn.Softmax()) |
|
|
|
for param in model.parameters(): |
|
param.requires_grad = False |
|
|
|
for param in model.classifier[last_dim].parameters(): |
|
param.requires_grad = True |
|
for param in model.classifier[last_dim + 1].parameters(): |
|
param.requires_grad = True |
|
|
|
return model |
|
|
|
def cmpgraph_64x64(imgfrom, imgto): |
|
height, width, channels = dim(imgfrom) |
|
img = cv2.imread(imgfrom, 1) |
|
img2 = [] |
|
if height > width: |
|
hnew = int(np.round(64 / width * height)) |
|
wnew = 64 |
|
img2 = cv2.resize(img, (wnew, hnew)) |
|
img2 = img2[0:64, 0:64] |
|
elif width > height: |
|
wnew = int(np.round(64 / height * width)) |
|
hnew = 64 |
|
img2 = cv2.resize(img, (wnew, hnew)) |
|
img2 = img2[0:64, 0:64] |
|
else: |
|
img2 = cv2.resize(img, (64,64)) |
|
img3 = cv2.cvtColor(img2, cv2.COLOR_BGRA2BGR) |
|
return cv2.imwrite(imgto, img3) |
|
|
|
|
|
|
|
|
|
def predict_class(img_path, model): |
|
img = Image.open(img_path) |
|
transform = transforms.Compose([transforms.ToTensor()]) |
|
img = transform(img) |
|
img = torch.unsqueeze(img, dim=0) |
|
out = model(img) |
|
max = torch.max(out).item() |
|
pmax = torch.max(out, 1)[1].item() |
|
cls = classes[pmax] |
|
print('This is ' + cls + ' with confidence of ' + str(np.round(max, 3))) |
|
|
|
def modelload(modelpath): |
|
model = model_struct() |
|
save = torch.load(modelpath) |
|
model.load_state_dict(save) |
|
return model |
|
|
|
def predictmain(model, filepath): |
|
img = filepath |
|
predict_class(img, model) |
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
model = modelload("pytorch_model.bin") |
|
|
|
|
|
|
|
|
|
|
|
cmpgraph_64x64("path.png", "path(1).png") |
|
predictmain(model, "path(1).png") |