yolov5 entrena y genera el modelo rknn y la implementación de la plataforma 3588

1. Configuración del entorno del servidor

1.1Instalación del controlador GPU

Descargar el controlador de la GPU

https://www.nvidia.cn/geforce/drivers/

Seleccione el modelo de tarjeta gráfica y el sistema operativo correspondientes y haga clic en Buscar

inserte la descripción de la imagen aquí
Simplemente seleccione la última descarga e instalación (la configuración predeterminada para todas las opciones es la mejor)

inserte la descripción de la imagen aquí

Ingrese el comando en la terminal para verificar si la instalación es correcta

nvidia-smi

La siguiente información aparece para indicar que la instalación es correcta, y el cuadro rojo es la versión más alta de cuda que se puede admitir

inserte la descripción de la imagen aquí

1.2 Instalar CUDA

Descargar el kit de herramientas CUDA

https://developer.nvidia.com/cuda-toolkit-archive

Seleccione la versión más alta admitida o una versión inferior

inserte la descripción de la imagen aquí

Seleccione el sistema y haga clic en descargar

inserte la descripción de la imagen aquí

Todas las configuraciones son predeterminadas, solo vaya al siguiente paso

Puede haber fallas durante el proceso de instalación. Si hay un problema con c ++, puede instalar Visual Studio. Instalé la edición comunitaria 2022

https://visualstudio.microsoft.com/zh-hans/vs/

Las opciones de instalación son las siguientes

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Vuelva a instalar CUDA después de que se complete la instalación

1.3 Instalar CUDNN

descargar cudnn

https://developer.nvidia.com/rdp/cudnn-download

Seleccione el paquete correspondiente para descargar

inserte la descripción de la imagen aquí

Descomprimir después de que se complete la descarga

inserte la descripción de la imagen aquí

Póngalo en el directorio correspondiente bajo la ruta

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7

1.4 Verificar CUDA

entrada terminal

nvcc -V

La siguiente figura muestra que la instalación es correcta y la versión en el cuadro rojo es

inserte la descripción de la imagen aquí

1.4 Instalar Anaconda

Descargar Anaconda

https://www.anaconda.com/

Descargar Anaconda del sistema correspondiente, tomando como ejemplo windows

La ruta de instalación se puede personalizar, y otros valores predeterminados están bien. Cabe señalar que se debe verificar lo siguiente para evitar el problema de configurar variables de entorno

inserte la descripción de la imagen aquí

entrada terminal

conda activate base

Ingrese al entorno base, y aparecerán las siguientes instrucciones para indicar que la instalación es correcta

inserte la descripción de la imagen aquí

1.5 Use Anaconda para crear un entorno operativo yolov5

1.5.1 Instalar pytorch-GPU

Ingrese el siguiente comando en la terminal para crear un entorno yolov5, python versión 3.8 (yolov5 requiere la versión de python> 3.7, se recomienda 3.8 aquí)

conda create -n yolov5 python=3.8

Ingrese todo el camino y sí para instalar con éxito.El comando para ingresar al entorno es el siguiente, y el resto de los comandos de conda puede buscarlos usted mismo

conda activate yolov5

Se pueden buscar otros comandos de conda en Baidu

Abrir el sitio web oficial de pytorch

https://www.pytorch.org

Seleccione el pytorch correspondiente al sistema operativo y la versión de CUDA (la versión de CUDA aquí no puede ser superior a la versión de CUDA que se ve arriba)

inserte la descripción de la imagen aquí

Copie el comando en Ejecutar este comando (se recomienda usar el siguiente comando para resolver el problema de la versión) e ingrese al entorno yolov5 de Anaconda, ingrese este comando y luego espere a que se complete la instalación. Si la instalación falla, puede cambiar el fuente por ti mismo para resolver el problema

conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 cudatoolkit=11.3 -c pytorch

conda agregar fuente Tsinghua

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge 
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/

# 设置搜索时显示通道地址
conda config --set show_channel_urls yes

Una vez completada la instalación, ingrese en el entorno yolov5

python

Ingrese python e ingrese

import torch
print(torch.cuda.is_available())
print(torch.backends.cudnn.is_available())

En ejecución se muestra como una indicación de que la instalación es correcta

True
True

1.5.2 Instale los paquetes necesarios para ejecutar yolov5

Obtenga la versión compatible con rknn de yolov5

git clone https://github.com/airockchip/yolov5.git

Ingrese al directorio raíz del proyecto yolov5 en el entorno yolov5 de Ancaonda, instale el paquete con pip, use la fuente Tsinghua más rápido con -i

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

