Object Detection - Prepare Dataset for Object Detector

Preparing dataset for object detection is slightly difference and more difficult than image prediction.

Our goal in this tutorial is to introduce the simplest methods to initiate or load a object detection datset for autogluon.vision.ObjectDetector.

There are generally two ways to load a dataset for ObjectDetector:

  • Load an existing object detection dataset, in VOC or COCO formats, downloaded or exported by other labeling tools.

  • Manually convert raw annotations in any format, knowing this you will be able to deal with arbitrary dataset format.

%matplotlib inline
import autogluon.core as ag
from autogluon.vision import ObjectDetector

Load an existing object detection dataset

Pascal VOC and MS COCO are two most popular data format for object detection. Most public available object detection datasets follow either one of these two formats. In this tutorial we will not touch the details. You may view the original introduction for VOC and COCO.

To distinguish these two formats, you can either refer to the labeling tool or check the folder structure. Usually annotations in VOC format are individual xml files, while COCO format use a single json file to store all annotations.

url = 'https://autogluon.s3.amazonaws.com/datasets/tiny_motorbike.zip'
dataset_train = ObjectDetector.Dataset.from_voc(url, splits='trainval')
# or load from coco format, skip as it's too big to download
# dataset_train = ObjectDetector.Dataset.from_coco(annotation_json_file, root='/path/to/root')
├── Annotations/
├── ImageSets/
└── JPEGImages/

Manually convert any format to autogluon object detector dataset

We will walk you through by creating a dataset manually to help you understand the meaning of underlying data, this does not mean you have to do so. We highly recommend you to use a handy labeling tool for object detection if you want to create one by your own. Labeling bounding boxes are time consuming so a nice UI/UX design will significantly reduce the trouble.

In the following section, we will use a single image and add annotations manually for all three major objects.

ag.utils.download('https://raw.githubusercontent.com/zhreshold/mxnet-ssd/master/data/demo/dog.jpg', path='dog.jpg')
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
img = mpimg.imread('dog.jpg')
imgplot = plt.imshow(img)
INFO:autogluon.core.utils.files:Downloading dog.jpg from https://raw.githubusercontent.com/zhreshold/mxnet-ssd/master/data/demo/dog.jpg...
100%|██████████| 160/160 [00:00<00:00, 7121.44KB/s]

With the grid on, we can roughly annotate this image like this:

import pandas as pd

class NaiveDetectionGT:
    def __init__(self, image):
        self._objects = []
        self.image = image
        img = mpimg.imread('dog.jpg')
        self.w = img.shape[1]
        self.h = img.shape[0]

    def add_object(self, name, xmin, ymin, xmax, ymax, difficult=0):
        self._objects.append({'image': self.image, 'class': name,
                              'xmin': xmin / self.w, 'ymin': ymin / self.h,
                              'xmax': xmax / self.w, 'ymax': ymax / self.h, 'difficult': difficult})

    def df(self):
        return pd.DataFrame(self._objects)

gt = NaiveDetectionGT('dog.jpg')
gt.add_object('dog', 140, 220, 300, 540)
gt.add_object('bicycle', 120, 140, 580, 420)
gt.add_object('car', 460, 70, 680, 170)
df = gt.df
image class xmin ymin xmax ymax difficult
0 dog.jpg dog 0.182292 0.381944 0.390625 0.937500 0
1 dog.jpg bicycle 0.156250 0.243056 0.755208 0.729167 0
2 dog.jpg car 0.598958 0.121528 0.885417 0.295139 0

The df is a valid dataset and can be used by ObjectDetector.fit function. Internally it will be converted to object detection dataset, or you can manually convert it.

dataset = ObjectDetector.Dataset(df, classes=df['class'].unique().tolist())
dataset.show_images(nsample=1, ncol=1)

Congratulations, you can now proceed to Object Detection - Quick Start to start training the ObjectDetector.