quinta-feira, 28 de novembro de 2024

MILV-V DUO 256 - YOLO11

  

"yolo11 is compatible with yolov8, and it has more frame shapes, not limited to rectangles"

yolo11 Detecção de alvo

Este programa de teste inferirá o modelo yolo11 para atingir a detecção de alvos, e os resultados serão exibidos somente na forma de impressão.

Baixe o

Compilação cruzada do programa YOLO no PC

Você pode usar o programa yolov8.

Localização do código Duo256M yolov8: sample_yolov8.cpp

Método de compilação

Consulte o método descrito em Introdução para compilar o programa exemplo.

Basicamente: (no ambiente docker - workspace - https://milk-v.blogspot.com/2024/10/milk-v-duo-256-yolov-parte-i.html)

cd yolo11-obiect-dection
wget https://sophon-file.sophon.cn/sophon-prod-s3/drive/23/03/07/16/host-tools.tar.gz
tar xvf host-tools.tar.gz cd host-tools
export PATH=$PATH:$(pwd)/gcc/riscv64-linux-musl-x86_64/bin cd /workspace git clone https://github.com/milkv-duo/cvitek-tdl-sdk-sg200x.git
cd cvitek-tdl-sdk-sg200x git pull cd sample
./compile_sample.sh . . . .riscv64-unknown-linux-musl-g++ -lopencv_core -lopencv_imgproc -lopencv_imgcodecs -L/workspace/cvitek-tdl-sdk-sg200x/sample/3rd/opencv/lib -L/workspace/cvitek-tdl-sdk-sg200x/sample/3rd/middleware/v2/lib -L/workspace/cvitek-tdl-sdk-sg200x/sample/3rd/middleware/v2/lib/3rd -lini -lsns_full -lsample -lisp -lvdec -lvenc -lawb -lae -laf -lcvi_bin -lcvi_bin_isp -lmisc -lisp_algo -lsys -lvpu -L/workspace/cvitek-tdl-sdk-sg200x/sample/3rd/tpu/lib -lcnpy -lcvikernel -lcvimath -lcviruntime -lz -lm -L/workspace/cvitek-tdl-sdk-sg200x/sample/3rd/middleware/v2/lib -lcvi_ive -L/workspace/cvitek-tdl-sdk-sg200x/lib -L/workspace/cvitek-tdl-sdk-sg200x/sample/3rd/lib -lpthread -latomic -lcvi_draw_rect -o sample_lib_draw_rect /workspace/cvitek-tdl-sdk-sg200x/sample/cvi_draw_rect/sample_lib_draw_rect.o /workspace/cvitek-tdl-sdk-sg200x/sample/cvi_draw_rect done /workspace/cvitek-tdl-sdk-sg200x/sample finish build sample!!! root@a4096611d762:/workspace/cvitek-tdl-sdk-sg200x/sample#

Após a conclusão da compilação, o programa sample_yolov8 que precisamos será gerado no diretório sample/cvi_yolo/

Compilação de modelos

Se você já baixou o repositório yolov8, apenas é suficiente git pull

Exportar 

cd /workspace
git clone https://github.com/ultralytics
  • Baixe o arquivo do modelo yolo11 correspondente

Tome yolo11n como exemplo

cd /workspace/ultralytics
wget 
https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n.pt

  • Exportar o modelo de yolo11n.onnx

Baixe a versão (opcional) mais recente do anaconda, consulte: https://docs.anaconda.com/miniconda/

Baixe o Python versão 3.8 ou superior, PyTorch versão 2.0.1 ou superior, é melhor usar a versão mais recente (opcionais)

Ativar (por exemplo, Python 3.8, torch2.0.1):

conda create -n py3.8 python==3.8.2
conda activate py3.8
python -m venv .venv
source .venv/bin/activate
pip3 install --upgrade pip
pip3 install torch==2.0.1

Nota: Execute no diretório ultralytics.

Copie o código yolo_export/yolov8_export.py para o repositório yolo11, o yolo11 é compatível com o yolov8.

cp /workspace/cvitek-tdl-sdk-sg200x/sample/yolo_export/yolov8_export.py .

python3 yolov8_export.py --weights ./yolo11n.pt --img-size 640 640

root@a4096611d762:/workspace/ultralytics# python3 yolov8_export.py --weights ./yolo11n.pt --img-size 640 640
Ultralytics 8.3.38 🚀 Python-3.10.12 torch-2.0.1+cpu CPU (Intel Core(TM) i7-4510U 2.00GHz)
YOLO11n summary (fused): 238 layers, 2,616,248 parameters, 0 gradients, 6.5 GFLOPs

PyTorch: starting from 'yolo11n.pt' with input shape (1, 3, 640, 640) BCHW and output shape(s) ((1, 64, 80, 80), (1, 64, 40, 40), (1, 64, 20, 20), (1, 80, 80, 80), (1, 80, 40, 40), (1, 80, 20, 20)) (5.4 MB)
requirements: Ultralytics requirement ['onnxslim'] not found, attempting AutoUpdate...
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
Collecting onnxslim
  Downloading onnxslim-0.1.42-py3-none-any.whl (142 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 142.7/142.7 KB 1.4 MB/s eta 0:00:00
Requirement already satisfied: onnx in /usr/local/lib/python3.10/dist-packages (from onnxslim) (1.14.0)
Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from onnxslim) (23.1)
Requirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from onnxslim) (1.12)
Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from onnx->onnxslim) (1.24.3)
Requirement already satisfied: typing-extensions>=3.6.2.1 in /usr/local/lib/python3.10/dist-packages (from onnx->onnxslim) (4.5.0)
Requirement already satisfied: protobuf>=3.20.2 in /usr/local/lib/python3.10/dist-packages (from onnx->onnxslim) (3.20.3)
Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.10/dist-packages (from sympy->onnxslim) (1.3.0)
Installing collected packages: onnxslim
Successfully installed onnxslim-0.1.42

