prefacio
Para aquellos que no tienen una máquina de entrenamiento de GPU, usar un servidor en la nube para entrenar su modelo debería ser la opción más óptima. Simplemente abra un servidor que se facture por hora durante el entrenamiento. Una vez que se completa el entrenamiento y la imagen del entorno es guardado, el servidor se puede detener por completo. No hay costo durante el período, y la próxima vez que entrene nuevamente, simplemente inicie el entorno, y es fácil proteger su entorno de entrenamiento de la contaminación.
1. Seleccione un servidor
1. El servidor de Alibaba se selecciona aquí y puede iniciar sesión directamente con su cuenta de Alipay.
2. Seleccione la configuración y pague sobre la marcha. Entrené el modelo yolov5 con un conjunto de datos de más de 20,000, y el V100 es completamente suficiente.
3. Seleccione el sistema e instale la GPU para comenzar
3. Seleccione la velocidad de la red (velocidad de enlace ascendente y descendente) y luego confirme el pedido.
Dos, configurar el servidor
1. Para conectarse al servidor, haga clic en Conexión remota directamente.
2. Cambie a raíz e instale los archivos necesarios.
su
cd
sudo apt-get install vim #vim
sudo apt-get install unzip #解压
sudo apt-get install zip #压缩
sudo apt-get install screen #保护进程会话
3. Configurar el entorno (usando Anaconda3)
1. Primero descargue Anaconda3 a su directorio local y luego cárguelo al servidor con scp
scp data/Anaconda3-5.3.0-Linux-x86_64.sh [email protected]:/home/data/
Después de esperar a que se complete la carga, instale Anaconda3 en el servidor y confirme hasta que se complete la instalación.
Agregue Anaconda3 a la variable de entorno.
sudo vim ~/.bashrc
Agregue la ruta bin al final del archivo, luego guarde el archivo y salga.
export PATH=$PATH:/root/anaconda3/bin
Usa el entorno para tener efecto
source ~/.bashrc
2. Crea el ambiente
conda create --name yolov5 python=3.7
conda activate yolov5
3. Descargue el código del algoritmo, puede descargar el código fuente directamente desde git o cargar el código fuente que ha cambiado.
Descarga el código fuente de git, yolov5s como ejemplo:
descargar git
git clone https://github.com/ultralytics/yolov5.git
cd yolov5
pip install -r requirements.txt
Dependencias de carga local e instalación manual
scp data/yolov5.zip [email protected]:/home/data/
Una vez completada la carga, cambie al servidor
unzip yolov5.zip
cd yolov5
conda install pytorch torchvision cudatoolkit=10.2 -c pytorch
pip install cython matplotlib tqdm opencv-python tensorboard scipy pillow onnx pyyaml pandas seaborn
4. Tratamiento de datos
1. Cargue el conjunto de datos en el servidor
scp data/dataset.zip [email protected]:/home/data/yolov5
2. Una vez completada la carga, divida los datos en un conjunto de entrenamiento y un conjunto de prueba. El formato de datos coco utilizado aquí debe convertirse al formato yolov5.
unzip dataset.zip
python generate_txt.py --img_path data/XXXXX/JPEGImages --xml_path data/XXXXX/Annotations --out_path data/XXXXX
Conversión de datos y generación de código fuente generate_txt.py
import os
import glob
import argparse
import random
import xml.etree.ElementTree as ET
from PIL import Image
from tqdm import tqdm
def get_all_classes(xml_path):
xml_fns = glob.glob(os.path.join(xml_path, '*.xml'))
class_names = []
for xml_fn in xml_fns:
tree = ET.parse(xml_fn)
root = tree.getroot()
for obj in root.iter('object'):
cls = obj.find('name').text
class_names.append(cls)
return sorted(list(set(class_names)))
def convert_annotation(img_path, xml_path, class_names, out_path):
output = []
im_fns = glob.glob(os.path.join(img_path, '*.jpg'))
for im_fn in tqdm(im_fns):
if os.path.getsize(im_fn) == 0:
continue
xml_fn = os.path.join(xml_path, os.path.splitext(os.path.basename(im_fn))[0] + '.xml')
if not os.path.exists(xml_fn):
continue
img = Image.open(im_fn)
height, width = img.height, img.width
tree = ET.parse(xml_fn)
root = tree.getroot()
anno = []
xml_height = int(root.find('size').find('height').text)
xml_width = int(root.find('size').find('width').text)
if height != xml_height or width != xml_width:
print((height, width), (xml_height, xml_width), im_fn)
continue
for obj in root.iter('object'):
cls = obj.find('name').text
cls_id = class_names.index(cls)
xmlbox = obj.find('bndbox')
xmin = int(xmlbox.find('xmin').text)
ymin = int(xmlbox.find('ymin').text)
xmax = int(xmlbox.find('xmax').text)
ymax = int(xmlbox.find('ymax').text)
cx = (xmax + xmin) / 2.0 / width
cy = (ymax + ymin) / 2.0 / height
bw = (xmax - xmin) * 1.0 / width
bh = (ymax - ymin) * 1.0 / height
anno.append('{} {} {} {} {}'.format(cls_id, cx, cy, bw, bh))
if len(anno) > 0:
output.append(im_fn)
with open(im_fn.replace('.jpg', '.txt'), 'w') as f:
f.write('\n'.join(anno))
random.shuffle(output)
train_num = int(len(output) * 0.9)
with open(os.path.join(out_path, 'train.txt'), 'w') as f:
f.write('\n'.join(output[:train_num]))
with open(os.path.join(out_path, 'val.txt'), 'w') as f:
f.write('\n'.join(output[train_num:]))
def parse_args():
parser = argparse.ArgumentParser('generate annotation')
parser.add_argument('--img_path', type=str, help='input image directory')
parser.add_argument('--xml_path', type=str, help='input xml directory')
parser.add_argument('--out_path', type=str, help='output directory')
args = parser.parse_args()
return args
if __name__ == '__main__':
args = parse_args()
class_names = get_all_classes(args.xml_path)
print(class_names)
convert_annotation(args.img_path, args.xml_path, class_names, args.out_path)
5. Modelo de formación
1. Antes de entrenar el modelo, ejecute screen primero para asegurarse de que el entrenamiento pueda continuar después de desconectar el terminal de servicio.
screen -S yolo
yolo 是一个标记,可以自己随便填,用来分辨该窗口的用途,避免窗口多了自己混淆
pantalla de comandos comunes
screen -ls #查看进程
screen -r -d 1020 #后台运行的screen进程
kill -9 1020 #杀死不需要的进程
screen -wipe #检查目前所有的screen作业,并删除已经无法使用的screen作业
2. Reactivar el medio ambiente
conda activate yolov5
3. Modelo de formación
python train.py --cfg models/yolov5s.yaml --data data/ODID.yaml --hyp data/hyp.scratch.yaml --epochs 100 --multi-scale --device 0
6. Algunos comandos de uso común en Linux
- scp
descargar archivo del servidor
scp username@IP:/remote_path/filename ~/local_destination
Subir archivos locales al servidor
scp ~/local_path/local_filename username@IP:/remote_path
从服务器下载整个目录
scp -r username@servername:/remote_path/remote_dir/ ~/local_destination
Subir directorio al servidor
scp -r ~/local_dir username@servername:/remote_path/remote_dir
- configuración de vim
directorio del archivo de configuración a nivel del sistema: /etc/vim/vimrc
directorio del archivo de configuración a nivel del usuario: ~/.vim/vimrc
modificar el archivo de configuración vimrc o .vimrc
//mostrar numero de linea
set nu
Comando zip de compresión y descompresión
zip -r file.zip ./*
Comprime todos los archivos y carpetas en el directorio actual en un archivo file.zip, -r significa comprimir recursivamente todos los archivos en subdirectorios.
El comando de descompresión
unzip -o -d /home/sunny file.zip
descomprime el archivo file.zip en /home/sunny/
-o: sobrescribe el archivo sin preguntar;
-d:-d /home/sunny especifica que se descomprima el archivo Comprímalo en el directorio /home/sunny;
Otros
zip -d file.zip smart.txt
elimina el archivo smart.txt en el archivo comprimido
zip -m file.zip ./rpm_info.txt
agrega el archivo rpm_info.txt a file.zip en el archivo comprimido
- agente terminal
export ALL_PROXY=socks5://127.0.0.1:4081 #端口号
curl -L cip.cc #验证是否成功
- controlador de gráficos
nvidia-smi