メインコンテンツへスキップ
画像、動画、オーディオなどをサポートしています。リッチメディアをログして結果を詳しく確認し、run、モデル、データセットを視覚的に比較できます。以下の例とハウツーガイドをご覧ください。
詳細は、データタイプのリファレンスを参照してください。
さらに詳しくは、モデル予測の可視化に関するデモレポートを確認するか、解説動画をご覧ください。

前提条件

W&B SDK でメディアオブジェクトをログするには、追加の依存パッケージのインストールが必要になる場合があります。 次のコマンドを実行すると、これらの依存パッケージをインストールできます。
pip install wandb[media]

画像

入力、出力、フィルターの重み、活性化などをトラッキングするために、画像をログします。
オートエンコーダーの入力と出力
画像は、NumPy 配列、PIL 画像、またはファイルシステムから直接ログできます。 step から画像をログするたびに、その画像を UI で利用できます。画像パネルを展開し、step スライダーを使って異なる step の画像を確認してください。これにより、トレーニング中にモデルの出力がどのように変化するかを簡単に比較できます。メディアパネルをクリックすると、画像を全画面モードで表示できます。全画面モードでは、キーボードショートカットを使った操作を含め、ズームやパンが可能です。 異なる Runs、step、またはインデックスの画像や動画を 1 つのビューで比較するには、メディアパネルで Compare mode を使用します。
トレーニング中にログ処理がボトルネックになったり、結果の表示時に画像の読み込みがボトルネックになったりするのを防ぐため、1 step あたり 50 枚未満の画像をログすることを推奨します。
torchvisionmake_grid を使用する場合のように、画像を手動で作成する際は、配列を直接指定します。配列は Pillow を使用して png に変換されます。
import wandb

with wandb.init(project="image-log-example") as run:

    images = wandb.Image(image_array, caption="上: 出力、下: 入力")

    run.log({"examples": images})
最後の次元が 1 の場合はグレースケール、3 の場合は RGB、4 の場合は RGBA の画像として扱われます。配列に浮動小数点数が含まれている場合は、それらを 0 から 255 の範囲の整数に変換します。画像を別の方法で正規化したい場合は、mode を手動で指定するか、このパネルの「PIL 画像をログする」タブで説明しているように PIL.Image をそのまま渡してください。

画像オーバーレイ

W&B UI でセマンティックセグメンテーションのマスクをログし、不透明度の変更や経時変化の表示などの操作を行えます。
インタラクティブなマスク表示
オーバーレイをログするには、次のキーと値を含む辞書を wandb.Imagemasks キーワード引数に指定します。
  • 画像マスクを表す、次の 2 つのキーのいずれか 1 つ:
    • "mask_data": 各ピクセルの整数クラスラベルを含む 2 次元 NumPy 配列
    • "path": (文字列) 保存済みの画像マスクファイルへのパス
  • "class_labels": (任意) 画像マスク内の整数クラスラベルを、わかりやすいクラス名に対応付ける辞書
複数のマスクをログするには、以下のコードスニペットのように、複数のキーを含むマスク辞書をログします。実際の例を見るサンプルコード
mask_data = np.array([[1, 2, 2, ..., 2, 2, 1], ...])

class_labels = {1: "tree", 2: "car", 3: "road"}

mask_img = wandb.Image(
    image,
    masks={
        "predictions": {"mask_data": mask_data, "class_labels": class_labels},
        "ground_truth": {
            # ...
        },
        # ...
    },
)
あるキーのセグメンテーションマスクは、各step (run.log() の各call) で定義されます。
  • 同じマスクキーに対してstepごとに異なる値が指定されている場合、画像に適用されるのはそのキーの最新の値だけです。
  • stepごとに異なるマスクキーが指定されている場合、各キーのすべての値が表示されますが、画像に適用されるのは、現在表示しているstepで定義されているものだけです。そのstepで定義されていないマスクの表示/非表示を切り替えても、画像は変わりません。

表 の画像オーバーレイ

表 のインタラクティブなセグメンテーションマスク
表 にセグメンテーションマスクをログするには、表の各行ごとに wandb.Image オブジェクトを指定する必要があります。以下のコードスニペットに例を示します。
table = wandb.Table(columns=["ID", "Image"])

for id, img, label in zip(ids, images, labels):
    mask_img = wandb.Image(
        img,
        masks={
            "prediction": {"mask_data": label, "class_labels": class_labels}
            # ...
        },
    )

    table.add_data(id, mask_img)

