import numpy as np
from matplotlib import patches, patheffects
import matplotlib.pyplot as plt
[docs]def show_img(im, figsize=None, ax=None):
if not ax:
_, ax = plt.subplots(figsize=figsize)
ax.imshow(im)
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
return ax
[docs]def outline(o, lw):
o.set_path_effects([
patheffects.Stroke(linewidth=lw, foreground='black'),
patheffects.Normal()
])
[docs]def point(ax, xy, color='red'):
ax.add_patch(
patches.Circle(xy, fill=True, edgecolor=color, color=color, lw=0))
[docs]def rect(ax, b, color='#9cff1d', lw=4):
"""
Parameters
--------
ax: the axis to plot
b: a bounding box of type (x_min, y_min, x_max, y_max)
"""
patch = ax.add_patch(
patches.Rectangle(b[:2],
boundingbox_width(b),
boundingbox_height(b),
fill=False,
edgecolor=color,
lw=2))
outline(patch, lw)
[docs]def text(ax, xy, txt, sz=14):
xy = xy - [0, 10]
text = ax.text(*xy,
txt,
verticalalignment='top',
color='white',
fontsize=sz,
weight='bold')
outline(text, 1)
[docs]def grid(ax, target_shape, grid_len):
size_grid_x = int(target_shape[0] / grid_len)
size_grid_y = int(target_shape[1] / grid_len)
x_ticks = list(range(0, target_shape[0] + size_grid_x, size_grid_x))
y_ticks = list(range(0, target_shape[0] + size_grid_y, size_grid_y))
ax.set_xticks(x_ticks)
ax.set_yticks(y_ticks)
ax.get_xaxis().set_visible(True)
ax.get_yaxis().set_visible(True)
ax.grid(which='both')
[docs]def get_cell_responsible_on_grid(box_xywh, img_size, grid_len):
"""Computes the grid cell responsible to detect the box
"""
grid_size = img_size / grid_len
grid_xy = ((box_xywh[..., :2]) // grid_size).astype(int)
grid_xy = np.clip(grid_xy, 0, grid_len - 1)
return grid_xy
[docs]def boundingbox_height(box):
return box[3] - box[1]
[docs]def boundingbox_width(box):
return box[2] - box[0]