Slicing with SAHI¶
0. Preparation¶
- Be sure current working directory is 'demo/' folder:
In [ ]:
Copied!
import os
os.getcwd()
import os
os.getcwd()
- Import required functions:
In [1]:
Copied!
from sahi.slicing import slice_coco
from sahi.utils.file import load_json
from PIL import Image, ImageDraw
import matplotlib.pyplot as plt
from sahi.slicing import slice_coco
from sahi.utils.file import load_json
from PIL import Image, ImageDraw
import matplotlib.pyplot as plt
1. Slicing COCO Dataset into Grids¶
- Visualize original image and annotations:
In [2]:
Copied!
coco_dict = load_json("demo_data/terrain2_coco.json")
f, axarr = plt.subplots(1, 1, figsize=(12, 12))
# read image
img_ind = 0
img = Image.open("demo_data/" + coco_dict["images"][img_ind]["file_name"]).convert('RGBA')
# iterate over all annotations
for ann_ind in range(len(coco_dict["annotations"])):
# convert coco bbox to pil bbox
xywh = coco_dict["annotations"][ann_ind]["bbox"]
xyxy = [xywh[0], xywh[1], xywh[0]+xywh[2], xywh[1]+xywh[3]]
# visualize bbox over image
ImageDraw.Draw(img, 'RGBA').rectangle(xyxy, width=5)
axarr.imshow(img)
coco_dict = load_json("demo_data/terrain2_coco.json")
f, axarr = plt.subplots(1, 1, figsize=(12, 12))
# read image
img_ind = 0
img = Image.open("demo_data/" + coco_dict["images"][img_ind]["file_name"]).convert('RGBA')
# iterate over all annotations
for ann_ind in range(len(coco_dict["annotations"])):
# convert coco bbox to pil bbox
xywh = coco_dict["annotations"][ann_ind]["bbox"]
xyxy = [xywh[0], xywh[1], xywh[0]+xywh[2], xywh[1]+xywh[3]]
# visualize bbox over image
ImageDraw.Draw(img, 'RGBA').rectangle(xyxy, width=5)
axarr.imshow(img)
Out[2]:
<matplotlib.image.AxesImage at 0x7fdb3fe44310>
- To slice a COCO dataset annoations an images, we need to specify slice parameters. In this example we will slice images into 256x256 grids overlap ratio of 0.2:
In [3]:
Copied!
coco_dict, coco_path = slice_coco(
coco_annotation_file_path="demo_data/terrain2_coco.json",
image_dir="demo_data/",
output_coco_annotation_file_name="sliced_coco.json",
ignore_negative_samples=False,
output_dir="demo_data/sliced/",
slice_height=256,
slice_width=256,
overlap_height_ratio=0.2,
overlap_width_ratio=0.2,
min_area_ratio=0.1,
verbose=True
)
coco_dict, coco_path = slice_coco(
coco_annotation_file_path="demo_data/terrain2_coco.json",
image_dir="demo_data/",
output_coco_annotation_file_name="sliced_coco.json",
ignore_negative_samples=False,
output_dir="demo_data/sliced/",
slice_height=256,
slice_width=256,
overlap_height_ratio=0.2,
overlap_width_ratio=0.2,
min_area_ratio=0.1,
verbose=True
)
100%|██████████| 5/5 [00:00<00:00, 121222.66it/s] 100%|██████████| 1/1 [00:00<00:00, 10.75it/s]
indexing coco dataset annotations... image.shape: (1024, 682) sliced image path: demo_data/sliced/terrain2_0_0_256_256.png sliced image path: demo_data/sliced/terrain2_205_0_461_256.png sliced image path: demo_data/sliced/terrain2_410_0_666_256.png sliced image path: demo_data/sliced/terrain2_615_0_871_256.png sliced image path: demo_data/sliced/terrain2_768_0_1024_256.png sliced image path: demo_data/sliced/terrain2_0_205_256_461.png sliced image path: demo_data/sliced/terrain2_205_205_461_461.png sliced image path: demo_data/sliced/terrain2_410_205_666_461.png sliced image path: demo_data/sliced/terrain2_615_205_871_461.png sliced image path: demo_data/sliced/terrain2_768_205_1024_461.png sliced image path: demo_data/sliced/terrain2_0_410_256_666.png sliced image path: demo_data/sliced/terrain2_205_410_461_666.png sliced image path: demo_data/sliced/terrain2_410_410_666_666.png sliced image path: demo_data/sliced/terrain2_615_410_871_666.png sliced image path: demo_data/sliced/terrain2_768_410_1024_666.png sliced image path: demo_data/sliced/terrain2_0_426_256_682.png sliced image path: demo_data/sliced/terrain2_205_426_461_682.png sliced image path: demo_data/sliced/terrain2_410_426_666_682.png sliced image path: demo_data/sliced/terrain2_615_426_871_682.png sliced image path: demo_data/sliced/terrain2_768_426_1024_682.png Num slices: 20 slice_height 256 slice_width 256 Time to slice demo_data/terrain2.png 0.09270477294921875 seconds
- Visualize sliced images:
In [4]:
Copied!
f, axarr = plt.subplots(4, 5, figsize=(13,13))
img_ind = 0
for ind1 in range(4):
for ind2 in range(5):
img = Image.open("demo_data/sliced/" + coco_dict["images"][img_ind]["file_name"])
axarr[ind1, ind2].imshow(img)
img_ind += 1
f, axarr = plt.subplots(4, 5, figsize=(13,13))
img_ind = 0
for ind1 in range(4):
for ind2 in range(5):
img = Image.open("demo_data/sliced/" + coco_dict["images"][img_ind]["file_name"])
axarr[ind1, ind2].imshow(img)
img_ind += 1
- Visualize sliced annotations on sliced images:
In [5]:
Copied!
f, axarr = plt.subplots(4, 5, figsize=(13,13))
img_ind = 0
for row_ind in range(4):
for column_ind in range(5):
# read image
img = Image.open("demo_data/sliced/" + coco_dict["images"][img_ind]["file_name"]).convert('RGBA')
# iterate over all annotations
for ann_ind in range(len(coco_dict["annotations"])):
# find annotations that belong the selected image
if coco_dict["annotations"][ann_ind]["image_id"] == coco_dict["images"][img_ind]["id"]:
# convert coco bbox to pil bbox
xywh = coco_dict["annotations"][ann_ind]["bbox"]
xyxy = [xywh[0], xywh[1], xywh[0]+xywh[2], xywh[1]+xywh[3]]
# visualize bbox over image
ImageDraw.Draw(img, 'RGBA').rectangle(xyxy, width=5)
axarr[row_ind, column_ind].imshow(img)
img_ind += 1
f, axarr = plt.subplots(4, 5, figsize=(13,13))
img_ind = 0
for row_ind in range(4):
for column_ind in range(5):
# read image
img = Image.open("demo_data/sliced/" + coco_dict["images"][img_ind]["file_name"]).convert('RGBA')
# iterate over all annotations
for ann_ind in range(len(coco_dict["annotations"])):
# find annotations that belong the selected image
if coco_dict["annotations"][ann_ind]["image_id"] == coco_dict["images"][img_ind]["id"]:
# convert coco bbox to pil bbox
xywh = coco_dict["annotations"][ann_ind]["bbox"]
xyxy = [xywh[0], xywh[1], xywh[0]+xywh[2], xywh[1]+xywh[3]]
# visualize bbox over image
ImageDraw.Draw(img, 'RGBA').rectangle(xyxy, width=5)
axarr[row_ind, column_ind].imshow(img)
img_ind += 1