requirements: AutoUpdate success ✅ 13.9s, installed 1 package: ['onnxslim']
requirements: ⚠️ Restart runtime or rerun command for updates to take effect


ONNX: starting export with onnx 1.14.0 opset 11...
============== Diagnostic Run torch.onnx.export version 2.0.1+cpu ==============
verbose: False, log level: Level.ERROR
======================= 0 NONE 0 NOTE 0 WARNING 0 ERROR ========================

ONNX: slimming with onnxslim 0.1.42...
ONNX: export success ✅ 20.2s, saved as 'yolo11n.onnx' (10.1 MB)

Export complete (24.3s)
Results saved to /workspace/ultralytics
Predict:         yolo predict task=detect model=yolo11n.onnx imgsz=640
Validate:        yolo val task=detect model=yolo11n.onnx imgsz=640 data=/usr/src/ultralytics/ultralytics/cfg/datasets/coco.yaml
Visualize:       https://netron.app
root@a4096611d762:/workspace/ultralytics#

Dica: Ao executar este comando, se um erro semelhante a ModuleNotFoundError: No module named 'x' aparecer, basta execute pip install x.

Gere yolo11n.onnx no diretório atual.

root@a4096611d762:/workspace/ultralytics# ls *.onnx
yolo11n.onnx
root@a4096611d762:/workspace/ultralytics#

Explicação dos parâmetros

--weights - caminh do modelo de pessos pytorch

--img-size tamanho da imagem de entrada

Método de conversão TPU-MLIR

Consulte o documento TPU-MLIR para configurar o ambiente de trabalho TPU-MLIR. Para análise de parâmetros, consulte o documento TPU-MLIR .

Veja https://milk-v.blogspot.com/2024/10/milk-v-duo-256-yolov-parte-i.html

Basicamente (em /workspace)

git clone https://github.com/milkv-duo/tpu-mlir.git source ./tpu-mlir/envsetup.sh

Depois de configurar o ambiente de trabalho, crie um diretório model_yolo11n no mesmo diretório deste projeto (ultralytics) e coloque os arquivos de modelo e imagem nele.

mkdir model_yolo11n && cd model_yolo11n
cp /workspace/ultralytics/yolo11n.onnx .
cp -rf ${REGRESSION_PATH}/dataset/COCO2017 .
cp -rf ${REGRESSION_PATH}/image .

As etapas específicas de implementação são divididas em três etapas:

  • model_transform.py converte o modelo onnx no modelo de formato intermediário mlir

onnx -> model_transform.py -> mlir

  • run_calibration.py gera tabela de calibração de quantização int8

conjunto_de_calibração -> run_calibration.py -> tabela_de_calibração

  • model_deploy.py gera cvimodel para inferência TPU com mlir e tabela de quantização int8

mlir + tabela_de_calibração ->model_deploy.py -> cvimodel

onnx para MLIR