with wandb.init(project="my_project") as run:
    run.log({"Table": table})

ヒストグラム

リスト、配列、テンソルなどの数値のシーケンスが最初の引数として指定されると、np.histogram() を呼び出して自動的にヒストグラムを作成します。すべての配列/テンソルはフラット化されます。オプションの num_bins キーワード引数を使用して、デフォルトの 64 bins を上書きできます。サポートされる bins の最大数は 512 です。UI では、トレーニング全体でログされたヒストグラムを比較しやすいように、x-axis にトレーニング step、Y-axis にメトリクス値、色でカウントを表したヒストグラムをプロットします。単発のヒストグラムをログする方法について詳しくは、このパネルの「Summary 内のヒストグラム」タブを参照してください。
run.log({"gradients": wandb.Histogram(grads)})
GAN 識別器の勾配
ヒストグラムが summary にある場合は、Run ページ の Overview タブに表示されます。history にある場合は、Charts タブに bins の経時変化を示すヒートマップが表示されます。

3D可視化

3Dポイントクラウドや、バウンディングボックス付きのLiDARシーンをログできます。表示する点の座標と色を含むNumPy配列を渡します。
point_cloud = np.array([[0, 0, 0, COLOR]])

run.log({"point_cloud": wandb.Object3D(point_cloud)})
W&B UI では、30万ポイントを超えるデータは切り捨てられます。

NumPy配列の形式

柔軟な色分けに対応するため、3種類のNumPy配列形式がサポートされています。
  • [[x, y, z], ...] nx3
  • [[x, y, z, c], ...] nx4 | c は [1, 14] の範囲のカテゴリです (セグメンテーションに便利)
  • [[x, y, z, r, g, b], ...] nx6 | r,g,b は、赤・緑・青の各カラーチャネルを表す [0,255] の範囲の値です。

Python オブジェクト

このスキーマを使用すると、Python オブジェクトを定義し、from_point_cloud method に渡せます。
  • points は、表示するポイントの座標と色を含む NumPy 配列です。形式には、上で示した simple ポイントクラウド renderer と同じ形式を使用します。
  • boxes は、3 つの属性を持つ Python の辞書の NumPy 配列です。
    • corners - 8 つの corner のリスト
    • label - ボックス上に表示するラベルを表す文字列 (任意)
    • color - ボックスの色を表す RGB 値
    • score - バウンディングボックスに表示される数値で、表示するバウンディングボックスをフィルターするために使用できます (たとえば、score > 0.75 のバウンディングボックスのみを表示) 。 (任意)
  • type は、表示するシーンのタイプを表す文字列です。現在サポートされる値は lidar/beta のみです
point_list = [
    [
        2566.571924017235, # x
        746.7817289698219, # y
        -15.269245470863748,# z
        76.5, # 赤
        127.5, # 緑
        89.46617199365393 # 青
    ],
    [ 2566.592983606823, 746.6791987335685, -15.275803826279521, 76.5, 127.5, 89.45471117247024 ],
    [ 2566.616361739416, 746.4903185513501, -15.28628929674075, 76.5, 127.5, 89.41336375503832 ],
    [ 2561.706014951675, 744.5349468458361, -14.877496818222781, 76.5, 127.5, 82.21868245418283 ],
    [ 2561.5281847916694, 744.2546118233013, -14.867862032341005, 76.5, 127.5, 81.87824684536432 ],
    [ 2561.3693562897465, 744.1804761656741, -14.854129178142523, 76.5, 127.5, 81.64137897587152 ],
    [ 2561.6093071504515, 744.0287526628543, -14.882135189841177, 76.5, 127.5, 81.89871499537098 ],
    # ... 以下同様
]

