Add compatibility with pifpaf 0.9 (#9)

* remove dependancy on pifpaf.transform

* add compatibility with pifpaf 0.9

* change verbose output

* add image transform compatible with webcam
This commit is contained in:
Lorenzo Bertoni 2019-08-07 12:10:57 +02:00 committed by GitHub
parent 63e5e5ef2c
commit f23a2e34f5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 25 additions and 31 deletions

View File

@ -136,9 +136,9 @@ Multiple visualizations can be combined in different windows.
The above gif has been obtained running on a Macbook the command: The above gif has been obtained running on a Macbook the command:
`pip3 install opencv-python` ```pip3 install opencv-python
python3 -m monoloco.run predict --webcam --scale 0.2 --output_types combined --z_max 10 --checkpoint resnet50 --model data/models/monoloco-190513-1437.pkl
`python3 -m monoloco.run predict --webcam --scale 0.2 --output_types combined --z_max 10 --checkpoint resnet50` ```
# Preprocess # Preprocess

View File

@ -1,4 +1,4 @@
"""Open implementation of MonoLoco.""" """Open implementation of MonoLoco."""
__version__ = '0.4.3' __version__ = '0.4.4'

View File

@ -347,7 +347,7 @@ class EvalKitti:
def show_statistics(self): def show_statistics(self):
print('-'*90) print('-'*90)
alp = [[str(100 * average(self.errors[key][perc]))[:4] alp = [[str(100 * average(self.errors[key][perc]))[:5]
for perc in ['<0.5m', '<1m', '<2m']] for perc in ['<0.5m', '<1m', '<2m']]
for key in self.METHODS] for key in self.METHODS]
@ -373,8 +373,8 @@ class EvalKitti:
if key == 'our': if key == 'our':
print("% of annotation inside the confidence interval: {:.1f} %, " print("% of annotation inside the confidence interval: {:.1f} %, "
"of which {:.1f} % at higher risk" "of which {:.1f} % at higher risk"
.format(self.dic_stats['test'][key][clst]['interval'], .format(self.dic_stats['test'][key][clst]['interval']*100,
self.dic_stats['test'][key][clst]['at_risk'])) self.dic_stats['test'][key][clst]['at_risk']*100))
for perc in ['<0.5m', '<1m', '<2m']: for perc in ['<0.5m', '<1m', '<2m']:
print("{} Instances with error {}: {:.2f} %" print("{} Instances with error {}: {:.2f} %"

View File

@ -5,22 +5,18 @@ import numpy as np
import torchvision import torchvision
import torch import torch
from PIL import Image, ImageFile from PIL import Image, ImageFile
from openpifpaf.network import nets from openpifpaf.network import nets
from openpifpaf import decoder from openpifpaf import decoder
from openpifpaf import transforms
from .process import image_transform
class ImageList(torch.utils.data.Dataset): class ImageList(torch.utils.data.Dataset):
"""It defines transformations to apply to images and outputs of the dataloader""" """It defines transformations to apply to images and outputs of the dataloader"""
def __init__(self, image_paths, scale, image_transform=None): def __init__(self, image_paths, scale):
self.image_paths = image_paths self.image_paths = image_paths
self.image_transform = image_transform or transforms.image_transform # to_tensor + normalize (from pifpaf)
self.scale = scale self.scale = scale
# data = datasets.ImageList(args.images, preprocess=transforms.RescaleRelative(2
# .0)
def __getitem__(self, index): def __getitem__(self, index):
image_path = self.image_paths[index] image_path = self.image_paths[index]
ImageFile.LOAD_TRUNCATED_IMAGES = True ImageFile.LOAD_TRUNCATED_IMAGES = True
@ -34,7 +30,7 @@ class ImageList(torch.utils.data.Dataset):
interpolation=Image.BICUBIC) interpolation=Image.BICUBIC)
# PIL images are not iterables # PIL images are not iterables
original_image = torchvision.transforms.functional.to_tensor(image) # 0-255 --> 0-1 original_image = torchvision.transforms.functional.to_tensor(image) # 0-255 --> 0-1
image = self.image_transform(image) image = image_transform(image)
return image_path, original_image, image return image_path, original_image, image

View File

@ -3,6 +3,7 @@ import json
import numpy as np import numpy as np
import torch import torch
import torchvision
from ..utils import get_keypoints, pixel_to_camera from ..utils import get_keypoints, pixel_to_camera
@ -82,18 +83,6 @@ def laplace_sampling(outputs, n_samples):
return xx return xx
def epistemic_variance(total_outputs):
"""Compute epistemic variance"""
# var_y = np.sum(total_outputs**2, axis=0) / total_outputs.shape[0] - (np.mean(total_outputs, axis=0))**2
var_y = np.var(total_outputs, axis=0)
lower_b = np.quantile(a=total_outputs, q=0.25, axis=0)
upper_b = np.quantile(a=total_outputs, q=0.75, axis=0)
var_new = (upper_b - lower_b)
return var_y, var_new
def unnormalize_bi(outputs): def unnormalize_bi(outputs):
"""Unnormalize relative bi of a nunmpy array""" """Unnormalize relative bi of a nunmpy array"""
@ -151,3 +140,13 @@ def prepare_pif_kps(kps_in):
ccs = kps_in[2:][::3] ccs = kps_in[2:][::3]
return [xxs, yys, ccs] return [xxs, yys, ccs]
def image_transform(image):
normalize = torchvision.transforms.Normalize(
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]
)
transforms = torchvision.transforms.Compose([torchvision.transforms.ToTensor(), normalize, ])
return transforms(image)

View File

@ -11,12 +11,11 @@ import time
import torch import torch
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
from PIL import Image from PIL import Image
from openpifpaf import transforms
import cv2 import cv2
from ..visuals import Printer from ..visuals import Printer
from ..network import PifPaf, MonoLoco from ..network import PifPaf, MonoLoco
from ..network.process import preprocess_pifpaf, factory_for_gt from ..network.process import preprocess_pifpaf, factory_for_gt, image_transform
def webcam(args): def webcam(args):
@ -42,7 +41,7 @@ def webcam(args):
height, width, _ = image.shape height, width, _ = image.shape
print('resized image size: {}'.format(image.shape)) print('resized image size: {}'.format(image.shape))
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
processed_image_cpu = transforms.image_transform(image.copy()) processed_image_cpu = image_transform(image.copy())
processed_image = processed_image_cpu.contiguous().to(args.device, non_blocking=True) processed_image = processed_image_cpu.contiguous().to(args.device, non_blocking=True)
fields = pifpaf.fields(torch.unsqueeze(processed_image, 0))[0] fields = pifpaf.fields(torch.unsqueeze(processed_image, 0))[0]
_, _, pifpaf_out = pifpaf.forward(image, processed_image_cpu, fields) _, _, pifpaf_out = pifpaf.forward(image, processed_image_cpu, fields)

View File

@ -27,7 +27,7 @@ setup(
zip_safe=False, zip_safe=False,
install_requires=[ install_requires=[
'openpifpaf==0.8.0', 'openpifpaf',
'tabulate', # For evaluation 'tabulate', # For evaluation
], ],
extras_require={ extras_require={