Dataloaders for object detection and instance segmentation.
/home/user/jupyter/env/lib/python3.7/site-packages/torch/cuda/__init__.py:52: UserWarning: CUDA initialization: Found no NVIDIA driver on your system. Please check that you have an NVIDIA GPU and installed a driver from http://www.nvidia.com/Download/index.aspx (Triggered internally at  /pytorch/c10/cuda/CUDAFunctions.cpp:100.)
  return torch._C._cuda_getDeviceCount() > 0

class ObjectDetectionDataLoaders[source]

ObjectDetectionDataLoaders(*loaders, path='.', device=None) :: DataLoaders

Basic wrapper around DataLoaders with factory method for object dections and instance segmentation problems

ObjectDetectionDataLoaders.from_df[source]

ObjectDetectionDataLoaders.from_df(df, valid_pct=0.2, img_id_col='image_id', img_path_col='image_path', bbox_cols=['x_min', 'y_min', 'x_max', 'y_max'], class_col='class_name', mask_path_col='mask_path', object_id_col='object_id', seed=None, vocab=None, add_na=True, item_tfms=None, batch_tfms=None, debug=False, path='.', bs=64, val_bs=None, shuffle=True, device=None)

Create dataloaders from DataFrame

Load the path and DataFrame of a downloaded dataset and create a DataLoader in one line.

from fastai_object_detection.datasets import CocoData

path,df = CocoData.get_path_df("ds-cats-dogs")
df.head(2)
image_id image_path mask_path object_id x_min y_min x_max y_max class_name
0 237643 /home/user/.fastai/data/ds-cats-dogs/images/000000237643.jpg /home/user/.fastai/data/ds-cats-dogs/masks/000000237643_0.png 0 385.42 53.01 619.38 178.05 dog
1 157981 /home/user/.fastai/data/ds-cats-dogs/images/000000157981.jpg /home/user/.fastai/data/ds-cats-dogs/masks/000000157981_0.png 0 50.58 39.23 272.52 468.65 cat
dls = ObjectDetectionDataLoaders.from_df(df, valid_pct=0.1, bs=2,
                                        item_tfms=[Resize(512, method='pad', pad_mode='zeros')],
                                        batch_tfms=[Normalize.from_stats(*imagenet_stats)])

Now you can show a batch as usual.

b = dls.one_batch()
[type(t) for t in b]
[fastai.torch_core.TensorImage,
 fastai.torch_core.TensorMask,
 fastai.vision.core.TensorBBox,
 fastai.torch_core.TensorMultiCategory]
dls.show_batch(b, figsize=(10,10))

If the column mask_path exists in your DataFrame, it creates a DataLoader with segmentation masks. If the column is not present, the dataloader only returns bounding boxes and labels.

df_bb_only = df.drop(columns=["mask_path"])
df_bb_only.head(2)
image_id image_path object_id x_min y_min x_max y_max class_name
0 237643 /home/user/.fastai/data/ds-cats-dogs/images/000000237643.jpg 0 385.42 53.01 619.38 178.05 dog
1 157981 /home/user/.fastai/data/ds-cats-dogs/images/000000157981.jpg 0 50.58 39.23 272.52 468.65 cat
dls = ObjectDetectionDataLoaders.from_df(df_bb_only, valid_pct=0.1, bs=2, 
                                        item_tfms=[Resize(512, method='pad', pad_mode='zeros')],
                                        batch_tfms=[Normalize.from_stats(*imagenet_stats)])
b = dls.one_batch()
[type(t) for t in b]
[fastai.torch_core.TensorImage,
 fastai.vision.core.TensorBBox,
 fastai.torch_core.TensorMultiCategory]
dls.show_batch(b, figsize=(10,10))