谷歌Colab训练自己YOLOv3数据集

谷歌Colab用免费GPU训练自己的YOLOv3数据

简介

在迫不得已使用windows作为自己训练数据环境的情况下,可能会遇到以下问题:

  • windows下配置相关环境较为复杂
  • 自己电脑的GPU算力较低或者不支持cuda,GPU显存不足

在此情况下,推荐使用云GPU来实现数据的训练,而Google的Colabortory就提供免费的云端GPU计算服务,并且提供的云服务器中已经配置好了所需的cuda、cudnn、opencv等相关所需。但是colab所分配的云GPU,在12个小时后会回收(据说),在训练时最好挂载谷歌云盘,并将必要文件进行储存。

yolov4相关

基于项目https://github.com/AlexeyAB/darknet,此项目的维护者在YOLO系列(v1-v3)作者 Joe Redmon 宣布不再继续CV方向的研究后接管并更新了yolov4。虽然项目在4.24更新了yolov4的相关内容,但是之前的版本的yolov3仍可以正常使用,在经过我的最新验证,此文章仍可正常应用。
自己最近也运行了yolov4并对自己的数据集进行了训练,yolov4的训练使用流程和此部分的yolov3如出一辙,训练测试所需的相关文件类型相同,所需要更改的不过更换yolov4.cfg和下载yolov4的预训练权重。
具体详见:https://blog.csdn.net/longlong068/article/details/105791941

谷歌Colab的使用

  1. 首先需要创建谷歌云盘账号:https://drive.google.com

  2. 打开谷歌云盘

    谷歌Colab训练自己YOLOv3数据集_第1张图片

    右键选择创建一个Colab的.ipynb文件,如果没有上图的Googel Colab选项,点击关联更多应用添加。

  3. 将.ipynb文件装载谷歌云盘,方便Googel云盘和Colab分配的云GPU进行文件相互传输。

    谷歌Colab训练自己YOLOv3数据集_第2张图片

    点击装载Google云端硬盘,或者直接在左边的命令行输入指令进行装载,指令如下:

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

    装载成功后可见:

    谷歌Colab训练自己YOLOv3数据集_第3张图片

    其中的My Drive中的文件即为Google云盘中的文件。

  4. 在生成的ipynb文件中进行设置GPU可用、项目的git、训练等后续操作。

运用Colab训练自己的Yolov3数据集

此部分的Yolov3项目基于https://github.com/AlexeyAB/darknet。
也是现在最新的yolov4的项目地址~

1.设置GPU可用

谷歌Colab训练自己YOLOv3数据集_第4张图片 谷歌Colab训练自己YOLOv3数据集_第5张图片

2.clone项目构建Darknet

git clone项目

输入并运行以下命令来git项目:

!git clone https://github.com/AlexeyAB/darknet

成功后在左边的文件列表可以找到项目文件darknet。

谷歌Colab训练自己YOLOv3数据集_第6张图片

修改项目的makefile文件,使编译生成的程序可以使用GPU和OpenCV

运行以下命令,将会自动修makefile

# 修改makefile 将OpenCV和GPU设置为可用
%cd darknet
!sed -i 's/OPENCV=0/OPENCV=1/' Makefile
!sed -i 's/GPU=0/GPU=1/' Makefile
!sed -i 's/CUDNN=0/CUDNN=1/' Makefile
验证CUDA版本
#验证CUDA版本
!/usr/local/cuda/bin/nvcc --version

输出结果如下:

谷歌Colab训练自己YOLOv3数据集_第7张图片

编译项目生成darknet运行程序
!make

编译生成可执行文件darknet

谷歌Colab训练自己YOLOv3数据集_第8张图片

3.运行demo显示bbox

此步只为了检验环境和编译成功与否,可以跳过此步直接训练自己的数据集。

下载训练好的coco数据集权重
!wget https://pjreddie.com/media/files/yolov3.weights
定义imshow函数,方便显示图片
#定义imshow 调用opencv显示图片
def imShow(path):
  import cv2
  import matplotlib.pyplot as plt
  %matplotlib inline

  image = cv2.imread(path)
  height, width = image.shape[:2]
  resized_image = cv2.resize(image,(3*width, 3*height), interpolation = cv2.INTER_CUBIC)

  fig = plt.gcf()
  fig.set_size_inches(18, 10)
  plt.axis("off")
  plt.imshow(cv2.cvtColor(resized_image, cv2.COLOR_BGR2RGB))
  plt.show()
运行demo
!./darknet detect cfg/yolov3.cfg yolov3.weights data/person.jpg
imShow('predictions.jpg')

最后结果图:

谷歌Colab训练自己YOLOv3数据集_第9张图片

4.训练自己的数据集

装载谷歌云盘——便于将谷歌云盘中的文件传到云端服务器中

前面装载过最好再运行以下代码

%cd ..
from google.colab import drive
drive.mount('/content/gdrive')
设置谷歌云盘路径的简写
#将谷歌云盘路径简写为mydrive
!ln -s /content/gdrive/My\ Drive/ /mydrive
!ls /mydrive

运行以上代码,以后输入mydrive即代表谷歌云盘的路径

在谷歌云盘中创建存放训练相关文件的文件夹

