def get_data(image_set='train', path='~/.fastai/data/stanford-cars', path_devkit='~/.fastai/data/devkit', normalization_type='default'): """ Returns an ImageDataBunch for the specified image_set Parameters ---------- image_set: str One of {'train', 'test'} path: PosixPath or str Image directory path path_devkit: PosixPath or str Devkit directory path normalization_type: str One of {'default', 'imagenet'} Returns ------- data: ImageDataBunch obj """ if type(path) == str: path = PosixPath(os.path.expanduser(path)) if type(path_devkit) == str: path_devkit = PosixPath(os.path.expanduser(path_devkit)) path_images = path / 'cars_{}_p'.format(image_set) path_annos = path_devkit / 'cars_{}_annos.mat'.format(image_set) path_labels_names = path_devkit / 'cars_meta.mat' annotations = scipy.io.loadmat(path_annos)['annotations'][0] label_names = scipy.io.loadmat(path_labels_names)['class_names'][0] images = [path_images / x[5][0] for x in annotations] labels = [label_names[int(x[4][0]) - 1][0] for x in annotations] if normalization_type == 'default': normalization_stats = [ torch.tensor([0.5, 0.5, 0.5]), torch.tensor([0.5, 0.5, 0.5]) ] elif normalization_type == 'imagenet': normalization_stats = imagenet_stats else: raise ValueError("invalid normalization_type provided") data = ImageDataBunch.from_lists(path_images, fnames=images, labels=labels, ds_tfms=get_transforms(), size=331, bs=8).normalize(normalization_stats) return data
def fastai_image_classifier(image_dir, filenames, labels, output_dir): """ This script provides FastAI-compatible training for the input labeled images :param image_dir: directory with images :param filenames: image filenames :param labels: image labels :param output_dir: output directory where results will be exported :return: fastai.basic_train.Learner object """ tfms = get_transforms() data = ImageDataBunch.from_lists(Path(image_dir), filenames, labels=labels, ds_tfms=tfms, size=224, bs=4) learn = cnn_learner(data, models.resnet18, metrics=accuracy, path=output_dir) learn.fit_one_cycle(10) return learn
def train_script(input_data, output_dir, image_dir, batch_size=4, num_iter=10, **kwargs): """ This script provides FastAI-compatible training for the input labeled images :param image_dir: directory with images :param filenames: image filenames :param labels: image labels :param output_dir: output directory where results will be exported :return: fastai.basic_train.Learner object """ filenames, labels = [], [] for item in input_data: if item['output'] is None: continue image_url = item['input'][0] image_path = download(image_url, image_dir) filenames.append(image_path) labels.append(item['output'][0]) tfms = get_transforms() data = ImageDataBunch.from_lists(Path(image_dir), filenames, labels=labels, ds_tfms=tfms, size=224, bs=batch_size) learn = cnn_learner(data, models.resnet18, metrics=accuracy, path=output_dir) learn.fit_one_cycle(num_iter) learn.export() return {'model_path': output_dir, 'image_dir': image_dir}