Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

This document will provide a detailed description of:

How to convert the YOLOV8 ONNX model into a model for use on the C3V platform

Write sample code for object detection based on YOLOV8

Execute object detection program and obtain recognition results in the C3V Linux environment

Table of Contents
stylenone

The tool versions involved in the current document are as follows:

NPU Kernel Driver

v6.4.15.9

v6.4.18.5

Acuity Toolkit

6.21.1

6.30.7

ViviantelIDE

5.8.2

5.10.1

1. Model Conversation

Before the conversion, it is necessary to first set up the environment for model conversion. Please refer to the following document to prepare the environment:NN Model Conversion

1.1. Project Preparation

  1. Create Model folder

Create a folder yolov8s in path ~/c3v/Models. Please ensure the folder name is the same as the ONNX file name.

Code Block
~/c3v/Models$ mkdir yolov8s && cd yolov8s
  1. Copy the ONNX file and input.jpg which resolution is 640x640 to the folder yolov8s. These two files will be used as input files during model conversion.

Code Block
~/c3v/Models$ cp yolov8s.onnx yolov8s/
~/c3v/Models$ cp input.jpg yolov8s/
  1. Create a dataset.txt file, the content of dataset.txt is the input.jpg file name.

Code Block
./input.jpg
  1. Create inputs_outputs.txt file and get the information from yolov8s.onnx via netron tool/webpage. Here is the onnx file:

    View file
    nameyolov8s_onnx.zip
    .

...

Select the three operators within the red box as the output. write --input-size-list and --outputs informations to inputs_outputs.txt:

Code Block
--outputs '/model.22/Sigmoid_output_0 /model.22/Mul_2_output_0'

After completing the above steps, there will be the following files under the yolov8s path:

...

1.2. Implementing

Using shell script tools to convert the model from ONNX to the NB file. There are 4 steps: import quantize inference and export. Tools are in ~/c3v/Models:

  • pegasus_import.sh

  • pegasus_quantize.sh

  • pegasus_inference.sh

  • pegasus_export_ovx.sh

Import

Execute the command in the console or terminal, and wait for it to complete. It will import and translate an NN model to NN formats.

Code Block
./pegasus_import.sh yolov8s

Wait until the tool execution is complete and check there are no errors like this:

...

Then we will see the following four files added under the folder ~/c3v/Models/yolov8s.

...

Quantize

Modify the scale value(1/255=0.003921569) of the yolov8s_inputmeta.yml file, which is in ~/c3v/Models/yolov8s.

...

Select one quantized type for your need, such as uint8 / int16 / bf16 / pcq. In this sample we use uint8.

Code Block
./pegasus_quantize.sh yolov8s uint8

Wait until the tool execution is complete and check there are no errors like this:

...

Then we will see the following four files added under the folder ~/c3v/Models/yolov8s.

...

Inference

Inference the NN model with the quantization data type.

Code Block
./pegasus_inference.sh yolov8s uint8

Wait until the tool execution is complete and check there are no errors like this:

...

Export

Export the quantized application for device deployment. Please modify the pegasus_export_ovx.sh for the nb file generating, and add both 3 lines marked in the red box.

...

Code Block
./pegasus_export_ovx.sh yolov8s uint8

Wait until the tool execution is complete and check there are no errors like this:

...

In the path ~/c3v/Models/yolov8s/wksp, you will find a folder named yolov8s_uint8_nbg_unify.

...

We can get the nb file and a c file for NN graph setup information.

...

1.3. Demo Video

This video is the demo for yolov8s-detection int16 quantize.

...

2. Object Detection Program

2.1. Post Processing

The post-processing of the example code automatically transferred out by the tool will print the top 5. We need to increase the parsing of the results to obtain complete results of target recognition. The relevant post-processing functions are located in the file vnn_post_process.c.

We provide an example function for post-processing, which can complete the parsing of NN processing results:

  • post_proc_init

  • post_proc_process

  • post_proc_deinit

The function needs to be modified:vnn_PostProcessYolov8Uint8

