# 12.3. Object Detection and Bounding Boxes¶

In the previous section, we introduced many models for image classification. In image classification tasks, we assume that there is only one main target in the image and we only focus on how to identify the target category. However, in many situations, there are multiple targets in the image that we are interested in. We not only want to classify them, but also want to obtain their specific positions in the image. In computer vision, we refer to such tasks as object detection (or object recognition).

Object detection is widely used in many fields. For example, in self-driving technology, we need to plan routes by identifying the locations of vehicles, pedestrians, roads, and obstacles in the captured video image. Robots often perform this type of task to detect targets of interest. Systems in the security field need to detect abnormal targets, such as intruders or bombs.

In the next few sections, we will introduce multiple deep learning models used for object detection. Before that, we should discuss the concept of target location. First, import the packages and modules required for the experiment.

%matplotlib inline
import d2l
from mxnet import image


Next, we will load the sample images that will be used in this section. We can see there is a dog on the left side of the image and a cat on the right. They are the two main targets in this image.

d2l.set_figsize((3.5, 2.5))
d2l.plt.imshow(img);


## 12.3.1. Bounding Box¶

In object detection, we usually use a bounding box to describe the target location. The bounding box is a rectangular box that can be determined by the $$x$$ and $$y$$ axis coordinates in the upper-left corner and the $$x$$ and $$y$$ axis coordinates in the lower-right corner of the rectangle. We will define the bounding boxes of the dog and the cat in the image based on the coordinate information in the above image. The origin of the coordinates in the above image is the upper left corner of the image, and to the right and down are the positive directions of the $$x$$ axis and the $$y$$ axis, respectively.

# bbox is the abbreviation for bounding box
dog_bbox, cat_bbox = [60, 45, 378, 516], [400, 112, 655, 493]


We can draw the bounding box in the image to check if it is accurate. Before drawing the box, we will define a helper function bbox_to_rect. It represents the bounding box in the bounding box format of matplotlib.

# Save to the d2l package.
def bbox_to_rect(bbox, color):
"""Convert bounding box to matplotlib format."""
# Convert the bounding box (top-left x, top-left y, bottom-right x,
# bottom-right y) format to matplotlib format: ((upper-left x,
# upper-left y), width, height)
return d2l.plt.Rectangle(
xy=(bbox[0], bbox[1]), width=bbox[2]-bbox[0], height=bbox[3]-bbox[1],
fill=False, edgecolor=color, linewidth=2)


After loading the bounding box on the image, we can see that the main outline of the target is basically inside the box.

fig = d2l.plt.imshow(img)