|
from typing import List, Set, Tuple |
|
|
|
import cv2 |
|
import numpy as np |
|
import numpy.typing as npt |
|
import torch |
|
|
|
|
|
def create_batch( |
|
images: npt.NDArray, shapes: Set[Tuple[int, int]], batch_size: int = 16 |
|
) -> Tuple[List[List[npt.NDArray]], List[int]]: |
|
""" |
|
- Input: |
|
+) images: List images |
|
+) shapes: set of all shapes of input images |
|
+) batch_size: number image in one batch |
|
- Output: |
|
+) images_batch: batch of images for inference |
|
+) indices: order of all input images |
|
""" |
|
split_batch = [] |
|
images_batch = [] |
|
for shape in shapes: |
|
mini_batch = [] |
|
images_mini_batch = [] |
|
for idx, img in enumerate(images): |
|
if img.shape == shape: |
|
mini_batch.append(idx) |
|
if len(images_mini_batch) < batch_size: |
|
images_mini_batch.append(img) |
|
else: |
|
images_batch.append(images_mini_batch) |
|
images_mini_batch = [] |
|
images_mini_batch.append(img) |
|
images_batch.append(images_mini_batch) |
|
split_batch.append(mini_batch) |
|
del images_mini_batch |
|
|
|
indices = [item for sublist in split_batch for item in sublist] |
|
return images_batch, indices |
|
|
|
|
|
def process_image(img: npt.NDArray, device: str = "cpu") -> npt.NDArray: |
|
"""Preprocess function for yolov5 |
|
|
|
Args: |
|
img (npt.NDArray): Input image |
|
device (str, optional): torch device. Defaults to "cpu". |
|
|
|
Returns: |
|
npt.NDArray: preprocessed image |
|
""" |
|
height, width = img.shape[:2] |
|
top = (640 - height) // 2 |
|
bottom = 640 - height - top |
|
left = (640 - width) // 2 |
|
right = 640 - width - left |
|
img = cv2.copyMakeBorder( |
|
img, |
|
top, |
|
bottom, |
|
left, |
|
right, |
|
cv2.BORDER_CONSTANT, |
|
value=(255, 255, 255), |
|
) |
|
img = img[:, :, ::-1].transpose(2, 0, 1) |
|
img = np.ascontiguousarray(img) |
|
img = torch.from_numpy(img).to(device) |
|
img = img.float() |
|
img /= 255.0 |
|
return img |
|
|