将NWPU VHR-10数据集标注文件转换为voc2007格式的xml标注文件脚本

博主最近在做遥感图像的目标检测领域,在发现NWPU的数据集后,发现标注的内容可以进行转化为VOC格式的数据,故如此解决。如果是其他类型的txt文件,也可以参考我的代码进行改进转化为VOC2007格式。

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File    :   changeTxt.py    
@Version :   1.0 
@Author  :   2014Vee
@Contact :   3363663448@qq.com
@License :   (C)Copyright 2014Vee From UESTC
@Modify Time :   2020/3/15 22:29
@Desciption  :   生成固定格式的label数据,
按照https://github.com/eriklindernoren/PyTorch-YOLOv3/blob/master/data/custom/labels/train.txt要求
'''
# 生成txt文件格式:class_num x_center y_center weight height


import xml.etree.ElementTree as ET
import os
import cv2
xml_path = 'F:/BaiduYunDownload/faceData/train_xml/'
pic_path = 'F:/BaiduYunDownload/faceData/train/'
save_path = './labels/'
piclist = os.listdir(xml_path)
for xml in piclist:
    print(xml)
    tree = ET.parse( xml_path + xml)
    rect={}
    line=""
    root = tree.getroot()
    with open(save_path + xml[:-4] + '.txt', 'w', encoding='utf-8') as f1:
        # 路径信息
        for name in root.iter('path'):
            rect['path'] = name.text
        # 因为有的xml文件没有宽高字段信息所以直接读取jpg信息
        # for size in root.iter('size'):
        #     for width in size.iter('width'):
        #         rect['width'] = width.text
        #         print('width:', rect['width'])
        #     for height in size.iter('height'):
        #         rect['height'] = height.text
        #         print('height:', rect['height'])
        img = cv2.imread(pic_path+xml[:-4]+'.jpg')
        width = img.shape[1]
        height = img.shape[0]


        for ob in root.iter('object'):

            for bndbox in ob.iter('bndbox'):

                # 文本信息
                for t in ob.iter('name'):

                   if(t.text == 'face'):
                       f1.write('0' + ' ')
                   else:
                       f1.write('1' + ' ')

                # for l in bndbox:
                #     print(l.text)
                # 坐标信息
                for xmin in bndbox.iter('xmin'):
                   rect['xmin'] = xmin.text
                for ymin in bndbox.iter('ymin'):
                   rect['ymin'] = ymin.text
                for xmax in bndbox.iter('xmax'):
                   rect['xmax'] = xmax.text
                for ymax in bndbox.iter('ymax'):
                   rect['ymax'] = ymax.text
                xc = (int(rect['xmin']) + (int(rect['xmax']) - int(rect['xmin'])) / 2) / width
                yc = (int(rect['ymin']) + (int(rect['ymax']) - int(rect['ymin'])) / 2) / height
                wid = ((int(rect['xmax']) - int(rect['xmin']))/width)
                hei = ((int(rect['ymax']) - int(rect['ymin']))/height)
                print(str(xc)+' '+str(yc)+' '+str(wid)+' '+str(hei))
                line = str(xc)+' '+str(yc)+' '+str(wid)+' '+str(hei) + " "
                f1.write(line + '\n')

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值