ubuntu下快速搭建docker环境训练yolov5数据集

参考文档

yolov5-github

yolov5-github-训练文档

csdn训练博客

一、配置环境

1.1 安装依赖包

前往清华源官方地址 选择适合自己的版本替换自己的源

# 备份源文件
sudo cp /etc/apt/sources.list /etc/apt/sources.list_bak
# 修改源文件
# 更新
sudo apt update && sudo apt upgrade -y

安装必要的环境依赖包

sudo apt-get install -y build-essential ubuntu-drivers-common net-tools python3 python-is-python3 python3-pip
# 修改pip源为清华源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

或者修改配置文件替换pipe国内源地址

mkdir ~/.pip/
cd  ~/.pip/
sudo vi pip.conf

输入以下内容:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=pypi.tuna.tsinghua.edu.cn

执行验证:

pip config list

1.2 安装docker

具体安装步骤参考ubuntu安装docker官方文档

  1. 卸载所有冲突包

    for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
    
  2. 设置 Docker 的apt存储库

    # Add Docker's official GPG key:
    sudo apt-get update
    sudo apt-get install -y ca-certificates curl gnupg
    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    sudo chmod a+r /etc/apt/keyrings/docker.gpg# Add the repository to Apt sources:
    echo \"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt-get update
    
  3. 安装最新的docker包

    sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    

1.3 拉取pytorch docker镜像

前往pytorch 官方docker镜像寻找自己合适版本,yolov5要求1.8以上版本,我拉取1.13版本,执行命令:

sudo docker pull pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime

1.4 安装nvidia驱动

桌面版参考链接

服务器版参考链接

我们使用pytorch-docker环境无需安装cuda,NVIDIA驱动简单安装如下

  1. 禁用nouveau驱动

    编辑 /etc/modprobe.d/blacklist-nouveau.conf 文件,添加以下内容:

    blacklist nouveau
    blacklist lbm-nouveau
    options nouveau modeset=0
    alias nouveau off
    alias lbm-nouveau off
    
  2. 关闭nouveau

    echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
    
  3. 重新生成内核并重启

    sudo update-initramfs -u
    sudo reboot
    
  4. 重启后验证
    重启后,执行:lsmod | grep nouveau如果没有屏幕输出,说明禁用nouveau成功

  5. 查找推荐驱动

    ubuntu-drivers devices
    # 输出如下
    # modalias : pci:v000010DEd00001EB8sv000010DEsd000012A2bc03sc02i00
    # vendor   : NVIDIA Corporation
    # model    : TU104GL [Tesla T4]
    # driver   : nvidia-driver-450-server - distro non-free
    # driver   : nvidia-driver-525-server - distro non-free
    # driver   : nvidia-driver-535-server - distro non-free
    # driver   : nvidia-driver-418-server - distro non-free
    # driver   : nvidia-driver-525 - distro non-free
    # driver   : nvidia-driver-470 - distro non-free
    # driver   : nvidia-driver-470-server - distro non-free
    # driver   : nvidia-driver-535 - distro non-free recommended
    # driver   : xserver-xorg-video-nouveau - distro free builtin
    
  6. 安装推荐的驱动程序

    根据自己系统选择安装,安装完成后重启

    sudo apt install nvidia-driver-535-server
    
  7. 重启后验证

    nvidia-smi 命令能够输出显卡信息则验证成功

1.5 安装nvidia docker gpus工具

为了让docker支持nvidia显卡,英伟达公司开发了nvidia-docker,该软件是对docker的包装,使得容器能够看到并使用宿主机的nvidia显卡。

根据网上的资料,从docker 19版本之后,nvidia-docker成为了过去式。不需要单独去下nvidia-docker这个独立的docker应用程序,也就是说gpu docker所需要的Runtime被集成进docker中,使用的时候用–gpus参数来控制。以下是工具安装步骤:

# step1 添加包存储库,在终端依次输入以下命令:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list# step2 下载安装nvidia-container-toolkit包
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit# step3 重启docker服务
sudo systemctl restart docker

二、训练数据集

2.1 下载yolov5代码