回到谷歌云盘中创建一个文件夹,来存放我们训练所要用到的文件,我创建了一个名为yolov3的文件夹,来存放obj.name、obj.zip(训练图片和.txt的压缩文件)。对于如何对图片进行标注生成项目所需数据格式,见我的上篇的标注部分。

!ls /mydrive/yolov3
将相关文件上传到谷歌云盘

对自己数据集的图片进行标注和生成.txt文件放到同一文件夹后,将其压缩然后上传到谷歌云盘中,直接上传将十分缓慢。

谷歌Colab训练自己YOLOv3数据集_第10张图片

上传obj.zip到谷歌云盘:通过标注工具生成项目所需的与图片同名的.txt文件,将原图片与同名.txt文件放在同一文件obj下,将文件夹压缩为obj.zip并上传到谷歌云盘的yolov3文件夹下。

上传obj.data和obj.names到谷歌云盘:obj.data文件在项目中文件的基础上,根据自己数据集的类别个数进行修改而得到。

谷歌Colab训练自己YOLOv3数据集_第11张图片

obj.names中每行写入自己数据集的类名。

上传yolov3_custom2.cfg到谷歌云盘:yolov3_custom2.cfg在darknet/cfg/yolov3.cfg的基础上,根据自己数据集的类别个数进行修改得到。所需修改的地方见https://blog.csdn.net/longlong068/article/details/105088304

上传generate_trian.py文件到谷歌云盘:此yolov3项目训练自己数据集还需要trian.txt,train.txt文件可通过运行generate_trian.py生成,所以在此之前需要创建generate_trian.py,并上传到谷歌云盘中,以便后续拷贝到云服务器中并运行。generate_trian.py文件如下:

import os

image_files = []
os.chdir(os.path.join("data", "obj"))
for filename in os.listdir(os.getcwd()):
    if filename.endswith(".jpg"):
        image_files.append("data/obj/" + filename)
os.chdir("..")
with open("train.txt", "w") as outfile:
    for image in image_files:
        outfile.write(image)
        outfile.write("\n")
    outfile.close()
os.chdir("..")
将云盘中的相关文件拷贝到云端
#查看当前路径 确保当前路径为darknet 如果不是要cd到darknet下 
!ls
#将数据集图片及标注的txt文件的压缩包上传到服务器
!cp /mydrive/yolov3/obj.zip ../
#解压到data文件下
!unzip ../obj.zip -d data/
#从谷歌云盘上传根据自己数据集修改的.cfg文件 会上传到darknet/cfg文件夹下
!cp /mydrive/yolov3/yolov3_custom2.cfg ./cfg

#从谷歌云盘上传自己数据集的obj.data obj.names
!cp /mydrive/yolov3/obj.names ./data
!cp /mydrive/yolov3/obj.data  ./data

#上传generate_train.py 以在服务器的data下生成train.txt
!cp /mydrive/yolov3/generate_train.py ./
运行generate.py文件在云端的darknet/data路径中生成所需trian.txt文件
!python generate_train.py
#查看是否生成了train.txt
!ls data/

运行生成后输出如下:

谷歌Colab训练自己YOLOv3数据集_第12张图片

5.开始训练

下载预训练权重
!wget http://pjreddie.com/media/files/darknet53.conv.74
运行训练
!./darknet detector train data/obj.data cfg/yolov3_custom2.cfg darknet53.conv.74 -dont_show

谷歌Colab训练自己YOLOv3数据集_第13张图片

训练过程中产生的权重文件将保存到darknet/backup下,loss图保存为darknet/chart.png:

谷歌Colab训练自己YOLOv3数据集_第14张图片

每迭代1000次会自动保存一次权重文件,除次还有last.weight(当前训练的权重,会不断更新)、final.weight(训练结束后的最后权重),以上截图因为只迭代了1000次,所以backup中只保存了1000.weight和last.weight。

loss图如下:

谷歌Colab训练自己YOLOv3数据集_第15张图片
如果训练时因不明原因中断,此后想要在上次训练权重的基础上继续训练可采用以下代码
!./darknet detector train  data/obj.data cfg/yolov3_custom2.cfg ./backup/yolov3_custom_last.weights -dont_show

以上代码运行后就会在backup中的yolov3_custom_last.weights权重基础上开始训练,yolov3_custom_last.weights即为中断后最后的权重文件。

6.用训练权重进行测试

修改.cfg文件为test模式

直接运行以下指令,即可自动修改之前上传到云端的yolov3_custom2.cfg

%cd cfg
!sed -i 's/batch=64/batch=1/' yolov3_custom2.cfg
!sed -i 's/subdivisions=16/subdivisions=1/' yolov3_custom2.cfg
%cd ..
运行云端的backup下权重来进行测试

需要实现把需要测试的图片放到谷歌云盘下image文件夹下(或者其他文件下,对应修改路径即可)

!./darknet detector test data/obj.data cfg/yolov3_custom2.cfg ./backup/yolov3_custom2_last.weights /mydrive/images/shou.jpg -thresh 0.3

预测的bbox的图片将保存为predictions.jpg

imShow('predictions.jpg')

你可能感兴趣的:(win下yolo相关)