其他相关链接:
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步骤 开始训练