Python读取VOC中的xml目标框实例


Posted in Python onMarch 10, 2020

代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# get annotation object bndbox location
import os
import cv2
try:
  import xml.etree.cElementTree as ET #解析xml的c语言版的模块
except ImportError:
  import xml.etree.ElementTree as ET
											     
##get object annotation bndbox loc start 
def GetAnnotBoxLoc(AnotPath):#AnotPath VOC标注文件路径
  tree = ET.ElementTree(file=AnotPath) #打开文件,解析成一棵树型结构
  root = tree.getroot()#获取树型结构的根
  ObjectSet=root.findall('object')#找到文件中所有含有object关键字的地方,这些地方含有标注目标
  ObjBndBoxSet={} #以目标类别为关键字,目标框为值组成的字典结构
  for Object in ObjectSet:
    ObjName=Object.find('name').text
    BndBox=Object.find('bndbox')
    x1 = int(BndBox.find('xmin').text)#-1 #-1是因为程序是按0作为起始位置的
    y1 = int(BndBox.find('ymin').text)#-1
    x2 = int(BndBox.find('xmax').text)#-1
    y2 = int(BndBox.find('ymax').text)#-1
    BndBoxLoc=[x1,y1,x2,y2]
    if ObjName in ObjBndBoxSet:
    	ObjBndBoxSet[ObjName].append(BndBoxLoc)#如果字典结构中含有这个类别了,那么这个目标框要追加到其值的末尾
    else:
    	ObjBndBoxSet[ObjName]=[BndBoxLoc]#如果字典结构中没有这个类别,那么这个目标框就直接赋值给其值吧
  return ObjBndBoxSet
##get object annotation bndbox loc end

def display(objBox,pic):
  img = cv2.imread(pic)
  
  for key in objBox.keys():
    for i in range(len(objBox[key])):
      cv2.rectangle(img, (objBox[key][i][0],objBox[key][i][1]), (objBox[key][i][2], objBox[key][i][3]), (0, 0, 255), 2)    
      cv2.putText(img, key, (objBox[key][i][0],objBox[key][i][1]), cv2.FONT_HERSHEY_COMPLEX, 1, (255,0,0), 1)
  cv2.imshow('img',img)
  cv2.imwrite('display.jpg',img)
  cv2.waitKey(0)


if __name__== '__main__':
  pic = r"./VOCdevkit/VOC2007/JPEGImages/000282.jpg"
  ObjBndBoxSet=GetAnnotBoxLoc(r"./VOCdevkit/VOC2007/Annotations/000282.xml")
  print(ObjBndBoxSet)
  display(ObjBndBoxSet,pic)

输出结果:

{'chair': [[335, 263, 484, 373]], 'person': [[327, 104, 476, 300], [232, 57, 357, 374], [3, 32, 199, 374], [58, 139, 296, 374]]}

图示:

Python读取VOC中的xml目标框实例

补充知识:使用python将voc类型标注xml文件对图片进行目标还原,以及批量裁剪特定类

使用标注工具如labelimg对图片物体进行voc类型标注,会生成xml文件,如何判断别人的数据集做的好不好,可以用以下代码进行目标还原。

import xml.etree.cElementTree as ET
import cv2
import os
import glob

def GetAnnotBoxLoc(AnotPath):
  tree = ET.ElementTree(file=AnotPath)
  root = tree.getroot()
  ObjectSet=root.findall('object')
  ObjBndBoxSet={} 
  for Object in ObjectSet:
    ObjName=Object.find('name').text
    BndBox=Object.find('bndbox')
    x1 = int(BndBox.find('xmin').text)
    y1 = int(BndBox.find('ymin').text)
    x2 = int(BndBox.find('xmax').text)
    y2 = int(BndBox.find('ymax').text)
    BndBoxLoc=[x1,y1,x2,y2]
    if ObjName in ObjBndBoxSet:
    	ObjBndBoxSet[ObjName].append(BndBoxLoc)
    else:
    	ObjBndBoxSet[ObjName]=[BndBoxLoc]
  return ObjBndBoxSet

def GetAnnotName(AnotPath):
  tree = ET.ElementTree(file=AnotPath) 
  root = tree.getroot()
  path=root.find('path').text
  return path

def Drawpic(xml_path,result_path):
  n = 0
  xmls = glob.glob(os.path.join(xml_path, '*.xml'))
  for xml in xmls:
    n = n + 1
    box=GetAnnotBoxLoc(xml)
    path=GetAnnotName(xml)
    img = cv2.imread(path)
    for classes in list(box.keys()):
      for boxes in box[classes]:
        if classes == "bad1":
          cv2.rectangle(img,(int(boxes[0]),int(boxes[1])),(int(boxes[2]),int(boxes[3])),(255,0,0),3) #blue
        if classes == "bad2":
          cv2.rectangle(img,(int(boxes[0]),int(boxes[1])),(int(boxes[2]),int(boxes[3])),(0,255,0),3) #green
        if classes == "bad3":
          cv2.rectangle(img,(int(boxes[0]),int(boxes[1])),(int(boxes[2]),int(boxes[3])),(0,0,255),3) #red
    cv2.imwrite(result_path+"/"+str(n)+"_result.jpg", img)
    print(path,"还原成功")

