使用ppyoloe训练voc数据集(自制的)详细教程

news2024/9/26 1:23:10

使用ppyoloe训练voc数据集(自制的)详细教程

一、数据集准备工作:
Voc数据集的格式:
在这里插入图片描述
通过labelimg标注后的数据集如图所示
分别存放原图与xml标注文件

二、在ppdetection的工程下面找到dataset文件夹
在这里插入图片描述
其中有许多的参考数据的格式样例
在dataset文件夹下,新建数据集文件夹(自己命名aaaa)
将制作好的数据集复制近来,格式如下:
在这里插入图片描述
三、在pcb文件下新建脚本,使用脚本生成代训练的文件

import argparse
import random
import re
from pathlib import Path
from matplotlib import pyplot as plt

annotations_name = 'Annotations'
jpegimages_name = 'JPEGImages'
trainval_name = 'trainval.txt'
text_file_name = 'test.txt'
val_file_name = 'val.txt'


def write_file(datas, file):
    results = []
    for data in datas:
        annotation = Path(annotations_name, f'{data}.xml')
        image = Path(jpegimages_name, f'{data}.jpg')
        result = f'{image} {annotation}'
        results.append(result)
    with file.open('w')as f:
        f.write("\n".join(results))
    print(file, "success")


def make_paddle_voc(dataset):
    dataset = Path(dataset)
    assert dataset.is_dir(), "Error dataset path"
    annotations_path = dataset / annotations_name
    images_path = dataset / jpegimages_name
    if not (annotations_path.is_dir() and images_path.is_dir()):
        print("Please use the following structure:")
        print(f"{dataset.name}")
        print(f'\t{annotations_name}\n\t\t|--00001.xml\n\t\t|--00002.xml')
        print(f'\t{jpegimages_name}\n\t\t|--00001.jpg\n\t\t|--00002.jpg')
        raise RuntimeError(f'Error {jpegimages_name} or {annotations_name} dir')
    paddle_path = dataset / 'paddle'
    paddle_path.mkdir(exist_ok=True, parents=True)
    trainval_path = paddle_path / trainval_name
    test_path = paddle_path / text_file_name
    val_path = paddle_path / val_file_name
    annotations = annotations_path.glob('*.xml')
    images = images_path.glob('*.jpg')
    images_list = [image.name for image in images]
    annotations_list = []
    for annotation in annotations:
        image = annotation.with_suffix('.jpg').name
        assert image in images_list, f"{annotation.name} has no image file"
        annotations_list.append(annotation.stem)
    random.shuffle(annotations_list)
    per = round(len(annotations_list) / 10)
    trainval = annotations_list[:per * 7]  # 此处切分比例为8:1:1 可行修改比例
    test = annotations_list[per * 7:per * 9]
    val = annotations_list[per * 9:]
    write_file(trainval, trainval_path)
    write_file(test, test_path)
    write_file(val, val_path)


def check_labels(dataset):
    dataset = Path(dataset)
    annotations_path = dataset / annotations_name
    class_list = {}
    for annotation_path in annotations_path.glob('*.xml'):
        with annotation_path.open('r')as f:
            names = re.findall(r'<name>(.+?)</name>', f.read())
            for name in names:
                if name not in class_list.keys():
                    class_list[name] = 0
                class_list[name] += 1
    class_list = dict(sorted(class_list.items()))
    label_list = dataset / 'label_list.txt'
    with label_list.open('w')as f:
        f.write('\n'.join(class_list.keys()))
    fig, ax = plt.subplots()
    [ax.text(a, b + 1, b, ha='center', va='bottom') for a, b in class_list.items()]
    plt.bar(*zip(*class_list.items()))
    plt.xticks(rotation=270)
    plt.title('Detection category distribution')
    plt.xlabel('Class')
    plt.ylabel('Number')
    plt.tight_layout()
    plt.savefig(f"{dataset / '类别分布.jpg'}", format="jpg")
    print(f"Save as {dataset / '类别分布.jpg'}")
    print(f"共{len(class_list)}类")


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--dataset', required=True, help='input dataset path, necessary parameter')

    opt = parser.parse_args()
    # check_dataset(opt.dataset)
    make_paddle_voc(opt.dataset)
    check_labels(opt.dataset)

四、修改代码中的配置文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/985401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Zebec Protocol 成非洲利比亚展会合作伙伴,并将向第三世界国家布局

在 9 月 6 日&#xff0c;The Digital Asset Summit ’23&#xff08;利比亚大会&#xff09;在尼日利亚首度阿布贾的 NAF 会议中心举办&#xff0c;该会议对 Web3 领域在非洲地区的发展进行了探索&#xff0c;旨在推动非洲地区区块链产业的进一步发展&#xff0c;据悉该会议室…

关于ChatGPT的个人的一些观点

问题 1 Q: 你认为ChatGPT是一款非常有用的工具吗&#xff1f; A: 我认为ChatGPT是一款非常有用的工具。它可以帮助人们解决各种问题&#xff0c;包括技术问题、心理问题、生活问题等等。同时&#xff0c;ChatGPT也可以成为人们分享想法和交流的平台&#xff0c;增强人与人之间…

C++ break 语句

C 中 break 语句有以下两种用法&#xff1a; 当 break 语句出现在一个循环内时&#xff0c;循环会立即终止&#xff0c;且程序流将继续执行紧接着循环的下一条语句。它可用于终止 switch 语句中的一个 case。 如果您使用的是嵌套循环&#xff08;即一个循环内嵌套另一个循环&…

UE4/UE5 动画控制