model_transform.py \
--model_name yolo11n \
--model_def yolo11n.onnx \
--input_shapes [[1,3,640,640]] \
--mean 0.0,0.0,0.0 \
--scale 0.0039216,0.0039216,0.0039216 \
--keep_aspect_ratio \
--pixel_format rgb \
--mlir yolo11n.mlir
root@a4096611d762:/workspace/ultralytics/model_yolo11n# model_transform.py \ > --model_name yolo11n \ > --model_def yolo11n.onnx \ > --input_shapes [[1,3,640,640]] \ > --mean 0.0,0.0,0.0 \ > --scale 0.0039216,0.0039216,0.0039216 \ > --keep_aspect_ratio \ > --pixel_format rgb \ > --mlir yolo11n.mlir SOPHGO Toolchain v1.3.228-g19ca95e9-20230921 2024/11/28 19:25:06 - INFO : _____________________________________________________ | preprocess: | | (x - mean) * scale | '-------------------------------------------------------' config Preprocess args : resize_dims : same to net input dims keep_aspect_ratio : True keep_ratio_mode : letterbox pad_value : 0 pad_type : center -------------------------- mean : [0.0, 0.0, 0.0] scale : [0.0039216, 0.0039216, 0.0039216] -------------------------- pixel_format : rgb channel_format : nchw Input_shape assigned ConstantFolding finished skip_fuse_bn: False Onnxsim opt finished ConstantFolding finished Save mlir file: yolo11n_origin.mlir [Running]: tpuc-opt yolo11n_origin.mlir --shape-infer --canonicalize --extra-optimize -o yolo11n.mlir [Success]: tpuc-opt yolo11n_origin.mlir --shape-infer --canonicalize --extra-optimize -o yolo11n.mlir Mlir file generated:yolo11n.mlir root@a4096611d762:/workspace/ultralytics/model_yolo11n#





Após a conversão para o arquivo mlir, um arquivo 
yolo11n.mlir será gerado.

root@a4096611d762:/workspace/ultralytics/model_yolo11n# ls yolo11n.mlir
yolo11n.mlir
root@a4096611d762:/workspace/ultralytics/model_yolo11n#

Modelo MLIR para INT8 (suporta apenas o modelo quantizado INT8 )

Antes de quantizar para o modelo INT8, você precisa executar calibration.py para obter a tabela de calibração. O número de dados de entrada deve ser de cerca de 100~1000 de acordo com a situação. Aqui, 100 imagens COCO2017 são preparadas para demonstração:

run_calibration.py yolo11n.mlir \
--dataset ./COCO2017 \
--input_num 100 \
-o yolo11n_cali_table
root@a4096611d762:/workspace/ultralytics/model_yolo11n# run_calibration.py yolo11n.mlir \ > --dataset ./COCO2017 \ > --input_num 100 \ > -o yolo11n_cali_table SOPHGO Toolchain v1.3.228-g19ca95e9-20230921 GmemAllocator use OpSizeOrderAssign reused mem is 3584000, all mem is 47558400 2024/11/28 19:28:14 - INFO : load_config Preprocess args : resize_dims : [640, 640] keep_aspect_ratio : True keep_ratio_mode : letterbox pad_value : 0 pad_type : center input_dims : [640, 640] -------------------------- mean : [0.0, 0.0, 0.0] scale : [0.0039216, 0.0039216, 0.0039216] -------------------------- pixel_format : rgb channel_format : nchw last input data (idx=100) not valid, droped input_num = 100, ref = 100 real input_num = 100 activation_collect_and_calc_th for op: images: 0%| | 0/231 [00:00<?, ?it/s]

.
.
.

GmemAllocator use OpSizeOrderAssign reused mem is 3584000, all mem is 47558400 GmemAllocator use OpSizeOrderAssign reused mem is 3584000, all mem is 47558400 prepare data from 100 tune op: 513_Conv: 100%|██████████████████████████████████████████████████████████████| 231/231 [30:34<00:00, 7.94s/it] auto tune end, run time:1835.7191824913025 root@a4096611d762:/workspace/ultralytics/model_yolo11n#







Use a tabela de calibração para gerar cvimodel simétrico int8:

model_deploy.py \
--mlir yolo11n.mlir \
--quant_input --quant_output \
--quantize INT8 \
--calibration_table yolo11n_cali_table \
--chip cv181x \
--model yolo11n_cv181x_int8_sym.cvimodel


