domingo, 13 de outubro de 2024

MILK-V DUO 256 - YOLOv5 - PARTE II - Detecção de Objetos

 

Detecção de objetos com base em YOLOv5

1. Prepare os arquivos do modelo originalWindows

Preparar o kit de desenvolvimento YOLOv5 e arquivo yolov5n.pt

Baixe o kit de desenvolvimento YOLOv5 e o arquivo yolov5n.pt . Quando o download estiver completo, extraia o kit de ferramentas e coloque o arquivo yolov5n.pt no diretório yolov5-master 
no ambiente workspace.

em \workspace
wget https://codeload.github.com/ultralytics/yolov5/zip/refs/heads/master
unzip master
cd yolov5-master
wget https://github.com/ultralytics/yolov5/releases/download/v6.2/yolov5n.pt

pip install torch
pip install torchvision
pip install torchaudio

Na pasta  yolov5-master  e  execute
pip install -r requirements.txt
para instalar outras dependências.


Gerando o arquivo original Model

Crie um novo arquivo main.py  no diretório yolov5-master e escreva o seguinte código no arquivo:

(sudo apt-get install nano)

nano main.py

import torch
from models.experimental import attempt_download
model = torch.load(attempt_download("./yolov5n.pt"),
map_location=torch.device('cpu'))['model'].float()
model.eval()
model.model[-1].export = True
torch.jit.trace(model, torch.rand(1, 3, 640, 640), strict=False).save('./yolov5n_jit.pt')


Em seguida, localize o arquivo yolov5-master/models/yolo.py , comente o código das linhas 99 a 115 e adicione o código return x na linha 116, conforme mostrado abaixo:
(respeitar TAB do Python)

Além disso, este arquivo também precisa ser modificado:

\Lib\site-packages\torch\nn\modules\upsampling.py

Com PS + DOCKER

\\wsl.localhost\docker-desktop\tmp\docker-desktop-root\var\lib\docker\rootfs\overlayfs\6268c9bcdb659814ad487f60c2189a1e267f2c70a156b0cb0f497a0fa4e64f7b\usr\local\lib\python3.10\dist-packages\torch\nn\modules

Após encontrar upsampling.py, editar

Faça as seguintes alterações na linha 153

duo

Após a modificação ser concluída, execute o arquivo python main.py, então o arquivo yolov5n_jit.pt será gerado no diretório yolov5-master. Este arquivo é o arquivo de modelo original necessário.

python main.py



2. Configurar o ambiente de desenvolvimento Dockerbiente

Consulte aqui . Após configurar o ambiente de desenvolvimento do Docker, retorne aqui para continuar a próxima etapa.

aviso

Se você estiver usando um ambiente de desenvolvimento Docker configurado, certifique-se de seguir o tutorial de configuração do Docker para executar o comando source ./tpu-mlir/envsetup.sh após iniciar o Docker, caso contrário, poderão ocorrer erros nas etapas subsequentes.

3. Prepare o diretório de trabalho no Docker

Crie e entre no diretório de trabalho yolov5n_torch, observe que é um diretório no mesmo nível que tpu-mlir, e coloque os arquivos de modelo e de imagem neste diretório

# mkdir yolov5n_torch && cd yolov5n_torch

Crie um novo terminal do Windows  ou pelo docker wsl2 e copie yolov5n_jit.pt 

Coloque os arquivos do dataset no diretório atual ( yolov5n_torch)