工程下载​ ​​​​​​​​​​​​​https://mbd.pub/o/bread/ZJ2cm5pu 蓝图控制sequence播放/倒播动画&#xff1a; 设置开启鼠标指针&#xff0c;开启鼠标事件 在场景中进行过场动画制作 设置控制事件

IDEA找不到Maven窗口

有时候导入项目或者创建项目时候Maven窗口找不到了 然后指定项目的pom.xml文件

初识Java 6-1 复用

目录 组合 继承 委托 组合和继承的结合 确保正确的清理 名称隐藏 在组合和继承之间选择 protected关键字 向上转型 final关键字 final数据 final方法 final类 初始化及类的重载 本笔记参考自&#xff1a; 《On Java 中文版》 对面向对象的编程语言而言&#xff0…

2023-09-07工作心得:String 和 LocalDate 的比较

1、SQL查询时间 如果根据某个日期区间检索&#xff1a; 假设有张t_order表&#xff0c;其中有个字段 create_time 在数据库里的格式是”yyyy-MM-dd HH:mm:ss“ 如果我在前端&#xff0c;选择2023-09-06-2023-09-07&#xff0c;这个区间&#xff0c;其实我期待的是查出这两天…

pip cryptography 遇到的 OpenSSL 问题

pip install -r requirements.txt 遇到 bug Collecting cryptography2.7Downloading cryptography-2.7.tar.gz (495 kB)------------------------------------- 495.9/495.9 kB 15.7 MB/s eta 0:00:00Installing build dependencies: startedInstalling build dependencies:…

CVE-2017-12615 PUT方法漏洞复现

这里的端口出现占用问题&#xff0c;需要修改端口 使用nuclei工具 找到[CVE-2017-12615] [http] [high] http://192.168.142.151/poc.jsp?cmdcat%2Fetc%2Fpasswd 浏览器访问&#xff0c;获得/etc/passwd信息

lv3 嵌入式开发-5 linux shell命令(进程管理、用户管理)

目录 1 进程处理相关命令 1.1 进程的概念 1.2 查看进程的命令 1.3 发送信号命令 2 用户管理相关命令 2.1 用户管理相关文件介绍 2.2 用户管理相关命令介绍 1 进程处理相关命令 1.1 进程的概念 进程的概念主要有两点&#xff1a; 进程是一个实体。每一个进程都有它自己…

曾国藩农民出身,弯道超车实现逆袭的大智慧

曾国藩从小就笨笨的&#xff0c;读书多了才开窍&#xff0c;实现人生逆袭。农民出身&#xff0c;弯道超车&#xff0c;贵在坚持。 约翰生说过&#xff1a;“成大事不在于力量的大小&#xff0c;而在于能坚持多久。” 很多家长认为“不让孩子输在起跑线上”&#xff0c;这是错…

c++ day 2

1、封装一个结构体&#xff0c;结构体中包含一个私有数组&#xff0c;用来存放学生的成绩&#xff0c;包含一个私有变量&#xff0c;用来记录学生个数&#xff0c; 提供一个公有成员函数&#xff0c;void setNum(int num)用于设置学生个数 提供一个公有成员函数&#xff1a;v…

【送书活动】网络安全(黑客)自学

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

Unity 之利用Audio Source(音频源)组件用于播放声音

文章目录 Unity中的Audio Source&#xff08;音频源&#xff09;是一个用于播放声音的组件&#xff0c;通常附加到游戏对象上&#xff0c;以便在游戏中播放音频效果、音乐或对话。以下是Audio Source的详细介绍&#xff1a; 添加Audio Source&#xff1a; 要在Unity中使用Audio…

Apache Tomcat漏洞复现

文章目录 弱口令启动环境漏洞复现 本地文件包含启动环境漏洞复现 弱口令 启动环境 来到vulhub/tomcat/tomcat8/靶场 cd vulhub/tomcat/tomcat8/安装环境并启动&#xff1a; sudo docker-compose up -d && sudo docker-compose up -d修改端口后启动&#xff1a; su…

AWR仿真报错invalid noise data found

在AWR microwave office 使用外部导入的s参数时遇到报错&#xff1a;“ invalid noise data found”&#xff0c;如下图所示&#xff0c;然而导入的s参数中&#xff0c;并没有噪声参数。 分析了好一阵&#xff0c;发现是sp文件中出现了频率不单调的数据&#xff0c;如下图所示…

荣耀9x使用体验

第一次使用鸿蒙系统&#xff0c;感觉还行&#xff0c;虽然各种操作和手势不太习惯&#xff0c;但是不影响什么&#xff0c;这是已经发布了4年的手机&#xff0c;用起来没什么毛病&#xff0c;各方面比较均衡。 2年前买的&#xff0c;原价1500块&#xff0c;现在&#xff08;20…

不用额外插件?RunnerGo内置压测模式怎么选

我们在做性能测试时需要根据性能需求配置不同的压测模式如&#xff1a;阶梯模式。使用jmeter时我们需要安装插件来配置测试模式&#xff0c;为了方便用户使用&#xff0c;RunnerGo内嵌了压测模式这一选项&#xff0c;今天给大家介绍一下RunnerGo的几种压测模式和怎么根据性能需…

Python Opencv实践 - Harris角点检测

参考资料&#xff1a;https://blog.csdn.net/wsp_1138886114/article/details/90415190 import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/chinease_tower.jpg", cv.IMREAD_COLOR) plt.imshow(img[:,:,::-1])#…

l8-d8 TCP并发实现

一、TCP多进程并发 1.地址快速重用 先退出服务端&#xff0c;后退出客户端&#xff0c;则服务端会出现以下错误&#xff1a; 地址仍在使用中 解决方法&#xff1a; /*地址快速重用*/ int flag1,len sizeof (int); if ( setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &a…