上一篇:小技巧(4):将txt中的某两列数据写入csv文件中,制作图像分类标签

文章目录

  • 一、相关准备
    • 1.1 下载数据集
    • 1.2 下载代码文件
    • 1.3 将相关文件移入代码文件
  • 二、创建标准的VOC文件夹
  • 三、生成整个数据集的XML文件
  • 四、删除txt中id对应XML和图片
  • 五 、生成tain.txt和val.txt文件

一、相关准备

1.1 下载数据集

http://cg.cs.tsinghua.edu.cn/traffic-sign/data_model_code/data.zip
TT100K数据集下载下来大概19.2G,解压后的文件夹如图

1.2 下载代码文件

https://github.com/cqfdch/TT100K_to_VOC

1.3 将相关文件移入代码文件

讲TT100K中的train文件、test文件夹、annotations.json文件移入代码文件夹。

二、创建标准的VOC文件夹

import os# 建立相关文件夹
# build voc2007 folder structure
def make_voc_dir():root_dir = os.getcwd()os.makedirs(root_dir+'/VOC2007')os.makedirs("VOC2007"+'/Annotations')os.makedirs("VOC2007" + '/JPEGImages/ ')os.makedirs("VOC2007"+'/ImageSets')os.makedirs("VOC2007"+'/ImageSets/Main')if __name__ == '__main__':make_voc_dir()

三、生成整个数据集的XML文件

import os
import json
from lxml import etree as ET
from xml.dom import minidom
#找出训练集和测试集中的不在45类的标注图片的id
def edit_xml(objects, id, dir):save_xml_path = os.path.join(dir, "%s.xml" % id)  # xmlroot = ET.Element("annotation")# root.set("version", "1.0")  folder = ET.SubElement(root, "folder")folder.text = "none"filename = ET.SubElement(root, "filename")filename.text = id + ".jpg"source = ET.SubElement(root, "source")source.text = "none"owner = ET.SubElement(root, "owner")owner.text = "halftop"size = ET.SubElement(root, "size")width = ET.SubElement(size, "width")width.text = str(2048)height = ET.SubElement(size, "height")height.text = str(2048)depth = ET.SubElement(size, "depth")depth.text = "3"segmented = ET.SubElement(root, "segmented")segmented.text = "0"for obj in objects:  #  object = ET.SubElement(root, "object")name = ET.SubElement(object, "name")  # numbername.text = obj["category"]# meaning = ET.SubElement(object, "meaning")  # name# meaning.text = inf_value[0]pose = ET.SubElement(object, "pose")pose.text = "Unspecified"truncated = ET.SubElement(object, "truncated")truncated.text = "0"difficult = ET.SubElement(object, "difficult")difficult.text = "0"bndbox = ET.SubElement(object, "bndbox")xmin = ET.SubElement(bndbox, "xmin")xmin.text = str(int(obj["bbox"]["xmin"]))ymin = ET.SubElement(bndbox, "ymin")ymin.text = str(int(obj["bbox"]["ymin"]))xmax = ET.SubElement(bndbox, "xmax")xmax.text = str(int(obj["bbox"]["xmax"]))ymax = ET.SubElement(bndbox, "ymax")ymax.text = str(int(obj["bbox"]["ymax"]))tree = ET.ElementTree(root)tree.write(save_xml_path, encoding="UTF-8", xml_declaration=True)root = ET.parse(save_xml_path) file_lines = minidom.parseString(ET.tostring(root, encoding="Utf-8")).toprettyxml(indent="\t") file_line = open(save_xml_path, "w", encoding="utf-8")  file_line.write(file_lines)file_line.close()def  getDirId(dir):  # get the  id list  of id.pngnames = os.listdir(dir)ids = []for name in names:# path = os.path.join(dir, name)# img  = cv2.imread(path)# w, h, c = img.shape# if name.endswith(".jpg") or name.endswith(".png"):# ids["%s" % name.split(".")[0]] = [w, h, c]ids.append(name.split(".")[0])return idsdef is_tt45(objects):flag = Truejson_file = open('./TT100K_VOC_classes.json', 'r')results = json.load(json_file)for obj in objects:text = obj["category"]for key in results.keys():flag1 = Falseif key == text:flag1 =Truebreakif flag1 == False:flag = Falsebreakreturn flag
filedir = "annotations.json"
annos = json.loads(open(filedir).read())trainIds = getDirId("train/")
testIds = getDirId("test/")ids = annos["imgs"].keys() #  all img ids in .json dir_train = "xmlLabel1/train"
dir_test = "xmlLabel1/test"
if not os.path.exists(dir_train):os.makedirs(dir_train)
if not os.path.exists(dir_test):os.makedirs(dir_test)Not_TT45_list_train = []
Not_TT45_list_val = []
for id in ids:
#  json 中的ID图片有待检测目标,且该id图片在 train文件夹中if len(annos["imgs"][id]["objects"]) > 0 and (id in trainIds):objects = annos["imgs"][id]["objects"]flag = is_tt45(objects)if flag is False:Not_TT45_list_train.append(id+'\n')edit_xml(objects, id, dir=dir_train)elif len(annos["imgs"][id]["objects"]) > 0 and (id in testIds):objects = annos["imgs"][id]["objects"]flag = is_tt45(objects)if flag is False:Not_TT45_list_val.append(id+'\n')edit_xml(objects, id, dir=dir_test)
with open("Not_TT45_list_train.txt" ,"a") as f:f.writelines(Not_TT45_list_train)
with open("Not_TT45_list_val.txt" ,"a") as f:f.writelines(Not_TT45_list_val)

