Skip to content

For generating Pascal VOC XML image annotation files. Supports polygon & bounding-boxes.

License

Notifications You must be signed in to change notification settings

EvitanRelta/polygon-pascalvoc-writer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Polygon Pascal VOC Writer

Simple python module to generate Pascal VOC XML image annotation files.

  • currently supports polygons & bounding-boxes
  • automatically detects image size

Improved upon AndrewCarterUK's Pascal VOC Writer.


Installation

$ pip install polygon-pascalvoc-writer

Importing:

from polygon_pascalvoc_writer import VocWriter

Table of Contents


Example Execution

For a single image

Write annotation for myImage.png (width: 100, height: 150) :

from polygon_pascalvoc_writer import VocWriter

images_dir = "dir/images/"
annotations_dir = "dir/annotations/"
image_name = "myImage.png"
writer = VocWriter(images_dir, annotations_dir, image_name)

# Rectangular bounding box
box_name = "myLabelBox"
xmin, ymin, xmax, ymax = 1, 2, 3, 4
writer.addBndBox(box_name, xmin, ymin, xmax, ymax)

# 1st polygon
polygon_1_name = "myPolygon"
vertices_1 = [
    [1, 2],
    [3, 4],
    [5, 6]
]
writer.addPolygon(polygon_1_name, vertices_1)

# 2nd polygon
polygon_2_name = "myPolygon"
vertices_2 = [
    [10, 20],
    [30, 40],
    [50, 60]
]
writer.addPolygon(polygon_2_name, vertices_2)

# Write to XML file in VOC format
writer.save()

Output file, dir/annotation/myImage.xml :

<annotation>
    <folder>images</folder>    
    <filename>myImage.png</filename>
    <path>absolutePathTo/dir/images/myImage.png</path>
    <source>
        <database>Unknown</database>
    </source>
    <size>
        <width>100</width>
        <height>150</height>
        <depth>3</depth>
    </size>
    <segmented>0</segmented>
    <object>
        <name>myLabelBox</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>1</xmin>
            <ymin>2</ymin>
            <xmax>3</xmax>
            <ymax>4</ymax>
        </bndbox>
    </object>
    <object>
        <name>myPolygon</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <polygon>
            <x1>1</x1>
            <y1>2</y1>
            <x2>3</x2>
            <y2>4</y2>
            <x3>5</x3>
            <y3>6</y3>
        </polygon>
        <bndbox>
            <xmin>1</xmin>
            <ymin>2</ymin>
            <xmax>5</xmax>
            <ymax>6</ymax>
        </bndbox>
    </object>
    <object>
        <name>myPolygon</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <polygon>
            <x1>10</x1>
            <y1>20</y1>
            <x2>30</x2>
            <y2>40</y2>
            <x3>50</x3>
            <y3>60</y3>
        </polygon>
        <bndbox>
            <xmin>10</xmin>
            <ymin>20</ymin>
            <xmax>50</xmax>
            <ymax>60</ymax>
        </bndbox>
    </object>
</annotation>

For a folder of images

Write annotation for image1.png and image2.png :

from polygon_pascalvoc_writer import VocWriter

images_dir = "dir/images/"
annotations_dir = "dir/annotations/"
writer = VocWriter(images_dir, annotations_dir, "")

list_of_annotations = [
    {
        "image_name": "image1.png",
        "polygons": [
            [
                [1, 2],
                [3, 4],
                [5, 6]
            ],
            [
                [10, 20],
                [30, 40],
                [50, 60]
            ]
        ]
    },
    {
        "image_name": "image2.png",
        "polygons": [
            [
                [7, 8],
                [9, 10],
                [11, 12]
            ],
            [
                [70, 80],
                [90, 100],
                [110, 120]
            ]
        ]
    }
]
for annotation in list_of_annotations:
    # Clears unsaved polygons/boxes, and
    # sets working-image to image matching annotation["image_name"].
    writer.nextImage(annotation["image_name"])  
    
    for polygon_vertices in annotation["polygons"]:
        writer.addPolygon("polygon_name", polygon_vertices)

    # Write to XML file in VOC format
    writer.save()

Resulting directories:

dir
├── images
|   ├── image1.png
|   └── image2.png
└── annotations
    ├── image1.xml
    ├── image2.xml