tensorflow2-yolov4-程序学习笔记之voc2yolo4.py、voc_annotation.py-程序员宅基地

技术标签: 深度学习  

项目场景:tensorflow2-yolov4-程序学习笔记

提示:程序由bubbiiiing提供:链接: link.
本程序没有做修改,只是添加了自己的详细注释,作为自己的一个记录。


程序:voc2yolo4.py

本程序为:./VOCdevikit/voc2007/voc2yolo4.py
程序用途:将已经生成的xml文件(放置在:"./VOCdevikit/voc2007/Annotations")。分别归类到"./VOCdevikit/voc2007/ImageSets/Main"中的训练集、训练验证集、验证集、检测集中。

xmlfilepath = "./Annotations"
saveBasePath = "./ImageSets/Main/"
 
#----------------------------------------------------------------------#
#   想要增加测试集修改trainval_percent
#   train_percent不需要修改
#----------------------------------------------------------------------#
trainval_percent = 1     # 设置全部训练集的数量的x%放置在trainval中,(1-x)放置在test中。
train_percent = 1        # 首先trainval与train内容一样,train中保留x,其余的放置到val中。

# 单独提取出xxx.xml类型文件名
temp_xml = os.listdir(xmlfilepath)       # 返回路径下所有文件名称包括文件类型名
total_xml = []
for xml in temp_xml:                     # 整合文件下的xml文件名,放入total_xml中
    if xml.endswith(".xml"):
        total_xml.append(xml)
# print(total_xml)

num = len(total_xml)  # 返回xml文件数量
list = range(num)     # list为文件数量变range格式
tv = int(num*trainval_percent)
tr = int(tv*train_percent)
trainval = random.sample(list, tv)       # 截取list中随机长度为tv的元素,将range中的数打乱截取tv个出来,代表xml文件。
train = random.sample(trainval, tr)       # 同上,在随机种子已经设置好。在trainval中提取tr个出来,乱序。

print("train and val size", tv)
print("traub suze", tr)
ftrainval = open(os.path.join(saveBasePath, 'trainval.txt'), 'w')    # os.path.join拼接路径(自动加/)
ftest = open(os.path.join(saveBasePath, 'test.txt'), 'w')            # open(xxx.'w')打开只用于写入文件
ftrain = open(os.path.join(saveBasePath, 'train.txt'), 'w')
fval = open(os.path.join(saveBasePath, 'val.txt'), 'w')
 
for i in list:
    name = total_xml[i][:-4]+'\n'     # 提取标签文件名,去掉文件类型文字。
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftrain.write(name)
        else:
            fval.write(name)
    else:
        ftest.write(name)

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

程序:voc_annotation.py

本程序为:./annotation.py
程序用途:整合图片文件路径和与之对应的xml文件信息,按照上面的程序划分的训练集、验证集、测试集。
输出结构格式为:图片路径+(bndbox的四点信息+物体在classes定义中的排序号)*n(图片中存在物体的数量)。

保存到根目录2007—test,2007-train,2007-val文件中。为后续信息导入做准备。

import xml.etree.ElementTree as ET
from os import getcwd

sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]  # 设置输出选项

classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]
# 分类结果设置