Solo espera a que se complete la instalación

Los paquetes incluidos son los siguientes: asegúrese de instalar los paquetes incluidos en la base (paquetes necesarios para el entrenamiento y la ejecución), el registro (registros) y la exportación (exportación de modelos y conversión de formato):

# pip install -r requirements.txt

# base ----------------------------------------
Cython
matplotlib>=3.2.2
numpy>=1.18.5
opencv-python>=4.1.2
pillow
PyYAML>=5.3
scipy>=1.4.1
tensorboard>=2.2
torch>=1.6.0
torchvision>=0.7.0
tqdm>=4.41.0

# logging -------------------------------------
# wandb

# coco ----------------------------------------
# pycocotools>=2.0

# export --------------------------------------
# coremltools==4.0
# onnx>=1.8.0
# scikit-learn==0.19.2  # for coreml quantization

# extras --------------------------------------
# thop  # FLOPS computation
# seaborn  # plotting

Si hay un problema de incompatibilidad de versiones, puede modificar la versión del paquete usted mismo (cuando se cumplan los requisitos mínimos)

2. Modificación del proyecto Yolov5

2.1 Modifica models/yolo.py para solucionar el error:

Alrededor de 153 líneas de la misma:

def _initialize_biases(self, cf=None):  # initialize biases into Detect(), cf is class frequency
        # https://arxiv.org/abs/1708.02002 section 3.3
        # cf = torch.bincount(torch.tensor(np.concatenate(dataset.labels, 0)[:, 0]).long(), minlength=nc) + 1.
        m = self.model[-1]  # Detect() module
        for mi, s in zip(m.m, m.stride):  # from
            b = mi.bias.view(m.na, -1)  # conv.bias(255) to (3,85)
            b[:, 4] += math.log(8 / (640 / s) ** 2)  # obj (8 objects per 640 image)
            b[:, 5:] += math.log(0.6 / (m.nc - 0.99)) if cf is None else torch.log(cf / cf.sum())  # cls
            mi.bias = torch.nn.Parameter(b.view(-1), requires_grad=True)

cambie a:

def _initialize_biases(self, cf=None):  # initialize biases into Detect(), cf is class frequency
        # https://arxiv.org/abs/1708.02002 section 3.3
        # cf = torch.bincount(torch.tensor(np.concatenate(dataset.labels, 0)[:, 0]).long(), minlength=nc) + 1.
        m = self.model[-1]  # Detect() module
        for mi, s in zip(m.m, m.stride):  # from
            b = mi.bias.view(m.na, -1)  # conv.bias(255) to (3,85)
            with torch.no_grad():
            	b[:, 4] += math.log(8 / (640 / s) ** 2)  # obj (8 objects per 640 image)
            	b[:, 5:] += math.log(0.6 / (m.nc - 0.99)) if cf is None else torch.log(cf / cf.sum())  # cls
            mi.bias = torch.nn.Parameter(b.view(-1), requires_grad=True)

Resuelva el problema del error

2.2 Modificar utils/datasets.py:

Aquí debe ser compatible con su propio conjunto de datos yolov4, no necesita modificarlo

Alrededor de 342 líneas de la misma:

def img2label_paths(img_paths):
            # Define label paths as a function of image paths
            sa, sb = os.sep + 'images' + os.sep, os.sep + 'labels' + os.sep  # /images/, /labels/ substrings
            return [x.replace(sa, sb, 1).replace(os.path.splitext(x)[-1], '.txt') for x in img_paths]

cambie a:

def img2label_paths(img_paths):
            # Define label paths as a function of image paths
            sa, sb = os.sep + 'JPEGImages' + os.sep, os.sep + 'labels' + os.sep  # /images/, /labels/ substrings
            return [x.replace(sa, sb, 1).replace(os.path.splitext(x)[-1], '.txt') for x in img_paths]

Para ser compatible con el conjunto de datos utilizado por yolov4, logre el propósito del conjunto de datos común v4 y v5

2.3 Nuevo archivo de datos.yaml:

Cree my y yaml en el directorio de datos, el contenido es el siguiente (este archivo es la información del conjunto de datos), y puede configurar sus propios datos usted mismo.

# 训练,验证,测试集路径,其中xxx表示数据盘中的某个数据集
train: /media/ubuntu/data/datasets/xxx/2007_train.txt 
val: /media/ubuntu/data/datasets/xxx/2007_train.txt
test: /media/ubuntu/data/datasets/xxx/2007_train.txt
# 类的个数
nc: 2  
# 类名
names: ['red_jeep', 'missile_vehicle']

