添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
卖萌的蚂蚁  ·  Kaggle -Ultralytics ...·  23 小时前    · 
旅途中的硬盘  ·  Solved: Re: Help ...·  2 周前    · 
潇洒的猴子  ·  维护计算机视觉模型 ...·  1 月前    · 
淡定的李子  ·  :: Términos - FMIM ::·  2 月前    · 
健壮的芹菜  ·  ERC 721 - ...·  2 月前    · 
痴情的松鼠  ·  Paginado remoto en un ...·  6 月前    · 
Sorry, you must verify to complete this action. Please click the verification link in your email. You may re-send via your profile .

Please help me with the difficulties I am experiencing trying to convert a YOLOv4-tiny model to IR (I downloaded the three files classes.txt, yolov4-tiny.cfg and yolov4-tiny.weights somewhere from the Internet some time ago and the model works fine).

I am following this page ( https://docs.openvino.ai/latest/workbench_docs_Workbench_DG_Tutorial_Import_YOLO.html ) and below, I will be asking questions (I colored in red for you to find them easily) where I have difficulties to understand:

Opening the Github (in the browser) for Yolov4-tiny ( https://github.com/openvinotoolkit/open_model_zoo/tree/master/models/public/yolo-v4-tiny-tf ), I opened the model.yml file and found these converter parameters:

model_optimizer_args:
  - --input_shape=[1,416,416,3]
  - --input=image_input
  - --scale_values=image_input[255]
  - --reverse_input_channels
  - --input_model=$conv_dir/yolo-v4-tiny.pb

I noticed the arguments differs from YOLOv4, where the YOLOv4 has an argument that reads --saved_model_dir=$conv_dir/yolo-v4.savedmodel while the Yolov4-tiny has an argument that reads --input_model=$conv_dir/yolo-v4-tiny.pb . But even then, I cannot understand what does the YOLOv4 page mean when it says, " Here you can see that the required format for the YOLOv4 model is SavedModel ". What does it mean by "SavedModel"? Does it mean the converted filename extension has to be declared ending with ".savedmodel"?

Opening the Github (in the browser) for Yolov4-tiny, I opened the pre-convert.py file and found the parameters required to use the converter:

subprocess.run([sys.executable, '--',
    str(args.input_dir / 'keras-YOLOv3-model-set/tools/model_converter/convert.py'),
    str(args.input_dir / 'keras-YOLOv3-model-set/cfg/yolov4-tiny.cfg'),
    str(args.input_dir / 'yolov4-tiny.weights'),
    str(args.output_dir / 'yolo-v4-tiny.h5'),
    '--yolo4_reorder',
], check=True)

I noticed the input_dir argument asks for the " yolov4-tiny.weights " file and the output_dir says " yolo-v4-tiny.h5 ". Shouldn't the output_dir filename extension be " .pb "? I ask because I noticed that for YOLOv4, both, the model.yml conv_dir and the pre-converter.py output_dir had the same filename with same filename extension ".savedmodel".

I ran the git clone to download the Darknet-to-TensorFlow converter with no issues. I prepared and activated the virtual environment with no issues as well. I saw some warnings (or errors) when I installed the ./keras-YOLOv3-model-set/requirements.txt the first time but, I ran the installation a second time and, I saw no warnings nor errors.

Following the YOLOv4 page again, where I have to organize the folders and files, I understood I had to put the "yolov4-tiny.weights" file (in my case) in the root of the keras-YOLOv3-model-set folder and the "yolov4-tiny.cfg" file in the "cfg" subfolder. However, I could not understand why is it saying there has to be a file named "saved_model" (on the root of the keras-YOLOv3-model-set folder)? Where is this file? And in my case, what should I put instead of "saved_model"?

Finally, should the script to run the converter for my yolov4r-tiny model read as follows?

python keras-YOLOv3-model-set/tools/model_converter/convert.py keras-YOLOv3-model-set/cfg/yolov4-tiny.cfg yolov4-tiny.weights yolo-v4-tiny.pb --yolo4_reorder

If the above script is wrong, can you please write to me how it should read?

Thank you in advanced and will be waiting for your reply,

Hello RGVGreatCoder,

The yolov4-tiny model was converted to SavedModel format. To convert the model to OpenVINO IR format, specify the --saved_model_dir parameter in the SavedModel directory.

Modify your command as follows:

mo --saved_model_dir C:\openvino-models -o C:\openvino-models\IR --input_shape [1,608,608,3] --data_type=FP16 -n yolov4-tiny

[ SUCCESS ] Generated IR version 10 model.
[ SUCCESS ] XML file: C:\Users\yolo-v4-tiny\yolov4-tiny.xml
[ SUCCESS ] BIN file: C:\Users\yolo-v4-tiny\yolov4-tiny.bin
[ SUCCESS ] Total execution time: 26.04 seconds.

Sincerely,

Zulkifli

Thank you for your question.

A SavedModel consists of a special directory with a .pb file and several subfolders: variables, assets, and assets.extra . For more information about the SavedModel directory, refer to the README file in the TensorFlow repository.

All YOLO models are originally implemented in the DarkNet framework and consist of two files:

  • .cfg file with model configurations
  • .weights file with model weights
  • In pre-convert.py file as you mentioned, the model is converted from .weights (YOLO native format) to .h5 (Keras), then from .h5 to .pb . You can refer to this snipped code from the pre-convert.py :

    subprocess.run([sys.executable, '--',

    str(args.input_dir / 'keras-YOLOv3-model-set/tools/model_converter/keras_to_tensorflow.py'),

    '--input_model={}'.format(args.output_dir / 'yolo-v4-tiny.h5'),

    '--output_model={}'.format(args.output_dir / 'yolo-v4-tiny.pb'),

    ], check=True)

    This method is applicable if you are using YOLO models from Intel Open Model ZOO (OMZ) Public model . These are the command used to convert yolo-v4-tiny-tf from OMZ Public model to IR format:

  • python3 downloader.py --name yolo-v4-tiny-tf
  • python3 converter.py –name yolo-v4-tiny-tf
  • If you wanted to convert your custom YOLOv4 model to IR format, I suggest you refer to Converting YOLO Models to the Intermediate Representation (IR) .

    Sincerely,

    Zulkifli

    Oh my. Please excuse me if I wasn't clear. I meant to say right at the beginning of my message, I needed to convert to IR, a custom Yolov4-tiny model I own, downloaded from a site I cannot remember , which is not from the Open Model Zoo (OMZ).  At the end of your response, it seems you are telling me that the page I was following does not apply to my need; therefore, your clarifications, although appreciated, in a way are pointless, since these only apply to Yolov4 models downloaded from OMZ. Am I correct?

    Seems I have to follow instead another page to convert my custom Yolov4-tiny model. The page you mentioned is this one: ( https://docs.openvino.ai/2021.4/openvino_docs_MO_DG_prepare_model_convert_model_tf_specific_Convert_YOLO_From_Tensorflow.html#convert-yolov4-model-to-ir) . However, this page does not apply to me eihter because it is asking to download and work on a yolov4.weight model from an existing hub. It starts of saying, " This section explains how to convert the YOLOv4 Keras* model from the https://github.com/Ma-Dan/keras-yolo4 " [github]. This page does not say it can work for a custom Yolov4 model.

    Can you please provide me a step-by-step instruction on how to convert my own custom Yolov4-tiny model to IR?

    I still have not received an answer to my last reply. I will greatly appreciate if I can get an answer.

    Also, I should let you know that I installed the OpenVINO toolkit for Developer using PIP. Is there a command to preconvert a custom YoloV4-tiny model before running the omz_converter?

    This issue is still not resolved. Please help.

    Thank you in advanced and will be waiting for your reply ...

    Okay. Almost there! But, I faced some issues when running the model optimizer on PIP. Let me explain below:

    So I ran the git clone, then ran the convert.py and, it generated a file named "saved_model.pb". I think I got it right up to this point.

    The page you shared, suggests running the PIP model optimizer "mo" script following this format:

    mo --saved_model_dir yolov4 --output_dir models/IRs --input_shape [1,608,608,3] --model_name yolov4

    So I provided my argument values (giving my best interpretation of the format):

    mo --C:\openvino-models yolov4 --C:\openvino-models models/IRs --input_shape [1,608,608,3] --model_name yolov4

    When I ran it, it threw the following error:

    usage: main.py [options]
    main.py: error: unrecognized arguments: --C:\openvino-models yolov4 --C:\openvino-models models/IRs

    To learn more about the PIP model optimizer "mo", I found this page in your site: https://docs.openvino.ai/latest/openvino_docs_MO_DG_prepare_model_convert_model_Converting_Model.html

    So I rewrote the "mo" script as follows:

    mo -m C:\openvino-models\saved_model.pb -o C:\openvino-models\IR --input_shape [1,608,608,3] -n yolov4

    And when I ran it, it displayed the following content that includes errors:

    Model Optimizer arguments:
    Common parameters:
            - Path to the Input Model:      C:\openvino-models\saved_model.pb
            - Path for generated IR:        C:\openvino-models\IR
            - IR output name:       yolov4
            - Log level:    ERROR
            - Batch:        Not specified, inherited from the model
            - Input layers:         Not specified, inherited from the model
            - Output layers:        Not specified, inherited from the model
            - Input shapes:         [1,608,608,3]
            - Mean values:  Not specified
            - Scale values:         Not specified
            - Scale factor:         Not specified
            - Precision of IR:      FP32
            - Enable fusing:        True
            - Enable grouped convolutions fusing:   True
            - Move mean values to preprocess section:       None
            - Reverse input channels:       False
    TensorFlow specific parameters:
            - Input model in text protobuf format:  False
            - Path to model dump for TensorBoard:   None
            - List of shared libraries with TensorFlow custom layers implementation:        None
            - Update the configuration file with input/output node names:   None
            - Use configuration file used to generate the model with Object Detection API:  None
            - Use the config file:  None
            - Inference Engine found in:    c:\users\manue\appdata\local\programs\python\python38\lib\site-packages\openvino
    Inference Engine version:       2021.4.2-3976-0943ed67223-refs/pull/539/head
    Model Optimizer version:        2021.4.2-3976-0943ed67223-refs/pull/539/head
    2022-02-11 10:06:25.853710: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'cudart64_110.dll'; dlerror: cudart64_110.dll not found
    2022-02-11 10:06:25.853884: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine. 
    c:\users\manue\appdata\local\programs\python\python38\lib\site-packages\tensorflow\python\autograph\impl\api.py:22: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses import imp
    [ FRAMEWORK ERROR ]  Cannot load input model: TensorFlow cannot read the model file: "C:\openvino-models\saved_model.pb" is incorrect TensorFlow model file.
    The file should contain one of the following TensorFlow graphs:
    1. frozen graph in text or binary format
    2. inference graph for freezing with checkpoint (--input_checkpoint) in text or binary format
    3. meta graph
    Make sure that --input_model_is_text is provided for a model in text format. By default, a model is interpreted in binary format. Framework error details: Error parsing message with type 'tensorflow.GraphDef'. For more information please refer to Model Optimizer FAQ, question #43. (https://docs.openvinotoolkit.org/latest/openvino_docs_MO_DG_prepare_model_Model_Optimizer_FAQ.html?question=43#question-43)
    

    I noticed an error on the common parameter -Log level and another error where it says something about the [ FRAMEWORK ERROR ]. 

    Questions:

  • Why is my script getting those errors and, can you please help me fix them?
  • Can you please write for me, How should the "mo" script exactly read with the arguments I provided above?
  • Again, thank you for all your help and will be waiting for your reply,

    P.S. I am now developing on a Windows 11 machine with the following features:

    -Windows 11 Home 21H2

    -Python 3.8.10 (tensorflow 2.4.4, numpy 1.19.5, opencv 4.5.5)

    -cmake 3.22.2

    -Installed OpenVINO through PIP and its version is OpenVINO 2021.4.2

    Hello, I tried today the following:

    mo -m C:\openvino-models\saved_model.pb -o C:\openvino-models\IR --input_shape [1,608,608,3] --data_type=FP16 -n yolov4-tiny

    And got the following result:

    Model Optimizer arguments:
    Common parameters:
    	- Path to the Input Model: 	C:\Users\openvino-models\saved_model.pb
    	- Path for generated IR: 	C:\Users\openvino-models\IR
    	- IR output name: 	yolov4-tiny
    	- Log level: 	ERROR
    	- Batch: 	Not specified, inherited from the model
    	- Input layers: 	Not specified, inherited from the model
    	- Output layers: 	Not specified, inherited from the model
    	- Input shapes: 	[1,608,608,3]
    	- Mean values: 	Not specified
    	- Scale values: 	Not specified
    	- Scale factor: 	Not specified
    	- Precision of IR: 	FP16
    	- Enable fusing: 	True
    	- Enable grouped convolutions fusing: 	True
    	- Move mean values to preprocess section: 	None
    	- Reverse input channels: 	False
    TensorFlow specific parameters:
    	- Input model in text protobuf format: 	False
    	- Path to model dump for TensorBoard: 	None
    	- List of shared libraries with TensorFlow custom layers implementation: 	None
    	- Update the configuration file with input/output node names: 	None
    	- Use configuration file used to generate the model with Object Detection API: 	None
    	- Use the config file: 	None
    	- Inference Engine found in: 	c:\users\manue\appdata\local\programs\python\python38\lib\site-packages\openvino
    Inference Engine version: 	2021.4.2-3976-0943ed67223-refs/pull/539/head
    Model Optimizer version: 	2021.4.2-3976-0943ed67223-refs/pull/539/head
    2022-02-14 13:27:15.649281: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'cudart64_110.dll'; dlerror: cudart64_110.dll not found
    2022-02-14 13:27:15.649447: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
    c:\users\manue\appdata\local\programs\python\python38\lib\site-packages\tensorflow\python\autograph\impl\api.py:22: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
      import imp
    [ FRAMEWORK ERROR ]  Cannot load input model: TensorFlow cannot read the model file: "C:\openvino-models\saved_model.pb" is incorrect TensorFlow model file.
    The file should contain one of the following TensorFlow graphs:
    1. frozen graph in text or binary format
    2. inference graph for freezing with checkpoint (--input_checkpoint) in text or binary format
    3. meta graph
    Make sure that --input_model_is_text is provided for a model in text format. By default, a model is interpreted in binary format. Framework error details: Error parsing message with type 'tensorflow.GraphDef'.
     For more information please refer to Model Optimizer FAQ, question #43. (https://docs.openvinotoolkit.org/latest/openvino_docs_MO_DG_prepare_model_Model_Optimizer_FAQ.html?question=43#question-43)
    

    I am attaching the three Yolov4-tiny model files in a compressed zip file, that I am trying to convert (I downloaded these files a few months ago from another github location and not from the zoo model).

    Please let me know how I can convert these files. I will appreciate very much if you can help me.

    -----------

    Software Developer:
    -C#, .Net Core, learning C++ and Python
    Developing Workstation:
    -Hardware:

       CPU Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz

       GPU: 3071MB NVIDIA GeForce GTX 1050

       RAM: 16GB
    -OS: Windows 11 Home 21H2 64-bit
    -Python 3.8.10 (tensorflow 2.4.4, numpy 1.19.5, opencv 4.5.5)
    -cmake 3.22.2
    -OpenVINO 2021.4.2 (installed using PIP)

    Hello RGVGreatCoder,

    The yolov4-tiny model was converted to SavedModel format. To convert the model to OpenVINO IR format, specify the--saved_model_dir parameter in the SavedModel directory.

    Modify your command as follows:

    mo --saved_model_dir C:\openvino-models -o C:\openvino-models\IR --input_shape [1,608,608,3] --data_type=FP16 -n yolov4-tiny

    [ SUCCESS ] Generated IR version 10 model.
    [ SUCCESS ] XML file: C:\Users\yolo-v4-tiny\yolov4-tiny.xml
    [ SUCCESS ] BIN file: C:\Users\yolo-v4-tiny\yolov4-tiny.bin
    [ SUCCESS ] Total execution time: 26.04 seconds.

    Sincerely,

    Zulkifli

    Thank you for your immediate response! ...

    Your script worked (after adding a second hyphen "-" before "-saved_model_dir" argument). 

    This time, I created a 244MB YoloV4 weights model (not a tiny version) from scratch (in Google Colab) and then ran the "convert.py" and "mo" and it generated the IR model with these files: yolov4.xml, yolov4.bin (of 121MB) and yolov4.mapping. Awesome.

    Trouble is, it generated an IR model that crashes my Python Program when it uses it.

    The generated IR model has the following details (I used Python to get and print these values):

  • Inputs:
    name: image_input
    shape: [1, 3, 608, 608]
    precision: FP32

  • Outputs:
    name: StatefulPartitionedCall/model/conv2d_101/BiasAdd/Add
    shape: [1, 21, 38, 38]
    layout: NCHW
    precision: FP32
    name: StatefulPartitionedCall/model/conv2d_109/BiasAdd/Add
    shape: [1, 21, 19, 19]
    layout: NCHW
    precision: FP32
    name: StatefulPartitionedCall/model/conv2d_93/BiasAdd/Add
    shape: [1, 21, 76, 76]
    layout: NCHW
    precision: FP32
  • However, my Python program (running in my laptop) works well when using an IR model (specifically the "ssdlite_mobilenet_v2.xml" I downloaded from your site) which has the following details:

  • Inputs:
    name: image_tensor
    shape: [1, 3, 300, 300]
    precision: FP32
  • Outputs:
    name: DetectionOutput
    shape: [1, 1, 100, 7]
    layout: NCHW
    precision: FP32
  • Following is a chunk of my Python program that when using my IR model, it crashes in line 27 with an error message that reads "too many values to unpack (expected 7)":

    import cv2 as cv
    import numpy as np
    from openvino.inference_engine import IECore
    device_name = 'GPU'  # try this on WSL Ubuntu runnin in my laptop
    ie = IECore()
    net = ie.read_network(
        model=openvino_xml,
        weights=openvino_weights,
    exec_net = ie.load_network(net, device_name)
    input_key = list(exec_net.input_info)[0]
    height, width = exec_net.input_info[input_key].tensor_desc.dims[2:]
    def process_results(frame, results, thresh=0.6):
        # size of the original frame
        h, w = frame.shape[:2]
        # results is a tensor [1, 1, 100, 7]
        results = results[output_key][0][0]
        boxes = []
        labels = []
        scores = []
        for _, label, score, xmin, ymin, xmax, ymax in results: # <== CRASHES HERE !!!
            # create a box with pixels coordinates from the box with normalized coordinates [0,1]
    while True:
          # resize image and change dims to fit neural network input
          resized_image = cv.resize(src=imageFrame, dsize=(width, height), interpolation=cv.INTER_AREA)
          # create batch of images (size = 1)
          input_img = resized_image.transpose(2, 0, 1)[np.newaxis, ...]
          result = exec_net.infer(inputs={input_key: input_img})
          # get poses from network results
          boxes = process_results(frame=imageFrame, results=result)
    

    Questions:

  • How can I generate an IR model with the details I need for my Python program to work?
  • If I want to use my IR model as it is, what code should I add (or change) in my Python program?
  • Thank you again and will be waiting for your reply,

    I created another model from scratch again, but this time a YoloV4-tiny model (I am attaching the zipped file). I then ran the converter and the "mo" script to generate the IR model (attached zipped file); however, when I tested the IR model it still crashed in line 87 of my program below with same error message "too many values to unpack (expected 7)".

    These are the steps I ran which successfully converted the Yolov4-tiny model to IR:

    python keras-YOLOv3-model-set/tools/model_converter/convert.py <directory_path>\yolov4-tiny-custom.cfg <directory_path>\yolov4-tiny-custom_last.weights <directory_path_pb_model>
    mo --saved_model_dir <directory_path_pb_model> -o <directory_path_pb_model>\IR --input_shape [1,608,608,3] --data_type=FP16 -n yolov4-tiny
    

    The "printOpenVino_InputOutputItems()" method (in line 60) printed the following values of the IR model that currentl crashes my program in line 87:

    Inputs:
            name: image_input
            shape: [1, 3, 608, 608]
            precision: FP32
    Outputs:
            name: StatefulPartitionedCall/model/conv2d_17/BiasAdd/Add
            shape: [1, 21, 19, 19]
            layout: NCHW
            precision: FP32
            name: StatefulPartitionedCall/model/conv2d_20/BiasAdd/Add
            shape: [1, 21, 38, 38]
            layout: NCHW
            precision: FP32
    input_key: image_input
    output_key: StatefulPartitionedCall/model/conv2d_17/BiasAdd/Add

    As I mentioned on my previous post, the Input and Output values that my program works well with, are the following:

    Inputs:
    	name: image_tensor
    	shape: [1, 3, 300, 300]
    	precision: FP32
    Outputs:
    	name: DetectionOutput
    	shape: [1, 1, 100, 7]
    	layout: NCHW
    	precision: FP32

    Finally, below is my Python program:

    #############
    # This program has code from the following pages:
    # https://docs.openvino.ai/latest/notebooks/004-hello-detection-with-output.html#
    # https://docs.openvino.ai/latest/notebooks/002-openvino-api-with-output.html
    # https://docs.openvino.ai/latest/notebooks/401-object-detection-with-output.html
    # To pre-convert and convert the YoloV4 files to OpenVINO IR (xml and bin) format, follow this link:
    # https://github.com/openvinotoolkit/openvino/blob/0948a54f53d832e2517911114829e2b8785845b5/docs/MO_DG/prepare_model/convert_model/tf_specific/Convert_YOLO_From_Tensorflow.md
    # The github repository mentioned on the above link is already cloned in: C:\Users\manue\source\repos\AI-Machine-Learning\keras-YOLOv3-model-set
    ###########
    import collections
    import cv2 as cv
    import numpy as np
    import time
    from openvino.inference_engine import IECore
    # PATHS
    save_detection_path = 'detections/'
    video_path = 'videos/'
    openvino_model_path = 'openvino-models/chairs/'
    picture_captured_path = 'picture-captured/chairs/'
    # MODELS
    openvino_xml = openvino_model_path + 'yolov4-tiny.xml'
    openvino_weights = openvino_model_path + 'yolov4-tiny.bin'
    #device_name = 'MYRIAD' # try this on the Rpi4
    #device_name = 'CPU'  # Use CPU of my laptop
    device_name = 'GPU'  # Use GPU of my laptop
    ie = IECore()
    net = ie.read_network(
        model=openvino_xml,
        weights=openvino_weights,
    exec_net = ie.load_network(net, device_name)
    input_layer_ir = next(iter(exec_net.input_info))
    output_layer_ir = next(iter(exec_net.outputs))
    print(ie.available_devices)
    # get input and output names of nodes
    input_key = list(exec_net.input_info)[0]
    output_key = list(exec_net.outputs.keys())[0]
    # get input size
    height, width = exec_net.input_info[input_key].tensor_desc.dims[2:]
    classes = ['office-chair', 'dining-chair']
    # colors for above classes (Rainbow Color Map)
    colors = cv.applyColorMap(
        src=np.arange(0, 255, 255 / len(classes), dtype=np.float32).astype(np.uint8),
       colormap=cv.COLORMAP_RAINBOW
    ).squeeze()
    def printOpenVino_InputOutputItems():
       print("Inputs:")
       for name, info in exec_net.input_info.items():
          print("\tname: {}".format(name))
          print("\tshape: {}".format(info.tensor_desc.dims))
          # print("\tlayout: {}".format(info.layout))
          print("\tprecision: {}\n".format(info.precision))
       print("Outputs:")
       for name, info in exec_net.outputs.items():
          print("\tname: {}".format(name))
          print("\tshape: {}".format(info.shape))
          print("\tlayout: {}".format(info.layout))
          print("\tprecision: {}\n".format(info.precision))
       print("input_key: " + input_key)
       print("output_key: " + output_key)
    def process_results(frame, results, thresh=0.6):
        # size of the original frame
        h, w = frame.shape[:2]
        # results is a tensor [1, 1, 100, 7]
        results = results[output_key][0][0]
        boxes = []
        labels = []
        scores = []
        for _, label, score, xmin, ymin, xmax, ymax in results:
            # create a box with pixels coordinates from the box with normalized coordinates [0,1]
            boxes.append(tuple(map(int, (xmin * w, ymin * h, xmax * w, ymax * h))))
            labels.append(int(label))
            scores.append(float(score))
        # apply non-maximum suppression to get rid of many overlapping entities
        # see https://paperswithcode.com/method/non-maximum-suppression
        # this algorithm returns indices of objects to keep
        indices = cv.dnn.NMSBoxes(bboxes=boxes, scores=scores, score_threshold=thresh, nms_threshold=0.6)
        # if there are no boxes
        if len(indices) == 0:
            return []
        # filter detected objects
        return [(labels[idx], scores[idx], boxes[idx]) for idx in indices.flatten()]
    def draw_boxes(frame, boxes):
        for label, score, box in boxes:
            # choose color for the label
            color = tuple(map(int, colors[label]))
            # draw box
            cv.rectangle(img=frame, pt1=box[:2], pt2=box[2:], color=color, thickness=2)
            # draw label name inside the box
            cv.putText(img=frame, text=f"{classes[label]}", org=(box[0] + 10, box[1] + 30),
                        fontFace=cv.FONT_HERSHEY_COMPLEX, fontScale=frame.shape[1] / 1000, color=color,
                        thickness=1, lineType=cv.LINE_AA)
        return frame
    def detectVehicle(media_source_type, video, picture, count_axles):
       video = video_path + video
       picture = picture_captured_path + picture
       frame_counter = 0
       if media_source_type == 'V':
          # cap = cv.VideoCapture(0)  # 0 =capture video from first camera
          cap = cv.VideoCapture(video)
       processing_times = collections.deque()
       while ((media_source_type == 'V' and True) or (media_source_type == 'P' and frame_counter < 1)):
          if media_source_type == 'V':
             # reads frames from a video
             ret, imageFrame = cap.read()
          else:
             imageFrame = cv.imread(picture)
          if (type(imageFrame) == type(None) or (media_source_type == 'V' and ret == False)):
             break
          # resize image and change dims to fit neural network input
          resized_image = cv.resize(src=imageFrame, dsize=(width, height), interpolation=cv.INTER_AREA)
          # create batch of images (size = 1)
          input_img = resized_image.transpose(2, 0, 1)[np.newaxis, ...]
          frame_counter += 1
          # measure processing time
          start_time = time.time()
          # get results
          result = exec_net.infer(inputs={input_key: input_img})
          stop_time = time.time()      
          # get poses from network results
          boxes = process_results(frame=imageFrame, results=result)
          # draw boxes on a frame
          imageFrame = draw_boxes(frame=imageFrame, boxes=boxes)
          processing_times.append(stop_time - start_time)
          # use processing times from last 200 frames
          if len(processing_times) > 200:
                processing_times.popleft()
          _, f_width = imageFrame.shape[:2]
          # mean processing time [ms]
          processing_time = np.mean(processing_times) * 1000
          fps = 1000 / processing_time
          cv.putText(img=imageFrame, text=f"Inference time: {processing_time:.1f}ms ({fps:.1f} FPS)", org=(20, 40),
                      fontFace=cv.FONT_HERSHEY_COMPLEX, fontScale=f_width / 1000,
                      color=(0, 0, 255), thickness=1, lineType=cv.LINE_AA)
          cv.imshow('detected image', imageFrame)
          if cv.waitKey(1) & 0xFF == ord('q'):
             break
       if media_source_type == 'V':
          cap.release()
       if media_source_type == 'P':
          cv.waitKey(0)
    def main():
        printOpenVino_InputOutputItems()
        detectVehicle(media_source_type='P',video='', picture='1644965910719.JPEG', count_axles=True)
        #detectVehicle(media_source_type='V',video='chairs1.mp4',picture='', count_axles=False) 
    main()
    cv.destroyAllWindows()

    Questions:

  • Did I use the right conversion value for "--input_shape" argument in the "mo" script, considering that the 32 pictures I used to create the Yolov4-tiny model were of 312 x 416?
  • Do I need to set values to additional arguments in the "mo" script?
  • Do I rather need to adjust something in my Python program to read and interpret correctly the Input/Output values of the new IR model?
  • Am I missing something?
  • Thank you for all of your time and effort. I will be waiting for your reply.

    Good news is, I created a YoloV4-tiny model (in a compressed zipped file) small enough to attach it on my previous post. Notice I edited my post last night. I also attached the IR (.xml and .bin) model (in a compressed zipped file) too.

    I still sent you a Google Drive share invitation to a folder with those compressed zipped files anyway.

    Let me know if you need anything else.

    Thank you for all your support and will be waiting for your reply.

    Hello RGVGreatCoder

    The input shape must have the same shape as your training data. YOLO model pixel resolution must be a multiple of 32. A standard resolution size to choose is 416x416.

    I tested your Python code with Intel OMZ model yolo-v4-tf and ssd_mobilenet_v1, I'm sharing with you the result:

    yolo-v4-tf:

    ssd_resnet50:

    Sincerely,

    Zulkifli

    I ran the "mo" script with "--input_shape [1,416,416,3]" as you suggested and generated a new IR model (.xml/.bin/.mapping files are attached in the compressed yolov4-tiny-416.zip file). And when I ran my Python program it displayed the following values (similar to the ones you posted):

    Inputs:
            name: image_input
            shape: [1, 3, 416, 416]
            precision: FP32
    Outputs:
            name: StatefulPartitionedCall/model/conv2d_17/BiasAdd/Add
            shape: [1, 21, 13, 13]
            layout: NCHW
            precision: FP32
            name: StatefulPartitionedCall/model/conv2d_20/BiasAdd/Add
            shape: [1, 21, 26, 26]
            layout: NCHW
            precision: FP32
    input_key: image_input
    output_key: StatefulPartitionedCall/model/conv2d_17/BiasAdd/Add

    However, my program is still crashing in the same place with same error "too many values to unpack (expected 7)", in line 87 that reads: 

    for _, label, score, xmin, ymin, xmax, ymax in results:

    As you probably realize by now, the goal of my program is to draw boxes on the detected objects before displaying them on the screen but, it still crashes in same place with the new IR model.

    As I wrote post above, my program is using code from this page in your site (https://docs.openvino.ai/latest/notebooks/401-object-detection-with-output.html

    Questions:

  • Why is the new IR model still displaying two outputs when the "ssdlite_mobilenet_v2.xml" only displays one output?
  • Can you please suggest me some code I should try in my program to make it work? 
  • Thank you and will be waiting for your reply,

    Hello RGVGreatCoder,


    The two outputs are expected because yolo-v4-tiny-tf model has 2 output layers:

    - conv2d_20/BiasAdd

    - conv2d_17/BiasAdd


    The array of detection summary info, name - conv2d_20/BiasAdd, shape - 1, 26, 26, 255. The anchor values are 23,27, 37,58, 81,82.

    The array of detection summary info, name - conv2d_17/BiasAdd, shape - 1, 13, 13, 255. The anchor values are 81,82, 135,169, 344,319.

    Please refer to Output for more info.


    You can use Object Detection Python Demo to run with the yolo-v4-tiny model. Note that Open Model Zoo demos expect input with BGR channels order. If you trained your model to work with RGB order, you need to manually rearrange the default channels order in the demo application or reconvert your model using the Model Optimizer tool with the --reverse_input_channels argument specified.


    Sincerely,

    Zulkifli 


    I am sorry to say this, but, I beg to speak or chat with someone at your end to speed this particular case. It's been already a month going back and forth through this portal where all I need is to be able to have OpenVINO run a custom Yolov4-tiny model (I created using Darknet in Google Colab) that I understand now, it needs to be pre-converted before it is converted first to IR model. Yet, I still cannot find a clear and simple solution from your site, on how to make use of the generated IR model. I am sorry. I am sorry. I am very frustrated, so many hours and I may even lose my job for not being able to come up with a solution into this case at my current job. :'(

    You point to me to this page now: https://github.com/openvinotoolkit/open_model_zoo/tree/2021.4.2/demos/object_detection_demo/python. Nowhere in this page are there instructions on how to download the object_detection_demo.py program. So I am lucky to find some instructions on this other page: https://github.com/openvinotoolkit/open_model_zoo. from which I downloaded the entire folder with all the demos, including the object_detection_demo.py that apparently has the code I need in my program to box and label a detected image before displaying on the screen (this is all I need). 

    As I navigate to the demo folder: https://github.com/openvinotoolkit/open_model_zoo/tree/master/demos, I realize there are some instructions to follow before running the demo page I need, as follow:

    <INSTALL_DIR>/extras/scripts/download_opencv.sh
    source <INSTALL_DIR>/setupvars.sh

    Except, a month ago (when I barely started playing with this toolkit), I installed OpenVINO through PIP installation. So I don't have an "<INSTALL_DIR>" directory. I cannot run the lines of script above to run the "source... setupvars.sh". 

    Then I find that this page says has this note: 

    NOTE: If you plan to use Python* demos only, you can install the OpenVINO Python* package. 
    pip install openvino
    

    Now, I had mentioned before I had installed OpenVINO using PIP, but the developer version. So further instructions after this, seem to not apply to me anymore. So, at this point, I am lost guys. I really need some serious help.

    Please. I need a faster response from you. I am sorry to even ask for this, but I have no other way to say it. I really do. How can we speed our communication? I am so lost; I don't even know what I need to ask from here on. Except, all you have need remember is this: I need to run a program that can box an image with a label, before displaying it on the screen using my custom Yolov4-tiny model converted to IR.

    Please, please, help. Let me know how we can do this. I feel like I am getting close, but I need more help from you. How can we interact much faster?

    Sorry. Will be waiting for your reply.

    Hello RGVGreatCoder,

    I managed to run your model with Object Detection Python Demo from Open Model Zoo (OMZ) demos.

    Here is the comparison result between your models and Intel OMZ model:

    Using your 1st yolo-v4-tiny:

    Using your 2nd yolov4-tiny model:

    Using Intel OMZ yolo-v4-tiny-tf model:

    To use the OMZ demos here are the steps to follow:

    1. Convert the yolov4-tiny model using this conversion command:

    mo --saved_model_dir <directory_path_pb_model> -o <directory_path_pb_model>\IR --input_shape [1,416,416,3] --reverse_input_channels --data_type=FP16 -n yolov4-tiny  

    2. Clone Open Model Zoo repository:

    git clone https://github.com/openvinotoolkit/open_model_zoo.git

    3. Configure the Python model API installation

    4. Once completed, go to the Object Detection Python demo:

    cd open_model_zoo\demos\object_detection_demo\python

    5. Run demo using this command:

    python object_detection_demo.py -m <model_directory>\yolov4-tiny.xml -i <input_directory>\1644965910719.JPEG -at yolov4 --loop

    Sincerely

    Zulkifli

    Thank you for your prompt response.

    Step 1, worked well and generated new .xml, .bin, .mapping files.

    Step 2, worked well, generating a folder with all its contents as follows:

    >git clone https://github.com/openvinotoolkit/open_model_zoo.git
    Cloning into 'open_model_zoo'...
    remote: Enumerating objects: 92030, done.
    remote: Counting objects: 100% (71/71), done.
    remote: Compressing objects: 100% (68/68), done.
    remote: Total 92030 (delta 13), reused 16 (delta 3), pack-reused 91959 eceiving objects: 100% (92030/92030), 279.
    Receiving objects: 100% (92030/92030), 279.80 MiB | 6.61 MiB/s, done.
    Resolving deltas: 100% (62565/62565), done.
    Updating files: 100% (2586/2586), done.
    

    Step 3.1, the pip installation went well as follows: 

    >pip install setuptools
    Requirement already satisfied: setuptools in c:\users\manue\appdata\local\programs\python\python38\lib\site-packa
    ges (56.0.0)
    

     But Step 3.2, failed as follows:

    >python open_model_zoo/demos/common/python/setup.py bdist_wheel
    running bdist_wheel
    running build
    running build_py
    copying C:\Users\manue\source\repos\AI-Machine-Learning\open_model_zoo\demos\common\python\openvino\__init__.py -
    > build\lib\openvino
    error: package directory 'visualizers' does not exist
    

    Interesting enough, I found a folder named "visualizers" inside "open_model_zoo\demos\common\python\" . Could the setup program be looking for that folder in some other location?

    Please let me know how to fix this. Thank you for your patience and will be waiting for your reply,

    I encountered the same error when using this command:

    python open_model_zoo\demos\common\python\setup.py bdist_wheel

    To avoid this error, please run this command:

    cd open_model_zoo\demos\common\python
    python setup.py bdist_wheel

    Sincerely,

    Zulkifli

    Thank you for your prompt response.

    I successfully setup bdist_wheel as follows (pasting the first and last lines to reduce space):

    cd open_model_zoo\demos\common\python
    python setup.py bdist_wheel
    running bdist_wheel
    running build
    running build_py
    adding 'openmodelzoo_modelapi-0.0.0.dist-info/WHEEL'
    adding 'openmodelzoo_modelapi-0.0.0.dist-info/top_level.txt'
    adding 'openmodelzoo_modelapi-0.0.0.dist-info/RECORD'
    removing build\bdist.win-amd64\wheel
    
    >cd dist
    >python -m pip install openmodelzoo_modelapi-0.0.0-py3-none-any.whl --force-reinstall
    Processing c:\users\manue\source\repos\ai-machine-learning\open_model_zoo\demos\common\python\dist\openmodelzoo_modelapi-0.0.0-py3-none-any.whl
    Collecting scipy~=1.5.4
      Using cached scipy-1.5.4-cp38-cp38-win_amd64.whl (31.4 MB)
    Collecting opencv-python==4.5.*
      Using cached opencv_python-4.5.5.62-cp36-abi3-win_amd64.whl (35.4 MB)
    Collecting numpy<=1.21,>=1.16.6
      Downloading numpy-1.21.0-cp38-cp38-win_amd64.whl (14.0 MB)
         ---------------------------------------- 14.0/14.0 MB 13.4 MB/s eta 0:00:00
    Installing collected packages: numpy, scipy, opencv-python, openmodelzoo-modelapi
      Attempting uninstall: numpy
        Found existing installation: numpy 1.19.5
        Uninstalling numpy-1.19.5:
          Successfully uninstalled numpy-1.19.5
      Attempting uninstall: scipy
        Found existing installation: scipy 1.5.4
        Uninstalling scipy-1.5.4:
          Successfully uninstalled scipy-1.5.4
      Attempting uninstall: opencv-python
        Found existing installation: opencv-python 4.5.5.62
        Uninstalling opencv-python-4.5.5.62:
          Successfully uninstalled opencv-python-4.5.5.62
    ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
    tensorflow 2.4.4 requires numpy~=1.19.2, but you have numpy 1.21.0 which is incompatible.
    openvino 2021.4.2 requires numpy<1.20,>=1.16.6, but you have numpy 1.21.0 which is incompatible.
    openvino-dev 2021.4.2 requires numpy<1.20,>=1.16.6, but you have numpy 1.21.0 which is incompatible.
    Successfully installed numpy-1.21.0 opencv-python-4.5.5.62 openmodelzoo-modelapi-0.0.0 scipy-1.5.4
    

    It installed numpy-1.21.0, opencv-python-4.5.5.62, openmodelzoo-modelapi-0.0.0 and scipy-1.5.4. However, I noticed there are some incompatibility issues with numpy-1.21.0 so I uninstalled it and installed numpy-1.19.5 as follows:

    >pip uninstall numpy
    Found existing installation: numpy 1.21.0
    Uninstalling numpy-1.21.0:
      Would remove:
        c:\users\manue\appdata\local\programs\python\python38\lib\site-packages\numpy-1.21.0.dist-info\*
        c:\users\manue\appdata\local\programs\python\python38\lib\site-packages\numpy\*
        c:\users\manue\appdata\local\programs\python\python38\scripts\f2py.exe
    Proceed (Y/n)? y
      Successfully uninstalled numpy-1.21.0
    >pip install numpy==1.19.5
    Collecting numpy==1.19.5
      Using cached numpy-1.19.5-cp38-cp38-win_amd64.whl (13.3 MB)
    Installing collected packages: numpy
    Successfully installed numpy-1.19.5
    

     I checked if the model API was successfully installed (seeing no errors when importing the  model_api) as follows:

    >python
    Python 3.8.10 (tags/v3.8.10:3d8993a, May  3 2021, 11:48:03) [MSC v.1928 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from openvino.model_zoo import model_api
    >>> quit()

    Now, I assumed that after installing "openmodelzoo_modelapi-0.0.0-py3-none-any.whl", I did not need to install nor run further steps in the page you referred to me which is "Python model API installation". So please let me know if there are more steps to execute from this page.

    Having said that, I thought it was about time to try and see if the demo worked but it failed as follows:

    >python object_detection_demo.py -at yolov4 -d GPU --loop -m <model_directory>\yolov4-tiny-416.xml -i <input_directory>\1644965910719.JPEG --labels <path>\classes.txt
    Traceback (most recent call last):
      File "object_detection_demo.py", line 28, in <module>
        from openvino.model_zoo.model_api.models import DetectionModel, DetectionWithLandmarks, RESIZE_TYPES, OutputTransform
      File "C:\Users\manue\AppData\Local\Programs\Python\Python38\lib\site-packages\openvino\model_zoo\model_api\models\__init__.py", line 32, in <module>
        from .open_pose import OpenPose
      File "C:\Users\manue\AppData\Local\Programs\Python\Python38\lib\site-packages\openvino\model_zoo\model_api\models\open_pose.py", line 23, in <module>
        import openvino.runtime.opset8 as opset8
    ModuleNotFoundError: No module named 'openvino.runtime'
    

    Please let me know how to fix this issue.

    Thank you and will be waiting for your reply.

    Community support is provided Monday to Friday. Other contact methods are available here.

    Intel does not verify all solutions, including but not limited to any file transfers that may appear in this community. Accordingly, Intel disclaims all express and implied warranties, including without limitation, the implied warranties of merchantability, fitness for a particular purpose, and non-infringement, as well as any warranty arising from course of performance, course of dealing, or usage in trade.

    For more complete information about compiler optimizations, see our Optimization Notice.