四、删除txt中id对应XML和图片

import os
import glob# 删除txt中id对应XML和图片
def delete_train_jpg(train_txt):root_dir = os.getcwd()for line in open(train_txt ,"r"):file_id = line.strip()# print(file_id)file_path = os.path.join(root_dir,"train",file_id+'.jpg')# print(file_path)os.remove(file_path)def delete_test_jpg(test_txt):root_dir = os.getcwd()for line in open(test_txt ,"r"):file_id = line.strip()# print(file_id)file_path = os.path.join(root_dir,"test",file_id+'.jpg')# print(file_path)os.remove(file_path)def delete_train_xml(train_txt):root_dir = os.getcwd()root_path = os.path.join(root_dir,"xmlLabel1")for line in open(train_txt,"r"):file_id = line.strip()# print(file_id)file_path = os.path.join(root_path,"train",file_id+'.xml')# print(file_path)os.remove(file_path)def delete_test_xml(test_txt):root_dir = os.getcwd()root_path = os.path.join(root_dir,"xmlLabel1")for line in open(test_txt,"r"):file_id = line.strip()# print(file_id)file_path = os.path.join(root_path,"test",file_id+'.xml')# print(file_path)os.remove(file_path)
if __name__ == '__main__':train_txt = "Not_TT45_list_train.txt"test_txt = "Not_TT45_list_val.txt"delete_train_jpg(train_txt)delete_train_xml(train_txt)delete_test_jpg(test_txt)delete_test_xml(test_txt)

五 、生成tain.txt和val.txt文件

第一步,生成train.txt
需要将4_spilt_data.py中的下面两行改成

files_path = "/home/ch/Object_Detection/dataset/TT100K_to_VOC/xmlLabel1/train"
val_rate = 0

然后运行4_spilt_data.py文件,可得到train.txt和val.txt文件,其中val.txt文件是空文件。将train.txt文件移入VOC2017/ImageSets/Main中,删除val.txt文件。

第二步、生成val.txt
需要将4_spilt_data.py中的下面两行改成

 files_path = "/home/ch/Object_Detection/dataset/TT100K_to_VOC/xmlLabel1/test"val_rate =1

然后运行4_spilt_data.py文件,可得到train.txt和val.txt文件,其中train.txt文件是空文件。将val.txt文件移入VOC2017/ImageSets/Main中,删除train.txt文件。

import os
import randomfiles_path = "/home/ch/Object_Detection/dataset/TT100K_YOLO_Label-master/xmlLabel1/train"
if not os.path.exists(files_path):print("文件夹不存在")exit(1)
val_rate = 0files_name = sorted([file.split(".")[0] for file in os.listdir(files_path)])
files_num = len(files_name)
val_index = random.sample(range(0, files_num), k=int(files_num*val_rate))
train_files = []
val_files = []
for index, file_name in enumerate(files_name):if index in val_index:val_files.append(file_name)else:train_files.append(file_name)try:train_f = open("train.txt", "x")eval_f = open("val.txt", "x")train_f.write("\n".join(train_files))eval_f.write("\n".join(val_files))
except FileExistsError as e:print(e)exit(1)

最后将生成的train.txt和val.txt放进VOC2017/ImageSets/Main文件夹中

下一篇:小技巧(6):进行BelgiumTSC交通标志数据集识别(定义自己的数据集)

