|  |  | 
					
						
						|  | 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) | 
					
						
						|  |  |