DatabricksとLabelboxの連携(実践編)

本記事では、[DatabricksとLabelboxの連携](https://qiita.com/taka_yayoi/items/1921192a94246810bc11)で説明されている手順を実際にウォークスルーしています。

# Partner ConnectによるLabelboxへの接続

ワークスペースのサイドバーの**Partner Connect**をクリックします。
![Screen Shot 2022-04-05 at 14.03.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5274467d-af53-d183-8d40-f86d0be7335e.png)

**機械学習**にある**Labelbox**をクリックします。

![Screen Shot 2022-04-05 at 13.39.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ce3a441e-e22d-68a5-c7b2-6e6b74bdc280.png)

**次のページ**をクリックします。
![Screen Shot 2022-04-05 at 13.39.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9cd338dc-a643-c697-e096-570ab390efaa.png)

**Labelboxに接続**をクリックします。
![Screen Shot 2022-04-05 at 13.39.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8d9f74fd-393b-4dba-3d50-410ed2229fbb.png)

新規タブでLabelboxが開きますので、**Continue trial sign-up**をクリックします。
![Screen Shot 2022-04-05 at 13.39.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4d88d975-649b-14cb-2f1a-48ca05692a2f.png)

アカウントが存在しない場合には、**Sign Up**を選択し、企業名、パスワード、氏名を入力します。
![Screen Shot 2022-04-05 at 13.41.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/47d0e4a7-741e-188a-9eac-903fe37f2975.png)

確認メールが送信されます。
![Screen Shot 2022-04-05 at 13.41.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/308598c6-cfc0-4324-0df3-af349836dff3.png)

メールに記載の**Verify Account**をクリックします。
![Screen Shot 2022-04-05 at 13.42.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c54e384f-bc4f-ea57-517a-3b567ef3daec.png)

会社名とロールを選択します。
![Screen Shot 2022-04-05 at 13.42.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/15ad5bc0-4478-702b-c3d6-cd031e61132c.png)

これで、Labelboxへの接続が確立されました。
![Screen Shot 2022-04-05 at 13.43.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ab3827bb-efc2-8944-35b8-85be881df7d5.png)

Databricks側でも接続成功のメッセージが表示されます。
![Screen Shot 2022-04-05 at 13.43.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5206f817-744d-403b-2638-e66acc35b737.png)
![Screen Shot 2022-04-05 at 13.44.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7ad937ae-772b-9a8a-fe48-fc10960adc15.png)

# クラスターとLabelboxスターターノートブックのセットアップ

上の設定で**LABELBOX_CLUSTER**というクラスターが作成されているので、このクラスターに必要なライブラリをインストールします。
![Screen Shot 2022-04-05 at 13.44.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f6b4106c-ce42-71a8-1038-6c6ecc4c7496.png)

ライブラリの画面に移動します。
![Screen Shot 2022-04-05 at 13.44.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/acc02349-7af6-b618-fb6c-b58b7c32052d.png)

**新規をインストール**をクリックして、`labelbox`と`labelspark`をPyPI経由でインストールします。
![Screen Shot 2022-04-05 at 13.45.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/600d846d-89ba-e506-bf8a-52fcc51f4f5b.png)

![Screen Shot 2022-04-05 at 13.45.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/54a60e7a-0223-6afd-643e-ddbeb5d6c305.png)

サンプルノートブックが**Workspace > Shared > labelbox_demo > labelbox_databricks_example.ipynb**に作成されているので、これを開きます。

![Screen Shot 2022-04-05 at 13.46.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/73d2b70f-b4b2-9494-86ca-ae41af3d31fd.png)

# サンプルノートブックの実行

上のクラスターにノートブックをアタッチします。
![Screen Shot 2022-04-05 at 13.46.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a36e510a-e7f1-2fcb-a45e-5ac68491b2a0.png)

Labelboxに移動して、**Account > API**に移動し、APIキーを作成します。
![Screen Shot 2022-04-05 at 13.48.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4c4f8e32-5eb4-307a-2e1a-6dc1b1664c80.png)
![Screen Shot 2022-04-05 at 13.48.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3710523e-9674-3f80-bbd9-4be01b6a7b22.png)
![Screen Shot 2022-04-05 at 13.48.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ef4f5551-82c8-55d7-1c15-81d63e203a2e.png)

## SDKの設定

LabelboxとDatabricksのライブラリがインストールできたので、SDKを設定する必要があります。[こちら](https://app.labelbox.com/account/api-keys)からAPIキーを作成する必要があります。DatabricksシークレットAPIを用いてキーを格納することも可能です。SDKは環境変数`LABELBOX_API_KEY`の読み込みを試行します。

```py:Python
from labelbox import Client, Dataset
from labelbox.schema.ontology import OntologyBuilder, Tool, Classification, Option
import databricks.koalas as pd
import labelspark

API_KEY = "<APIキー>" 

if not(API_KEY):
  raise ValueError("Go to Labelbox to get an API key")
  
client = Client(API_KEY)
```

## シードデータの取り込み

次に、デモ用データセットをSparkテーブルにロードし、URLを通じて簡単にアセットをLabelboxにロードする方法を理解することができます。シンプルにするために、LabelboxからデータセットIDを取得することができ、みなさまが使用できるようにこれらのURLをSparkテーブルにロードします(なので、このデモノートブックを実行するためにデータを見つけ出す必要はありません)。以下では、Labelboxトライアルに含まれる"Example Nature Dataset"を取得します。

また、LabelboxはAWS、Azure、GCPのクラウドストレージをネイティブでサポートしています。[Delegated Access](https://docs.labelbox.com/docs/iam-delegated-access)を通じてLabelboxをお使いのストレージに接続することができ、アノテーションするためにこれらのアセットを簡単にロードすることができます。詳細については、こちらの[動画](https://youtu.be/wlWo6EmPDV4)をご覧ください。

```py:Python
sample_dataset = next(client.get_datasets(where=(Dataset.name == "Example Nature Dataset")))
sample_dataset.uid
```

```py:Python
# ディレクトリをパースし、画像URLのSparkテーブルを作成することができます
SAMPLE_TABLE = "sample_unstructured_data"

tblList = spark.catalog.listTables()

if not any([table.name == SAMPLE_TABLE for table in tblList]):
   
  df = pd.DataFrame([
    {
      "external_id": dr.external_id,
      "row_data": dr.row_data
    } for dr in sample_dataset.data_rows()
  ]).to_spark()
  df.registerTempTable(SAMPLE_TABLE)
  print(f"Registered table: {SAMPLE_TABLE}")
```

テーブルの中身を確認します。

```py:Python
display(sqlContext.sql(f"select * from {SAMPLE_TABLE} LIMIT 5"))
```
![Screen Shot 2022-04-05 at 16.04.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c16d9e48-08e7-b41b-aa5b-620cc444510f.png)

## ラベリングプロジェクトの作成

プロジェクトはチームがラベルを作成する場所となります。プロジェクトにはラベル付けされるアセットのデータセットと、ラベリングの推論を設定するためのオントロジーを必要となります。

### ステップ 1: データセットの作成

[Labelbox Connector for Databricks](https://pypi.org/project/labelspark/)は、2つのカラムを持つSparkテーブルを期待します。最初のカラムは"external_id"で、2つ目のカラムは"row_data"となります。

`external_id`は"birds.jpg"や"my_video.mp4"のようなファイル名となります。

`row_data`はファイルに対するURLパスとなります。Labelboxはラベリングを行う際、ユーザーのマシンにローカルにレンダリングするので、ラベリング担当はアセットにアクセスする権限を必要とします。 

サンプル: 

| external_id | row_data                             |
|-------------|--------------------------------------|
| image1.jpg  | https://url_to_your_asset/image1.jpg |
| image2.jpg  | https://url_to_your_asset/image2.jpg |
| image3.jpg  | https://url_to_your_asset/image3.jpg |

```py:Python
unstructured_data = spark.table(SAMPLE_TABLE)

demo_dataset = labelspark.create_dataset(client, unstructured_data, "Databricks Demo Dataset")
```

```py:Python
print("Open the dataset in the App")
print(f"https://app.labelbox.com/data/{demo_dataset.uid}")
```

表示されるURLにアクセスするとデータセットを確認できます。

![Screen Shot 2022-04-05 at 13.51.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c0f196f2-daf9-d56c-c642-eaf4487313c2.png)

### ステップ 2: プロジェクトの作成

使用するオントロジー(次に実施します)を構築するためにlabebox SDKを使用します。app.labelbox.comのウェブサイトを通じて、プロジェクト全体をセットアップすることができます。

[ontology creation documentation.](https://docs.labelbox.com/docs/configure-ontology)をチェックしてください。

```py:Python
# 新規プロジェクトの作成
project_demo = client.create_project(name="Labelbox and Databricks Example")
project_demo.datasets.connect(demo_dataset)  # キューにデータセットを追加

ontology = OntologyBuilder()

tools = [
  Tool(tool=Tool.Type.BBOX, name="Frog"),
  Tool(tool=Tool.Type.BBOX, name="Flower"),
  Tool(tool=Tool.Type.BBOX, name="Fruit"),
  Tool(tool=Tool.Type.BBOX, name="Plant"),
  Tool(tool=Tool.Type.SEGMENTATION, name="Bird"),
  Tool(tool=Tool.Type.SEGMENTATION, name="Person"),
  Tool(tool=Tool.Type.SEGMENTATION, name="Sleep"),
  Tool(tool=Tool.Type.SEGMENTATION, name="Yak"),
  Tool(tool=Tool.Type.SEGMENTATION, name="Gemstone"),
]
for tool in tools: 
  ontology.add_tool(tool)

conditions = ["clear", "overcast", "rain", "other"]

weather_classification = Classification(
    class_type=Classification.Type.RADIO,
    instructions="what is the weather?", 
    options=[Option(value=c) for c in conditions]
)  
ontology.add_classification(weather_classification)


# エディターのセットアップ
for editor in client.get_labeling_frontends():
    if editor.name == 'Editor':
        project_demo.setup(editor, ontology.asdict()) 

print("Project Setup is complete.")
```

### ステップ 3: データラベリングの実施

```py:Python
print("Open the project to start labeling")
print(f"https://app.labelbox.com/projects/{project_demo.uid}/overview")
```

表示されるURLにアクセスして、ラベリングを行います。
![Screen Shot 2022-04-05 at 16.10.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6b7cdf05-6c9c-b000-f39f-4903f712d353.png)

## ラベル・アノテーションのエクスポート

Labelboxでラベルを作成した後は、Databricksでモデルのトレーニング、分析に使用するためにこれらをエクスポートすることができます。

```py:Python
LABEL_TABLE = "exported_labels"

labels_table = labelspark.get_annotations(client, project_demo.uid, spark, sc)
labels_table.registerTempTable(LABEL_TABLE)
display(labels_table)
```

![Screen Shot 2022-04-05 at 16.12.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/42932afd-05b1-7589-d389-83d0cfe1b59e.png)

サンプルノートブックはこちらからダウンロードできます。

https://github.com/taka-yayoi/public_repo/tree/main/labelbox

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)