#!/usr/bin/env python3

import cv2
import numpy as np
import openvino as ov

model_path = '../Models/yolov8n_openvino_model/yolov8n.xml'
image_path = '../../../assets/bus.jpg'
device_name = 'CPU'


def main():
    # Загрузка OpenVINO
    core = ov.Core()
    model = core.read_model(model_path)

    # Загрузка изображения
    image = cv2.imread(image_path)

    # Добавить N измерений
    input_tensor = np.expand_dims(image, 0)

    # Изменение формы модели в соответствии с ВxШ изображения
    n, h, w, c = input_tensor.shape
    model.reshape({model.input().get_any_name(): ov.PartialShape((n, c, h, w))})

    # Предварительная обработка
    ppp = ov.preprocess.PrePostProcessor(model)
    ppp.input().tensor().set_element_type(ov.Type.u8).set_layout(ov.Layout('NHWC'))
    ppp.input().model().set_layout(ov.Layout('NCHW'))
    ppp.output().tensor().set_element_type(ov.Type.f32)
    model = ppp.build()

    compiled_model = core.compile_model(model, device_name)
    results = compiled_model.infer_new_request({0: input_tensor})

    # Output
    predictions = next(iter(results.values()))
    detections = predictions.reshape(-1, 7)

    for detection in detections:
        confidence = detection[2]

        if confidence > 0.25:
            class_id = int(detection[1])

            xmin = int(detection[3] * w)
            ymin = int(detection[4] * h)
            xmax = int(detection[5] * w)
            ymax = int(detection[6] * h)

            cv2.rectangle(image, (xmin, ymin), (xmax, ymax), (0, 255, 0), 2)

    cv2.imwrite('/tmp/py_openvino_result.bmp', image)


if __name__ == '__main__':
    main()
