1.首先把widerperson解压并把解压后的文件夹放在我的目标检测项目文件夹中

2.原始的Widerperson是没有trainval.txt的,这里是我把train.txt和val.txt合在了一起,方面运行代码一次生成xml文件,注意000040.jpg.txt和相对应的图片都要删掉,因为是乱码,影响生成xml文件。

3.运行转换voc代码

这里我把classes1-5都改为了person,因为我做行人检测,只需要person,修改完之后输出的xml文件中五种类别都是person。

import os
import numpy as np
import scipy.io as sio
import shutil
from lxml.etree import Element, SubElement, tostring
from xml.dom.minidom import parseString
import cv2def make_voc_dir():# labels 目录若不存在,创建labels目录。若存在,则清空目录if not os.path.exists('./VOC2007/Annotations'):os.makedirs('./VOC2007/Annotations')if not os.path.exists('./VOC2007/ImageSets'):os.makedirs('./VOC2007/ImageSets')os.makedirs('./VOC2007/ImageSets/Main')if not os.path.exists('./VOC2007/JPEGImages'):os.makedirs('./VOC2007/JPEGImages')if __name__ == '__main__':# < class_label =1: pedestrians > 行人# < class_label =2: riders >      骑车的# < class_label =3: partially-visible persons > 遮挡的部分行人# < class_label =4: ignore regions > 一些假人,比如图画上的人# < class_label =5: crowd > 拥挤人群,直接大框覆盖了classes = {'1': 'person','2': 'person','3': 'person','4': 'person', #不需要哪个类的话直接删去'5': 'person'} #这里如果自己只要人,可以把1-5全标记为people,也可以根据自己场景需要筛选VOCRoot = './VOC2007'   #生成的voc2007的位置widerDir = './WiderPerson'  # widerperson文件夹所在的路径wider_path = './WiderPerson/trainval.txt'   #widerperson文件夹所中训练集+验证集txt标签所在位置make_voc_dir()with open(wider_path, 'r') as f:imgIds = [x for x in f.read().splitlines()]for imgId in imgIds:objCount = 0  # 一个标志位,用来判断该img是否包含我们需要的标注filename = imgId + '.jpg'img_path = './WiderPerson/images/' + filenameprint('Img :%s' % img_path)img = cv2.imread(img_path)width = img.shape[1]  # 获取图片尺寸height = img.shape[0]  # 获取图片尺寸 360node_root = Element('annotation')node_folder = SubElement(node_root, 'folder')node_folder.text = 'JPEGImages'node_filename = SubElement(node_root, 'filename')node_filename.text = 'VOC2007/JPEGImages/%s' % filenamenode_size = SubElement(node_root, 'size')node_width = SubElement(node_size, 'width')node_width.text = '%s' % widthnode_height = SubElement(node_size, 'height')node_height.text = '%s' % heightnode_depth = SubElement(node_size, 'depth')node_depth.text = '3'label_path = img_path.replace('images', 'Annotations') + '.txt'with open(label_path) as file:line = file.readline()count = int(line.split('\n')[0])  # 里面行人个数line = file.readline()while line:cls_id = line.split(' ')[0]xmin = int(line.split(' ')[1]) + 1ymin = int(line.split(' ')[2]) + 1xmax = int(line.split(' ')[3]) + 1ymax = int(line.split(' ')[4].split('\n')[0]) + 1line = file.readline()cls_name = classes[cls_id]obj_width = xmax - xminobj_height = ymax - ymindifficult = 0if obj_height <= 6 or obj_width <= 6:difficult = 1node_object = SubElement(node_root, 'object')node_name = SubElement(node_object, 'name')node_name.text = cls_namenode_difficult = SubElement(node_object, 'difficult')node_difficult.text = '%s' % difficultnode_bndbox = SubElement(node_object, 'bndbox')node_xmin = SubElement(node_bndbox, 'xmin')node_xmin.text = '%s' % xminnode_ymin = SubElement(node_bndbox, 'ymin')node_ymin.text = '%s' % yminnode_xmax = SubElement(node_bndbox, 'xmax')node_xmax.text = '%s' % xmaxnode_ymax = SubElement(node_bndbox, 'ymax')node_ymax.text = '%s' % ymaxnode_name = SubElement(node_object, 'pose')node_name.text = 'Unspecified'node_name = SubElement(node_object, 'truncated')node_name.text = '0'image_path = VOCRoot + '/JPEGImages/' + filenamexml = tostring(node_root, pretty_print=True)  # 'annotation'dom = parseString(xml)xml_name = filename.replace('.jpg', '.xml')xml_path = VOCRoot + '/Annotations/' + xml_namewith open(xml_path, 'wb') as f:f.write(xml)# widerDir = '../WiderPerson'  # 代码运行到最后会对图片保存到voc2007/JPEGImages中shutil.copy(img_path, './VOC2007/JPEGImages/' + filename)

