YOLOv7远程服务器训练自己数据集踩坑记录

YOLOv7远程服务器训练自己数据集踩坑记录

服务器相关

设备限制,需用实验室远程服务器进行部署:

1. MobaXterm连接服务器后新建容器。

sudo NV_GPU=0,1 nvidia-docker run --name 文件夹名 --shm-size=‘6g’ -d -p 7803:22 -it -v /home/disk3090ti/wjh3090ti:/workspace/文件夹名 pytorch/pytorch:aaa bash

2.下载并上传YOLOv7-master

各文件说明:
cfg:存放训练所需要的网络结构yaml文件
customdata:这个文件夹是存放用户自定义数据集,这是我后来训练v7的时候创建的,刚下载的时候是没有的
data:存放训练过程中超参数和训练相关data的yaml文件
models:存放的是定义网络结构的相关python文件和导出模型部署所需要的代码
runs:存放训练和测试的权重文件和相关信息
utils:存放一些代码运行中必备的代码
detect.py:用于测试的脚本
requirement.txt:训练和测试所需要下载的库
train.py:用于开启训练的脚本
(转自进我的收藏吃灰吧~~大佬)

3. 修改ssh设置以同步文件夹

设置密码
passwd root
apt-get update
apt-get install openssh-server
vim /etc/ssh/sshd_config
service ssh restart

4. 进入容器配置YOLO环境

conda create -n yolov7 python=3.7
conda activate yolov7
pip install -r your_yolov7_path/requirement.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

5. 搞自己的数据集

数据存放位置如下:
YOLOv7远程服务器训练自己数据集踩坑记录_第1张图片

Labelimg标注工具选用voc格式标注完的文件是xml,yolo所需代码是txt格式,需要进行格式转换。xml2txt代码如下:

import os
import glob
import xml.etree.ElementTree as ET

xml_file=r'/workspace/hdy7/yolov7-main/data/data2/labels/val/'

l=['stem', 'blade', 'black tuber']

def convert(box,dw,dh):
    x=(box[0]+box[2])/2.0
    y=(box[1]+box[3])/2.0
    w=box[2]-box[0]
    h=box[3]-box[1]

    x=x/dw
    y=y/dh
    w=w/dw
    h=h/dh

    return x,y,w,h

def f(name_id):
    xml_o=open(r'/workspace/hdy7/yolov7-main/data/data2/labels/val/%s.xml'%name_id)  #xml标签文件夹
    txt_o=open(r'/workspace/hdy7/yolov7-main/data/data2/labels/val_txt/%s.txt'%name_id,'w')   #txt输出文件

    pares=ET.parse(xml_o)
    root=pares.getroot()
    objects=root.findall('object')
    size=root.find('size')
    dw=int(size.find('width').text)
    dh=int(size.find('height').text)

    for obj in objects :
        c=l.index(obj.find('name').text)
        bnd=obj.find('bndbox')

        b=(float(bnd.find('xmin').text),float(bnd.find('ymin').text),
           float(bnd.find('xmax').text),float(bnd.find('ymax').text))

        x,y,w,h=convert(b,dw,dh)

        write_t="{} {:.5f} {:.5f} {:.5f} {:.5f}\n".format(c,x,y,w,h)
        txt_o.write(write_t)

    xml_o.close()
    txt_o.close()

name=glob.glob(os.path.join(xml_file,"*.xml"))
for i in name :
    name_id=os.path.basename(i)[:-4]
    f(name_id)

转完xml文件会变成如下txt格式
YOLOv7远程服务器训练自己数据集踩坑记录_第2张图片
然后需要用代码生成图片的文件路径,代码如下:

import os

def listdir(path, list_name):  # 传入存储的list
    for file in os.listdir(path):
        file_path = os.path.join(path, file)
        if os.path.isdir(file_path):
            listdir(file_path, list_name)
        else:
            list_name.append(file_path)


list_name = []
path = '/workspace/hdy7/yolov7-main/data/data2/images/test/'  # 文件夹路径
listdir(path, list_name)
print(list_name)

with open('/workspace/hdy7/yolov7-main/data/data2/test_list.txt', 'w') as f:  # 要存入的txt
    write = ''
    for i in list_name:
        write = write + str(i) + '\n'
    f.write(write)

新建data.yaml数据路径配置文件,填写训练验证和测试集文件路径,修改标签种类数目nc,修改标签名字。
YOLOv7远程服务器训练自己数据集踩坑记录_第3张图片

6. 修改train.py配置文件

YOLOv7远程服务器训练自己数据集踩坑记录_第4张图片
weights这里下载了源码里的权重文件,默认的从网站上自动下载会报错,建议自己下载到本地后上传。
batch-size根据算力修改
data给入前面设置的data.yaml文件路径
nosave可以改一下,要不会每几轮训练就保存一次训练结果。

7. 运行python train.py文件即可开始训练

YOLOv7远程服务器训练自己数据集踩坑记录_第5张图片

8.踩坑记录

1.不下载权重文件到本地的话我这报这个错:

subprocess.CalledProcessError: Command ‘git tag’ returned non-zero exit status 127.

2.环境中缺少GL.so.1文件

ImportError: libGL.so.1: cannot open shared object file: No such file or directory
服务器上装一下就行啦
apt-get update
apt install libgl1-mesa-glx

你可能感兴趣的:(python)