YOLOFastestv2 训练自己的数据集---辛酸仨小时

news/2024/7/10 0:13:50 标签: 深度学习, 目标检测, python

我是训练的行人目标检测

首先下载YOLOFastestv2:https://github.com/dog-qiuqiu/FastestDet

yolofastestv2需要这样的数据集:

python">.
├── category.names        # .names category label file
├── train                 # train dataset
│   ├── 000001.jpg
│   ├── 000001.txt
│   ├── 000002.jpg
│   ├── 000002.txt
│   ├── 000003.jpg
│   └── 000003.txt
├── train.txt              # train dataset path .txt file
├── val                    # val dataset
│   ├── 000043.jpg
│   ├── 000043.txt
│   ├── 000057.jpg
│   ├── 000057.txt
│   ├── 000070.jpg
│   └── 000070.txt
└── val.txt                # val dataset path .txt file

一般我们的数据集是voc样式的数据集即文件夹中只有这两个文件:

在这里插入图片描述

train和val文件夹内的0001.txt为yolo数据集的格式,其内容如下:

python">0 0.344192634561 0.611 0.416430594901 0.262
1 0.509915014164 0.51 0.974504249292 0.972

首先我们将xml转成这个格式的,在Annotations和JPEGImages的同级路径下创建一个py文件:

python"># 作者:李富贵
# 公众号:猛男技术控
# 输入:xml的文件夹路径
# 输出:在txt路径下创建对应的txt文件
import xml.etree.ElementTree as ET
import os

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(xml_file, txt_path, filename):
    in_file = open('{}/{}.xml'.format(xml_file, filename), encoding='UTF-8')
    out_file = open('{}/{}.txt'.format(txt_path, filename), '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
        if obj.find('difficult'):
            difficult = obj.find('difficult').text
        else:
            difficult = 0
        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')


# 改成自己的类别
classes = ["person"]
# 改成自己xml文件夹和要保存的txt文件夹的路径
xml_path = 'Annotations'
txt_path = 'txt'
if not os.path.exists(txt_path):
    os.makedirs(txt_path)

xml_files = os.listdir(xml_path)
for xml_file in xml_files:
    print(xml_path + '/' + xml_file)
    convert_annotation(xml_path, txt_path, xml_file[:-4])
    

然后得到一个txt文件,里面就是存放所有已转换的txt

第二步就是将文件分成train和test

python">import os
import shutil
import random

all_txt = os.listdir('txt')
random.shuffle(all_txt)


trainf = all_txt[:1316]
vlaf = all_txt[1317:]

i = 1
for trainimg in trainf:
    try:
        shutil.copy(os.path.join('JPEGImages',trainimg[:-3]+'png'),'train')
        shutil.copy(os.path.join('txt', trainimg), 'train')
        print(i)
        i += 1
    except:
        print('no such file ',os.path.join('JPEGImages',trainimg[:-3]+'jpg'))
j = 1

for valimg in vlaf:
    try:
        shutil.copy(os.path.join('JPEGImages',valimg[:-3]+'png'),'v')
        shutil.copy(os.path.join('txt', valimg), 'v')
        print(j)
        j += 1

    except:
        print('no such file ',os.path.join('JPEGImages',valimg))

注意自己创建号train和val文件夹,修改train和val文件的个数。
这样就生成了下面这样的文件

python">├── train
│   ├── 000001.jpg
│   ├── 000001.txt
│   ├── 000002.jpg
│   ├── 000002.txt
│   ├── 000003.jpg
│   └── 000003.txt
└── val
    ├── 000043.jpg
    ├── 000043.txt
    ├── 000057.jpg
    ├── 000057.txt
    ├── 000070.jpg
    └── 000070.txt

然后将所有文件读入txt中:

python">import os

traintxt = open('train.txt','a')
val = open('val.txt','a')
for img in os.listdir('train'):
    if "png" in img:
        traintxt.write(os.path.join('INRIAPerson-823/train',img)+'\n')
        print(img)

    else:
        print(img,'error')
for img in os.listdir('val'):
    if "png" in img:
        valtxt.write(os.path.join('INRIAPerson-823/val',img)+'\n')
        print(img)
    else:
        print(img,'error')
valtxt.close()
traintxt.close()

然后修改data下的.data文件

在这里插入图片描述
对应的路径自己修改

然后就是训练了:
先跑下这个:

python">python3 genanchors.py --traintxt ./train.txt

然后

python">python3 train.py --data data/coco.data

下不了的关注我公众号:猛男技术控,回复yolofastest 可以提供代码、数据、以及我训练的权重。


http://www.niftyadmin.cn/n/5289.html

相关文章

(未整理完)十月每日一题打卡

每日打卡 10.1 [重新格式化电话号码 lc1694](1694. 重新格式化电话号码 - 力扣(LeetCode)) 模拟题:特殊情况就是在最后划分完全部三个之后,还剩四个需要变成aa-bb class Solution { public:string reformatNumber(string number…

Redis(五)整合:SpringBoot如何整合Redis?

Redis(五)整合:SpringBoot如何整合Redis? 前言 SpringBoot应该不用过多介绍了吧!是Spring当前最火的一个框架,既然学习了Redis,我们肯定是要在实际项目中使用,那么肯定首选整合Spri…

数据结构之栈的实现

文章目录前言1.栈的相关介绍1.栈的概念2.栈结构实现方式2.具体代码实现栈1.栈的相关接口2.栈结构的定义声明和栈的初始化3.栈数据的处理1.入栈2.出栈4.栈判空和获取栈中元素个数以及栈销毁3.总结前言 之前介绍了链表的实现,现在接着介绍另一种线性结构—栈。栈和链…

AC自动机

在家"疯"控第四天,无聊,写博客消遣一下. 今天我们来讲AC自动机. 引入 我知道,很多人在第一次看到这个东西的时侯是非常兴奋的。(别问我为什么知道)不过这个自动机啊它叫作 Automaton,不是 Automation,让萌…

前端静态页面基本开发思路(一)

有不少刚入门前端的同学经常问我前端布局的问题,总是跟我说在面对学校布置的作业或者想自己搭建博客的时候不知道怎么下手,不知道怎么去写静态的页面,每当我解决了一个又一个同学的问题的时候,又有新的同学来问,故思来…

Linux服务器被入侵后的排查思路(应急响应思路)

目录Linux-暴力破解、替换ps命令并留存后门事件复现一、事件背景二、应急响应过程排查crontab后门排查是否有命令被替换响应过程回顾三、事件还原查看后门排查安全日志Linux-暴力破解、替换ps命令并留存后门事件复现 一、事件背景 服务器疑似被入侵,与恶意IP进行通信…

windows常用命令大全

作者介绍: ♥️作者:小刘在C站 ♥️每天分享课堂笔记,一起努力,共赴美好人生! ♥️夕阳下,是最美的,绽放。 目录 运行框命令 cmd中 Windows运行中 快捷键 运行框命令 shutdown-s-t&#xff…

Pandas的数据结构

Pandas的数据结构 处理CSV 文件 CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。 Pan…