메인 콘텐츠로 건너뛰기
Colab에서 실행해 보기 이미지, 동영상, 오디오 등 다양한 유형을 지원합니다. 결과를 탐색하고 실행, 모델, 데이터셋을 시각적으로 비교할 수 있도록 다양한 미디어를 로깅하세요. 아래 예제와 사용 방법 가이드를 참고하세요.
자세한 내용은 데이터 타입 레퍼런스를 참조하세요.
더 자세한 내용은 모델 예측 시각화 데모 리포트를 확인하거나 동영상 가이드를 시청하세요.

사전 준비 사항

W&B SDK로 미디어 객체를 로깅하려면 추가 종속성을 설치해야 할 수 있습니다. 다음 명령을 실행하여 이러한 종속성을 설치하세요:
pip install wandb[media]

이미지

입력, 출력, 필터 가중치, 활성값 등을 추적하기 위해 이미지를 로깅합니다.
오토인코더 입력과 출력
이미지는 NumPy 배열, PIL 이미지, 또는 파일 시스템에서 직접 로깅할 수 있습니다. 각 스텝에서 이미지를 로깅할 때마다 UI에 표시할 수 있도록 저장됩니다. 이미지 패널을 확장한 후 스텝 슬라이더를 사용해 서로 다른 스텝의 이미지를 확인하세요. 이를 통해 모델의 출력이 학습 중에 어떻게 변하는지 쉽게 비교할 수 있습니다.
학습 중 로깅 과정이 병목이 되거나 결과를 조회할 때 이미지 로딩이 병목이 되는 것을 방지하려면, 스텝당 50개 미만의 이미지를 로깅하는 것을 권장합니다.
torchvisionmake_grid를 사용하는 것처럼 이미지를 수동으로 구성할 때, 배열을 직접 제공할 수 있습니다.배열은 Pillow를 사용해 PNG로 변환됩니다.
import wandb

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

    images = wandb.Image(image_array, caption="Top: Output, Bottom: Input")

    run.log({"examples": images})
마지막 차원이 1이면 그레이스케일, 3이면 RGB, 4이면 RGBA 이미지로 간주합니다. 배열에 float 값이 포함된 경우 0에서 255 사이의 정수로 변환합니다. 이미지를 다른 방식으로 정규화하려면 mode를 수동으로 지정하거나, 이 패널의 “Logging PIL Images” 탭에 설명된 것처럼 PIL.Image를 직접 제공하면 됩니다.

이미지 오버레이

W&B UI를 통해 시맨틱 세그멘테이션 마스크를 로그하고, 불투명도 조절, 시간에 따른 변화 확인 등과 함께 상호작용할 수 있습니다.
대화형 마스크 보기
오버레이를 로그하려면 아래 키와 값을 포함하는 딕셔너리를 wandb.Imagemasks 키워드 인자로 전달합니다:
  • 이미지 마스크를 나타내는 두 키 중 하나:
    • "mask_data": 각 픽셀에 대한 정수형 클래스 레이블을 담고 있는 2D 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": {
            # ...
        },
        # ...
    },
)
각 키에 대한 세그멘테이션 마스크는 각 스텝(매번 run.log()를 호출할 때마다)에서 정의됩니다.
  • 여러 스텝에서 동일한 마스크 키에 서로 다른 값을 제공하는 경우, 이미지에는 해당 키의 가장 최신 값만 적용됩니다.
  • 여러 스텝에서 서로 다른 마스크 키를 제공하는 경우, 각 키에 대한 모든 값이 표시되지만, 현재 보고 있는 스텝에 정의된 값만 이미지에 적용됩니다. 현재 스텝에 정의되지 않은 마스크의 표시 여부를 전환해도 이미지는 변경되지 않습니다.

테이블에서 이미지 오버레이 사용하기

테이블에서의 인터랙티브 Segmentation Mask
테이블에 Segmentation Mask를 로깅하려면, 테이블의 각 행마다 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을 호출하여 히스토그램을 자동으로 생성합니다. 모든 배열/텐서는 1차원으로 평탄화됩니다. 선택적 키워드 인자 num_bins를 사용하여 기본값인 64개의 구간(bin)을 변경할 수 있습니다. 지원되는 최대 구간 수는 512입니다.UI에서는 히스토그램이 x축에 학습 스텝, y축에 메트릭 값, 색상으로 개수를 표현하는 방식으로 표시되어, 학습 전체에 걸쳐 로깅된 히스토그램을 쉽게 비교할 수 있습니다. 단발성(one-off) 히스토그램 로깅에 대한 자세한 내용은 이 패널의 “Histograms in Summary” 탭을 참고하세요.
run.log({"gradients": wandb.Histogram(grads)})
GAN 판별기 그래디언트
히스토그램이 summary에 포함되어 있으면 실행 페이지의 Overview 탭에 표시됩니다. history에 포함되어 있으면 Charts 탭에서 시간에 따른 구간(bin) 히트맵으로 시각화됩니다.

