No Description

Dimitri Korsch 468fb48222 added first guides how to use the wrapper 7 years ago
nabirds 0b206d68e4 modified uniform part creation. added functions for random part selection 7 years ago
.gitignore be1c417ac6 added a readme 7 years ago
Makefile caee5ce167 added make target for displaying the current version 7 years ago
README.md 468fb48222 added first guides how to use the wrapper 7 years ago
display.sh cb7abb8c97 removed example scripts. added display script, that replaces the example scripts 7 years ago
requirements.txt 83808eb9eb first version of the NA birds wrapper 7 years ago
setup.py 24ef9c4a34 added function for uniform sampling 7 years ago

README.md

NA-Birds dataset wrapper

For more deatils to see how to use this library take a look at nabirds/display.py.

Annotation and Image Loading

Here is some example code how to load images and use the predefined train-test split.

# replace NAB_Annotations with CUB_Annotations to load CUB200-2011 annotations
from nabirds import NAB_Annotations, Dataset

annot = NAB_Annotations("path/to/nab/folder")

train_data = Dataset(annot.train_uuids, annot)
test_data = Dataset(annot.test_uuids, annot)

print("Loaded {} training and {} test images".format(len(train_data), len(test_data)))

Dataset Iteration

import matplotlib.pyplot as plt

# either access the images directly
im, parts, label = test_data[100]
plt.imshow(im)
plt.show()

# or iterate over the dataset
for im, parts, label in train_data:
    plt.imshow(im)
    plt.show()

Working with Part Annotations

Both datasets (NAB and CUB) have part annotations. Each annotation has for each of the predefined parts the location of this part and a boolean (0 or 1) value whether this part is visible. A Dataset instance returns besides the image and the class label this information:


im, parts, label = train_data[100]

print(parts)
# array([[  0, 529, 304,   1],
#        [  1, 427, 277,   1],
#        [  2, 368, 323,   1],
#        [  3,   0,   0,   0],
#        [  4, 449, 292,   1],
#        [  5, 398, 502,   1],
#        [  6, 430, 398,   1],
#        [  7,   0,   0,   0],
#        [  8, 365, 751,   1],
#        [  9,   0,   0,   0],
#        [ 10,   0,   0,   0]])

In order to filter by only visible parts use the utils.visible_part_locs function. It returns the indices and the x-y positions of the visible parts:

idxs, xy = visible_part_locs(parts)
print(idxs)
# array([0, 1, 2, 4, 5, 6, 8])
print(xy)
# array([[529, 427, 368, 449, 398, 430, 365],
#        [304, 277, 323, 292, 502, 398, 751]])

x, y = xy
plt.imshow(im)
plt.scatter(x,y, marker="x", c=idxs)
plt.show()