小技巧(5):将TT100K数据集转成VOC格式,并且用Python脚本选出45类超过100张的图片和XML相关推荐

  1. TT100K数据集转换成coco格式,并重新划分

    TT100K数据集转换成coco格式,并重新划分 统计每个类别 import os import jsonos.makedirs('annotations',exist_ok=True) #存放数据的 ...

  2. CrowdHuman数据集转成VOC格式并训练模型

    CrowdHuman数据集转成VOC格式并训练模型 1. 介绍 The CrowdHuman dataset is large, rich-annotated and contains high di ...

  3. INRIA数据集转换成VOC格式

    背景 下面的代码是将INRIA数据集转换成VOC格式.图片是614张. 其中,使用OinginImage文件夹里的Train中Pos和Annotations作为训练,利用Test里的Pos作为测试. ...

  4. DAGM2007数据集转换成VOC格式

    DAGM2007数据集-to-缺陷数据集VOC格式 DAGM2007数据集下载 数据集简单介绍 转换代码 转换结果 DAGM2007数据集下载 链接: DAGM2007. 下载后把每一类的压缩包解压放 ...

  5. Caltech 数据集转换成VOC格式

    注意本人用pycharm 运行环境是python2.7.14 如果是python3 可能会存在错误 1. Seq文件转化成JEPG图像文件() 运行seq2jpg.py文件,输入.seq文件夹,输出到 ...

  6. PS实用小技巧:把png批量转换成jpg的方法

    内容提要:本文的PS实用小技巧:把png批量转换成jpg的方法,不仅适用于png批量转换jpg,还适用于PSD等格式批量转换成jpg格式.对PS感兴趣的朋友可加 ps学习交流群:142574315 今 ...

  7. SSD学习系列(二)LMDB概念以及将VOC数据集转换成LMDB格式

    LMDB概念 接上一篇,将SSDa caffen框架代码编译通过后y,接下来就可以利用其脚本将标注好的VOC格式数据集转换成LMDB格式,以便开始SSD模型训练. LMDB是Lightning Mem ...

  8. 数据集转换成LMDB格式

    文章来源https://www.cnblogs.com/dengshunge/p/10841108.html略加修改和补充. 介绍两种LMDB格式数据集的生成,一种是自己的数据集,一种是下载wider ...

  9. 将一张面值100元的人民币换成5元、1元、0.5元的100张的零钞,要求每种零钞不少于1张,问有哪几种组合。

    //将一张面值100元的人民币换成5元.1元.0.5元的100张的零钞,要求每种零钞不少于1张,问有哪几种组合. #include <stdio.h> int main() {     i ...

最新文章

  1. 英伟达发布RTX 2000系列显卡,“实时光线追踪”究竟能为游戏带来什么?
  2. python中元组tuple官方使用手册
  3. 【编程珠玑】读书笔记 第二章 算法
  4. Android被逼学习小例子1
  5. 排序算法的时间复杂度_算法的时间复杂度
  6. Context结构图
  7. dbscan用 java代码_聚类算法之DBScan(Java实现)[转]
  8. 桥接模式和路由模式区别_联通创维光猫DT541-CSF改桥接模式方法
  9. 程序员很忙吗_当一个程序员一天被打扰 10 次,后果很惊人!
  10. xp的服务器系统怎么安装win7系统教程,怎么在xp系统下安装win7双系统教程
  11. 精妙SQL语句 (笔记)【转】
  12. c# DESEncrypt 加密、解密算法
  13. 武书连2022中国大学综合实力排行榜发布!
  14. SMILES:化学结构的线性表示方法
  15. 实操《深入浅出React和Redux》第四期--react-redux
  16. Vue动态组件、组件缓存、组件激活和非激活、组件插槽、组件name
  17. 4.6 案例10 使用QList处理数据集
  18. nginx alias php,Nginx设置alias实现虚拟目录 alias与root的用法区别
  19. 期待已久的《刀剑神域》第三季终于来了
  20. Android 反编译apk文件

热门文章

  1. 30岁之前应该看的,三十而立!
  2. python数据清洗的方法有哪些_7步搞定数据清洗-Python数据清洗指南
  3. DMRS在信道占用的时频资源
  4. 典型卷积神经网络算法(AlexNet、VGG、GoogLeNet、ResNet)
  5. 教你Windows10系统修改hosts文件的操作方法
  6. LeetCode每日一题——1687. 从仓库到码头运输箱子
  7. Android实例-OrientationSensor方向传感器(XE8+小米2)
  8. linux trim命令,linux shell trim()
  9. 适用于现代制造业的ERP系统有哪些?
  10. greendao连接mysql_使用GreenDao操作数据库