root@a4096611d762:/workspace/ultralytics/model_yolo11n# model_deploy.py \ > --mlir yolo11n.mlir \ > --quant_input --quant_output \ > --quantize INT8 \ > --calibration_table yolo11n_cali_table \ > --chip cv181x \ > --model yolo11n_cv181x_int8_sym.cvimodel SOPHGO Toolchain v1.3.228-g19ca95e9-20230921 2024/11/28 20:44:52 - INFO : load_config Preprocess args : resize_dims : [640, 640] keep_aspect_ratio : True keep_ratio_mode : letterbox pad_value : 0 pad_type : center input_dims : [640, 640] -------------------------- mean : [0.0, 0.0, 0.0] scale : [0.0039216, 0.0039216, 0.0039216] -------------------------- pixel_format : rgb channel_format : nchw [Running]: tpuc-opt yolo11n.mlir --chip-assign="chip=cv181x" --import-calibration-table="file=yolo11n_cali_table asymmetric=False" --chip-top-optimize --convert-top-to-tpu="mode=INT8 asymmetric=False linear_quant_mode=NORMAL doWinograd=False ignore_f16_overflow=False" --canonicalize -o yolo11n_cv181x_int8_sym_tpu.mlir [Success]: tpuc-opt yolo11n.mlir --chip-assign="chip=cv181x" --import-calibration-table="file=yolo11n_cali_table asymmetric=False" --chip-top-optimize --convert-top-to-tpu="mode=INT8 asymmetric=False linear_quant_mode=NORMAL doWinograd=False ignore_f16_overflow=False" --canonicalize -o yolo11n_cv181x_int8_sym_tpu.mlir [Running]: tpuc-opt yolo11n_cv181x_int8_sym_tpu.mlir --mlir-disable-threading --strip-io-quant="quant_input=True quant_output=True" --chip-tpu-optimize --distribute='num_device=1' --weight-reorder --subnet-divide="dynamic=False" --op-reorder --layer-group="opt=2" --parallel='num_core=1' --address-assign -o yolo11n_cv181x_int8_sym_final.mlir ==---------------------------== Run LayerGroupSearchPass : Searching the optimal layer groups ==---------------------------== ======================================================= ***** Dynamic Programming layer group with cluster **** ======================================================= total num of base_group is 43 clusters idx(size): 0(1), 1(1), 2(1), 3(1), 4(1), 5(1),

Após a compilação, um arquivo chamado yolo11n_cv181x_int8_sym.cvimodel será gerado.

root@a4096611d762:/workspace/ultralytics/model_yolo11n# ls *.cvimodel
yolo11n_cv181x_int8_sym.cvimodel
root@a4096611d762:/workspace/ultralytics/model_yolo11n#

Execução no Duo 256

Copie o sample_yolov8 compilado, o cvimodel e a imagem jpg a ser inferida para a placa e execute o programa binário:

root@a4096611d762:/workspace# scp /workspace/cvitek-tdl-sdk-sg200x/sample/sample_yolov8 root@192.168.42.1:/root/
root@192.168.42.1's password:
sample_yolov8                                                                         100%   14KB 460.4KB/s   00:00
root@a4096611d762:/workspace
root@a4096611d762:/workspace# scp /workspace/ultralytics/model_yolo11n/yolo11n_cv181x_int8_sym.cvimodel root@192.168.42.1:/root/
root@192.168.42.1's password:
yolo11n_cv181x_int8_sym.cvimodel                                                      100% 3065KB   1.7MB/s   00:01
root@a4096611d762:/workspace#
root@a4096611d762:/workspace# scp /workspace/tpu-mlir/regression/image/cat.jpg root@192.168.42.1:/root/
root@192.168.42.1's password:
cat.jpg                                                                               100%  137KB   1.9MB/s   00:00
root@a4096611d762:/workspace#

Execute o seguinte comando:

export LD_LIBRARY_PATH='/mnt/system/lib'
./sample_yolov8 ./yolo11n_cv181x_int8_sym.cvimodel cat.jpg

O efeito é o seguinte:

[root@milkv-duo]~# ./sample_yolov8 ./yolo11n_cv181x_int8_sym.cvimodel cat.jpg enter CVI_TDL_Get_YOLO_Preparam... asign val 0 asign val 1 asign val 2 setup yolov8 param enter CVI_TDL_Get_YOLO_Preparam... setup yolov8 algorithm param yolov8 algorithm parameters setup success! ---------------------openmodel-----------------------version: 1.4.0 yolo11n Build at 2024-11-28 21:56:12 For platform cv181x Max SharedMem size:2560000 ---------------------to do detection----------------------- image read,width:480 image read,hidth:360 objnum:1 boxes=[[166.359,14.2262,352.954,351.749,15,0.874853],] [root@milkv-duo]~#

A SMARTCORE FORNECE CHIPS E MÓDULOS PARA IOT, COMUNICAÇÃO WIRELESS, BIOMETRIA, CONECTIVIDADE, RASTREAMENTO E AUTOMAÇÃO. NOSSO PORTFÓLIO INCLUI MODEM 2G/3G/4G/NB-IOT, SATELITAL, MÓDULOS WIFI, BLUETOOTH, GPS, SIGFOX, LORA, LEITOR DE CARTÃO, LEITOR QR CCODE, MECANISMO DE IMPRESSÃO, MINI-BOARD PC, ANTENA, PIGTAIL, BATERIA, REPETIDOR GPS E SENSORES.

Nenhum comentário:

Postar um comentário