Drawpic("/home/wxy/Dashboard/dataset/VOCdevkit/VOC2012/Annotations","/home/wxy/Dashboard/dataset/VOCdevkit/VOC2012/test")

使用labelimg对图像进行标注,folder目录需要修改一下

import xml.etree.ElementTree as ET
import os

for i in os.listdir('/home/wxy/Dashboard/dataset/VOCdevkit/VOC2012/Annotations'):
  tree = ET.parse('/home/wxy/Dashboard/dataset/VOCdevkit/VOC2012/Annotations'+'/'+i)
  root = tree.getroot()
  print(root.find('folder').text)
  root.find('folder').text = 'VOC2012'
  print(root.find('folder').text)
  tree.write('/home/wxy/Dashboard/dataset/VOCdevkit/VOC2012/Annotations'+'/'+i)

批量裁剪特定类,xml.dom.minidom好像比xml.etree.cElementTree好用啊。

#coding=utf-8
import xml.dom.minidom
import cv2
import os

for name in os.listdir("./Annotations/"):
  dom=xml.dom.minidom.parse("./Annotations/"+name)
  root=dom.documentElement
  object_name=root.getElementsByTagName('name')
  if(object_name[0].firstChild.data == "normal"):
    print(name)
    xmin=root.getElementsByTagName('xmin')
    ymin=root.getElementsByTagName('ymin')
    xmax=root.getElementsByTagName('xmax')
    ymax=root.getElementsByTagName('ymax')

    x_min = int(xmin[0].firstChild.data)
    y_min = int(ymin[0].firstChild.data)
    x_max = int(xmax[0].firstChild.data)
    y_max = int(ymax[0].firstChild.data)

    img=cv2.imread("./JPEGImages/"+name[:-4]+".jpg")
    cropped=img[y_min:y_max,x_min:x_max]
    cv2.imwrite("./cut_jpg/"+name[:-4]+".jpg", cropped)

以上这篇Python读取VOC中的xml目标框实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
tensorflow建立一个简单的神经网络的方法
Feb 10 Python
Python堆排序原理与实现方法详解
May 11 Python
Django 连接sql server数据库的方法
Jun 30 Python
pycharm 批量修改变量名称的方法
Aug 01 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
Aug 07 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
Aug 12 Python
python生成随机红包的实例写法
Sep 02 Python
Window10下python3.7 安装与卸载教程图解
Sep 30 Python
python3连接kafka模块pykafka生产者简单封装代码
Dec 23 Python
浅谈对pytroch中torch.autograd.backward的思考
Dec 27 Python
Python写出新冠状病毒确诊人数地图的方法
Feb 12 Python
Python使用进程Process模块管理资源
Mar 05 Python
Python 读取xml数据,cv2裁剪图片实例
Mar 10 #Python
python代码xml转txt实例
Mar 10 #Python
Python切割图片成九宫格的示例代码
Mar 10 #Python
pycharm设置python文件模板信息过程图解
Mar 10 #Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
Mar 10 #Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
Mar 10 #Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
Mar 10 #Python
You might like
基于php下载文件的详解
2013/06/02 PHP
php生成缩略图示例代码分享(使用gd库实现)
2014/01/20 PHP
PHP实现微信公众平台音乐点播
2014/03/20 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
PHP闭包定义与使用简单示例
2018/04/13 PHP
Yii框架中使用PHPExcel的方法分析
2019/07/25 PHP
laravel 字段格式化 modle 字段类型转换方法
2019/09/30 PHP
javascript 动态数据下的锚点错位问题解决方法
2008/12/24 Javascript
jQuery-ui中自动完成实现方法
2010/06/10 Javascript
jQuery(非HTML5)可编辑表格实现代码
2012/12/11 Javascript
js实现屏蔽默认快捷键调用自定义事件示例
2013/06/18 Javascript
node.js中的fs.lchownSync方法使用说明
2014/12/16 Javascript
jQuery实现按键盘方向键翻页特效
2015/03/18 Javascript
JS实现可展开折叠层的鼠标拖曳效果
2015/10/09 Javascript
详解JavaScript的AngularJS框架中的作用域与数据绑定
2016/03/04 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
2016/10/04 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
利用vue重构有赞商城的思路以及总结整理
2019/02/21 Javascript
javascript数组元素删除方法delete和splice解析
2019/12/09 Javascript
python 类对象和实例对象动态添加方法(分享)
2017/12/31 Python
Python如何把十进制数转换成ip地址
2020/05/25 Python
python 爬取英雄联盟皮肤并下载的示例
2020/12/04 Python
REN Clean Skincare官网:英国本土有机护肤品牌
2019/02/23 全球购物
Bath & Body Works阿联酋:在线购买沐浴和身体用品
2021/02/27 全球购物
品管员岗位职责
2013/11/10 职场文书
大学生蛋糕店创业计划书
2014/01/13 职场文书
爱岗敬业演讲稿范文
2014/01/14 职场文书
求职信的最佳写作思路
2014/02/01 职场文书
二年级语文教学反思
2014/02/02 职场文书
业务员的岗位职责
2014/03/15 职场文书
程序员求职信
2014/04/16 职场文书
书香家庭事迹材料
2014/05/09 职场文书
于丹讲座视频观后感
2015/06/15 职场文书
2016年优秀班主任先进事迹材料
2016/02/26 职场文书
2019销售早会主持词
2019/06/27 职场文书
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python