# cp -rf ${TPUC_ROOT}/regression/dataset/COCO2017 .
--- Conteúdo de COCO2017 000000000632.jpg 000000085911.jpg 000000122672.jpg 000000208363.jpg 000000296657.jpg 000000463618.jpg 000000000885.jpg 000000088345.jpg 000000123633.jpg 000000209753.jpg 000000304545.jpg 000000466602.jpg 000000001532.jpg 000000088970.jpg 000000124798.jpg 000000210915.jpg 000000304560.jpg 000000475779.jpg 000000004495.jpg 000000093261.jpg 000000127660.jpg 000000213255.jpg 000000307598.jpg 000000476704.jpg 000000006954.jpg 000000094157.jpg 000000128148.jpg 000000213605.jpg 000000308753.jpg 000000481413.jpg 000000009400.jpg 000000094185.jpg 000000128372.jpg 000000220310.jpg 000000309655.jpg 000000497568.jpg 000000010092.jpg 000000095069.jpg 000000134096.jpg 000000228436.jpg 000000352684.jpg 000000497599.jpg 000000025096.jpg 000000099039.jpg 000000160728.jpg 000000230008.jpg 000000354307.jpg 000000498747.jpg 000000034139.jpg 000000104198.jpg 000000162130.jpg 000000232348.jpg 000000356531.jpg 000000532761.jpg 000000040757.jpg 000000104619.jpg 000000162858.jpg 000000239041.jpg 000000361586.jpg 000000547502.jpg 000000042296.jpg 000000104669.jpg 000000174371.jpg 000000239537.jpg 000000366711.jpg 000000549167.jpg 000000045229.jpg 000000106881.jpg 000000177065.jpg 000000239857.jpg 000000373315.jpg 000000550939.jpg 000000051598.jpg 000000109827.jpg 000000185250.jpg 000000255749.jpg 000000441442.jpg 000000562443.jpg 000000079188.jpg 000000111609.jpg 000000191288.jpg 000000255917.jpg 000000442009.jpg 000000579091.jpg 000000080659.jpg 000000116825.jpg 000000194471.jpg 000000281447.jpg 000000442661.jpg 000000580418.jpg 000000082821.jpg 000000119088.jpg 000000200839.jpg 000000293300.jpg 000000447169.jpg 000000085329.jpg 000000119445.jpg 000000206838.jpg 000000294163.jpg 000000447187.jpg root@a8eb466ff276:/workspace/yolov5n_torch/COCO2017#

--- e também
# cp -rf ${TPUC_ROOT}/regression/image .

${TPUC_ROOT}aqui está uma variável de ambiente, correspondente ao diretório tpu-mlir, que é carregada após a execução do comando source ./tpu-mlir/envsetup.sh na etapa da configuração anterior do ambiente de desenvolvimento do Docker.

Crie e insira o diretório work de trabalho para armazenar arquivos compilados, como MLIR cvimodel

# mkdir work && cd work


4. Modelo de conversão YOLOv5n-TORCH 
dica

A placa de desenvolvimento Duo é equipada com o chip CV1800B, que suporta a série ONNX e os modelos Caffe . Atualmente, ela não suporta modelos TFLite. Em termos de tipos de dados quantizados, ela suporta quantização no formato BF16 e quantização assimétrica no formato INT8 .

As etapas para conversão do modelo são as seguintes:

  • Converter modelo TORCH para MLIR
  • Gerar tabelas de calibração necessárias para quantificação
  • Quantização MLIR em cvimodel assimétrico INT8

Modelo TORCH convertido para MLIR

Neste exemplo, o modelo é uma entrada RGB, mean scale são respectivamente 0,0,0 0.00392160.00392160.0039216 . O comando para converter o modelo TORCH para o modelo MLIR é o seguinte:

# model_transform.py \
--model_name yolov5n \
--model_def ../yolov5n_jit.pt \
--input_shapes [[1,3,640,640]] \
--pixel_format "rgb" \
--keep_aspect_ratio \
--mean 0,0,0 \
--scale 0.0039216,0.0039216,0.0039216 \
--test_input ../image/dog.jpg \
--test_result yolov5n_top_outputs.npz \
--output_names 1219,1234,1249 \
--mlir yolov5n.mlir

Exemplo de operação bem-sucedida



Após a conversão para o modelo MLIR, um arquivo yolov5n.mlir  será gerado, que é o arquivo do modelo MLIR. Um arquivo yolov5n_in_f32.npz e um arquivo yolov5n_top_outputs.npz também serão gerados, que são os arquivos de entrada para a conversão subsequente do modelo.

MLIR para INT8

Gerar tabelas de calibração necessárias para quantificação

Antes de converter para o modelo INT8, você precisa gerar uma tabela de calibração. Aqui usamos as 100 imagens existentes do COCO2017 como um exemplo para executar a calibração.

# run_calibration.py yolov5n.mlir \
--dataset ../COCO2017 \
--input_num 100 \
-o ./yolov5n_cali_table





Exemplo de operação bem-sucedida

duo

Após a conclusão da operação, o arquivo yolov5n_cali_table será gerado, o qual será utilizado para posterior compilação do modelo INT8.



MLIR quantizado no cvimodel assimétrico

O comando para converter o modelo MLIR para o modelo INT8 é o seguinte

