最近由于项目需要想把Object Detection数据集中的bounding box抠出来(这里其实是想偷个懒,本来应该是将segmentation扣取,后面发现bounding box不行,只能换成segmentation,这是后话了)
但是发现这种通用性这么广的数据集居然网上没用现成直接可用的代码,没办法,只能自行写。
好了,废话不多说,直接上代码吧

import os
import cv2
import xml.etree.ElementTree as ET
from tqdm import tqdmclasses = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat","chair", "cow", "diningtable", "dog", "horse", "motorbike", "person","pottedplant", "sheep", "sofa", "train", "tvmonitor"]
# 这里的Ori_Path表示原始VOC数据集的位置,需要自行更改
Ori_Path = './VOC2012/'
# 这里的Save_Path表示把boundingbox分割之后保存的图像,也是需要自行更改的
Save_Path = './Cut_image/'# 生成每个类别的文件夹
def make_class_Dir():for cls in classes:path = Save_Path + clsif not os.path.exists(path):os.mkdir(path)# 定义一个boundingbox切割的函数,把boundingbox区域分割
def image_cut(path, bbox, save_path):img = cv2.imread(path, flags=cv2.IMREAD_COLOR)cut_image = img[bbox[1]:bbox[1]+bbox[3], bbox[0]:bbox[0]+bbox[2]]cv2.imwrite(save_path, cut_image)# 从xml文件中读取boundingbox的具体信息
def Get_bbox_from_xml(xml_path):global xmin, ymin, xmax, ymaxetree = ET.parse(xml_path)root = etree.getroot()for filename in root.iter('filename'):img_name = filename.textimg_path = Ori_Path + 'JPEGImages/' + img_nameprint(img_path)for obj in root.iter('object'):for cls in obj.iter('name'):save_path = Save_Path + cls.text + '/' + img_name# 从每一个object中分别找到xmin,ymin,xmax,ymaxfor position in obj.iter(('xmin')):xmin = int(float(position.text))for position in obj.iter(('ymin')):ymin = int(float(position.text))for position in obj.iter(('xmax')):xmax = int(float(position.text))for position in obj.iter(('ymax')):ymax = int(float(position.text))image_cut(img_path, (xmin, ymin, xmax, ymax), save_path)if __name__ == '__main__':make_class_Dir()这里的path表示VOC2012数据集中的放xml文件的目录path = './VOC2012/Annotations/'xml_files = os.listdir(path)for xml in tqdm(xml_files):xml_path = path + xml# print(xml_path)# xxx = xml.dom.minidom.parse(xml_path)Get_bbox_from_xml(xml_path)

直接运行上面的代码就可以了,注意一下,上面找xmin, ymin, xmax, ymax的地方有一个坑,就是VOC2012的数据集中不同年份标注的xmin, ymin, xmax, ymax顺序是不一样,注意不要直接想当然是xmin, ymin, xmax, ymax的顺序(这是我在网上看的别人其他人时发现的问题)。

这是2007开头xml的写法,是xmin、ymin、xmax、ymax的顺序

<object><name>tvmonitor</name><pose>Frontal</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>251</xmin><ymin>28</ymin><xmax>475</xmax><ymax>267</ymax></bndbox></object>

这是2009开头xml的写法,是xmax、xmin、ymax、ymin的顺序

<object><name>car</name><bndbox><xmax>458</xmax><xmin>260</xmin><ymax>92</ymax><ymin>29</ymin></bndbox><difficult>0</difficult><occluded>0</occluded><pose>Right</pose><truncated>0</truncated></object>

