YOLO-World-IDCard / utils.py
hr16's picture
Create utils.py
aec7a65 verified
import cv2
import numpy as np
import onnxruntime as ort
def preprocess(image, size=(640, 640)):
h, w = image.shape[:2]
max_size = max(h, w)
scale_factor = size[0] / max_size
pad_h = (max_size - h) // 2
pad_w = (max_size - w) // 2
pad_image = np.zeros((max_size, max_size, 3), dtype=image.dtype)
pad_image[pad_h:h + pad_h, pad_w:w + pad_w] = image
image = cv2.resize(pad_image, size,
interpolation=cv2.INTER_LINEAR).astype('float32')
image /= 255.0
image = image[None]
return image, scale_factor, (pad_h, pad_w)
def inference(ort_session,
ori_image,
size=(640, 640),
**kwargs):
# normal export
# with NMS and postprocessing
h, w = ori_image.shape[:2]
image, scale_factor, pad_param = preprocess(ori_image[:, :, [2, 1, 0]],
size)
input_ort = ort.OrtValue.ortvalue_from_numpy(image.transpose((0, 3, 1, 2)))
results = ort_session.run(["num_dets", "labels", "scores", "boxes"],
{"images": input_ort})
num_dets, labels, scores, bboxes = results
num_dets = num_dets[0][0]
labels = labels[0, :num_dets]
scores = scores[0, :num_dets]
bboxes = bboxes[0, :num_dets]
bboxes -= np.array(
[pad_param[1], pad_param[0], pad_param[1], pad_param[0]])
bboxes /= scale_factor
bboxes[:, 0::2] = np.clip(bboxes[:, 0::2], 0, w)
bboxes[:, 1::2] = np.clip(bboxes[:, 1::2], 0, h)
bboxes = bboxes.round().astype('int')
return labels, scores, bboxes