run.log({"my_first_point_cloud": wandb.Object3D.from_point_cloud(
     points = point_list,
     boxes = [{
         "corners": [
                [ 2601.2765123137915, 767.5669506323393, -17.816764802288663 ],
                [ 2599.7259021588347, 769.0082337923552, -17.816764802288663 ],
                [ 2599.7259021588347, 769.0082337923552, -19.66876480228866 ],
                [ 2601.2765123137915, 767.5669506323393, -19.66876480228866 ],
                [ 2604.8684867834395, 771.4313904894723, -17.816764802288663 ],
                [ 2603.3178766284827, 772.8726736494882, -17.816764802288663 ],
                [ 2603.3178766284827, 772.8726736494882, -19.66876480228866 ],
                [ 2604.8684867834395, 771.4313904894723, -19.66876480228866 ]
        ],
         "color": [0, 0, 255], # バウンディングボックスの RGB 色
         "label": "car", # バウンディングボックスに表示される文字列
         "score": 0.6 # バウンディングボックスに表示される数値
     }],
     vectors = [
        {"start": [0, 0, 0], "end": [0.1, 0.2, 0.5], "color": [255, 0, 0]}, # 色は任意
     ],
     point_cloud_type = "lidar/beta",
)})
ポイントクラウドの表示中は、Controlキーを押したままマウスを使って空間内を移動できます。

点群ファイル

点群データを含む JSON ファイルは、from_file methodを使用して読み込めます。
run.log({"my_cloud_from_file": wandb.Object3D.from_file(
     "./my_point_cloud.pts.json"
)})
ポイントクラウドデータのフォーマット例を以下に示します。
{
    "boxes": [
        {
            "color": [
                0,
                255,
                0
            ],
            "score": 0.35,
            "label": "My label",
            "corners": [
                [
                    2589.695869075582,
                    760.7400443552185,
                    -18.044831294622487
                ],
                [
                    2590.719039645323,
                    762.3871153874499,
                    -18.044831294622487
                ],
                [
                    2590.719039645323,
                    762.3871153874499,
                    -19.54083129462249
                ],
                [
                    2589.695869075582,
                    760.7400443552185,
                    -19.54083129462249
                ],
                [
                    2594.9666662674313,
                    757.4657929961453,
                    -18.044831294622487
                ],
                [
                    2595.9898368371723,
                    759.1128640283766,
                    -18.044831294622487
                ],
                [
                    2595.9898368371723,
                    759.1128640283766,
                    -19.54083129462249
                ],
                [
                    2594.9666662674313,
                    757.4657929961453,
                    -19.54083129462249
                ]
            ]
        }
    ],
    "points": [
        [
            2566.571924017235,
            746.7817289698219,
            -15.269245470863748,
            76.5,
            127.5,
            89.46617199365393
        ],
        [
            2566.592983606823,
            746.6791987335685,
            -15.275803826279521,
            76.5,
            127.5,
            89.45471117247024
        ],
        [
            2566.616361739416,
            746.4903185513501,
            -15.28628929674075,
            76.5,
            127.5,
            89.41336375503832
        ]
    ],
    "type": "lidar/beta"
}

NumPy 配列

上で定義した配列形式と同じ形式を使用すると、from_numpy methodnumpy配列を直接使用してポイントクラウドを定義できます。
run.log({"my_cloud_from_numpy_xyz": wandb.Object3D.from_numpy(
     np.array(  
        [
            [0.4, 1, 1.3], # x, y, z
            [1, 1, 1], 
            [1.2, 1, 1.2]
        ]
    )
)})
run.log({"my_cloud_from_numpy_cat": wandb.Object3D.from_numpy(
     np.array(  
        [
            [0.4, 1, 1.3, 1], # x, y, z, category 
            [1, 1, 1, 1], 
            [1.2, 1, 1.2, 12], 
            [1.2, 1, 1.3, 12], 
            [1.2, 1, 1.4, 12], 
            [1.2, 1, 1.5, 12], 
            [1.2, 1, 1.6, 11], 
            [1.2, 1, 1.7, 11], 
        ]
    )
)})
run.log({"my_cloud_from_numpy_rgb": wandb.Object3D.from_numpy(
     np.array(  
        [
            [0.4, 1, 1.3, 255, 0, 0], # x, y, z, r, g, b 
            [1, 1, 1, 0, 255, 0], 
            [1.2, 1, 1.3, 0, 255, 255],
            [1.2, 1, 1.4, 0, 255, 255],
            [1.2, 1, 1.5, 0, 0, 255],
            [1.2, 1, 1.1, 0, 0, 255],
            [1.2, 1, 0.9, 0, 0, 255],
        ]
    )
)})
run.log({"protein": wandb.Molecule("6lu7.pdb")})
次の10種類のファイル形式のいずれかで分子データをログできます:pdbpqrmmcifmcifcifsdfsdgromol2mmtf W&B は、SMILES 文字列、rdkitmol ファイル、および rdkit.Chem.rdchem.Mol オブジェクトから分子データをログすることもサポートしています。
resveratrol = rdkit.Chem.MolFromSmiles("Oc1ccc(cc1)C=Cc1cc(O)cc(c1)O")