Code Block
languagecpp
vsi_status vnn_PostProcessYolov8sUint8(vsi_nn_graph_t *graph)
{
    vsi_status status = VSI_FAILURE;

#if DETECT_RESULT_IMPL
    /*detect result sample implement*/
    post_proc_init(graph);
    post_proc_process(graph);
    post_proc_deinit();

#else
    /* Show the top5 result */
    status = show_top5(graph, vsi_nn_GetTensor(graph, graph->output.tensors[0]));
    TEST_CHECK_STATUS(status, final);

    /* Save all output tensor data to txt file */
    save_output_data(graph);

final:
#endif

    return VSI_SUCCESS;
}

For detailed function implementation, please refer to the following file:

View file
nameyolov8sDetection_u8_post_process.zip

2.2. Program Compile

When compiling NN-related applications, SDK's headers and libraries must be included.

  • Example of SDK Includes Path:

Code Block
INCLUDES+=-I$(NN_SDK_DIR)/include/ \
-I$(NN_SDK_DIR)/include/CL \
-I$(NN_SDK_DIR)/include/VX \
-I$(NN_SDK_DIR)/include/ovxlib \
-I$(NN_SDK_DIR)/include/jpeg

Example of SDK Link Libraries:

Code Block
LIBS+=-lOpenVX -lOpenVXU -lCLC -lVSC -lGAL -ljpeg -lovxlib

3. Example flow of the program build and run

Unzipped

View file
nameyolov8sDetection_u8_post_process.zip
and
View file
nameMakefile.zip
then placed them in ~/c3v/Models/yolov8s-detection/wksp/yolov8s_uint8_nbg_unify Folder. The brief folder of the project is like this:

...

3.1. build in c3v

If you want to build the project in c3v directly, please modify these contents of Makefile:

Code Block
BIN=yolov8s-detection-uint8
# 2.build in c3v
NN_SDK_DIR=/usr
CC=gcc
CXX=g++

then copy the whole folder yolov8s_uint8_nbg_unify to the c3v Linux system. Then using make to compile the project.

Code Block
cd /sample/yolov8s_uint8_nbg_unify
make -j

After compilation, you can see the corresponding application program:yolov8s-detection-uint8.

You can run the application directly on c3v:

The param1 is the network_binary.nb file that converts from the acuity toolkit.

The param2 is the image that is for detection. Please prepare the image file which format is jpg and the pixel size is 640 * 640.

Code Block
./yolov8s-detection-uint8 ./network_binary.nb ./input.jpg

The result is like this:

Code Block
/mnt/yolov8s_uint8_nbg_unify # ./yolov8s-detection-uint8 ./network_binary.nb
Create Neural Network: 31ms or 31666us
Verify...
Verify Graph: 18ms or 18520us
Start run graph [1] times...
Run the 1 time: 52.67ms or 52667.43us
vxProcessGraph execution time:
Total   52.79ms or 52792.95us
Average 52.79ms or 52792.95us
obj: L: 0 P:0.92, [(294, 264) - (209, 369)]
obj: L: 0 P:0.92, [(0, 44) - (199, 589)]
obj: L: 0 P:0.50, [(349, 169) - (179, 299)]
obj: L: 2 P:0.33, [(534, 294) - (74, 64)]
obj: L: 0 P:0.26, [(539, 264) - (99, 349)]

3.2. ImageWriter Tool

If you want to show the detection results in an image, we suggest using ImageWriter tools.

Please download

View file
nameimageWriter.zip
and compile it in c3v:

Code Block
cd imageWriter
make -j

Then you can run the imageWriter application directly on c3v:

Param1 is the image which is the same as yolov8s-detection-uint8 param2. The yolov8s-detection-uint8 is the application that is built in step 3.1. build in c3v.

Param2 is the file detect_results.raw which was generated after the program yolov8s-detection-uint8 runs.

Param3 is the output name, which format is jpg.

Code Block
./imageWriter ./input.jpg ./detect_results.raw ./output.jpg

The result is like this:

...

3.3. Demo Video

...