前往github下载代码,或者准备自己的yolov5训练代码,如果是拷贝他人代码,将**.git目录删除**,否则后续训练时检查git信息会报错。

git clone git@github.com:ultralytics/yolov5.git

2.2 启动进入pytorch-docker

# 映射宿主机地址到docker内部,根据显卡实际情况指定显存容量
sudo docker run -v /home/zmj/lishi:/workspace --gpus all --shm-size 18g -p 6006:6006 -it pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime /bin/bash

后续都将在docker中执行;

2.3 安装依赖项

在docker下进入yolov5代码目录下将request.txtopencv注释掉然后执行依赖项安装

image-20231129140344105

pip3 install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

继续安装opencv-python-headless版本opencv;

pip3 install opencv-python-headless

2.4 创建文件

2.4.1 数据集为图片+xml格式

将标准好的图像文件夹命名为images,标签文件夹命名为Annotations都放到源码目录的data文件夹下(注意: images内为数据集原始图片,Annotations内为标注的xml文件,对这两个文件夹做好备份);

├── data
│   ├── Annotations  进行 detection 任务时的标签文件,xml 形式,文件名与图片名一一对应
│   ├── images  存放 .jpg 格式的图片文件
│   ├── ImageSets  存放的是分类和检测的数据集分割文件,包含train.txt, val.txt,trainval.txt,test.txt
│   ├── labels  存放label标注信息的txt文件,与图片一一对应├── ImageSets(train,val,test建议按照8:1:1比例划分)
│   ├── train.txt  写着用于训练的图片名称
│   ├── val.txt  写着用于验证的图片名称
│   ├── trainval.txt  train与val的合集
│   ├── test.txt  写着用于测试的图片名称

yolov5根目录下创建make_txt.py文件,内容如下:

import os
import random# 函数:确保文件夹存在,如果不存在则创建
def ensure_folder_exists(folder):if not os.path.exists(folder):os.makedirs(folder)print(f"Created folder: {folder}")# 检查并创建所需文件夹
folders = ["data/ImageSets", "data/JPEGImages", "data/labels"]
for folder in folders:ensure_folder_exists(folder)trainval_percent = 0.1
train_percent = 0.9
xmlfilepath = 'data/Annotations'
txtsavepath = 'data/ImageSets'
total_xml = os.listdir(xmlfilepath)
num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)
file_paths = []
file_paths.append(os.path.join(txtsavepath, 'trainval.txt'))
file_paths.append(os.path.join(txtsavepath, 'test.txt'))
file_paths.append(os.path.join(txtsavepath, 'train.txt'))
file_paths.append(os.path.join(txtsavepath, 'val.txt'))for file_path in file_paths:with open(file_path, 'w') as file:for i in list:name = total_xml[i][:-4] + '\n'if i in trainval:if file_path.endswith('trainval.txt'):file.write(name)if i in train:if file_path.endswith('test.txt'):file.write(name)else:if file_path.endswith('val.txt'):file.write(name)else:if file_path.endswith('train.txt'):file.write(name)file.close()os.chmod(file_path, 0o666)  # 设置文件权限print("Finished!")

