【darknet-yolo系列】在colab上训练yolo模型(详细操作流程)

其他相关链接:
yolov4 训练模型操作流程(包含所有资源下载)
yolov3 训练模型操作流程(包含所有资源下载)
Windows下在c++中调用darknet-yolo进行检测
在window10下安装GPU版的darknet
下载coco数据集并训练自己的模型

简介:若是自己的电脑配置无法满足深度学习训练的要求,可以利用google的colab训练模型,可以在网页上进行操作,利用Google免费提供的远程linux后台及GPU来训练自己的模型。不过分配的硬盘空间会定期重置,最多不超过12小时,因此需要挂在自己的google drive到colab中,并将训练集和训练中生成的weights保存到云盘中。

经过无数踩坑之后,用colab训练的基本方案:
1.上传数据集压缩包至google drive(图像和txt标注文件)
2.下载darknet至google drive,而非colab分配的磁盘空间!!!
(主要原因:google drive挂载到colab的名称为My Drive,目录名有空格且不可修改。而data文件中的路径带空格无法识别,没找到很好的解决方法,所以当darknet和训练目录同在My Drive下,使用相对路径,则路径中就不会出现My Drive了)


yolov4_train_colab.ipynb下载

在参考很多方案和反复尝试踩坑之后,总结好了yolo训练的ipynb文本,大家可以下载并参考.
链接:https://pan.baidu.com/s/1qZvSvoy54UEHfejkStFjgg
提取码:3qzq

1.预先准备

1.1 首先必须准备好yolo训练所必备的数据集
即原图数据和标注文件(.txt格式),在yolo训练流程中会有详细的介绍,这里不多做叙述;
【darknet-yolo系列】yolov4 训练模型操作流程
在这里插入图片描述
1.2 准备好云盘google drive
因为colab分配的磁盘空间会定期清理,所以必须将训练用的数据集保存至google drive上,然后挂载到colab上,并将训练的结果backup的路径指向云盘,避免数据集反复上传和训练结果丢失。
需要连接外网,选择个人云盘登录google账号
在这里插入图片描述
在这里插入图片描述2.3 将数据集的数据压缩为zip压缩包,并上传到云盘:
由于免费使用的磁盘空间只有15G,后面还要涉及到压缩包的解压,不宜上传过大的压缩包,大小控制在6G以内为宜。
讲解的时候将压缩包命名为data.zip

2.使用colab

访问colab的前提就是可以访问外网,必备常识,不多说。
注册google账号,开通google drive;
google搜索colab,然后打开colab网站即可。
进入colab:
在这里插入图片描述然后打开下载好的yolov4_train_colab.ipynb:
在这里插入图片描述colab会分配一个远程主机,最多12小时就会初始化,在训练中也会时常发生连接中断,再次连接已经初始化的情况;
在这里插入图片描述

3.安装环境

每次初始化之后,环境还是会重置,环境已经初始安装了很多东西,比如可以直接使用tensorflow,opencv,cuda, 但是yolo训练还是需要安装darknet包。因此最好可以将darknet下载到google drive并编译,这样就不需要每一次初始化都要重复相同的事情,尽量不要把东西保存到分配的colab空间,会被定时清理。
在这里插入图片描述

3.1查看gpu

gpu_info = !nvidia-smi
gpu_info = '\n'.join(gpu_info)
if gpu_info.find('failed') >= 0:
  print('没找到GPU,菜单栏点击 修改->笔记本设置->硬件加速器选择GPU,然后重新执行该代码块')
else:
  print(gpu_info)

在这里插入图片描述

3.2 挂载google drive

打开出现的链接,然后拷贝验证码粘贴到下面出现的输入框里

from google.colab import drive
drive.mount('/content/drive')

在这里插入图片描述在这里插入图片描述
挂载完之后文件结构:
在这里插入图片描述
3.3 安装cudnn和相关包(每次初始化必做操作)

