~~tag> NPU YOLO OpenCV VIM4 ~~
**Doc for version ddk-3.4.7.7**
====== YOLOv7-tiny VIM4 Demo - 1 ======
{{indexmenu_n>1}}
===== Train the model =====
Download the YOLOv7 official code [[gh>WongKinYiu/yolov7]]
```shell
$ git clone https://github.com/WongKinYiu/yolov7
```
Refer ''README.md'' to create and train a YOLOv7 tiny model.
===== Convert the model =====
==== Build a virtual environment ====
Follow Docker official documentation to install Docker: [[https://docs.docker.com/engine/install/ubuntu/|Install Docker Engine on Ubuntu]].
Follow the script below to get Docker image:
```shell
docker pull numbqq/npu-vim4
```
==== Get the conversion tool ====
Download The conversion tool from [[gl>khadas/vim4_npu_sdk]].
```shell
$ git lfs install
$ git lfs clone https://gitlab.com/khadas/vim4_npu_sdk.git
$ cd vim4_npu_sdk
$ ls
adla-toolkit-binary adla-toolkit-binary-3.1.7.4 convert-in-docker.sh Dockerfile docs README.md
```
* ''adla-toolkit-binary/docs'' - SDK documentations
* ''adla-toolkit-binary/bin'' - SDK tools required for model conversion
* ''adla-toolkit-binary/demo'' - Conversion examples
If your kernel is older than 241129, please use version before tag ddk-3.4.7.7.
==== Convert ====
After training the model, modify ''yolov7/models/yolo.py'' as follows.
```diff
diff --git a/models/yolo.py b/models/yolo.py
index 95a019c..98ae95c 100644
--- a/models/yolo.py
+++ b/models/yolo.py
@@ -144,7 +144,10 @@ class IDetect(nn.Module):
for i in range(self.nl):
x[i] = self.m[i](x[i]) # conv
bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85)
- x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()
if not self.training: # inference
if self.grid[i].shape[2:4] != x[i].shape[2:4]:
```
yolo.py has many forward. Right place is class **IDetect** function **fuseforward**.
Then, run ''export.py'' to convert the model to ONNX.
```shell
$ python export.py
```
Enter ''vim4_npu_sdk/demo'' and modify ''convert_adla.sh'' as follows.
```bash convert_adla.sh
#!/bin/bash
ACUITY_PATH=../bin/
#ACUITY_PATH=../python/tvm/
adla_convert=${ACUITY_PATH}adla_convert
if [ ! -e "$adla_convert" ]; then
adla_convert=${ACUITY_PATH}adla_convert.py
fi
$adla_convert --model-type onnx \
--model ./model_source/yolov7_tiny/yolov7_tiny.onnx \
--inputs "images" \
--input-shapes "3,640,640" \
--dtypes "float32" \
--quantize-dtype int8 --outdir onnx_output \
--channel-mean-value "0,0,0,255" \
--inference-input-type "float32" \
--inference-output-type "float32" \
--source-file dataset.txt \
--batch-size 1 --target-platform PRODUCT_PID0XA003
```
Run ''convert_adla.sh'' to generate the VIM4 model. The converted model is ''xxx.adla'' in ''onnx_output''.
```shell
$ bash convert_adla.sh
```
===== Run inference on the NPU =====
==== Get source code ====
Clone the source code [[gh>khadas/vim4_npu_applications]].
```shell
$ git clone https://github.com/khadas/vim4_npu_applications
```
If your kernel is older than 241129, please use version before tag ddk-3.4.7.7.
==== Install dependencies ====
```shell
$ sudo apt update
$ sudo apt install libopencv-dev python3-opencv cmake
```
==== Compile and run ====
=== Picture input demo ===
Put ''yolov7_tiny_int8.adla'' in ''vim4_npu_applications/yolov7_tiny/data/''.
```shell
# Compile
$ cd vim4_npu_applications/yolov7_tiny
$ mkdir build
$ cd build
$ cmake ..
$ make
# Run
$ ./yolov7_tiny -m ../data/yolov7_tiny_int8.adla -p ../data/horses.jpg
```
{{:products:sbc:vim4:npu:demos:yolov7-tiny-demo-output.webp?800|}}
=== Camera input demo ===
Put ''yolov7_tiny_int8.adla'' in ''vim4_npu_applications/yolov7_tiny_cap/data/''.
```shell
# Compile
$ cd vim4_npu_applications/yolov7_tiny_cap
$ mkdir build
$ cd build
$ cmake ..
$ make
# Run
$ ./yolov7_tiny_cap -m ../data/yolov7_tiny_int8.adla -d 0
```
''0'' is the camera device index.
If your **YOLOv7-tiny** model classes are not the same as **COCO**, please change ''data/coco_80_labels_list.txt'' and the ''OBJ_CLASS_NUM'' in ''include/postprocess.h''.