# model_deploy.py \
--mlir yolov5n.mlir \
--quantize INT8 \
--calibration_table ./yolov5n_cali_table \
--chip cv181x \
--test_input ../image/dog.jpg \
--test_reference yolov5n_top_outputs.npz \
--compare_all \
--tolerance 0.96,0.72 \
--fuse_preprocess \
--debug \
--model yolov5n_int8_fuse.cvimodel




dica

Se a placa de desenvolvimento que você estiver usando não for Duo, substitua a quinta linha --chip cv180x no comando acima pelo modelo de chip correspondente. Ao usar Duo 256M/Duo S, ele deve ser alterado para --chip cv181x.

Após a conclusão da compilação, o arquivo yolov5n_int8_fuse.cvimodel será gerado.

5. Validar no Development Board Duo

Conectando a Milk-V Duo

Conclua a conexão entre a placa de desenvolvimento Duo e o computador de acordo com o tutorial anterior e use ferramentas como teraterm, realtermmobaxterm ou Xshell ou putty para abrir um terminal para operar a placa de desenvolvimento Duo.

Obter sdk tpu

Mude para o diretório /workspace no terminal do Docker

cd /workspace

Baixe o tpu sdk, se estiver usando o Duo, execute

git clone https://github.com/milkv-duo/tpu-sdk-cv180x.git
mv ./tpu-sdk-cv180x ./tpu-sdk

Caso contrário, se você estiver usando Duo 256M/Duo S, execute

git clone https://github.com/milkv-duo/tpu-sdk-sg200x.git
mv ./tpu-sdk-sg200x ./tpu-sdk


Copie os arquivos tpu-sdk e model para Duo

No terminal da placa Duo, crie um novo diretório/mnt/tpu/

# mkdir -p /mnt/tpu && cd /mnt/tpu


No terminal do Docker, copie tpu-sdk e modele os arquivos para o Duo

# scp -r /workspace/tpu-sdk root@192.168.xxx.xxx:/mnt/tpu/
caso seja comunicação via ETH, 192.168.xxx.xxx


caso seja comunicação via USB, 192.168.42.1

# scp /workspace/yolov5n_torch/work/yolov5n_int8_fuse.cvimodel root@192.168.xxx.x:/mnt/tpu/tpu-sdk/




Definir variáveis de ambiente

No terminal da placa Duo, defina as variáveis ​​de ambiente

# cd /mnt/tpu/tpu-sdk
# source ./envs_tpu_sdk.sh

Executar detecção

Na placa Duo, execute a detecção de objetos na imagem

duo

dog.jpg

No terminal da placa Duo, use o modelo yolov5n_int8_fuse.cvimodel para detecção de objetos

# ./samples/samples_extra/bin/cvi_sample_detector_yolo_v5_fused_preprocess \
./yolov5n_int8_fuse.cvimodel \
./samples/samples_extra/data/dog.jpg \
yolov5n_out.jpg

Exemplo de resultado de detecção bem-sucedido

Após a operação bem-sucedida, o arquivo de resultado da detecção yolov5n_out.jpg será gerado, o qual pode ser obtido no PC por meio do comando scp no terminal do Windows.


scp root@192.168.xxx.xxx:/mnt/tpu/tpu-sdk/yolov5n_out.jpg .

Visualizar arquivos de resultados de testes em um PC com Windows

Execução

Referências

Object Detection Based on YOLOv5 | Milk-V (milkv.io)
https://blog.csdn.net/qq_41808475/article/details/138133120?sharetype=blogdetail&shareId=138133120&sharerefer=APP&sharesource=2405_87120824&sharefrom=link
CV180-Duo/TPU_SDK/TPU-MLIR_Quick_Start.pdf at main · sophgocommunity/CV180-Duo (github.com)
How to use the TPU(0.2TOPS@INT8) on the Duo - CV1800B(Duo English Forum) - Sophgo
Training Yolo v5 on Custom Dataset for Object Detection | Roboflow Universe & Workspace (youtube.com)
Explicação sobre a detecção de objetos YOLO: Um guia para iniciantes | DataCamp
A Beginner’s Guide to Training a YOLOv5 Object Detection Model | by Prithvi Seshadri | Artificial Intelligence in Plain English
Train Custom Data - Ultralytics YOLO Docs
https://huggingface.co/Ultralytics/YOLOv8

PS: docker cp best.pt duotpu:/workspace/yolov5-master

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