# Download the cuDNN driver
!wget https://objectstorage.ca-toronto-1.oraclecloud.com/n/yzpqsgba6ssd/b/bucket-20200415-0121/o/cudnn-10.0-linux-x64-v7.5.0.56.tgz -O cudnn-10.0-linux-x64-v7.5.0.56.tgz
# We're unzipping the cuDNN files from your Drive folder directly to the VM CUDA folders
!tar -xzvf cudnn-10.0-linux-x64-v7.5.0.56.tgz -C /usr/local/
!chmod a+r /usr/local/cuda/include/cudnn.h

# install python-nvcc plugin
!pip install git+git://github.com/andreinechaev/nvcc4jupyter.git
%load_ext nvcc_plugin

# check if installed successfully
!/usr/local/cuda/bin/nvcc --version

3.4 下载Yolov3-Darknet至google drive(google drive中已有darknet包的可以直接跳过)

%cd /content/drive/My\ Drive
!git clone https://github.com/AlexeyAB/darknet
# 已下载yolov4.conv.137的yolov4预训练权重的可注释该行
!wget https://objectstorage.ca-toronto-1.oraclecloud.com/n/yzpqsgba6ssd/b/bucket-20200415-0121/o/yolov4.conv.137 -q --show-progress --no-clobber -O /content/drive/My\ Drive/darknet/cfg/yolov4.conv.137

3.5设置YOLOv4-Darknet关于cuda10.0的编译(google drive中darknet包已编译的可以直接跳过)

!export PATH=/usr/local/cuda-10.0/bin${PATH:+:${PATH}}
!export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
%cd /content/drive/My\ Drive/darknet
!sed -i 's|GPU=0|GPU=1|' Makefile
!sed -i 's|CUDNN=0|CUDNN=1|' Makefile
!sed -i 's|OPENCV=0|OPENCV=1|' Makefile
!make

4.准备darknet-yolo训练数据:

data.zip压缩包解压到/mytrain/文件夹下
初始的数据集自己准备,内容同解压后的data目录一致
标注文件xml如何转换为txt文件可参考博客:【darknet-yolo系列】yolov4 训练模型操作流程

初始数据集解压后的文件结构:
在这里插入图片描述

最终文件结构:
在这里插入图片描述4.1解压数据集压缩包

# 生成训练用的目录
!mkdir /content/drive/My\ Drive/my_train
#生成保存训练权重的目录
!mkdir /content/drive/My\ Drive/my_train/backup
#将数据集压缩包解压到 my_train目录下,DATA_PATH的是压缩包路径,需要根据自己情况填写
!unzip <DATA_PATH> -d /content/drive/My\ Drive/my_train
# eg: unzip /content/drive/My\ Drive/data.zip -d /content/yolov3-dataloader-cloud
!echo '  Finished loading dataset !'

4.2 生成names文件

#指定model的名称
MODEL_NAME = 'demo'
#将设定的类名填写上去,按照id顺序
CLASS_NAME = [
    "class_1",
    "class_2" 
]

#Show Training process,显示darknet训练的折现图,打开darknet目录,找到chart.png就可以看到最新的训练损失图
IMG_PATH = '/content/drive/My\ Drive/darknet/chart.png'

%cd /content/drive/My\ Drive/my_train

with open(MODEL_NAME+'.names', "a+") as file:
    file.seek(0)
    for i in CLASS_NAME:
        file.write(i + '\n')
    print(MODEL_NAME+'.names'+' has been successfully created!')
    file.close()

在这里插入图片描述4.3生成data文件

#生成data文件,这里采用相对路径的方式,且默认当前位置在darknet目录下,写相对路径
with open(MODEL_NAME+'.data', "a+") as file:
    file.seek(0)
    file.write('classes = ' + str(len(CLASS_NAME)) + '\n')
    file.write('train = ../my_train/train.list' + '\n')
    file.write('valid = ../my_train/val.list' + '\n')
    file.write('backup = ../my_train/backup' + '\n')
    file.write('names = ../my_train/' + MODEL_NAME + '.names' + '\n')
    print(MODEL_NAME+'.data'+' has been successfully created!')
    file.close()

