|
|
|
@ -21,7 +21,16 @@ from .ops import clip_boxes, scale_image, xywh2xyxy, xyxy2xywh
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Colors:
|
|
|
|
|
"""Ultralytics color palette https://ultralytics.com/."""
|
|
|
|
|
"""Ultralytics default color palette https://ultralytics.com/.
|
|
|
|
|
|
|
|
|
|
This class provides methods to work with the Ultralytics color palette, including converting hex color codes to
|
|
|
|
|
RGB values.
|
|
|
|
|
|
|
|
|
|
Attributes:
|
|
|
|
|
palette (list of tuple): List of RGB color values.
|
|
|
|
|
n (int): The number of colors in the palette.
|
|
|
|
|
pose_palette (np.array): A specific color palette array with dtype np.uint8.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
|
"""Initialize colors as hex = matplotlib.colors.TABLEAU_COLORS.values()."""
|
|
|
|
@ -36,12 +45,13 @@ class Colors:
|
|
|
|
|
dtype=np.uint8)
|
|
|
|
|
|
|
|
|
|
def __call__(self, i, bgr=False):
|
|
|
|
|
"""Converts hex color codes to rgb values."""
|
|
|
|
|
"""Converts hex color codes to RGB values."""
|
|
|
|
|
c = self.palette[int(i) % self.n]
|
|
|
|
|
return (c[2], c[1], c[0]) if bgr else c
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def hex2rgb(h): # rgb order (PIL)
|
|
|
|
|
def hex2rgb(h):
|
|
|
|
|
"""Converts hex color codes to RGB values (i.e. default PIL order)."""
|
|
|
|
|
return tuple(int(h[1 + i:1 + i + 2], 16) for i in (0, 2, 4))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -49,7 +59,17 @@ colors = Colors() # create instance for 'from utils.plots import colors'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Annotator:
|
|
|
|
|
"""YOLOv8 Annotator for train/val mosaics and jpgs and detect/hub inference annotations."""
|
|
|
|
|
"""Ultralytics Annotator for train/val mosaics and JPGs and predictions annotations.
|
|
|
|
|
|
|
|
|
|
Attributes:
|
|
|
|
|
im (Image.Image or numpy array): The image to annotate.
|
|
|
|
|
pil (bool): Whether to use PIL or cv2 for drawing annotations.
|
|
|
|
|
font (ImageFont.truetype or ImageFont.load_default): Font used for text annotations.
|
|
|
|
|
lw (float): Line width for drawing.
|
|
|
|
|
skeleton (List[List[int]]): Skeleton structure for keypoints.
|
|
|
|
|
limb_color (List[int]): Color palette for limbs.
|
|
|
|
|
kpt_color (List[int]): Color palette for keypoints.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
def __init__(self, im, line_width=None, font_size=None, font='Arial.ttf', pil=False, example='abc'):
|
|
|
|
|
"""Initialize the Annotator class with image and line width along with color palette for keypoints and limbs."""
|
|
|
|
@ -113,6 +133,7 @@ class Annotator:
|
|
|
|
|
|
|
|
|
|
def masks(self, masks, colors, im_gpu, alpha=0.5, retina_masks=False):
|
|
|
|
|
"""Plot masks at once.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
masks (tensor): predicted masks on cuda, shape: [n, h, w]
|
|
|
|
|
colors (List[List[Int]]): colors for predicted masks, [[r, g, b] * n]
|
|
|
|
@ -292,7 +313,37 @@ def plot_labels(boxes, cls, names=(), save_dir=Path(''), on_plot=None):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def save_one_box(xyxy, im, file=Path('im.jpg'), gain=1.02, pad=10, square=False, BGR=False, save=True):
|
|
|
|
|
"""Save image crop as {file} with crop size multiple {gain} and {pad} pixels. Save and/or return crop."""
|
|
|
|
|
"""Save image crop as {file} with crop size multiple {gain} and {pad} pixels. Save and/or return crop.
|
|
|
|
|
|
|
|
|
|
This function takes a bounding box and an image, and then saves a cropped portion of the image according
|
|
|
|
|
to the bounding box. Optionally, the crop can be squared, and the function allows for gain and padding
|
|
|
|
|
adjustments to the bounding box.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
xyxy (torch.Tensor or list): A tensor or list representing the bounding box in xyxy format.
|
|
|
|
|
im (numpy.ndarray): The input image.
|
|
|
|
|
file (Path, optional): The path where the cropped image will be saved. Defaults to 'im.jpg'.
|
|
|
|
|
gain (float, optional): A multiplicative factor to increase the size of the bounding box. Defaults to 1.02.
|
|
|
|
|
pad (int, optional): The number of pixels to add to the width and height of the bounding box. Defaults to 10.
|
|
|
|
|
square (bool, optional): If True, the bounding box will be transformed into a square. Defaults to False.
|
|
|
|
|
BGR (bool, optional): If True, the image will be saved in BGR format, otherwise in RGB. Defaults to False.
|
|
|
|
|
save (bool, optional): If True, the cropped image will be saved to disk. Defaults to True.
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
(numpy.ndarray): The cropped image.
|
|
|
|
|
|
|
|
|
|
Examples:
|
|
|
|
|
```python
|
|
|
|
|
from ultralytics.utils.plotting import save_one_box
|
|
|
|
|
|
|
|
|
|
xyxy = [50, 50, 150, 150]
|
|
|
|
|
im = cv2.imread('image.jpg')
|
|
|
|
|
cropped_im = save_one_box(xyxy, im, file='cropped.jpg', square=True)
|
|
|
|
|
```
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
if not isinstance(xyxy, torch.Tensor): # may be list
|
|
|
|
|
xyxy = torch.stack(xyxy)
|
|
|
|
|
b = xyxy2xywh(xyxy.view(-1, 4)) # boxes
|
|
|
|
|
if square:
|
|
|
|
|
b[:, 2:] = b[:, 2:].max(1)[0].unsqueeze(1) # attempt rectangle to square
|
|
|
|
|