Flipping an image (and its annotations) is a deceivingly simple technique that can improve model performance in substantial ways.

Our models are learning what collection of pixels and the relationship between those collections of pixels denote an object is in-frame. But machine learning models (like convolutional neural networks) have a tendency to be quite brittle: they might memorize a specific ordering of pixels describes an object, but if that same object is mirrored across the image, our models may struggle to recognize it.

Consider the orientation of your face when you are taking a selfie versus using the backwards lens on your camera: one interpretation may be mirrored while the other is not, yet they are still both your face. This mirroring of orientation is what we call flipping an image.

By creating several versions of our images in various orientations, we give our deep learning model more information to learn from without having to go through the time consuming process of collecting and labeling more training data.

Implementing Flip

Flipping an image is quite straightforward in NumPy:

    def update_image(self):
        if self.kwargs["how"] == "vertical":
            img = np.flipud(self.img)
        elif self.kwargs["how"] == "horizontal":
            img = np.fliplr(self.img)
        return img

Remember, we need to also handle the image’s annotations as well:

if self.kwargs["how"] == "vertical":
    for box in self.annotations["boxes"]:
    name = box['label']
    # unchanged
    width = box["width"]
    # unchanged
    height = box["height"]
    # check if annotation is on bottom of image
    if box["y"] < img_height/2:
        # new Y position is addition of center and diff of
        # (center and old y)
        nY = img_height/2 + (img_height/2 - box["y"])
    # else annotation is on right side of image
    elif box["y"] >= img_height/2:
        # new Y position is center  diff between old x and center
        nY = img_height/2 - (box["y"] - img_height/2)
    # unchanged
    nX = box["x"]
    # create new boxes for each label
    new_box.append({
    "label": name,
    "x": nX,
    "y": nY,
    "width": width,
    "height": height
})

Flips in Roboflow

Roboflow includes a flip augmentation by default on all accounts. Simply create a dataset, check "Flip" augmentation, and we handle the image and annotations!

Roboflow Screenshot: choosing horizontal and vertical flips.
Simply toggle it on!