注意所填的路径一定要对,我这里widerperson文件夹在我所打开的项目文件夹下面,因此路径前面一个(.)就可以。

例如:

经过以上步骤就可以生成voc2007了,其实在运行这个脚本时候的绝大部分错误都是因为路径设置的格式不对。

4.最后还可以对widerperson文件夹中原始的txt标签进行可视化,同样还是在我的项目文件夹下进行,当然也可以用别的代码对xml文件进行可视化,这里是对原始的txt标注文件可视化

import os
import cv2if __name__ == '__main__':path = './WiderPerson/trainval.txt'with open(path, 'r') as f:img_ids = [x for x in f.read().splitlines()]for img_id in img_ids:  # '000040'img_path = './WiderPerson/images/' + img_id + '.jpg'img = cv2.imread(img_path)im_h = img.shape[0]im_w = img.shape[1]label_path = img_path.replace('images', 'Annotations') + '.txt'with open(label_path) as file:line = file.readline()count = int(line.split('\n')[0])  # 里面行人个数line = file.readline()while line:cls = int(line.split(' ')[0])# < class_label =1: pedestrians > 行人# < class_label =2: riders >      骑车的# < class_label =3: partially-visible persons > 遮挡的部分行人# < class_label =4: ignore regions > 一些假人,比如图画上的人# < class_label =5: crowd > 拥挤人群,直接大框覆盖了if cls == 1 or cls == 2 or cls == 3:xmin = float(line.split(' ')[1])ymin = float(line.split(' ')[2])xmax = float(line.split(' ')[3])ymax = float(line.split(' ')[4].split('\n')[0])img = cv2.rectangle(img, (int(xmin), int(ymin)), (int(xmax), int(ymax)), (0, 255, 0), 2)line = file.readline()cv2.imshow('result', img)cv2.waitKey(0)

5.数据清洗

我想给ignore和crowd两个类删去,运行下列代码


#  批量移除xml标注中的某一个类别标签
import xml.etree.cElementTree as ET
import ospath_root = ['VOC2007/Annotations']CLASSES = ["crowd"]   # 填入想要删去的类别,每次删去一个类for anno_path in path_root:xml_list = os.listdir(anno_path)for axml in xml_list:path_xml = os.path.join(anno_path, axml)tree = ET.parse(path_xml)root = tree.getroot()print("root",root)for child in root.findall('object'):name = child.find('name').textprint("name",name)if name in CLASSES:     # 这里可以反向写,不在Class的删掉root.remove(child)# 重写tree.write(os.path.join('VOC2007/Annotations_new', axml))  # 记得新建annotations_new文件夹

参考一下两位老哥:

WiderPerson行人检测数据集_松菇的博客-CSDN博客_widerperson数据集

关于WiderPerson数据说明(使用后笔记)_wait a minute~的博客-CSDN博客

评估:

Wider Person拥挤场景行人数据集_红叶骑士之初的博客-CSDN博客_widerperson数据集

