アノテーション済みデータのアップロード

公開されているベンチマークデータセットや、過去にアノテーションしたデータをABEJA Platformにアップロードする手順について説明します。

事前準備

Datalakeチャンネルの作成とデータのアップロード

まず、Datalakeチャンネルを作成します。

from abeja.datalake import Client as DatalakeClient
from abeja.datalake.storage_type import StorageType

ABEJA_ORGANIZATION_ID = 'XXXXXXXXXXXXXX'
ABEJA_PLATFORM_USER_ID = 'XXXXXXXXXXXXXX'
ABEJA_PLATFORM_TOKEN = 'XXXXXXXXXXXXXX'

credential = {
    'user_id': ABEJA_PLATFORM_USER_ID,
    'personal_access_token': ABEJA_PLATFORM_TOKEN
}

datalake_client = DatalakeClient(organization_id=ABEJA_ORGANIZATION_ID, credential=credential)

name = 'XXXXXXXXXXXXXXXXXXX'
description = 'XXXXXXXXXXXXXXXXXXXXXXX'

channel = datalake_client.channels.create(name, description, StorageType.DATALAKE.value)

次に、データをアップロードします。

channel = datalake_client.get_channel(channel.channel_id)
file = channel.upload_file('cat.jpg')

Datasetの作成(Classification編)

Datasetの箱は以下のように作成します。最初にスキーマ(クラスの情報)を定義します。ここでは、dog/catの2クラスの分類問題とします。マルチクラス分類の場合は、categoriesのリストに複数のカテゴリを追加します。

from abeja.datasets import Client as DatasetClient
datasets_client = DatasetClient(organization_id=organization_id, credential=credential)

labels = [{"label_id": 0, "label": "dog"}, {"label_id": 1, "label": "cat"}]
category = {'labels': labels, 'category_id': 0, 'name': 'cats_dogs'}
props = {"categories": [category]}

dataset = datasets_client.datasets.create(name='XXXXXXXXXXXXX', type='classification', props=props)

アノテーションデータは以下のようにアップロードします。

source_data = [
    {
        'data_type': 'image/jpeg',
        'data_uri': 'datalake://{}/{}'.format(channel.channel_id, file.file_id),
    }
]

data = {
    'category_id': 0,
    'label_id': 1
}
attributes = {'classification': [data]}

dataset_item = dataset.dataset_items.create(source_data=source_data, attributes=attributes)

Datasetの作成(Detection編)

Detectionの場合は、以下のようになります。スキーマとしては先ほどと同様に犬と猫の2値分類とします。typedetectionに変更します。

from abeja.datasets import Client as DatasetClient
datasets_client = DatasetClient(organization_id=organization_id, credential=credential)

labels = [{"label_id": 0, "label": "dog"}, {"label_id": 1, "label": "cat"}]
category = {'labels': labels, 'category_id': 0, 'name': 'cats_dogs'}
props = {"categories": [category]}

dataset = datasets_client.datasets.create(name='XXXXXXXXXXXXX', type='detection', props=props)

アノテーションデータは以下のようにアップロードします。

source_data = [
    {
        'data_type': 'image/jpeg',
        'data_uri': 'datalake://{}/{}'.format(channel.channel_id, file.file_id),
    }
]

rect = {'xmin': 200, 'ymin': 0, 'xmax': 1000, 'ymax': 900}
det1 = {
    'category_id': 0,
    'label_id': 1,
    'rect': rect
}
attributes = {'detection': [det1]}

dataset_item = dataset.dataset_items.create(source_data=source_data, attributes=attributes)

Datasetの作成(Custom編)

Classification/Detectionだけではなく、自由な形式のアノテーションを利用できます。この場合、typecustomにします。

from abeja.datasets import Client as DatasetClient
datasets_client = DatasetClient(organization_id=organization_id, credential=credential)

labels = [{"label_id": 0, "label": "dog"}, {"label_id": 1, "label": "cat"}]
category = {'labels': labels, 'category_id': 0, 'name': 'cats_dogs'}
props = {"categories": [category]}

dataset = datasets_client.datasets.create(name='XXXXXXXXXXXXX', type='custom', props=props)

アノテーションデータは以下のようにアップロードします。

source_data = [
    {
        'data_type': 'image/jpeg',
        'data_uri': 'datalake://{}/{}'.format(channel.channel_id, file.file_id),
    }
]
d = {
    'category_id': 0,
    'label_id': 1,
    'text': 'nyaan'
}
attributes = {'custom': [d]}
dataset_item = dataset.dataset_items.create(source_data=source_data, attributes=attributes)

データの確認

最後にアップロードしたデータを確認してみましょう。

from abeja.datasets import Client as DatasetClient

client = DatasetClient(organization_id=organization_id, credential=credential)

dataset = client.get_dataset(XXXXXXXXXXXX)

dataset_list = list(dataset.dataset_items.list(prefetch=False))

d = dataset_list[0]
file_content = d.source_data[0].get_content()
file_like_object = io.BytesIO(file_content)

img = Image.open(file_like_object)
annotation = d.attributes