从VOC数据集中把boundingbox截取出来相关推荐

  1. Ubuntu 16.04下Caffe-SSD的应用(五)——安装VOC数据标注工具LabelImag

    前言 1.LabelImg是一款开源的图像标注工具,有操作图形界面,可以很方便创建自己的数据集,LabelImg标注生成的 XML 文件是遵循 PASCAL VOC数据 格式的.可以用于做SSD目标检 ...

  2. linux下caffe-ssd在cuda10+python3.6下编译,训练VOC数据集和测试

    简介 之前源码编译安装了caffe,但是对于caffe-ssd依旧需要编译安装 . 个人环境 Ubuntu18.04, python3.6 CUDA 10.0, cuDNN 7.6.3 opencv3 ...

  3. go golang 判断base64数据 获取随机字符串 截取字符串

    go golang 判断base64数据 获取随机字符串 截取字符串 先少写点,占个坑,以后接着加. 1,获取指定长度随机字符串 func RandomDigits(length int) strin ...

  4. VOC数据增强与调整大小

    数据增强是针对数据集图像数量太少所采取的一种方法. 博主在实验过程中,使用自己的数据集时发现其数据量过少,只有280张,因此便想到使用数据增强的方式来获取更多的图像信息.对于图像数据,我们可以采用旋转 ...

  5. voc数据集和标签同时增强,增加下雪、下雨、加雾天气状况扩充数据集,附其他博主yolo和voc格式互相转换

    效果 下雪.下雨和雾化可以根据参数自行调整   在博主原有的基础上,考虑自身数据集实际情况,对其添加了天气状况,增强数据集鲁棒性 核心已注释 voc和yolo转换直接抄某博主的,找不到链接,见谅 数据 ...

  6. 按时间取天和月的数据,和字符串截取函数

    --取本月的数据,但是今天数据除外      SELECT   *      FROM  coustomertable      WHERE  TO_CHAR (sb_date, 'mm') = TO ...

  7. Python解析VOC数据标签文件

    导读 在目标检测数据集中我们经常会使用到VOC格式的数据,这篇文章就向大家介绍一下如何来解析xml标签文件的数据 xml数据 <annotation><folder>/root ...

  8. 数据加工:Sql截取之间的字符串的方法

    这个查询需要注意的是qwer后的需要查询的字符串必须是一个空格,不能有的是一个空格有的是两个.也就是格式要固定.LTrim() 删除左侧空格:CharIndex() 查找指定字符串所在的索引值:len ...

  9. JQuery Datatables单元格内显示数据太长,截取部分显示功能

    //初始化表格 var oTable = $("#example").DataTable({ajax: {url: "dataList.action",data ...

最新文章

  1. 134人!国家重点研发计划“生物大分子与微生物组”重点专项会评专家名单
  2. Python pandas dataframe 分组聚合时,分组组名并入列的方法
  3. bootstrap全局css样式
  4. leetcode 55. 跳跃游戏 思考分析
  5. 仙岛求药(信息学奥赛一本通-T1251)
  6. mysql空间数据类型解释_MySQL空间数据类型
  7. 记录一次不同接口之间并发导致的生产问题
  8. Java语言String字符串课后作业
  9. 回忆大学到现在为止学到了什么?
  10. 邮件发送JS脚本传播敲诈者木马的分析报告
  11. 电子料盘 电容 物料标识识别
  12. SNPS IP LPDDR4 调试
  13. 电脑上的歌曲怎么传到苹果手机上面,怎么把电脑上的歌导入苹果手机
  14. avr 74hc595驱动数码管动态显示c语言例程,一种电梯钢丝绳张力计控制系统软件的设计...
  15. ABAP 身份证校验的函数
  16. 是地价决定房价还是房价决定地价
  17. logo计算机编程简单指令,pc logo 基本绘图命令
  18. ins的更新带来的一系列问题
  19. 内核网络接口层的实现
  20. 金链盟中国区块链应用大赛正式启动,200万奖金将花落谁家?

热门文章

  1. MongoDB 3.0副本集配置
  2. 基于Flask的微电影管理1(项目结构、引入蓝图)
  3. java雪花纷飞_android 实现漫天飞舞雪花以及下雨天的效果
  4. linux未来_使用Linux将汽车推向未来
  5. 布局的神---网格布局最全总结,建议点赞收藏
  6. 解决Android闪退的坑
  7. linux centos7安装显卡驱动,CentOS 7中安装Nvidia GTX1080显卡驱动的方法
  8. 3.Spatially Attentive Output Layer for Image Classification 论文阅读
  9. awk命令用法及编程
  10. 保姆级教程:Linux(Ubuntu 18.04)下VSCode配置与嵌入式开发平台X2000_Halley5调试环境搭建