创建voc_label.py内容如下:

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join# 函数:确保文件夹存在,如果不存在则创建
def ensure_folder_exists(folder):if not os.path.exists(folder):os.makedirs(folder)print(f"Created folder: {folder}")# 检查并创建所需文件夹
folders = ["data/ImageSets", "data/JPEGImages", "data/labels"]
for folder in folders:ensure_folder_exists(folder)sets = ['train', 'test','val']
#此处修改为实际标注内容
classes = ['fall']
def convert(size, box):dw = 1. / size[0]dh = 1. / size[1]x = (box[0] + box[1]) / 2.0y = (box[2] + box[3]) / 2.0w = box[1] - box[0]h = box[3] - box[2]x = x * dww = w * dwy = y * dhh = h * dhreturn (x, y, w, h)
def convert_annotation(image_id):in_file = open('data/Annotations/%s.xml' % (image_id))file_path = 'data/labels/%s.txt' % (image_id)tree = ET.parse(in_file)root = tree.getroot()size = root.find('size')w = int(size.find('width').text)h = int(size.find('height').text)if(w==0 or h==0):in_file.close()print(image_id,"w ", w, "h ", h, "0 error")image_file = 'data/images/%s.jpg' % (image_id)xml_file = 'data/Annotations/%s.xml' % (image_id)os.remove(image_file)os.remove(xml_file)returnout_file = open('data/labels/%s.txt' % (image_id), 'w')for obj in root.iter('object'):difficult = obj.find('difficult').textcls = obj.find('name').textif cls not in classes or int(difficult) == 1:continuecls_id = classes.index(cls)xmlbox = obj.find('bndbox')b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),float(xmlbox.find('ymax').text))bb = convert((w, h), b)out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')in_file.close()out_file.close()os.chmod(file_path, 0o666)  # 设置文件权限
wd = getcwd()
print(wd)
for image_set in sets:if not os.path.exists('data/labels/'):os.makedirs('data/labels/')image_ids = open('data/ImageSets/%s.txt' % (image_set)).read().strip().split()file_path = 'data/%s.txt' % (image_set)with open(file_path, 'w') as list_file:for image_id in image_ids:list_file.write('data/images/%s.jpg\n' % (image_id))convert_annotation(image_id)list_file.close()os.chmod(file_path, 0o666)  # 设置文件权限
print("Finished!")

依次执行上述两个脚本,如果执行voc_labels.py提示有w 0 h 0 errror字样,说明标注的宽高有0异常,脚本会删除异常标签和图片,需要重新执行这两个脚本。

python3 make_txt.py
python3 voc_label.py

执行完成后会在data下创建ImageSets文件夹和labels文件夹大致内容如下:

image-20231129155751988

image-20231129155819545

data下生成三个txt文件

image-20231129155914301

2.4.2 数据集为图片+txt格式

如果数据集为已经归一化后的txt格式数据,则只需将数据集的trainvaltest三个文件夹放到data目录下,使用python在data目录下生成对应的txt文件即可。python实现可参考如下内容:

# chat-gpt编写
import osdef create_list(data_folder, subset):images_folder = os.path.join(data_folder, subset, 'images')list_file_path = os.path.join(data_folder, f'{subset}.txt')with open(list_file_path, 'w') as list_file:for image_name in os.listdir(images_folder):if image_name.endswith('.jpg'):image_path = os.path.relpath(os.path.join(images_folder, image_name), start=os.path.dirname(data_folder))list_file.write(image_path + '\n')# 设置文件权限为0666os.chmod(list_file_path, 0o666)# 替换为您的data目录的路径
data_directory = 'data'# 为train, test, val创建列表
for subset in ['train', 'test', 'val']:create_list(data_directory, subset)

执行之后即可,效果如下:

image-20231201103911953

image-20231201104043739

2.5 修改yaml文件

复制data目录下的coco.yaml,我这里命名为fall.yaml,参照参考文档主要修改三个地方:

  1. 修改train,val,test的路径为自己刚刚生成的三个txt文件相对于yolov5源码根目录的路径;

  2. nc 里的数字代表数据集的类别,我这里只有跌倒一类,所以修改为1;

  3. names 里为自己数据集标注的类名称,我这里是fall

    内容如下

    # YOLOv5 🚀 by Ultralytics, AGPL-3.0 license
    # COCO 2017 dataset http://cocodataset.org by Microsoft
    # Example usage: python train.py --data coco.yaml
    # parent
    # ├── yolov5
    # └── datasets
    #     └── coco  ← downloads here (20.1 GB)# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
    # path: ../datasets/coco  # dataset root dir
    # train: train2017.txt  # train images (relative to 'path') 118287 images
    # val: val2017.txt  # val images (relative to 'path') 5000 images
    test: data/test.txt  # dataset root dir
    train: data/train.txt  # train images (relative to 'path') 128 images
    val: data/val.txt  # val images (relative to 'path') 128 images
    # test: test-dev2017.txt  # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794nc: 1 # number of classes
    names: ['fall']  # class names# Download script/URL (optional)
    download: |from utils.general import download, Path# Download labelssegments = False  # segment or box labelsdir = Path(yaml['path'])  # dataset root dirurl = 'https://github.com/ultralytics/yolov5/releases/download/v1.0/'urls = [url + ('coco2017labels-segments.zip' if segments else 'coco2017labels.zip')]  # labelsdownload(urls, dir=dir.parent)# Download dataurls = ['http://images.cocodataset.org/zips/train2017.zip',  # 19G, 118k images'http://images.cocodataset.org/zips/val2017.zip',  # 1G, 5k images'http://images.cocodataset.org/zips/test2017.zip']  # 7G, 41k images (optional)download(urls, dir=dir / 'images', threads=3)

