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
Simplemente seleccione la última descarga e instalación (la configuración predeterminada para todas las opciones es la mejor)
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
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
Seleccione el sistema y haga clic en descargar
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
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
Descomprimir después de que se complete la descarga
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
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
entrada terminal
conda activate base
Ingrese al entorno base, y aparecerán las siguientes instrucciones para indicar que la instalación es correcta
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)
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:
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.
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
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
Otros videos y el razonamiento de la cámara pueden modificar la implementación de la demostración oficial usted mismo