easy-Fpn源码解读(四):dataset
base代码解析
base.py
class Base(torch.utils.data.dataset.Dataset):
class Mode(Enum):
TRAIN = 'train'
EVAL = 'eval'
OPTIONS = ['voc2007', 'coco2017', 'voc2007-cat-dog', 'coco2017-person', 'coco2017-car', 'coco2017-animal']
@staticmethod # 静态方法,不依赖于类调用,但也不能出现和该类相关的任何属性,方法
def from_name(name: str) -> Type['Base']:
if name == 'voc2007':
from dataset.voc2007 import VOC2007
return VOC2007
elif name == 'coco2017':
from dataset.coco2017 import COCO2017
return COCO2017
elif name == 'voc2007-cat-dog':
from dataset.voc2007_cat_dog import VOC2007CatDog
return VOC2007CatDog
elif name == 'coco2017-person':
from dataset.coco2017_person import COCO2017Person
return COCO2017Person
elif name == 'coco2017-car':
from dataset.coco2017_car import COCO2017Car
return COCO2017Car
elif name == 'coco2017-animal':
from dataset.coco2017_animal import COCO2017Animal
return COCO2017Animal
else:
raise ValueError
def __init__(self, path_to_data_dir: str, mode: Mode, image_min_side: float, image_max_side: float):
self._path_to_data_dir = path_to_data_dir
self._mode = mode
self._image_min_side = image_min_side
self._image_max_side = image_max_side
def __len__(self) -> int: # 属于python类定义中保留的特殊的用于重载的方法
raise NotImplementedError # raise用于实现报错功能,而NotImplementedError则是要求在子类中必须实现此方法,不然就报错
def __getitem__(self, index: int) -> Tuple[str, Tensor, float, Tensor, Tensor]:
raise NotImplementedError
def evaluate(self, path_to_results_dir: str, image_ids: List[str], bboxes: List[List[float]], classes: List[int], probs: List[float]) -> Tuple[float, str]:
raise NotImplementedError
def _write_results(self, path_to_results_dir: str, image_ids: List[str], bboxes: List[List[float]], classes: List[int], probs: List[float]):
raise NotImplementedError
@staticmethod
def num_classes() -> int:
raise NotImplementedError
@staticmethod # 关于PIL.Image:https://www.cnblogs.com/lyrichu/p/9124504.html
def preprocess(image: PIL.Image.Image, image_min_side: float, image_max_side: float) -> Tuple[Tensor, float]:
# resize according to the rules:
# 1. scale shorter side to IMAGE_MIN_SIDE
# 2. after scaling, if longer side > IMAGE_MAX_SIDE, scale longer side to IMAGE_MAX_SIDE
scale_for_shorter_side