Skip to main content

For generating Pascal VOC XML image annotation files

Project description

Polygon Pascal VOC Writer

A simple python module to generate Pascal VOC XML image annotation files.
Currently only supports bounding-boxes and polygons.

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

back to Contents

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

back to Contents

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 the label data, then sets the image with
    # name matching annotation["image_name"] as the current working image.
    # Doesn't save the label data. Saving is done by writer.save()
    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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

polygon-pascalvoc-writer-1.0.5.tar.gz (4.5 kB view details)

Uploaded Source

Built Distribution

polygon_pascalvoc_writer-1.0.5-py2.py3-none-any.whl (5.5 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file polygon-pascalvoc-writer-1.0.5.tar.gz.

File metadata

  • Download URL: polygon-pascalvoc-writer-1.0.5.tar.gz
  • Upload date:
  • Size: 4.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.62.3 importlib-metadata/4.11.1 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.7.12

File hashes

Hashes for polygon-pascalvoc-writer-1.0.5.tar.gz
Algorithm Hash digest
SHA256 25fa23bd5ae09304a26dc3953a6a9069dc0df9c0b49cab52ba1f5c7e19f9aacb
MD5 0cbde29088624bc6b8eac1a679925d5a
BLAKE2b-256 837bda7c21ca60d946ae58142a687adc9ec8f793409ff5616c57151a2a192b63

See more details on using hashes here.

File details

Details for the file polygon_pascalvoc_writer-1.0.5-py2.py3-none-any.whl.

File metadata

  • Download URL: polygon_pascalvoc_writer-1.0.5-py2.py3-none-any.whl
  • Upload date:
  • Size: 5.5 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.62.3 importlib-metadata/4.11.1 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.7.12

File hashes

Hashes for polygon_pascalvoc_writer-1.0.5-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 4d8cff1966f12d5b9b299af6cc108933f02972ba787bd045d35591d424eef0e9
MD5 2ffabf55b469a0ebf74a58625d99c7a5
BLAKE2b-256 3cae48e750d859d6d259cfc2b925f4a7f28ac832ed4922f0f685261cff5c8978

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page