IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 目标检测: 数据集转换txt转为xml格式 -> 正文阅读

[人工智能]目标检测: 数据集转换txt转为xml格式

1.txt数据集格式

第1元素代表类别,第2,3表示目标框的中心位置,第4,5表示目标框的大小。

?请注意: xml 格式文件 目标物体是xmin ymin xmax ymax 描述位置信息,表示目标框的左上角和右下角的坐标,因此在写脚本的时候要注意转换。

2.xml数据集格式

3.转换代码?

# .txt-->.xml
# ! /usr/bin/python
# -*- coding:UTF-8 -*-
import os
import cv2

 
def txt_to_xml(txt_path,img_path,xml_path):
    dict = {'0': "organoid", #字典对类型进行转换
                '1': "car",
                '2': "bus",
                '3': "ufo",
                '4': "robot",
                '5': "virus",
                '6': "trunk",
                '7': "plash",
                '8': "biycle"}
    #找到txt标签文件
    files = os.listdir(txt_path)
    pre_img_name = '' 
    for i, name in enumerate(files):
        if name == "desktop.ini":
            continue
        print(name)
        #打开txt
        txtFile=open(txt_path+name)
        #读取所有内容
        txtList = txtFile.readlines()
        #读取图片
        img_name = name.split(".")[0]
        pic = cv2.imread(img_path+img_name+".jpg")
        #获取图像大小信息
        Pheight,Pwidth,Pdepth=pic.shape
        
        for row in txtList:
            #按' '分割txt的一行的内容
            oneline = row.strip().split(" ") 
            #遇到的是一张新图片
            if img_name != pre_img_name: 
                #非第一张图片,在上一个xml中写下</annotation>

                
                    #新建xml文件
                xml_file = open((xml_path + img_name + '.xml'), 'w')
                xml_file.write('<annotation>\n')
                xml_file.write('    <folder>VOC2007</folder>\n')
                xml_file.write('    <filename>' + img_name + '.jpg' + '</filename>\n')
                xml_file.write('<source>\n')
                xml_file.write('<database>orgaquant</database>\n')
                xml_file.write('<annotation>organoids</annotation>\n')
                xml_file.write('</source>\n')
                xml_file.write('    <size>\n')
                xml_file.write('        <width>' + str(Pwidth) + '</width>\n')
                xml_file.write('        <height>' + str(Pheight) + '</height>\n')
                xml_file.write('        <depth>' + str(Pdepth) + '</depth>\n')
                xml_file.write('    </size>\n')
                xml_file.write('    <object>\n')
                xml_file.write('<name>' + dict[oneline[0]] + '</name>\n')
                xml_file.write('        <bndbox>\n')
                xml_file.write('            <xmin>' + str(int(((float(oneline[1]))*Pwidth+1)-(float(oneline[3]))*0.5*Pwidth)) + '</xmin>\n')
                xml_file.write('            <ymin>' + str(int(((float(oneline[2]))*Pheight+1)-(float(oneline[4]))*0.5*Pheight)) + '</ymin>\n')
                xml_file.write('            <xmax>' + str(int(((float(oneline[1]))*Pwidth+1)+(float(oneline[3]))*0.5*Pwidth)) + '</xmax>\n')
                xml_file.write('            <ymax>' + str(int(((float(oneline[2]))*Pheight+1)+(float(oneline[4]))*0.5*Pheight)) + '</ymax>\n')
                xml_file.write('        </bndbox>\n')
                xml_file.write('    </object>\n')
                xml_file.close()
                pre_img_name = img_name 
            else:
                #同一张图片,只需要追加写入object
                xml_file = open((xml_path + img_name + '.xml'), 'a')
                xml_file.write('    <object>\n')
                xml_file.write('<name>'+dict[oneline[0]]+'</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(int(((float(oneline[1]))*Pwidth+1)-(float(oneline[3]))*0.5*Pwidth)) + '</xmin>\n')
                xml_file.write('            <ymin>' + str(int(((float(oneline[2]))*Pheight+1)-(float(oneline[4]))*0.5*Pheight)) + '</ymin>\n')
                xml_file.write('            <xmax>' + str(int(((float(oneline[1]))*Pwidth+1)+(float(oneline[3]))*0.5*Pwidth)) + '</xmax>\n')
                xml_file.write('            <ymax>' + str(int(((float(oneline[2]))*Pheight+1)+(float(oneline[4]))*0.5*Pheight)) + '</ymax>\n')
                xml_file.write('        </bndbox>\n')
                xml_file.write('    </object>\n')
                xml_file.close()
                pre_img_name = img_name
    
        #最后一个xml需要写入</annotation>
        xml_file1 = open((xml_path + pre_img_name + '.xml'), 'a')
        xml_file1.write('</annotation>')
        xml_file1.close()
    print("Done !")

#注意文件夹最后要加上/    
txt_to_xml("2/","1/","3/") 

4.根据xml标签分割出图像中的目标物体


import cv2
import xml.etree.ElementTree as ET
import numpy as np
 
import xml.dom.minidom
import os
import argparse
 
 
def main():
    # JPG文件的地址
    img_path = '1/'
    # XML文件的地址
    anno_path = '3/'
    # 存结果的文件夹
    cut_path = 'crops/'

    if not os.path.exists(cut_path):
        os.makedirs(cut_path)
    # 获取文件夹中的文件
    imagelist = os.listdir(img_path)
    # print(imagelist
    for image in imagelist:
        image_pre, ext = os.path.splitext(image)

        img_file = img_path + image
        img = cv2.imread(img_file)
        xml_file = anno_path + image_pre + '.xml'
        # DOMTree = xml.dom.minidom.parse(xml_file)
        # collection = DOMTree.documentElement
        # objects = collection.getElementsByTagName("object")
        print(xml_file)
        tree = ET.parse(xml_file)
        root = tree.getroot()
        # if root.find('object') == None:
        #     return
        obj_i = 0
        for obj in root.iter('object'):
            obj_i += 1
            print(obj_i)
            cls = obj.find('name').text
            xmlbox = obj.find('bndbox')
            b = [int(float(xmlbox.find('xmin').text)), int(float(xmlbox.find('ymin').text)),
                 int(float(xmlbox.find('xmax').text)),
                 int(float(xmlbox.find('ymax').text))]
            img_cut = img[b[1]:b[3], b[0]:b[2], :]
            path = os.path.join(cut_path, cls)
            # 目录是否存在,不存在则创建
            mkdirlambda = lambda x: os.makedirs(x) if not os.path.exists(x) else True
            mkdirlambda(path)
            try:
                cv2.imwrite(os.path.join(cut_path, cls, '{}_{:0>2d}.jpg'.format(image_pre, obj_i)), img_cut)
            except:
                continue
 
            print("&&&&")
 
 
if __name__ == '__main__':
    main()
 

5.效果展示

原图:

?分割后的图像:

?

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:22:47  更:2022-04-01 23:23:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 12:31:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码