美文网首页
数据集-读取图片标注框和xml文件,生成txt文件

数据集-读取图片标注框和xml文件,生成txt文件

作者: 求索_700e | 来源:发表于2019-03-27 15:51 被阅读0次


作用:

          1. 读取图片和标注后的xml文件,将标注信息写到txt文件中。生成的txt文件在txt文件夹下面,可以直接用于yolo3等目标检测算法的训练。

            2. txt文件包含图片的路径,标注框的位置和大小,以及标注的类别。

            3. 分割标注的图片,可以用于行人属性识别。分割的图片保存在segmentation文件夹下。

数据集准备工作:

           1. 需要将数据集放在dataset路径下。

            2. Annotations存放的是xml文件,JPEGImages存放的是图片。

修改:需要针对需要进行适当的修改。下面进行说明:

第一:

class_tab={

"human":1  ##这个是类别,如果有多个类别,可以添加多条

}

第二:

params={"xml_prefix":"./dataset/Annotations/", ##这个是xml源文件的路径前缀,注意末尾要有“/”

        "img_prefix":"./dataset/JPEGImages/",##这个是图片源文件的路径前缀,注意末尾要有“/”

        "seg_prefix":"./segmentation/",##这个是分割后图片存放的位置前缀,注意末尾要有“/”

      }

第三:

f = open('./txt/train.txt','a')##这个是生成的txt文件的路径。

                               下面附上所有源码

第一: main.py

import sys

#sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')

import cv2

import os

from readxml import *

class_tab={

"humanimport sys

#sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')

import cv2

import os

from readxml import *

class_tab={

"human":1

}

params={"xml_prefix":"./dataset/Annotations/",

        "img_prefix":"./dataset/JPEGImages/",

        "seg_prefix":"./segmentation/",

      }

def write_line(f, img_path, boxes):

    f.write("%s "%(img_path))

    for box in boxes:

      f.write(str(box['cls'])+",")

      f.write(str(box['xmin']+","))

      f.write(str(box['ymin']+","))

      f.write(str(box['xmax']+","))

      f.write(str(box['ymax']))

      f.write(" ")

    f.write("\n")

    f.flush()

def segment(img_path, imgname, boxes):

    img=cv2.imread(img_path, cv2.IMREAD_COLOR)

    cnt=0

    for box in boxes:

          seg=img[int(box['ymin']):int(box["ymax"]), int(box["xmin"]):int(box["xmax"]),:]

          cv2.imwrite(params["seg_prefix"]+imgname+"_"+str(cnt)+".jpg", seg)

          cnt=cnt+1

def main():

    f = open('./txt/train.txt','a')

    img_list=os.listdir(params["img_prefix"])

    for il in img_list:

        img_path=params["img_prefix"]+il

        tokens=il.split(".")

        xml_path=params["xml_prefix"]+tokens[0]+".xml"

        if os.path.isfile(img_path)==False:

            raise ValueError("%s does not exits!"%img_path)

        else:

            print("reading:", img_path)

            boxes=xml_reader(xml_path, class_tab)

            write_line(f,img_path,boxes)

            segment(img_path, tokens[0], boxes)

    f.close()

if __name__ == '__main__':

    main()

":1

}

params={"xml_prefix":"./dataset/Annotations/",

        "img_prefix":"./dataset/JPEGImages/",

        "seg_prefix":"./segmentation/",

      }

def write_line(f, img_path, boxes):

    f.write("%s "%(img_path))

    for box in boxes:

      f.write(str(box['cls'])+",")

      f.write(str(box['xmin']+","))

      f.write(str(box['ymin']+","))

      f.write(str(box['xmax']+","))

      f.write(str(box['ymax']))

      f.write(" ")

    f.write("\n")

    f.flush()

def segment(img_path, imgname, boxes):

    img=cv2.imread(img_path, cv2.IMREAD_COLOR)

    cnt=0

    for box in boxes:

          seg=img[int(box['ymin']):int(box["ymax"]), int(box["xmin"]):int(box["xmax"]),:]

          cv2.imwrite(params["seg_prefix"]+imgname+"_"+str(cnt)+".jpg", seg)

          cnt=cnt+1

def main():

    f = open('./txt/train.txt','a')

    img_list=os.listdir(params["img_prefix"])

    for il in img_list:

        img_path=params["img_prefix"]+il

        tokens=il.split(".")

        xml_path=params["xml_prefix"]+tokens[0]+".xml"

        if os.path.isfile(img_path)==False:

            raise ValueError("%s does not exits!"%img_path)

        else:

            print("reading:", img_path)

            boxes=xml_reader(xml_path, class_tab)

            write_line(f,img_path,boxes)

            segment(img_path, tokens[0], boxes)

    f.close()

if __name__ == '__main__':

    main()


第二:readxml.py

from xml.dom.minidom import Document

import xml.etree.ElementTree as ET

def xml_reader(fname, cls_tab):###, classes_merge_list,classes_merged_name):

    in_file = open(fname)

    tree=ET.parse(in_file)

    root = tree.getroot()

    boxes=[]

    for item in root.iter('item'):

        cls = item.find('name').text

        if cls in cls_tab:

            bndbox = item.find('bndbox')

            b={

                "xmin": str(int(bndbox.find('xmin').text)),

                "ymin": str(int(bndbox.find('ymin').text)),

                "xmax": str(int(bndbox.find('xmax').text)),

                "ymax": str(int(bndbox.find('ymax').text)),

                "cls": cls_tab[cls]

                }

            boxes.append(b)

        else:

            continue

    return boxes

if __name__ == '__main__':

  cls_tab={"human":1}

  fname="/home/ta/Downloads/liqiming_label/dataset/Annotations/sa341.xml"

  box=xml_reader(fname, cls_tab)

  print(box)

相关文章

网友评论

      本文标题:数据集-读取图片标注框和xml文件,生成txt文件

      本文链接:https://www.haomeiwen.com/subject/xhizvqtx.html