2.6 修改模型文件

models下有5个模型,smlx需要训练的时间依次增加,按照需求选择一个文件进行修改即可,我选择yolov5s.yaml,只需将nc改为实际值即可;

image-20231129161119063

2.7修改训练tran.py

这里需要对train.py文件内的参数进行修改,weightscfgdata按照自己所需文件的路径修改,weights如果使用参考博客的文件,将yolov5s.pt下载放到代码根目录下即可,如果使用官方则无需修改,会自行下载。具体参数含义,查看官方文档。我修改内容如下:

image-20231129171756529

2.8 开始训练

执行python train.py

可能报以下错误:

按照提示执行export GIT_PYTHON_REFRESH=quiet继续执行训练命令,就可以开始训练了。

2.9 验证训练结果

训练结束后在代码根目录下执行检测命令,可以将待检测图片放到data/samples目录下执行

python detect.py --weights runs/train/exp/weights/best.pt --source data/samples/ --device 0 --data data/fall.yaml

注意: 每训练一次都会在runs/train/目录下新创建一个exp加数字文件夹,运行测试用例时选择最新的,测试结果也会保存在runs/detect目录下最新的exp文件夹下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/193242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LinuxBasicsForHackers笔记 --常用Linux命令

在终端中修改用户密码命令:passwd Linux的文件系统是逻辑文件系统。 Linux基本命令 pwd – print working directory. 返回你当前所在目录结构中的位置。 whoami – 查看您当前登录的用户身份。 cd – change directory. 从终端更改目录。 cd / – 移动到根目录…

数据结构与算法(Java) -单调队列单调栈题单

单调队列(灵神笔记) 239 滑动窗口最大值 239. 滑动窗口最大值 - 力扣(LeetCode) 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗…

Skywalking接入实际应用做日志跟踪

Skywalking客户端挂载 从官网下载skywalking-agent客户端,并挂在到应用服务器指定目录 挂载到应用主机中,好处是解决打包应用镜像的时候,镜像过大,部署成本过高。 docker-compose部署应用,并接入skywalking服务,这里以gateway为例 versio…

Webgis学习总结

前言: 作者跟随视频学习了webgis内容进行如下学习复习总结 参考:新中地学习笔记 WebGIS第一课:测试高德API并通过: 注册申请高德API成为开发者,创建自己的项目和key进行项目初始化,可以使用JS API官方文…

26. 深度学习进阶 - 深度学习的优化方法

Hi, 你好。我是茶桁。 上一节课中我们预告了,本节课是一个难点,同时也是一个重点,大家要理解清楚。 我们在做机器学习的时候,会用不同的优化方法。 SGD 上图中左边就是Batch Gradient Descent,中间是Mini-Batch Gra…

【Linux】第二十五站:深入理解文件系统

文章目录 一、前言二、认识硬件----磁盘1.基本介绍2.磁盘的存储构成3.磁盘的逻辑结构4.回归到硬件 三、文件系统1.划分2.Block group(1)Data blocks(2)inode Table(3)Block Bitmap(4)inode Bitmap(5)Group Descriptor Table(GDT)(6)Super Block 3.总结4.一些其他问题5.如何理解…

untiy webgl常见问题与操作

文章目录 1 untiy和网页相互通信2 打开新页面(同标签页和新标签页)3 获取网页的URL4 解析Url内的参数5 后处理与色彩空间问题 1 untiy和网页相互通信 看这个文章 2 打开新页面(同标签页和新标签页) 先看本文untiy和网页相互通信…

翻译: GPT4等大型语言模型的原理解析和未来预测慢思考和模型自我迭代和LLM安全