run.log(
    {
        "resveratrol": wandb.Molecule.from_rdkit(resveratrol),
        "green fluorescent protein": wandb.Molecule.from_rdkit("2b3p.mol"),
        "acetaminophen": wandb.Molecule.from_smiles("CC(=O)Nc1ccc(O)cc1"),
    }
)
run が終了すると、UI で分子の 3D 可視化をインタラクティブに操作できるようになります。 AlphaFold を使ったライブデモを見る
分子構造

PNG 画像

wandb.Image は、デフォルトで numpy 配列または PILImage のインスタンスを PNG に変換します。
run.log({"example": wandb.Image(...)})
# または複数の画像
run.log({"example": [wandb.Image(...) for img in images]})

動画

動画のログには、wandb.Videoデータ型を使用します。
run.log({"example": wandb.Video("myvideo.mp4")})
メディアブラウザーで動画を表示できるようになりました。プロジェクトのワークスペース、run のワークスペース、または レポート に移動し、Add visualization をクリックしてリッチメディアパネルを追加します。

分子の2D表示

wandb.Image データタイプと rdkit を使用すると、分子の2D表示をログできます。
molecule = rdkit.Chem.MolFromSmiles("CC(=O)O")
rdkit.Chem.AllChem.Compute2DCoords(molecule)
rdkit.Chem.AllChem.GenerateDepictionMatching2DStructure(molecule, molecule)
pil_image = rdkit.Chem.Draw.MolToImage(molecule, size=(300, 300))

run.log({"acetic_acid": wandb.Image(pil_image)})

その他のメディア

W&B では、他にもさまざまな種類のメディアをログできます。

オーディオ

run.log({"whale songs": wandb.Audio(np_array, caption="OooOoo", sample_rate=32)})
1 stepあたり、最大100件のオーディオクリップをログできます。詳しい使用方法については、audio-fileを参照してください。

動画

run.log({"video": wandb.Video(numpy_array_or_path_to_video, fps=4, format="gif")})
numpy 配列が指定された場合、次元の順序は time、channels、width、height であるとみなされます。デフォルトでは 4 fps の GIF 画像を作成します (numpy オブジェクトを渡す場合は ffmpeg と Python ライブラリの moviepy が必要です) 。サポートされる形式は "gif""mp4""webm""ogg" です。wandb.Video に文字列を渡した場合は、wandb にアップロードする前に、そのファイルが存在し、サポートされる形式であることを確認します。BytesIO オブジェクトを渡すと、指定した形式を拡張子とする一時ファイルが作成されます。 W&B の Run ページおよび プロジェクト ページでは、メディアセクションに動画が表示されます。 使用方法の詳細については、video-file を参照してください。

テキスト

wandb.Table を使用して表にテキストをログすると、UI に表示されます。デフォルトの列ヘッダーは ["Input", "Output", "Expected"] です。最適な UI パフォーマンスを確保するため、デフォルトの最大行数は 10,000 に設定されています。ただし、wandb.Table.MAX_ROWS = {DESIRED_MAX} を使用してこの最大値を明示的に上書きできます。
with wandb.init(project="my_project") as run:
    columns = ["Text", "Predicted Sentiment", "True Sentiment"]
    # 方法 1
    data = [["I love my phone", "1", "1"], ["My phone sucks", "0", "-1"]]
    table = wandb.Table(data=data, columns=columns)
    run.log({"examples": table})

    # 方法 2
    table = wandb.Table(columns=columns)
    table.add_data("I love my phone", "1", "1")
    table.add_data("My phone sucks", "0", "-1")
    run.log({"examples": table})
pandas の DataFrame オブジェクトを渡すこともできます。
table = wandb.Table(dataframe=my_dataframe)
詳しい使用方法については、stringを参照してください。

HTML

run.log({"custom_file": wandb.Html(open("some.html"))})
run.log({"custom_string": wandb.Html('<a href="https://mysite">Link</a>')})
任意のキーにカスタム HTML をログすると、run ページに HTML パネルを表示できます。デフォルトでは標準のスタイルが挿入されますが、inject=False を渡すと無効にできます。
run.log({"custom_file": wandb.Html(open("some.html"), inject=False)})
詳しい使用方法については、html-fileを参照してください。