在这里插入图片描述4.4 将yolov4的预训练权重文件yolov4.conv.137
复制一份到my_train/backup,并改名yolov4_last.weights
这样的话,若是colab训练中断后可继续开始训练,不会从头开始训练

!cp -rf /content/drive/My\ Drive/darknet/cfg/yolov4.conv.137 /content/drive/My\ Drive/my_train/backup
!mv /content/drive/My\ Drive/my_train/backup/yolov4.conv.137 /content/drive/My\ Drive/my_train/backup/yolov4_last.weights

4.5复制一份yolov4.cfg至训练目录,并修改参数

!cp /content/drive/My\ Drive/darknet/cfg/yolov4.cfg /content/drive/My\ Drive/my_train
!mv yolov4.cfg yolov4.txt
with open('yolov4.txt', "r") as file:
    file.seek(0)
    all_lines = file.readlines()
    file.close()
%cd /content/drive/My\ Drive/my_train
with open('yolov4.cfg', "w") as file:
  #设置batch和subdivisions,和RAM相关,原设置一次放8张(batch/subdivisions),google colab会显存不够,需调整#
  #若还出现 out of menory,依次这样调整:batch=64,subdivisions=32;batch=64,subdivisions=64#
  all_lines[1] = 'batch=64' + '\n'
  all_lines[2] = 'subdivisions=16' + '\n'
  #显存紧张,适当减小输入尺寸
  all_lines[6] = 'width=416' + '\n'
  all_lines[7] = 'height=416' + '\n'
  #调整最大迭代数,根据github官方建议,change line max_batches to classes*2000
  all_lines[18] = 'max_batches=' + str(2000*len(CLASS_NAME)) + '\n'
  #调整steps,根据github官方建议:change line steps to 80% and 90% of max_batches
  all_lines[20] = 'steps=' + str(int(0.8*2000*len(CLASS_NAME))) + ',' + str(int(0.9*2000*len(CLASS_NAME)))+ '\n'
  #修改classes的数量
  all_lines[967] = 'classes=' + str(len(CLASS_NAME)) + '\n'
  all_lines[1055] = 'classes=' + str(len(CLASS_NAME)) + '\n'
  all_lines[1143] = 'classes=' + str(len(CLASS_NAME)) + '\n'
  #修改classes之前的filters,根据github官方建议:filters=(classes + 5)x3)
  all_lines[960] = 'filters=' + str((len(CLASS_NAME)+5)*3) + '\n'
  all_lines[1048] = 'filters=' + str((len(CLASS_NAME)+5)*3) + '\n'
  all_lines[1136] = 'filters=' + str((len(CLASS_NAME)+5)*3) + '\n'
  #overwrite all
  file.writelines(all_lines)
  print(MODEL_NAME+'-yolov3-tiny.cfg'+' has been successfully created!')
  file.close()
!rm yolov4.txt

在这里插入图片描述4.6 生成train.list文件和val.list文件

%cd /content/drive/My\ Drive/darknet
!find ../my_train/train_data -name \*.png > ../my_train/train.list
!find ../my_train/val_data -name \*.png > ../my_train/val.list

5.训练

5.1 开始训练

#start training
!export PATH=/usr/local/cuda-10.0/bin${PATH:+:${PATH}}
!export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
%cd /content/drive/My\ Drive/darknet
!chmod -R 777 ./darknet
#开始训练
#1.根据自己的data文件路径填写
#2.根据自己的cfg文件路径填写
#3.根据自己的预训练权重路径填写
!./darknet detector train\
../my_train/demo.data\ 
../my_train/yolov4.cfg\
../my_train/yolov4_last.weights\

附:colab重新初始化后继续训练的步骤
1>.挂载google drive
2>.执行3.3步骤 安装cudnn和相关包
3>.执行5.1步骤 开始训练

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值