Windows10(CPU)下运用yolov5,实现从数据集制作到样本训练到电动车检测的全过程

Windows10(CPU)下运用yolov5,实现从数据集制作到样本训练到电动车检测的全过程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

我的毕设课题是“基于视觉检测的电动车违章进电梯的门禁控制系统”,核心任务是实现电动车检测。在此之前并没有独自完成某个物体的实现任务,在网上一番查询之后并没有找到有关电动车检测的相关公共数据集、代码等,于是想要实现电动车检测,一切只能从头开始了!多方面考虑,本文运用yolov5实现了最终的电动车检测。本人纯小白一枚,在此想分享一下整个项目的完成过程,大家一起学习交流,有问题之处欢迎指教!

一、项目环境搭建

操作系统 Windows10
Pytorch 1.6.0
Cuda 10.1
深度学习模型 YOLOv5
编程语言 Python3.8
本教程所用环境:代码版本V3.0,源码下载地址:https://github.com/ultralytics/yolov5.git

二、电动车数据集制作

(一)数据集文件架构
1.在yolov5目录下创建yolodata文件夹(可自定义),具体结构如下:

---yolodata
	---images # 存放电动车图片
	---Annotations # 存放每张图片对应的xml文件
	---ImageSets
	    ---Main #之后会在Main文件夹内自动生成train.txt,val.txt,test.txt和trainval.txt四个文件,存放训练集、验证集、测试集图片的名字

下面对yolodata下各文件夹中保存的内容进行介绍:

  • images:存放收集到的、满足检测任务的电动车图片,一般来说想要使得训练出来的模型能够较好的完成识别任务,采集的数据样本最好为3000-5000张。本次的识别对象为电动车,网上并没有公开的电动车数据集,能找到的或者数量太少,或者质量不满足要求,于是本人自己在校园中采集了5000+张电动车数据样本。(哈哈大学校园里最不缺的就是电动车了,如有小伙伴不方便收集样本,下面可分享本人采集到的部份样本,采集不易,有偿分享~1599张电动车样本+1600张电动车样本
    在这里插入图片描述

  • Annotations:在得到够量的电动车样本后,需要利用标注工具labelImg进行标注,每标注完一张图片都会生成对应的xml文件。Annotations就用于存放所有样本的xml文件。
    在这里插入图片描述

  • ImageSets:文件夹下面有个Main子文件夹,在Pycharm中创建一个split_train_val.py文件,代码内容如下,运行之后会在Main文件夹内自动生成train.txt,val.txt,test.txt和trainval.txt四个文件,存放训练集、验证集、测试集图片的名字。

# coding:utf-8

import os
import random
import argparse

parser = argparse.ArgumentParser()
#xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下
parser.add_argument('--xml_path', default='Annotations', type=str, help='input xml label path')
#数据集的划分,地址选择自己数据下的ImageSets/Main
parser.add_argument('--txt_path', default='ImageSets/Main', type=str, help='output txt label path')
opt = parser.parse_args()

trainval_percent = 1.0
train_percent = 0.9
xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
total_xml = os.listdir(xmlfilepath)
if not os.path.exists(txtsavepath):
    os.makedirs(txtsavepath)

num = len(total_xml)
list_index = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list_index, tv)
train = random.sample(trainval, tr)

file_trainval = open(txtsavepath + '/trainval.txt', 'w')
file_test = open(txtsavepath + '/test.txt', 'w')
file_train = open(txtsavepath + '/train.txt', 'w')
file_val = open(txtsavepath + '/val.txt', 'w')

for i in list_index:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        file_trainval.write(name)
        if i in train:
            file_train.write(name)
        else:
            file_val.write(name)
    else:
        file_test.write(name)

file_trainval.close()
file_train.close()
file_val.close()
file_test.close()

运行结束后文件如图所示:
在这里插入图片描述
(二)创建labels文件
在Pycharm创建voc_label.py文件,将训练集、验证集、测试集的样本生成label标签(训练中要用到),同时将数据集路径导入txt文件中,代码内容如下:

# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
from os import getcwd

sets = ['train', 'val', 'test']
classes = ["a", "b"]   # 改成自己的类别
abs_path = os.getcwd()
print(abs_path)

