Guide to compiling the NPU application on the VIM3/3L.
Install the necessary library packages to build the OpenCV4 application.
$ sudo apt update $ sudo apt install libopencv-dev python3-opencv
Get the source code: khadas/aml_npu_app
$ git clone https://github.com/khadas/aml_npu_app
Base directory of the cloned repository.
$ cd aml_npu_app $ ls DDK_6.3.2 DDK_6.3.2.3 DDK_6.3.2.5 DDK_6.3.3.4 DDK_6.4.0.3 DDK_6.4.3 detect_library LICENSE NN_SLT
File | Description |
---|---|
DDK_xx | Library source code, xx is the version code |
detect_library | Application layer source code. the detect_library/model_code is linked to the latest version of the DDK library |
NN_SLT | Separate source code directory for DnCnn model (no longer maintained). |
LICENSE | LICENSE file. |
Directory with various model specific application code.
$ cd aml_npu_app/detect_library $ ls densenet_ctc_demo_picture inception model_code retinaface_demo_x11_usb sample_demo_fb sample_demo_x11 source_code yolo_demo_fb_mipi yolo_demo_fb_usb yolo_demo_x11_mipi yolo_demo_x11_usb yolov7_tiny_demo_x11_usb yolov8n_demo_x11_usb
File | Description |
---|---|
model_code | Load model and complete pre-processing and post-processing. |
source_code | Provide interfaces for demo to call model_code. |
Other folders | Application source code |
Directory containing all the detection library code.
$ cd aml_npu_app/detect_library/model_code $ ls densenet_ctc detect_mtcnn detect_retinaface detect_yoloface detect_yolo_v2 detect_yolo_v3 detect_yolo_v3_tiny detect_yolo_v4 detect_yolo_v7_tiny detect_yolov8n facenet
Except for detect_mtcnn
, each directory represents a different model, and each model will be compiled into a library.
File | Description |
---|---|
densenet_ctc | Character recognition, used to identify characters. The input is only a picture. |
detect_retinaface | Detect faces and the keypoints of faces. |
detect_yoloface | yoloface model, used to detect faces without keypoints. |
detect_yolo_v2 | yolov2 model, for object detection. |
detect_yolo_v3 | yolov3 model, for object detection. |
detect_yolo_v3_tiny | yolov3-tiny model, for object detection. |
detect_yolo_v4 | yolov4 model, used to detect faces. |
detect_yolo_v7_tiny | yolov7_tiny model, for object detection. |
detect_yolov8n | yolov8n model, for object detection. The latest yolo model. |
facenet | Deprecated - No longer in use. |
Take detect_yolo_v3
as an example to illustrate the structure of each directory.
$ cd aml_npu_app/detect_library/model_code/detect_yolo_v3 $ ls build_vx.sh include Makefile makefile.linux makefile.linux.def vnn_yolov3.c yolo_v3.c yolov3_process.c
File | Description |
---|---|
build_vx.sh | Compile script. |
include | The corresponding header files and all definitions will be placed in this directory. |
Makefile | Makefile file. |
makefile.linux | Make environment configuration file. |
vnn_yolov3.c | SDK The converted model processing file is mainly used to interface with the nb file. |
yolo_v3.c | Specify the called nb file, and define all the interfaces of the model call. |
yolov3_process.c | Mainly defines the pre-processing and post-processing of the model. |
Directory containing the application library source code.
$ cd aml_npu_app/detect_library/source_code $ ls build_vx.sh detect.c detect_log.c include Makefile makefile.linux makefile.linux.def
File | Description |
---|---|
build_vx.sh | Compile script. |
detect.c | Provide interface for detect and call model_code. |
detect_log.c | About log level. |
include | The corresponding header files and all definitions will be placed in this directory. |
Makefile | Makefile file. |
makefile.linux | Make environment configuration file. |
Enter the directory of the yolo_demo_x11_usb
:
$ cd aml_npu_app/detect_library/yolo_demo_x11_usb $ ls build_vx.sh detect.h main.cpp makefile.linux makefile.linux.def makefile.target_name nn_detect_common.h nn_detect.h nn_detect_utils.h
File | Description |
---|---|
build_vx.sh | Compile script. |
main.cpp | Main function. |
detect.h, nn_detect_common.h, nn_detect.h, nn_detect_utils.h | The corresponding header files. |
makefile.linux | Make environment configuration file. |
makefile.target_name | The name of the compiled executable. |
1. Compile the model you want to use from the model_code
directory. Here we shall take detect_yolo_v3
as an example.
$ cd aml_npu_app/detect_library/model_code/detect_yolo_v3 $ ls build_vx.sh include Makefile makefile.linux makefile.linux.def vnn_yolov3.c yolo_v3.c yolov3_process.c $ bash build_vx.sh $ ls bin_r build_vx.sh include linux_build_sample.log makefile.linux makefile.linux.def makefile.target_name vnn_yolov3.c yolo_v3.c yolov3_process.c
2. The compiled library libnn_yolo_v3.so
is generated in bin_r
folder. Add it to the library path variable.
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)/bin_r/libnn_yolo_v3.so
3. You will also need to build the contents of the source_code
directory.
$ cd aml_npu_app/detect_library/source_code $ ls build_vx.sh detect.c detect_log.c include Makefile makefile.linux makefile.linux.def $ bash build_vx.sh $ ls bin_r build_vx.sh detect.c detect_log.c include Makefile makefile.linux makefile.linux.def
4. The compiled library libnn_yolo_v3.so
is generated in bin_r folder. Add it to the library path variable.
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)/bin_r/libnn_detect.so
5. Now, Build the example application.
$ cd aml_npu_app/detect_library/yolo_demo_x11_usb $ ls build_vx.sh detect.h main.cpp makefile.linux makefile.linux.def makefile.target_name nn_detect_common.h nn_detect.h nn_detect_utils.h $ bash build_vx.sh $ ls bin_r_cv4 build_vx.sh detect.h linux_build_sample.log main.cpp makefile.linux makefile.linux.def makefile.target_name nn_detect_common.h nn_detect.h nn_detect_utils.h
If you use kernel are using version 5.15 or above, please remove the red lines in makefile.linux
before running build_vx.sh
.
LIBS += -L$(VIVANTE_SDK_LIB) -lOpenVX -lOpenVXU -lGAL -lovxlib -lArchModelSw -lNNArchPerf LIBS += -L../source_code/bin_r -lnn_detect -#LIBS +=-L$(LIB_DIR) -lstdc++ -LIBS += -lvpcodec -lamcodec -lamadec -lamvdec -lamavutils -lrt -lpthread -lge2d -lion ############################################################################# # Macros. PROGRAM = 1 CUR_SOURCE = ${wildcard *.c} #############################################################################
6. Create a folder named nn_data
under bin_r_cv4
and place the yolov3_88.nb
model file in it.
$ cd bin_r_cv4 $ mkdir nn_data $ cp -r xx/xx/yolov3_88.nb nn_data/ $ ls detect_demo_x11_usb main.o nn_data
Now you can run inference on captured video data using the model.
$ ./detect_demo_x11_usb -m 2 -d /dev/video1
The parameter -m
is for selecting the inference model, Here are the all the available models and their respective serial numbers.
Index | File |
---|---|
0 | detect_yoloface |
1 | detect_yolo_v2 |
2 | detect_yolo_v3 |
3 | detect_yolo_v3_tiny |
4 | detect_yolo_v4 |
13 | detect_yolo_v7_tiny |
14 | detect_yolov8n |
15 | densenet_ctc |
16 | detect_retinaface |
For the above example, we used the serial number 2
which corresponds to the yolov3
model.
If you use the model that takes input as a picture, change -d
to -p
. Here is an example with densenet_ctc
.
$ ./densenet_ctc_picture -m 15 -p ../KhadasTeam.png