先收藏了,目标检测处理数据的一些脚本

VOC格式的数据生成训练需要的train.txt和vla.txt
'''
txt存放图片名字
'''
def train_val():
    path  = 'data/VOCdevkit/VOC2007/Annotations'
    trainpath = 'data/VOCdevkit/VOC2007/ImageSets/Main/train.txt'
    valpath = 'data/VOCdevkit/VOC2007/ImageSets/Main/val.txt'

    with open(trainpath,'w') as train:
        for i in os.listdir(path):
            name = i.split('.')
            # print(name)
            train.writelines(name[0]+'\n')

    with open(valpath,'w') as val:
        for num,i in enumerate(os.listdir(path)):
            if num%4==0:
                name = i.split('.')
                # print(name)
                val.writelines(name[0]+'\n')
图片类型转化png转为jpg
def png_jpg(dirName):
    #图片存储路径
    # dirName = "G:\pict\\"
    #OS模块获取文件夹下的文件名
    D_list = os.listdir(dirName)
    #遍历
    for FileName in D_list:
        #分割文件名,索引改后缀
        NewName = FileName
        NewName = NewName.split('.')
        if NewName[-1] == 'png':
            NewName[-1] = 'jpg'
            #字符串拼接文件名
            NewName = str.join('.', NewName)
            Filename = dirName + FileName
            NewName = dirName + NewName
            #rename()方法
            os.rename(Filename, NewName)
            print(NewName, "修改成功!")
图片标签同时候重命名为A00000格式
def renamefile(xml_path,img_path,imgtype='.jpg'):
	'''
	传入需要重命名的图片标签路径
	'''
    A = os.listdir(xml_path)
    strs = 'A00000'
    k = 0
    for a in A:
        
        i = str(k)
        xml = strs[:-len(i)]+i+'.xml'
        img = strs[:-len(i)]+i+imgtype

        xmlname = os.path.join(xml_path,a)
        newxmlname = os.path.join(xml_path,xml)

        imgname = os.path.join(img_path,(a[:-4]+imgtype))
        newimgname = os.path.join(img_path,img)

        os.rename(xmlname,newxmlname)
        os.rename(imgname,newimgname)
        k+=1
删除标签xml为空的图片和标签文件
# 如果标签为空那么删除标签和对应的图片
def rm_none_obj(xmlpath,imgpath):
    for xml_name in os.listdir(xmlpath):
        filename = os.path.join(xml_path,xml_name)
        imgname = os.path.join(img_path,(xml_name[:-3]+'jpg'))
        tree = ET.parse(filename)
        objs = tree.findall('object')
        num_objs = len(objs)
        if num_objs == 0:
            print('-=-=-=-=-=',filename)
            os.remove(filename)
            os.remove(imgname)
坐标转化为偏移量
#坐标换成偏移量 0 x1,y1,x2,y2
def ScaleCovertor(width,height,xmin,ymin,xmax,ymax): 
    width = int(width)
    height = int(height)
    xmax = int(xmax)
    ymax = int(ymax)
    xmin = int(xmin)
    ymin = int(ymin)
    xp = str((xmin+xmax)/(2*width))
    yp = str((ymin+ymax)/(2*height))
    wp = str((xmax-xmin)/width)
    hp = str((ymax-ymin)/height)
    plist = [xp,yp,wp,hp]
    sp = ' '.join(plist)
    return plist
p = ScaleCovertor(1280,720,597,406,628,500)
根据txt存放的坐标生成xml文件
import os, sys
import glob
from PIL import Image

# imgname x1 y1 x2 y2 cls x11 y11 x22 y22 cls2
# imgname 

def onelines(label_txt,img_path,src_xml_dir):

    names = os.path.split(label_txt)[-1].split('.')[0]
    print(names)
    save_xml = os.path.join(src_xml_dir,names+'.xml')
    img_path = os.path.join(img_path,names+'.jpg')

    img = Image.open(img_path)
    width, height = img.size

    xml_file = open(save_xml, 'w')
    xml_file.write('<annotation>\n')
    xml_file.write('    <folder>MeData</folder>\n')
    xml_file.write('    <filename>' + names + '</filename>\n')
    xml_file.write('    <size>\n')
    xml_file.write('        <width>' + str(width) + '</width>\n')
    xml_file.write('        <height>' + str(height) + '</height>\n')
    xml_file.write('        <depth>3</depth>\n')
    xml_file.write('    </size>\n')

    for f in open(label_txt):
        # 取出 \n 再以空格分割起来
        spt = f.strip('\n').split(' ')
        xml_file.write('    <object>\n')
        xml_file.write('        <name>' + class_dict[spt[4]] + '</name>\n')
        xml_file.write('        <pose>Unspecified</pose>\n')
        xml_file.write('        <truncated>0</truncated>\n')
        xml_file.write('        <difficult>0</difficult>\n')
        xml_file.write('        <bndbox>\n')
        xml_file.write('            <xmin>' + str(spt[0]) + '</xmin>\n')
        xml_file.write('            <ymin>' + str(spt[1]) + '</ymin>\n')
        xml_file.write('            <xmax>' + str(spt[2]) + '</xmax>\n')
        xml_file.write('            <ymax>' + str(spt[3]) + '</ymax>\n')
        xml_file.write('        </bndbox>\n')
        xml_file.write('    </object>\n')
    xml_file.write('</annotation>')




if __name__ == "__main__":
	# 对应类别名称
    class_dict = {'0':'person','1':'head','2':'coat','3':'pants','4':'shoes'}

    path = '/home/sdkj/software/OpenLabeling/main/output/YOLO_darknet/'
    for txt in os.listdir(path):
        label_txt = os.path.join(path,txt)
        img_path = 'image_path/'
        src_xml_dir = 'save_xml_path/'
        onelines(label_txt,img_path,src_xml_dir)

根据xml获取坐标并且以txt文件存起来
def get_car(xml_path, name,save_txt_path,class_dict):
    save_txt_path = save_txt_path+name[:-3]+'txt'
    # image = cv2.imread(os.path.join(image_path,name[:-3]+'jpg'))
    filename = os.path.join(xml_path,name)
    print(filename)
    tree = ET.parse(filename)
    W = tree.find('size').find('width').text
    H = tree.find('size').find('height').text
    objs = tree.findall('object')
    with open(save_txt_path,'w+') as f:
        for ix, obj in enumerate(objs):
            bbox = obj.find('bndbox')
            ne = obj.find('name').text
            x1 = int(bbox.find('xmin').text) if int(bbox.find('xmin').text) > 0 else 0
            y1 = int(bbox.find('ymin').text) if int(bbox.find('ymin').text) > 0 else 0
            x2 = int(bbox.find('xmax').text) if int(bbox.find('xmax').text) > 0 else 0
            y2 = int(bbox.find('ymax').text) if int(bbox.find('ymax').text) > 0 else 0
            p = ScaleCovertor(W,H,x1,y1,x2,y2)
            sp = class_dict[ne]+' '+' '.join(p)
            f.writelines(sp+'\n')
        f.close()
# xml_path = 'xmlpath/'
# save_txt_path = 'savetxt/'
# 0:person,1:head,2:coat,3:pants,4:shoes
class_dict = {'person':'0','head':'1','coat':'2','pants':'3','shoes':'4'}
for xmlname in os.listdir(xml_path):
    get_car(xml_path,xmlname,save_txt_path,class_dict)
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值