2.4 Nuevo cfg.yaml

Cree rknn.yaml en el directorio de datos, el contenido es el siguiente (este archivo es el archivo de configuración de la estructura del modelo)

Dado que la estructura de esta versión del proyecto utiliza un módulo anterior, lo modificamos a la estructura principal y principal: estructura de yolov5 versión 6.0 para mejorar el rendimiento. Dado que la salida de la versión 6.0 no es compatible con rknn, use la capa de detección de este proyecto para resolver este problema Por supuesto, puede utilizar el archivo de configuración del proyecto original

nc: 2  # 类的个数
depth_multiple: 0.33  # 深度倍率
width_multiple: 0.50  # 通道倍率
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

# YOLOv5 v6.0 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 6, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 3, C3, [1024]],
   [-1, 1, SPPF, [1024, 5]],  # 9
  ]

# YOLOv5 v6.0 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

2.5 Agregar módulo SPPF

Abra el archivo common.py en el archivo de modelos y agregue la clase SPPF. La función de activación en este archivo se ha cambiado a Relu, por lo que esta operación ya no es necesaria.

class SPPF(nn.Module):
    # Spatial Pyramid Pooling - Fast (SPPF) layer for YOLOv5 by Glenn Jocher
    def __init__(self, c1, c2, k=5):  # equivalent to SPP(k=(5, 9, 13))
        super().__init__()
        c_ = c1 // 2  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c_ * 4, c2, 1, 1)
        self.m = nn.MaxPool2d(kernel_size=k, stride=1, padding=k // 2)

    def forward(self, x):
        x = self.cv1(x)
        with warnings.catch_warnings():
            warnings.simplefilter('ignore')  # suppress torch 1.9.0 max_pool2d() warning
            y1 = self.m(x)
            y2 = self.m(y1)
            return self.cv2(torch.cat((x, y1, y2, self.m(y2)), 1))

2.6 Agregar módulo SPPF en la construcción del modelo

Modifique la línea 219 de la función def parse_model en models/yolo.py

if m in [Conv, Bottleneck, SPP, DWConv, MixConv2d, Focus, CrossConv, BottleneckCSP, C3]:

cambie a

if m in [Conv, Bottleneck, SPP, DWConv, MixConv2d, Focus, CrossConv, BottleneckCSP, C3, SPPF]:

El tensor de error 2.7 no se puede convertir a numpy

Este error se debe a que la versión numpy es demasiado alta

Puede desinstalar la versión superior numpy primero

pip uninstall numpy

Luego instale numpy1.18.5 para resolver el problema

pip install numpy==1.18.5 -i https://pypi.tuna.tsinghua.edu.cn/simple

2.8 No utilices pesas preentrenadas

Modifique train.py para eliminar el uso de modelos previamente entrenados

parser.add_argument('--weights', type=str, default='yolov5s.pt', help='initial weights path')

cambiar a:

parser.add_argument('--weights', type=str, default='', help='initial weights path')

2.9 Si el archivo de la página es demasiado pequeño, la operación no se puede completar

OSError: [WinError 1455] 页面文件太小,无法完成操作。 Error loading "D:\anaconda3\envs\Yolo\lib\site-packages\torch\lib\shm.dll" or one of its dependencies.

Modifique la memoria virtual correspondiente a la letra de la unidad, la operación es la siguiente, el tamaño puede depender de la situación:
inserte la descripción de la imagen aquí

Reinicie la computadora y comience a entrenar nuevamente

3. entrenamiento modelo yolov5

En el yolov5 de Anaconda, ingrese al directorio raíz de yolov5, la terminal se ejecuta de la siguiente manera, seleccione el archivo de configuración del modelo y el archivo del conjunto de datos para comenzar a entrenar

python --cfg models/rknn.yaml --data/my.yaml 

Una vez que se completa el entrenamiento, puede ver los resultados del entrenamiento en la carpeta de carreras. Pesos guarda los modelos de cada etapa, y results.png es la pantalla de resultados del entrenamiento.

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

formato 4.pt→formato onnx

En el yolov5 de Anaconda, ingrese el directorio raíz de yolov5, y la terminal se ejecuta de la siguiente manera

python models/export.py --weight xx.pt# 此处为需要转换模型的相对路径 当然也可以是绝对路径 如runs/train/exp/weight/best.pt

Si el módulo no existe, simplemente instálelo de acuerdo con los requisitos.txt

5. formato onnx → formato rknn

5.1 Instalación del entorno de la máquina virtual

Dado que rknn-toolkit2 actualmente solo es compatible con Linux, es necesario usar una máquina virtual (rknn-toolkit no es compatible con 3588)

Uso VMware como software de máquina virtual aquí, y el sistema es Ubuntu 18.04. Dado que la versión 20.04 no puede arrastrar archivos después de instalar vm-toolkit, se recomienda usar 18.04 y la instalación de la máquina virtual no se repetirá.

5.1.1 Instalar Anaconda

El documento oficial contiene la imagen de la ventana acoplable, que se puede extraer y usar directamente. Usamos el método tradicional aquí

Dado que Ubuntu 18.04 viene con python3.6, para evitar conflictos y simplificar las operaciones, continúe usando Anaconda para crear el entorno rknn

https://www.anaconda.com/

Descargue el sistema operativo correspondiente, colóquelo en el directorio principal después de la descarga, ejecútelo y presione Sí hasta el final para completar

sudo sh ./Anaconda3-2022.05-Linux-x86_64.sh 

Nota: Finalmente, pregunte si agregar a la variable de entorno, responda sí

Vuelve a abrir la terminal y podrás ver que la instalación es exitosa

inserte la descripción de la imagen aquí

5.1.2 Anaconda crea el entorno rknn e instala rknn-toolkit2

rknn-toolkit2 tiene paquetes python3.6 y python3.8, elegimos python3.8 aquí

conda create -n rknn puthon=3.8

Obtenga el paquete de instalación de rknn-toolkit2 e ingrese al directorio raíz del proyecto

git clone https://github.com/rockchip-linux/rknn-toolkit2.git
cd rknn-toolkits-1.3.0

Instale el paquete de dependencia de rknn-toolkit2 en el entorno rknn de Anaconda

pip3 install -r requirements_cp38-1.3.0.txt  -i https://pypi.tuna.tsinghua.edu.cn/simple

Instale rknn-toolkit2, si hay un problema de discrepancia de versión, puede desinstalar el paquete y reinstalar otras versiones

pip3 install package/rknn_toolkit2-1.3.0_11912b58-cp38-cp38-linux_x86_64.whl

Probar si la instalación fue exitosa

cd /examples/onnx/yolov5
python3 test.py

Ejecutar correctamente indica que la instalación es correcta

5.2 Conversión de modelos

Obtenga la demostración oficial

git clone https://github.com/rockchip-linux/rknpu2.git

Ingrese al directorio de conversión del modelo yolov5

cd /home/ptay/rknpu2-master/examples/rknn_yolov5_demo/convert_rknn_demo/yolov5

Coloque y convierta el modelo onnx en el directorio onnx

Abra onnx2rknn.py y modifíquelo de la siguiente manera:

1. Nombre de la plataforma de destino

platform = 'rk3588'

2. El modelo onnx que necesita ser convertido

MODEL_PATH = './onnx_models/best.onnx'

Luego ejecútelo en el entorno rknn, se generará un nuevo directorio rknn y el modelo rknn debajo de él, y luego puede modificar el nombre o modificarlo en el archivo py, que no es el punto

python3 onnx2rknn.py

Despliegue de la plataforma 6.3588

Obtenga la demostración oficial en el directorio principal de 3588

git clone https://github.com/rockchip-linux/rknpu2.git

Ingrese al directorio yolov5

cd /home/ptay/rknpu2-master/examples/rknn_yolov5_demo

Modifique el archivo de encabezado postprocess.h en el archivo de inclusión

#define OBJ_CLASS_NUM     2  #这里的数字修改为数据集的类的个数

Modifique el archivo coco_80_labels_list.txt en el directorio del modelo, cámbielo a su propia clase y guárdelo

red_jeep
missile_vehicle

Coloque el archivo rknn convertido en el directorio model/RK3588

compilar, ejecutar shell

bash ./build-linux_RK3588.sh

Generar directorio de instalación después del éxito

cd install/rknn_yolov5_demo_linux

Coloque las imágenes que necesitan ser razonadas en el directorio del modelo.

correr

./rknn_yolov5_demo ./model/RK3588/best.rknn ./model/test.jpg

El resultado lo obtuve en rknn_yolov5_demo_linux, por el problema de confidencialidad de los datos, aquí utilicé otro conjunto de datos para mostrar el resultado

inserte la descripción de la imagen aquí

Otros videos y el razonamiento de la cámara pueden modificar la implementación de la demostración oficial usted mismo

Supongo que te gusta

Origin blog.csdn.net/m0_51714298/article/details/125916417
Recomendado
Clasificación