Ubuntu16.04 搭建YOLOv5及训练自己的数据集

具体参考:(如果侵权,速删)
1.https://blog.csdn.net/u013171226/article/details/115064641
2.https://blog.csdn.net/qq_45646174/article/details/112913012
3.https://zhuanlan.zhihu.com/p/156835045?from_voters_page=true
4.https://blog.csdn.net/weixin_48695781/article/details/121677849
5.https://blog.csdn.net/didiaopao/article/details/119954291
6.https://blog.csdn.net/m0_53392188/article/details/119334634

环境:

Nvidia RTX 3060
Ubuntu 16.04
CUDA 11.1
cuDNN 8.2.0
torch 1.10.1+cu111
torchvision 0.11.2+cu111

如果不是从头开始,退出并删除虚拟环境

source deactivate //退出虚拟环境
conda remove -n yolov5 --all //删除虚拟环境
conda env list //查看虚拟环境列表

一.搭建YOLOv5深度学习环境

1.使用conda创建YOLOv5需要的环境
conda create -n yolov5 python=3.7  //yolov5是虚拟环境的名字
source activate yolov5
2.然后下载YOLOv5工程
git clone https://github.com/ultralytics/yolov5  

yolov5-1.png

如果出现问题:fatal: unable to access 'https://github.com/ultralytics/yolov5/': gnutls_handshake() failed: The TLS connection was non-properly terminated.
参考:https://www.jianshu.com/p/b38ef810fe24
如果出现问题:fatal: remote error:
The unauthenticated git protocol on port 9418 is no longer supported.
Please see https://github.blog/2021-09-01-improving-git-protocol-security-github/ for more information.
参考:https://www.jianshu.com/p/b38ef810fe24

3.安装依赖
cd yolov5

(1)可以使用pip命令安装

pip install -r requirements.txt  

(2)pytorch也可自行安装,注意pytorch和cuda版本需对应,官网地址:https://pytorch.org/get-started/previous-versions/
对应关系如下:

55pytorchCUDA.png

本文选择使用官网命令进行安装,torch 1.10.1+cu111,torchvision 0.11.2+cu111

pip install torch==1.10.1+cu111 torchvision==0.11.2+cu111 torchaudio==0.10.1 -f https://download.pytorch.org/whl/torch_stable.html
yolov5-15.png

二.准备自己的数据集

1.标注文件

用labelimg标注自己的数据集,利用labelimg标注数据的时候,注意选择生成的txt格式为yolo格式


image.png

按照下图格式创建数据集
文件夹下:images + labels
其中images文件夹中存放图片,labels文件夹中存放标签txt


yolov5-3.png
2.创建一个split_train_val.py文件,代码内容如下:
# coding:utf-8

import os
import random
import argparse

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

trainval_percent = 1.0
train_percent = 0.6
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()

运行代码

python split_train_val.py

然后新建的demo1文件夹中会生成四个txt文件


yolov5-5.png

不知道为什么我标注的图片是从1始


yolov5-7.png

所以写了个小程序,将每一行的第一列减1,在写入新的文件夹中

import os

path = '/home/slave110/yolov5/eddy316/labels' 
path_result = r'/home/slave110/yolov5/eddy316/labels111'


for name in os.listdir(path):
   print(path + name)
   f = open(path + '/' + name, 'r')
   result = open(path_result + '/' + name,'w')
   while 1:
      line = f.readline()
      if not line:
         break
      values = line.split(' ');
      first = int(values[0]) - 1
      new_1 = str(first) + ' ' + values[1] + ' ' + values[2] + ' ' + values[3] + ' ' + values[4] 
      result.write(new_1)
   f.close()
   result.close()

处理之后如下所示:


yolov5-8.png
3.创建voc_label.py文件,将训练集、验证集、测试集生成label标签(训练中要用到),同时将数据集路径导入txt文件中,代码内容如下:
# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
from os import getcwd

sets = ['train', 'val']
classes = ["Repelling Focus", "Attracting Focus" , "Center" , "Saddle Point"]   # 改成自己的类别
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('/home/slave110/yolov5/eddy316/%s.xml' % (image_id), encoding='UTF-8')
    out_file = open('/home/trainingai/zyang/yolov5/paper_data/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('home/slave110/yolov5/eddy316/labels/'):
        os.makedirs('home/slave110/yolov5/eddy316/labels/')
    image_ids = open('/home/slave110/yolov5/demo1/%s.txt' % (image_set)).read().strip().split()
    list_file = open('/home/slave110/yolov5/txt/%s.txt' % (image_set), 'w')
    for image_id in image_ids:
        list_file.write(abs_path + '/eddy316/images/%s.bmp\n' % (image_id)) //注意:图片格式
        #convert_annotation(image_id)
    list_file.close()

新建文件夹txt,执行命令:

python voc_label.py 

文件夹中会出现三个txt,其中test.txt是我手动加的


yolov5-9.png

txt中的内容如下:


yolov5-10.png
3.配置文件
1)数据集的配置

在yolov5目录下的data文件夹下新建一个ab.yaml文件(可以自定义命名),用来存放训练集和验证集的划分文件(train.txt和val.txt),这两个文件是通过运行voc_label.py代码生成的,然后是目标的类别数目和具体类别列表,ab.yaml内容如下:

train: /home/slave110/yolov5/txt/train.txt
val: /home/slave110/yolov5/txt/val.txt

#number of classes 
nc: 4

#class names
names: ['Repelling Focus', 'Attracting Focus', 'Center', 'Saddle Point']
2)修改/model/yolov5s.yaml

将 nc : 80 改成 nc : 4

训练命令:python train.py --img 1000 --batch 4 --epoch 100 --data data/ab.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --device '0'

python train.py --img 640 --batch 4 --epoch 300 --data data/ab.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --device '0'     # 0号GPU
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容