def convert(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = (box[0] + box[1]) / 2.0 - 1
    y = (box[2] + box[3]) / 2.0 - 1
    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('F:/yolo5/yolodata/Annotations/%s.xml' % (image_id), encoding='UTF-8')
    out_file = open('F:/yolo5/yolodata/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
        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))
        b1, b2, b3, b4 = b
        # 标注越界修正
        if b2 > w:
            b2 = w
        if b4 > h:
            b4 = h
        b = (b1, b2, b3, b4)
        bb = convert((w, h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

wd = getcwd()
for image_set in sets:
    if not os.path.exists('F:/yolo5/yolodata/labels/'):
        os.makedirs('F:/yolo5/yolodata/labels/')
    image_ids = open('F:/yolo5/yolodata/ImageSets/Main/%s.txt' % (image_set)).read().strip().split()
    list_file = open('yolodata/%s.txt' % (image_set), 'w')
    for image_id in image_ids:
        list_file.write(abs_path + 'F:/yolo5/yolodata/images/%s.jpg\n' % (image_id))
        convert_annotation(image_id)
    list_file.close()

运行后会生成如下图所示的一个labels文件夹和三个txt文件。
在这里插入图片描述

  • labels中存放数据样本标注信息
    在这里插入图片描述
    labels下每个txt文件的内容格式如下所示:
类别索引           x 	      y				w				h
0 			0.53857421875 0.8779296875 0.158203125 0.06184895833333333

在这里插入图片描述
另外生成的三个文件train.txt、test.txt、val.txt文件为划分后图像所在位置的绝对路径,如train.txt就含有所有训练集图像的绝对路径。
注:运行voc_label.py时报错“ZeroDivisionError: float division by zero”的原因是:标注的xlm文件中存在width为0或者height为0的数据,检查Annotations中的xml文件修改后可解决。
(三)相关配置文件的修改
1)数据集的配置
在yolo5目录下的data文件夹下新建一个ab.yaml文件,用来存放训练集和验证集的划分文件(train.txt和val.txt),然后是目标的类别数目和具体类别列表,ab.yaml内容如下:
在这里插入图片描述
至此,自定义数据集已创建完毕,下面是训练模型。

三、电动车检测模型的训练

1.超参数的调整

在模型开始训练之前,需要在yolo5/train.py代码中修改几个地方:
在这里插入图片描述
首先是修改几个相关文件的路径,其次由于本次电动车检测模型的训练是在CPU下完成的,因此考虑到训练时间以及电脑显存的问题,此次项目中我调整了epochs、batch-size两个参数。

opt模型主要参数解析:
--weights:初始化的权重文件的路径地址
--cfg:模型yaml文件的路径地址
--data:数据yaml文件的路径地址
--hyp:超参数文件路径地址
--epochs:训练轮次
--batch-size:喂入批次文件的多少
--img-size:输入图片尺寸
--rect:是否采用矩形训练,默认False
--resume:接着打断训练上次的结果接着训练
--nosave:不保存模型,默认False
--notest:不进行test,默认False
--noautoanchor:不自动调整anchor,默认False
--evolve:是否进行超参数进化,默认False
--bucket:谷歌云盘bucket,一般不会用到
--cache-images:是否提前缓存图片到内存,以加快训练速度,默认False
--image-weights:使用加权图像选择进行训练
--device:训练的设备,cpu;0(表示一个gpu设备cuda:0);0,1,2,3(多个gpu设备)
--multi-scale:是否进行多尺度训练,默认False
--single-cls:数据集是否只有一个类别,默认False
--adam:是否使用adam优化器
--sync-bn:是否使用跨卡同步BN,在DDP模式使用
--local_rank:DDP参数,请勿修改
--workers:最大工作核心数
--project:训练模型的保存位置
--name:模型保存的目录名称
--exist-ok:模型目录是否存在,不存在就创建

修改完成后即可在Pycharm中运行train.py文件,开始模型的训练。训练好的模型会被保存在yolo5目录下的runs/train/exp0/weights/last.pt和best.pt,详细训练数据保存在runs//exp0/results.txt文件中。

至此,电动车检测模型训练完毕,下面进行模型的测试。

四、电动车检测模型的测试

在test.py文件中指定训练结果模型和数据集配置文件的路径,如下:
在这里插入图片描述
修改完后即可运行进行模型测试。

五、电动车检测模型的推理

最后,模型在没有标注的数据集上进行推理,在detect.py文件中指定测试图片和测试模型的路径,其他参数(img_size、置信度object confidence threshold、IOU threshold for NMS)可自行修改,如下:
在这里插入图片描述
修改完成后即可在Pycharm中运行detect.py文件,开始模型的推理。检测好的图片会被保存在yolo5目录下的runs/detect/exp0中。
在这里插入图片描述
至此,已经完成了从数据集制作到样本训练到电动车检测的全过程。

总结

本人学艺不精,此份教程适合新手小白。另外本文项目的完成离不开博客里优秀的大佬们,在此深表谢意。本文内容不算严谨,欢迎大家指教。

  • 4
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

csbn60

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值