チュートリアル2 : pythonでアノテーションした画像を読み込む

このページではanntでアノテーションした画像をpythonで読み込む方法を紹介します

事前準備

1. このチュートリアルではpython3.6を使って作業を行います。まずはpipからanntのライブラリをインストールします。

pip install annt

2. 次にアノテーションされたファイル類が存在しているかを確認します。 まだアノテーション作業を行っていない場合にはチュートリアル1を参考にアノテーション作業をしてください。

読み込み処理の実装

早速アノテーションした画像を読み込んでみましょう。project_nameには読み込むプロジェクト名を入れてください。

import annt

# annotations is list of annotation data
filepath = "./Dropbox/アプリ/{project_bame}"
annotations = annt.load(filepath)

上のスクリプトではプロジェクトから画像などの情報を読みこんでannotationsに格納しています。 annotationsは画像の情報を返すジェネレーターです。 for文などを用いて画像データをAnnotationオブジェクトとして一つづつ取り出すことができます。

AnnotationオブジェクトとBoxオブジェクト

1. Annotationオブジェクトは画像データとアノテーション情報を保持し、それらに関する基本的な操作を提供します。まずは読み込んだデータを表示してみましょう。 表示するにはshowプロパティを使用します。正しく動いていれば下の例のように画像とバウンディングボックスの情報が表示されます。

for annotation in annotations:
    annotation.show()

2. 次にAnnotationオブジェクトが持つプロパティを確認しましょう。 imageプロパティにはnumpyの配列として読み込まれた画像が格納されています。 boxesプロパティには次の項で説明するBoxオブジェクトのリストが格納されています。 バウンディングボックス情報のタグや位置情報はこのBoxオブジェクトに格納されています。

for annotation in annotations:
    image = annotation.image
    print(type(image))  # => 'numpy.ndarray'

    boxes = annotation.boxes
    print(type(boxes))  # => 'list'
    print(type(boxes[0]))  # => 'annt.main.Box'

3. 次はBoxオブジェクトの中身を確認してみましょう。Boxオブジェクトはバウンディングボックス1個のタグと位置情報を格納しています。 Boxオブジェクトは2通りの座標形式でデータにアクセスできます。 まずはx, y, h, w形式です。 これはバウンディングボックス左上の位置x, yと バウンディングボックスの幅と高さの情報h, wを用いて表現する方法です。

for annotation in annotations:
    for box in annotation.boxes:
        f = "xy: {}-{}, wh: {}-{}"
        print(f.format(box.x, box.y, box.w, box.h))

もうひとつの形式は画像端からの距離で表現する方法です。 left, top, right, bottom, という4つのプロパティを用いて取得することができます。

for annotation in annotations:
    for box in annotation.boxes:
        f = "left-top-right-bottom: {}-{}-{}-{}"
        print(f.format(box.left, box.top, box.right, box.bottom))

どちらか片方の形式でこれらのプロパティを書き換えると、もう片方のプロパティも自動で計算しなおされます。

最後にタグの情報の取得です。タグの情報はtag プロパティで文字列として取得することができます。

for annotation in annotations:
    for box in annotation.boxes:
        print(type(box.tag))  # => str
        print(box.tag)  # => 'car'


次のステップ

チュートリアル3では回転やリサイズなどの前処理を行う方法を紹介します。