使用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)
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VOC格式的XML文件包括对象的标注信息,可以使用以下代码将普通的XML文件转换为VOC格式的XML文件: ```python import os import xml.etree.ElementTree as ET def convert_voc(xml_path, save_path): # 打开xml文件 tree = ET.parse(xml_path) root = tree.getroot() # 创建XML文件 new_root = ET.Element('annotation') # 添加文件名 filename = ET.SubElement(new_root, 'filename') filename.text = os.path.basename(xml_path).split('.')[0] + '.jpg' # 添加标注信息 for obj in root.findall('object'): # 获取对象的名称 name = obj.find('name').text # 获取对象的位置信息 bbox = obj.find('bndbox') xmin = int(bbox.find('xmin').text) ymin = int(bbox.find('ymin').text) xmax = int(bbox.find('xmax').text) ymax = int(bbox.find('ymax').text) # 创建新的对象 new_obj = ET.SubElement(new_root, 'object') new_name = ET.SubElement(new_obj, 'name') new_name.text = name new_bbox = ET.SubElement(new_obj, 'bndbox') new_xmin = ET.SubElement(new_bbox, 'xmin') new_xmin.text = str(xmin) new_ymin = ET.SubElement(new_bbox, 'ymin') new_ymin.text = str(ymin) new_xmax = ET.SubElement(new_bbox, 'xmax') new_xmax.text = str(xmax) new_ymax = ET.SubElement(new_bbox, 'ymax') new_ymax.text = str(ymax) # 保存XML文件 new_tree = ET.ElementTree(new_root) new_tree.write(save_path) xml_path = 'example.xml' save_path = 'example_voc.xml' convert_voc(xml_path, save_path) ``` 在上面的代码中,`xml_path` 参数是需要转换的普通XML文件的路径,`save_path` 参数是转换后的VOC格式XML文件的保存路径。代码中,我们首先打开原始XML文件,然后创建一个新的XML文件,并将文件名添加到新的XML文件中。接下来,我们遍历原始XML文件中的每个对象,并获取对象的名称和位置信息。然后,我们将这些信息添加到新的XML文件中,并将其保存。注意,我们假设原始XML文件中的图像文件名与其对应的JPEG文件名相同,只是扩展名不同。因此,在保存VOC格式的XML文件时,我们将文件名更改为原始XML文件名的基础上加上'.jpg' 扩展名。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值