123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- from collections import defaultdict
- from pathlib import Path
- import cv2
- import numpy as np
- import paddle.vision.transforms as T
- from openvino.inference_engine import IECore
- from ppdet.modeling.mot.tracker import JDETracker
- from ppdet.modeling.mot.visualization import plot_tracking_dict
- root_path = Path(__file__).parent
- target_height = 320
- target_width = 576
- # -------------------------------
- def get_net():
- ie = IECore()
- model_path = root_path / "fairmot_576_320_v3.onnx"
- net = ie.read_network(model= str(model_path))
- exec_net = ie.load_network(network=net, device_name="CPU")
- return net, exec_net
- def get_output_names(net):
- output_names = [key for key in net.outputs]
- return output_names
- def prepare_input():
- transforms = [
- T.Resize(size=(target_height, target_width)),
- T.Normalize(mean=(0,0,0), std=(1,1,1), data_format='HWC', to_rgb= True),
- T.Transpose()
- ]
- img_file = root_path / "street.jpeg"
- img = cv2.imread(str(img_file))
- normalized_img = T.Compose(transforms)(img)
- normalized_img = normalized_img.astype(np.float32, copy=False) / 255.0
- # add an new axis in front
- img_input = normalized_img[np.newaxis, :]
- # scale_factor is calculated as: im_shape / original_im_shape
- h_scale = target_height / img.shape[0]
- w_scale = target_width / img.shape[1]
- input = {"image": img_input, "im_shape": [target_height, target_width], "scale_factor": [h_scale, w_scale]}
- return input, img
- def predict(exec_net, input):
- result = exec_net.infer(input)
- return result
- def postprocess(pred_dets, pred_embs, threshold = 0.5):
- tracker = JDETracker()
- online_targets_dict = tracker.update(pred_dets, pred_embs)
- online_tlwhs = defaultdict(list)
- online_scores = defaultdict(list)
- online_ids = defaultdict(list)
- for cls_id in range(1):
- online_targets = online_targets_dict[cls_id]
- for t in online_targets:
- tlwh = t.tlwh
- tid = t.track_id
- tscore = t.score
- # make sure the tscore is no less then the threshold.
- if tscore < threshold: continue
- # make sure the target area is not less than the min_box_area.
- if tlwh[2] * tlwh[3] <= tracker.min_box_area:
- continue
- # make sure the vertical ratio of a found target is within the range (1.6 as default ratio).
- if tracker.vertical_ratio > 0 and tlwh[2] / tlwh[3] > tracker.vertical_ratio:
- continue
- online_tlwhs[cls_id].append(tlwh)
- online_ids[cls_id].append(tid)
- online_scores[cls_id].append(tscore)
- online_im = plot_tracking_dict(
- img,
- 1,
- online_tlwhs,
- online_ids,
- online_scores,
- frame_id=0)
- return online_im
- # -------------------------------
- net, exec_net = get_net()
- output_names = get_output_names(net)
- del net
- input, img = prepare_input()
- result = predict(exec_net, input)
- pred_dets = result[output_names[0]]
- pred_embs = result[output_names[1]]
- processed_img = postprocess(pred_dets, pred_embs)
- tracked_img_file_path = root_path / "tracked.jpg"
- cv2.imwrite(str(tracked_img_file_path), processed_img)
|