栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

在google colab上利用yolov4训练自定义数据集(保姆式教程)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在google colab上利用yolov4训练自定义数据集(保姆式教程)

目录

一、前言

二、数据集架构介绍

三、在Google Colab上配置darknet环境

四、训练yolov4模型

 1. 文件修改

 2. 训练

一、前言

        由于很多小伙伴没有好的电脑显卡配置或者服务器,跑深度学习算法相对会很困难。我最近在Google colab上用yolov4算法训练了自己的数据集,最终模型在测试集下的平均精度mAP达到了92.6%。该平台可以较方便地训练中小型数据量的深度学习算法,不用配置深度学习环境。免费版每天可以连续使用数个小时,只不过中途会有中断的现象。大家如果想更稳定地训练模型,可以考虑开一个会员哟。

二、数据集架构介绍

        建立VOC2007格式数据集,VOC2007数据集文件夹下包含images(图片)和Annotations(图片对应的标签,格式是.xml)两个文件夹。支持yolov4算法训练的的数据集架构包括:images(图片+yolo格式标签)和test.txt、train.txt、val.txt(图片路径信息)。

        运行shengc_txt.py文件,生成ImageSets文件夹,并在ImageSets下生成test.txt,train.txt,trainval.txt,val.txt 四个文件夹(存放图片的文件名)。shengc_txt.py代码如下(路径需要自己修改哟):

import os
import random

trainval_percent = 0.2
train_percent = 0.8
xmlfilepath = '/content/drive/MyDrive/yolov4/VOC2007/Annotations'
txtsavepath = '/content/drive/MyDrive/yolov4/VOC2007/ImageSets'
if not os.path.exists(txtsavepath):
    os.makedirs(txtsavepath)
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)

ftrainval = open('/content/drive/MyDrive/yolov4/VOC2007/ImageSets/trainval.txt', 'w')
ftest = open('/content/drive/MyDrive/yolov4/VOC2007/ImageSets/test.txt', 'w')
ftrain = open('/content/drive/MyDrive/yolov4/VOC2007/ImageSets/train.txt', 'w')
fval = open('/content/drive/MyDrive/yolov4/VOC2007/ImageSets/val.txt', 'w')

for i in list:
    name = total_xml[i][:-4] + 'n'
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftest.write(name)
        else:
            fval.write(name)
    else:
        ftrain.write(name)

ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

 生成的4个.txt文件格式如下:

        接下来执行VOC_yolo.py文件,在VOC2007文件夹下生成test.txt、train.txt、val.txt(包含图片路径信息),还会产生一个labels文件夹(.xml格式转化为.txt格式),并将labels里的文件全部复制进images文件里。

VOC_yolo.py代码如下:

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

sets = ['train', 'test', 'val']
classes = ["orange"]  # 数据集目标类别

# 将xml数据格式转化为YOLO数据格式(.txt)
def convert(size, box):
    dw = 1. / size[0]
    dh = 1. / size[1]
    x = (box[0] + box[1]) / 2.0
    y = (box[2] + box[3]) / 2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return (x, y, w, h)


def convert_annotation(image_id):
    in_file = open('/content/drive/MyDrive/yolov4/VOC2007/Annotations/%s.xml' % (image_id))
    out_file = open('/content/drive/MyDrive/yolov4/VOC2007/labels/%s.txt' % (image_id), 'w')
    tree = ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)
    for obj in root.iter('object'):
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult) == 1:
            continue
        cls_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')


wd = getcwd()
print(wd)
for image_set in sets:
    if not os.path.exists('/content/drive/MyDrive/yolov4/VOC2007/labels/'):
        os.makedirs('/content/drive/MyDrive/yolov4/VOC2007/labels/')
    image_ids = open('/content/drive/MyDrive/yolov4/VOC2007/ImageSets/%s.txt' % (image_set)).read().strip().split()
    list_file = open('/content/drive/MyDrive/yolov4/VOC2007/%s.txt' % (image_set), 'w')
    for image_id in image_ids:
        list_file.write('/content/drive/MyDrive/yolov4/VOC2007/images/%s.jpgn' % (image_id))
        convert_annotation(image_id)
    list_file.close()

        到目前为止,yolov4的数据集VOC2007就构建好了,包括:images(图片+yolo格式标签)和test.txt、train.txt、val.txt(图片路径信息)。

生成的test.txt、train.txt、val.txt格式如下 :

三、在Google Colab上配置darknet环境

1. 需要一个谷歌账号,登录google colab平台: https://drive.google.com

2. 在我的云端硬盘中新建一个文件夹,用于放数据集文件和darknet源码。并将VOC2007数据集上传到该新建文件夹下。

 3. 鼠标右击空白处,点更多,新建一个Google colab。

 

 4. 新建的google colab如下:

 5. 需要在平台服务器上挂载我们自己的云端硬盘,这样我们就可以在服务器上方便访问我们的云端硬盘。挂载成功后,右端会出现MyDrive文件夹。

挂载硬盘的指令如下:

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

 6. 运行shengc_txt.py和VOC_yolo.py代码,生成test.txt、train.txt、val.txt(图片路径信息)。

%cd /content/drive/MyDrive/yolov4/VOC2007
!python shengc_txt.py
!python VOC_yolo.py

7. 在google colab上下载github上的darknet源码

%cd /content/drive/MyDrive/yolov4
!git clone https://github.com/AlexeyAB/darknet

 8. 执行以下指令修改darknet/Makefile文件参数(opencv,GPU, CUDNN)

%cd /content/drive/MyDrive/yolov4/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

9. 验证CUDA版本

#验证CUDA版本
!/usr/local/cuda/bin/nvcc --version

 10. 编译darknet,在darknet文件下生成darknet。

!make

11. 执行以下指令,解决/bin/bash: ./darknet: Permission denied问题(没有权限)

!chmod +x ./darknet

四、训练yolov4模型

 1. 文件修改

(1)修改darknet/data/coco.names,修改为自己的目标类别。(或者自己新建一个.name)

 (2)制作数据配置文件 yolo.data。

classes=1    #目标类别个数
train=/content/drive/MyDrive/yolov4/VOC2007/train.txt
valid=/content/drive/MyDrive/yolov4/VOC2007/val.txt
names=/content/drive/MyDrive/yolov4/darknet/data/coco.names
backup=backup/

(3) 修改yolov4.cfg

1)max_batches:2000*类别种数,steps = 0.8*max_batches,0.9*max_batches。我数据集只有一类,所以设置如下:

 2)修改3处(convolutional和yolo层)

 filters=(5+类别种数)*3;classes=类别种数。

 2. 训练

 (1)基于预训练权重yolov4.conv.137训练:

%cd /content/drive/MyDrive/yolov4/darknet    #进入项目路径
!./darknet detector train data/yolo.data cfg/yolov4.cfg yolov4.conv.137 -dont_show

(2) 接着上次训练断开的位置训练:

!./darknet detector train data/yolo.data cfg/yolov4.cfg backup/yolov4_last.weights -dont_show

(3)用训练好的模型测试测试集的mAP(将yolo.data里的val.txt路径改为test.txt路径)

!./darknet detector map data/yolo.data cfg/yolov4.cfg /content/drive/MyDrive/yolov4/darknet/backup/yolov4_final.weights

 

 更多详细介绍可参考yolov4作者的github:https://github.com/AlexeyAB/darknet

有小伙伴需要预训练模型的话,评论区留言哟! 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/882904.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号