def convert_annotation(year, image_id, list_file):
    in_file = open('VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id), encoding='utf-8')
    tree=ET.parse(in_file)      # 将xml文档解析为ElementTree对象
    root = tree.getroot()       # 获取element类的树根

    for obj in root.iter('object'):         # 遍历root下面的所有object项目
        difficult = 0
        if obj.find('difficult')!=None:
            difficult = obj.find('difficult').text
            
        cls = obj.find('name').text          # 把这个object的‘name’中内容放入到cls中。(提出xml文件中物体的类型名)
        if cls not in classes or int(difficult)==1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (int(xmlbox.find('xmin').text), int(xmlbox.find('ymin').text), int(xmlbox.find('xmax').text), int(xmlbox.find('ymax').text))
        # 输出每一个object中bndbox的四个参数。
        list_file.write(" " + ",".join([str(a) for a in b]) + ',' + str(cls_id))
        # 生成图片文件的路径+图片中所有bnbbox的参数+name参数在classes中的序号


wd = getcwd()    # 得到当前路径


for year, image_set in sets:
    image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'% (year, image_set)).read().strip().split()
    # 打开文件,read()读取所有文件内容,strip为删除空白字符包括'\n', '\r', '\t',  ' ',split为按照字符串分割
    # 把xml文件名全部放入 image_ids列表
    print(image_ids)
    list_file = open('%s_%s.txt'%(year, image_set), 'w')       # 生成2007—test,2007-train,2007-val文件
    for image_id in image_ids:
        list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg'%(wd, year, image_id))  # 生成xml文件对应图片路径
        convert_annotation(year, image_id, list_file)
        list_file.write('\n')
    list_file.close()
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/one_with_two/article/details/116696082

智能推荐

人脸数据集——亚洲人脸数据集-程序员宅基地

文章浏览阅读3.6w次,点赞30次,收藏126次。大规模亚洲人脸数据的制作 在这次大规模亚洲人脸数据制作主要是亚洲明星人脸数据集,此次我爬取了大概20万张亚洲人脸图像,可以修改爬取每位明星图片的数量来获取更多的图片,过程中主要分以下几步: 获取明星名字列表 (1)、首先从百度搜索栏中搜索“明星”,显示出明星栏目,地区包括内地、香港、台湾、韩国和日本,如下图:(2)、使用python爬虫将这些明星的名字爬取下来,代码如下所...

章鱼哥出品—VB.NET 自定义快捷键使用详解之全局热键_vb.net 中窗体快捷键如何设置为alt+p-程序员宅基地

文章浏览阅读7.5k次,点赞2次,收藏21次。如何设置VB.NET 窗体的全局热键(快捷键),_vb.net 中窗体快捷键如何设置为alt+p

Win7 装 Ubuntu 双系统,不需要U盘_win7无u盘安装ubuntu18.04-程序员宅基地

文章浏览阅读9.8k次。本文测试安装的是32位的ubuntu-14.10-desktop-i386.iso 系统。准备: Ubuntu系统ISO文件。官网或者学校的镜像源可下。 UltraISO 软件。 Google 搜一下,可用试用版就行。主要用于从ISO文件里提取文件。 EasyBCD 软件。 Google 一下。Step 1. 计算机右键,管理,_win7无u盘安装ubuntu18.04

远程命令/代码执行漏洞(RCE)总结_rec 远程-程序员宅基地

文章浏览阅读6.6k次,点赞18次,收藏80次。文章目录介绍PHP命令执行函数代码执行函数命令拼接符命令执行的一些绕过技巧绕过str_replace()函数空格被过滤的绕过用编码来绕过URL编码绕过Base64编码绕过Hex编码绕过Oct编码绕过:偶读拼接绕过(黑名单绕过)花括号{command,}的别样用法无回显的命令执行方法一:反弹shell方法二:msf反向回连利用RCE反弹Shellnetcat 一句话反弹Shellbash反弹shel..._rec 远程

CodeForces - 817C Really Big Numbers_codeforces 817c-程序员宅基地

文章浏览阅读211次。Ivan likes to learn different things about numbers, but he is especially interested in really big numbers. Ivan thinks that a positive integer number x is really big if the difference between x and th..._codeforces 817c

VirtualBox+mininet网络配置手记_找不到/etc/network/interfaces' mininet-程序员宅基地

文章浏览阅读3.6k次。因为毕业设计的缘故,必须学习mininet(一种基于Linux内核,由python语言编写的虚拟SDN网络平台),来实现多种路由规则分配算法的仿真。然而,在学习过程中,我算是遇到了各种各样的障碍,甚是苦恼。好在mininet官方做的tutorial足够丰富,google也很给力,所以许多问题都可以查到该如何解决。今天,作死的Windows10系统在我上厕所的过程_找不到/etc/network/interfaces' mininet

随便推点

1到n的数按字典序排序_输出从 11 到 nn 所有数字的所有排列方式,按字典序排序。-程序员宅基地

文章浏览阅读5.6k次。#coding:utf-8'''今日头条2017秋招编程题输入:n,m输出从 1 到 n 的数按 字典序 排序的低 m 个数如输入:11 41 10 11 2 3 4 5 6 7 8 9 中的第四个数输出: 2'''import numpy as npfrom numpy import *s = raw_input()s = s.split(' ')n = int(s[0])m = int(s[1_输出从 11 到 nn 所有数字的所有排列方式,按字典序排序。

常见的几种Windows后门持久化方式_windows alistcmd持久化-程序员宅基地

文章浏览阅读1.9k次。0×0 背景持久化后门是指当入侵者通过某种手段拿到服务器的控制权之后,通过在服务器上放置一些后门(脚本、进程、连接之类),来方便他以后持久性的入侵,简单梳理一下日常遇见windows用的比较多的一些持久化方式方便以后排查问题使用。0×1 注册表自启动最常见的在指定键值添加一个新的键值类型为REG_SZ,数据项中添写需要运行程序的路径即可以启动,此类操作一些较为敏感容易被本地AV..._windows alistcmd持久化

2023年第三届能源、电力与电气工程国际会议 (CoEEPE 2023)-程序员宅基地

文章浏览阅读675次。会议将围绕“能源、电力与电气工程”的最新研究领域而展开,为研究人员、工程师、专家学者以及行业专业人士提供一个交流与探讨最新研究成果的平台,并为与会者们交流新的思想和应用经验建立业务或研究关系。本次会议将于2023年11月22至24日在澳大利亚墨尔本召开,在会议期间您将有机会聆听到行业前沿的学术报告,见证该领域的成果与进步。5. 至少有一位论文作者应注册参会,并且至少有一位作者必须在会议上发表论文。5.文章录用:若您的文章被录用,我们将以邮件形式通知您,您将收到以下文件:录用通知、审稿意见表、中文注册表。_coeepe 2023

全自动采集文章php:省时省力,轻松获取海量信息-程序员宅基地

文章浏览阅读477次,点赞7次,收藏6次。1.什么是全自动采集文章php?全自动采集文章php是一款优秀的基于PHP的软件,它能智能提取并储存互联网文章至数据库中,极大地减轻了用户获取大量信息的负担,更有效率地利用了您宝贵的时光与精力。2.如何使用全自动采集文章php?运用PHP全自动采集文章只需三步。首先

vue 项目引用static目录资源_Vue2.0项目入门 — 静态资源目录src/assets和static/区别...-程序员宅基地

文章浏览阅读1.3k次。rose.png你应该注意到了,在项目结构上我们有静态资源两个目录:src/assets和static/。他们之间有什么区别?通过webpack处理的资源首先我们需要了解webpack如何处理静态资源。在*.vue组件中,所有的html模板和css都会被vue-html-loader和css-loader压缩并且查找资源路径。例如,(../logo.png)和background:url(../l..._vue2 webpack项目 static

Android Glide实现加载网络图片_glide加载网络图片-程序员宅基地

文章浏览阅读2.5k次。Glide实现加载网络图片Glide,一个被google所推荐的图片加载库作者是Bump Technologies这个库被广泛运用在google的开源项目中,包括2014年的google I/O大会上发布的官方app加载图片的步骤图片的地址把图片转换为可被加载的对象通过图片加载控件展示图片使用流程.with() 创建图片加载实例.load() 指定加载的图片资源.into() 指定图片的加载控件Generated API继承库可以为Generated API扩展自定义_glide加载网络图片