widerperson数据集转voc相关推荐

  1. pythonvbb转换txt_Caltech行人数据集转化VOC数据集

    Caltech行人数据集转化VOC数据集 发布时间:2018-04-09 17:31, 浏览次数:1213 , 标签: Caltech VOC CaltechPestrian2VOC 代码仓库地址 1 ...

  2. 目标检测数据集PASCAL VOC简介

    简介 PASCAL VOC挑战赛 (The PASCAL Visual Object Classes )是一个世界级的计算机视觉挑战赛, PASCAL全称:Pattern Analysis, Stat ...

  3. MSCOCO数据集转VOC数据集训练目标检测模型

    MSCOCO数据集转VOC数据集训练目标检测模型 Images 2014 Train images [83K/13GB] 2014 Val images [41K/6GB] 2014 Test ima ...

  4. KITTI车辆检测数据集转VOC格式(亲测成功,附KITTI云盘连接以及完整格式转换代码)- KITTI车辆检测数据集看着一篇就够了!

    KIITI数据集转VOC格式 软件环境 一.准备数据集 1.1下载链接 1.2数据集使用方法 二.txt标注文件准换为VOC格式 2.1目前准换代码存在的问题 2.2博主提供的方法 2.3转换代码 2 ...

  5. mmdetection实战,训练扑克牌数据集(VOC格式)并测试计算mAP

    mmdetection实战,训练扑克牌数据集(VOC格式)并测试计算mAP 一.数据集准备 二.mmdetection的安装 三.修改相关文件 1. 修改class_names.py文件 2. 修改v ...

  6. 输电线路绝缘子检测红外图像数据集(VOC标签,900多张图像)

    下载地址: 输电线路绝缘子检测红外图像数据集(VOC标签,900多张图像)

  7. CityScapes数据集转voc数据格式训练yolov5(含下载链接)

    CityScapes数据集转voc数据格式训练yolov5(含下载链接) 1.CityScapes数据集数据格式: 2.数据处理 3.CityScapes数据集转VOC格式转换代码 CityScape ...

  8. 目标检测数据集-Pascal VOC 数据集介绍

    个人微信公众号:AI研习图书馆 ID:(Art-Intelligence) 欢迎关注,交流学习,共同进步~ 1.引言 PASCAL VOC数据集,为图像识别和分类提供了一整套标准化的优秀数据集,从20 ...

  9. 将数据集转换为VOC格式

    xml文件操作 方式一 import sysimport timeimport stringfrom lxml import etree#设置默认字符集为UTF8 不然有些时候转码会出问题defaul ...

最新文章

  1. 满12万送Mate 30 Pro?华为云“双十一”20+款明星产品齐上线
  2. 独立云计算服务商的多维实践之道:用户需求驱动变革
  3. 『ExtJS』01 009. ExtJS 4 方法重载
  4. OCP 042全真试题讲解
  5. OpenGL坐标系转化之投影坐标系
  6. 逆元~(乘法逆元及其应用)
  7. 【读书笔记0103】Beginning linux programming-shell programming
  8. pascal voc数据集_【资源分享】数据集搜索神器BIFROST
  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(67)-MVC与ECharts
  10. 在苹果mac中使用excel时,如何快速求和多行数值?
  11. C语言实现巴特沃斯IIR滤波器
  12. Stored Outline
  13. 如何处理偶现的 Bug
  14. 信息安全方面优秀论文
  15. 关于ELF格式文件里面的调试信息解读
  16. Mstar Mac Phy 驱动学习
  17. Vue 数据双向绑定
  18. matlab对于图像压缩,Matlab的图像压缩技术
  19. 华为HCNP h12-221习题训练加解析(1-13)
  20. mac上php版本切换

热门文章

  1. 使用宝塔搭建环境,以及把自己本地的Web项目通过宝塔发布到远程云服务器上
  2. 反向比例运算电路微分关系_电气必备20个经典电路,老电工必看!
  3. 冒泡排序从左到右 从右到左方法实现(三种方法)
  4. 划一划新闻作手机端最简洁的新闻聚合网站
  5. 核心微生物分析_基因测序找出肠道核心微生物群
  6. Python编程:给定y和m,计算y年m月有多少天
  7. 为什么 MySQL 采用 B+ 树作为索引?
  8. 如何看待抖音被降权限流,该怎么挽回账号权重丨国仁网络资讯
  9. w7设置双显示器_win7系统设置双显示器的操作方法
  10. 基于PyQt5的简易计算器