|
from transformers import PreTrainedModel |
|
import torch |
|
import os |
|
|
|
url_map = { |
|
"inception_v3": "https://download.pytorch.org/models/inception_v3_google-1a9a5a14.pth" |
|
} |
|
|
|
class InceptionV3ModelForImageClassification(PreTrainedModel): |
|
def __init__(self, config): |
|
super().__init__(config) |
|
|
|
model_path = f"{self.config.model_name}.bin".replace("/","_") |
|
|
|
if self.config.model_name == "google-safesearch-mini": |
|
self.model = torch.jit.load(model_path) |
|
elif self.config.model_name == "inception_v3": |
|
self.model = torch.hub.load('pytorch/vision:v0.6.0', 'inception_v3', pretrained=True) |
|
else: |
|
if not os.path.exists(model_path): |
|
from urllib.request import urlretrieve |
|
urlretrieve(f"https://huggingface.co/{self.config.model_name}/resolve/main/pytorch_model.bin", model_path) |
|
self.model = torch.jit.load(model_path) if self.config.use_jit else torch.load(model_path) |
|
|
|
def forward(self, input_ids): |
|
out, aux = self.model(input_ids) |
|
return out, aux |
|
|
|
def freeze(self): |
|
for param in self.model.parameters(): |
|
param.requires_grad = False |
|
|
|
def unfreeze(self): |
|
for param in self.model.parameters(): |
|
param.requires_grad = True |
|
|
|
def train(self, mode=True): |
|
super().train(mode) |
|
self.model.train(mode) |
|
|
|
def eval(self): |
|
return self.train(False) |
|
|
|
def to(self, device): |
|
self.model.to(device) |
|
return self |
|
|
|
def cuda(self, device=None): |
|
return self.to("cuda") |
|
|
|
def cpu(self): |
|
return self.to("cpu") |
|
|
|
def state_dict(self, destination=None, prefix='', keep_vars=False): |
|
return self.model.state_dict(destination, prefix, keep_vars) |
|
|
|
def load_state_dict(self, state_dict, strict=True): |
|
return self.model.load_state_dict(state_dict, strict) |
|
|
|
def parameters(self, recurse=True): |
|
return self.model.parameters(recurse) |
|
|
|
def named_parameters(self, prefix='', recurse=True): |
|
return self.model.named_parameters(prefix, recurse) |
|
|
|
def children(self): |
|
return self.model.children() |
|
|
|
def named_children(self): |
|
return self.model.named_children() |
|
|
|
def modules(self): |
|
return self.model.modules() |
|
|
|
def named_modules(self, memo=None, prefix=''): |
|
return self.model.named_modules(memo, prefix) |
|
|
|
def zero_grad(self, set_to_none=False): |
|
return self.model.zero_grad(set_to_none) |
|
|
|
def share_memory(self): |
|
return self.model.share_memory() |
|
|
|
def transform(self, image): |
|
from torchvision import transforms |
|
transform = transforms.Compose([ |
|
transforms.Resize(299), |
|
transforms.ToTensor(), |
|
transforms.Normalize(mean=self.config.mean, std=self.config.std) |
|
]) |
|
image = transform(image) |
|
return image |
|
|
|
def open_image(self, path): |
|
from PIL import Image |
|
path = 'https://images.unsplash.com/photo-1594568284297-7c64464062b1' |
|
if path.startswith('http://') or path.startswith('https://'): |
|
import requests |
|
from io import BytesIO |
|
response = requests.get(path) |
|
image = Image.open(BytesIO(response.content)).convert('RGB') |
|
else: |
|
image = Image.open(path).convert('RGB') |
|
return image |
|
|
|
def predict(self, path, device="cuda", print_tensor=True): |
|
image = self.open_image(path) |
|
image = self.transform(image) |
|
image = image.unsqueeze(0) |
|
self.eval() |
|
if device == "cuda": |
|
image = image.cuda() |
|
self.cuda() |
|
else: |
|
image = image.cpu() |
|
self.cpu() |
|
with torch.no_grad(): |
|
out, aux = self(image) |
|
if print_tensor: |
|
print(out) |
|
_, predicted = torch.max(out.data, 1) |
|
return self.config.classes[str(predicted.item())] |
|
|