YouTube: Intro to Large Language Models - YouTube 1. Large Language Model LLM 大家好,最近我做了一个关于大型语言模型的 30 分钟演讲,有点像介绍性演讲,不幸的是,那个演讲没有被录制下来,但很多人在演讲结束后…

基于JNI实现调用C++ SDK

基于JNI实现调用C SDK 背景分析解决实践 背景 上篇文章总结了几种Java项目调用C/C SDK项目方法,在逐一实践、踩坑后,最终还是敲定采用 JNI 方式进行实现。在文章开始的过程,会先大概讲讲笔者遇到的情况,因为封装方式需要根据实际…

MQTT客户端、代理(broker)和连接建立

在前篇文章(http://t.csdnimg.cn/IamPz)中,介绍了发布/订阅架构和MQTT如何据此交换信息,其中的关键概念是: 发布/订阅架构触耦了负责发布信息的客户端(发布者)和负责接收信息的客户端&#xff…

[c]求逆序数

#include<stdio.h> int main() {int n,i,count;scanf("%d",&n);int arr[n];count0;for(i0;i<n-1;i){scanf("%d",&arr[i]);}for(int j0;j<n-2;j)//注意是小于等于n-2&#xff0c;因为倒数第一个元素后面没有数了&#xff0c;不需要比较…

CSC173 Boolean Logic and Boolean Circuits

We have provided code for a simple Boolean circuit simulator written i n C

韵达速递查询,韵达速递单号查询,对需要的单号进行备注

批量查询韵达速递单号的物流信息&#xff0c;对需要的单号进行备注。 所需工具&#xff1a; 一个【快递批量查询高手】软件 韵达速递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界面左上角的“…

基于SpringBoot + vue的在线视频教育平台

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

王炸cpu-龙芯3A6000

国产 CPU 性能媲美 Intel 酷睿这事儿&#xff0c;可能真的已经实现了。 没错&#xff0c;那颗有着多次爆料拉满大家期待值的龙芯 3A6000&#xff0c;终于正式发布。 就在今天上午&#xff0c;龙芯中科在 2023 年龙芯产品发布暨用户大会上正式带来了这颗 CPU。 整场发布会 PPT …

【选择题】校招笔试选择题第一辑

题目 以下程序的运行结果是&#xff08; &#xff09; #include <stdio.h> int main(void) {printf("%s , %5.3s\n", "computer", "computer");return 0; }A. computer , puter B. computer , com C. computer , computer D. computer…

半导体封装之倒装封装 (Flip Chip)

倒装封装 &#xff08;Flipchip&#xff09;是相对于引线键合(Wire Bonding)来说的&#xff0c;之所以叫做倒装&#xff0c;是因为flip chip是正面朝下放置。倒装芯片技术是通过芯片上的凸点直接将元器件朝下互连到基板、载体或者电路板上。引线键合的连接方式是将芯片的正面朝…

笔记本电脑关闭触摸板

大部分人用笔记本 其实都是外接的鼠标 那么在打游戏 以及一些切图操作中 为了防止碰到触摸板导致误操作 我们就可以将他关掉 我们可以按快捷键 Win i 或者 点击桌面 此电脑/我的电脑/此计算机 打开设置界面 如果 左侧菜单中有设备 那么 直接点击设备 然后左侧菜单就会有 触摸…

详细了解 MOSFET 晶体管

MOSFET 开关晶体管 MOS 管是 “金属&#xff08;Metal&#xff09;氧化物&#xff08;Oxide&#xff09;半导体&#xff08;Semi&#xff09;” 场效应晶体管&#xff0c;或者称是 “金属&#xff08;Metal&#xff09;绝缘体&#xff08;Insulator&#xff09;半导体&#xf…

2022CVPR(PoseC3D):Revisiting Skeleton-based Action Recognition

Revisiting Skeleton-based Action Recognition 摘要1、引言2、相关工作3、框架3.1. 姿势提取的良好实践3.2.从2D姿势到3D热图体积3.3.基于骨架的动作识别的3D-CNN 4、实验4.2.姿势提取4.3. 3D热图体积的预处理4.4.与GCN的比较4.5. RGBPose-SlowFast4.6.与最先进的比较 5、结论…