| |
|
| | import numpy as np |
| | import cv2 |
| | import torch |
| | import onnxruntime |
| | import sys |
| | import pathlib |
| | CURRENT_DIR = pathlib.Path(__file__).parent |
| | sys.path.append(str(CURRENT_DIR)) |
| | import argparse |
| | from utils import ( |
| | letterbox, |
| | non_max_suppression, |
| | scale_coords, |
| | Annotator, |
| | Colors, |
| | ) |
| |
|
| |
|
| | def pre_process(img): |
| | img = letterbox(img, [640, 640], stride=32, auto=False)[0] |
| | |
| | img = img.transpose((2, 0, 1))[::-1] |
| | img = np.ascontiguousarray(img) |
| | img = img.astype("float32") |
| | img = img / 255.0 |
| | img = img[np.newaxis, :] |
| | return img |
| |
|
| |
|
| | def post_process(x): |
| | x = list(x) |
| | z = [] |
| | stride = [8, 16, 32] |
| | for i in range(3): |
| | bs, _, ny, nx = x[i].shape |
| | x[i] = ( |
| | torch.tensor(x[i]) |
| | .view(bs, 3, 85, ny, nx) |
| | .permute(0, 1, 3, 4, 2) |
| | .contiguous() |
| | ) |
| | y = x[i].sigmoid() |
| | xy = (y[..., 0:2] * 2.0 - 0.5 + grid[i]) * stride[i] |
| | wh = (y[..., 2:4] * 2) ** 2 * anchor_grid[i] |
| | y = torch.cat((xy, wh, y[..., 4:]), -1) |
| | z.append(y.view(bs, -1, 85)) |
| |
|
| | return (torch.cat(z, 1), x) |
| |
|
| |
|
| | def make_parser(): |
| | parser = argparse.ArgumentParser("onnxruntime inference sample") |
| | parser.add_argument( |
| | "-m", |
| | "--model", |
| | type=str, |
| | default="./yolov5s_qat.onnx", |
| | help="input your onnx model.", |
| | ) |
| | parser.add_argument( |
| | "-i", |
| | "--image_path", |
| | type=str, |
| | default='./demo.jpg', |
| | help="path to your input image.", |
| | ) |
| | parser.add_argument( |
| | "-o", |
| | "--output_path", |
| | type=str, |
| | default='./demo_infer.jpg', |
| | help="path to your output directory.", |
| | ) |
| | parser.add_argument( |
| | '--ipu', |
| | action='store_true', |
| | help='flag for ryzen ai' |
| | ) |
| | parser.add_argument( |
| | '--provider_config', |
| | default='', |
| | type=str, |
| | help='provider config for ryzen ai' |
| | ) |
| | return parser |
| |
|
| |
|
| | names = ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light', |
| | 'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', |
| | 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee', |
| | 'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', |
| | 'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple', |
| | 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch', |
| | 'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', |
| | 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear', |
| | 'hair drier', 'toothbrush'] |
| |
|
| |
|
| | if __name__ == '__main__': |
| | args = make_parser().parse_args() |
| | onnx_path = args.model |
| | if args.ipu: |
| | providers = ["VitisAIExecutionProvider"] |
| | provider_options = [{"config_file": args.provider_config}] |
| | onnx_model = onnxruntime.InferenceSession(onnx_path, providers=providers, provider_options=provider_options) |
| | else: |
| | onnx_model = onnxruntime.InferenceSession(onnx_path) |
| | grid = np.load("./grid.npy", allow_pickle=True) |
| | anchor_grid = np.load("./anchor_grid.npy", allow_pickle=True) |
| | path = args.image_path |
| | new_path = args.output_path |
| | conf_thres, iou_thres, classes, agnostic_nms, max_det = 0.25, 0.45, None, False, 1000 |
| |
|
| | img0 = cv2.imread(path) |
| | img = pre_process(img0) |
| | onnx_input = {onnx_model.get_inputs()[0].name: img.transpose(0, 2, 3, 1)} |
| | onnx_output = onnx_model.run(None, onnx_input) |
| | onnx_output = [torch.tensor(item).permute(0, 3, 1, 2) for item in onnx_output] |
| | onnx_output = post_process(onnx_output) |
| | pred = non_max_suppression( |
| | onnx_output[0], conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det |
| | ) |
| | colors = Colors() |
| | det = pred[0] |
| | im0 = img0.copy() |
| | annotator = Annotator(im0, line_width=2, example=str(names)) |
| | if len(det): |
| | |
| | det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round() |
| |
|
| | |
| | for *xyxy, conf, cls in reversed(det): |
| | c = int(cls) |
| | label = f"{names[c]} {conf:.2f}" |
| | annotator.box_label(xyxy, label, color=colors(c, True)) |
| | |
| | im0 = annotator.result() |
| | cv2.imwrite(new_path, im0) |
| |
|