3D 시각화

3D 포인트 클라우드와 바운딩 박스가 포함된 LiDAR 장면을 기록합니다. 렌더링할 포인트의 좌표와 색상을 담은 NumPy 배열을 전달하세요.
point_cloud = np.array([[0, 0, 0, COLOR]])

run.log({"point_cloud": wandb.Object3D(point_cloud)})
W&B UI는 데이터를 최대 300,000 포인트까지만 표시합니다.

NumPy 배열 형식

유연한 색상 구성을 위해 세 가지 NumPy 배열 형식을 지원합니다.
  • [[x, y, z], ...] nx3
  • [[x, y, z, c], ...] nx4 | c is a category [1, 14] 범위의 카테고리입니다(세그멘테이션에 유용)
  • [[x, y, z, r, g, b], ...] nx6 | r,g,b는 빨간색, 초록색, 파란색 채널에 대한 [0, 255] 범위의 값입니다.

Python object

이 스키마를 사용하여 Python 객체를 정의한 뒤 from_point_cloud 메서드에 전달할 수 있습니다.
  • points는 렌더링할 포인트의 좌표와 색상을 포함하는 NumPy 배열이며, 위에 제시된 단순 point cloud 렌더러와 동일한 형식을 사용합니다.
  • boxes는 다음 속성을 가진 Python 딕셔너리들로 이루어진 NumPy 배열입니다:
    • corners - 8개의 코너로 이루어진 리스트
    • label - 박스에 렌더링할 레이블을 나타내는 문자열 (선택 사항)
    • color - 박스의 색상을 나타내는 RGB 값
    • score - 바운딩 박스에 표시되는 수치 값으로, 표시할 바운딩 박스를 필터링하는 데 사용할 수 있습니다(예: score > 0.75인 바운딩 박스만 표시). (선택 사항)
  • type은 렌더링할 장면 유형을 나타내는 문자열입니다. 현재 지원되는 유일한 값은 lidar/beta입니다.
point_list = [
    [
        2566.571924017235, # x
        746.7817289698219, # y
        -15.269245470863748,# z
        76.5, # red
        127.5, # green
        89.46617199365393 # blue
    ],
    [ 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]}, # color는 선택 사항
     ],
     point_cloud_type = "lidar/beta",
)})
포인트 클라우드를 볼 때는 Ctrl 키를 누른 상태에서 마우스를 사용해 공간 안을 이동할 수 있습니다.

포인트 클라우드 파일

from_file 메서드를 사용해 포인트 클라우드 데이터가 포함된 JSON 파일을 불러올 수 있습니다.
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 메서드와 함께 numpy 배열을 직접 사용해 포인트 클라우드를 정의할 수 있습니다.
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가지 파일 유형 중 하나로 분자 데이터를 로깅할 수 있습니다: pdb, pqr, mmcif, mcif, cif, sdf, sd, gro, mol2, mmtf. 또한 W&B에서는 SMILES 문자열, rdkit mol 파일, 그리고 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"),
    }
)
실행이 완료되면 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")})
이제 미디어 브라우저에서 동영상을 볼 수 있습니다. 프로젝트 워크스페이스, 실행 워크스페이스 또는 리포트에서 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)})
스텝(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 객체를 전달할 때는 ffmpegmoviepy Python 라이브러리가 필요합니다.) 지원되는 형식은 "gif", "mp4", "webm", "ogg"입니다. wandb.Video에 문자열을 전달하면 업로드하기 전에 해당 파일이 존재하고 지원되는 형식인지 확인합니다. BytesIO 객체를 전달하면 지정한 형식을 확장자로 사용하는 임시 파일을 생성합니다. W&B 실행 페이지와 프로젝트 페이지의 Media 섹션에서 동영상을 확인할 수 있습니다. 자세한 사용 방법은 video-file을 참고하세요.

텍스트

테이블에 텍스트를 로그로 기록해 UI에 표시하려면 wandb.Table을 사용합니다. 기본적으로 열 헤더는 ["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>')})
임의의 key에 커스텀 HTML을 로깅할 수 있으며, 실행 페이지에 HTML 패널이 표시됩니다. 기본적으로 기본 스타일이 주입되며, inject=False를 전달하여 이 기본 스타일 주입을 끌 수 있습니다.
run.log({"custom_file": wandb.Html(open("some.html"), inject=False)})
자세한 사용법은 html-file을 참조하세요.