메인 콘텐츠로 건너뛰기
Try in Colab W&B는 이미지, 비디오, 오디오 등 다양한 미디어 타입을 지원합니다. 리치 미디어를 로그하여 결과를 탐색하고 Runs, Models, Datasets를 시각적으로 비교해 보세요. 아래의 예시와 가이드를 참고하시기 바랍니다.
자세한 내용은 Data types reference를 참조하세요.
더 자세한 내용은 모델 예측 시각화에 대한 데모 리포트를 확인하거나 동영상 튜토리얼을 시청하세요.

사전 요구 사항

W&B SDK로 미디어 오브젝트를 로그하려면 추가 종속성을 설치해야 할 수 있습니다. 다음 코맨드를 실행하여 이러한 종속성을 설치할 수 있습니다.
pip install wandb[media]

Images

이미지를 로그하여 입력, 출력, 필터 웨이트, 활성화 함수 등을 추적하세요.
Autoencoder inputs and outputs
이미지는 NumPy 어레이, PIL 이미지 또는 파일 시스템에서 직접 로그할 수 있습니다. 각 step에서 이미지를 로그할 때마다 UI에 표시하기 위해 해당 이미지가 저장됩니다. 이미지 패널을 확장하고 step 슬라이더를 사용하여 서로 다른 step의 이미지를 확인할 수 있습니다. 이를 통해 트레이닝 중에 모델의 출력이 어떻게 변하는지 쉽게 비교할 수 있습니다.
트레이닝 중 로깅이 병목 현상이 되거나 결과를 볼 때 이미지 로딩이 지연되는 것을 방지하기 위해, step당 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를 수동으로 지정하거나 이 패널의 “PIL Images 로깅” 탭에 설명된 대로 PIL.Image를 제공하면 됩니다.

Image overlays

시멘틱 세그멘테이션 마스크를 로그하고 W&B UI를 통해 마스크와 상호작용(불투명도 조절, 시간에 따른 변화 확인 등)할 수 있습니다.
Interactive mask viewing
오버레이를 로그하려면 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": {
            # ...
        },
        # ...
    },
)
특정 키에 대한 세그멘테이션 마스크는 각 step(run.log() 호출 시마다)에서 정의됩니다.
  • 만약 여러 step에서 동일한 마스크 키에 대해 다른 값을 제공하는 경우, 해당 키에 대한 가장 최근의 값만 이미지에 적용됩니다.
  • 여러 step에서 서로 다른 마스크 키를 제공하는 경우, 각 키의 모든 값이 표시되지만 현재 보고 있는 step에서 정의된 값만 이미지에 적용됩니다. 해당 step에서 정의되지 않은 마스크의 가시성을 토글해도 이미지는 변하지 않습니다.

Tables에서의 Image overlays

Interactive Segmentation Masks in Tables
Tables에 세그멘테이션 마스크를 로그하려면 테이블의 각 행에 대해 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})

Histograms

리스트, 어레이 또는 텐서와 같은 숫자 시퀀스가 첫 번째 인수로 제공되면 np.histogram을 호출하여 히스토그램을 자동으로 구성합니다. 모든 어레이/텐서는 평탄화(flatten)됩니다. 선택 사항인 num_bins 키워드 인수를 사용하여 기본값인 64 빈(bin)을 재정의할 수 있습니다. 지원되는 최대 빈 수는 512입니다.UI에서 히스토그램은 x축에 트레이닝 step, y축에 메트릭 값, 색상으로 카운트를 표시하여 트레이닝 전반에 걸쳐 로그된 히스토그램을 쉽게 비교할 수 있도록 그려집니다. 일회성 히스토그램 로깅에 대한 자세한 내용은 이 패널의 “Summary에서의 히스토그램” 탭을 참조하세요.
run.log({"gradients": wandb.Histogram(grads)})
GAN discriminator gradients
히스토그램이 summary에 있는 경우 Run Page의 Overview 탭에 표시됩니다. 히스토그램이 history에 있는 경우 Charts 탭에 시간에 따른 빈의 히트맵이 그려집니다.

3D visualizations

바운딩 박스가 포함된 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는 [1, 14] 범위의 카테고리 (세그멘테이션에 유용)
  • [[x, y, z, r, g, b], ...] nx6 | r,g,b는 레드, 그린, 블루 컬러 채널의 [0,255] 범위 값.

Python 오브젝트

이 스키마를 사용하여 Python 오브젝트를 정의하고 the from_point_cloud 메소드에 전달할 수 있습니다.
  • points위에서 보여준 간단한 포인트 클라우드 렌더러와 동일한 형식을 사용하여 렌더링할 포인트의 좌표와 색상을 포함하는 NumPy 어레이입니다.
  • 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
    ],
    # ... 계속됨
]

run.log({"my_first_point_cloud": wandb.Object3D.from_point_cloud(
     points = point_list,
     boxes = [{
         "corners": [
                [ 2601.2765123137915, 767.5669506323393, -17.816764802288663 ],
                # ...
        ],
         "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 키를 누른 상태에서 마우스를 사용하여 공간 내부를 이동할 수 있습니다.

포인트 클라우드 파일

the 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],
                # ...
            ]
        }
    ],
    "points": [
        [2566.571924017235, 746.7817289698219, -15.269245470863748, 76.5, 127.5, 89.46617199365393],
        # ...
    ],
    "type": "lidar/beta"
}

NumPy 어레이

위에 정의된 것과 동일한 어레이 형식을 사용하여 numpy 어레이를 the from_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({"protein": wandb.Molecule("6lu7.pdb")})
pdb, pqr, mmcif, mcif, cif, sdf, sd, gro, mol2, 또는 mmtf 등 10가지 파일 유형의 분자 데이터를 로그하세요. 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"),
    }
)
Run이 끝나면 UI에서 분자의 3D 시각화와 상호작용할 수 있습니다. AlphaFold를 사용한 라이브 예시 보기
Molecule structure

PNG image

wandb.Image는 기본적으로 numpy 어레이나 PILImage 인스턴스를 PNG로 변환합니다.
run.log({"example": wandb.Image(...)})
# 또는 여러 이미지
run.log({"example": [wandb.Image(...) for img in images]})

Video

비디오는 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)})

Other media

W&B는 다양한 다른 미디어 타입의 로깅도 지원합니다.

Audio

run.log({"whale songs": wandb.Audio(np_array, caption="OooOoo", sample_rate=32)})
Step당 최대 100개의 오디오 클립을 로그할 수 있습니다. 더 많은 사용 정보는 audio-file을 참조하세요.

Video

run.log({"video": wandb.Video(numpy_array_or_path_to_video, fps=4, format="gif")})
numpy 어레이가 제공되는 경우 차원 순서를 시간, 채널, 너비, 높이로 간주합니다. 기본적으로 4 fps gif 이미지를 생성합니다 (numpy 오브젝트를 전달할 때 ffmpegmoviepy 파이썬 라이브러리가 필요합니다). 지원되는 형식은 "gif", "mp4", "webm", "ogg"입니다. wandb.Video에 문자열을 전달하면 wandb에 업로드하기 전에 파일이 존재하고 지원되는 형식인지 확인합니다. BytesIO 오브젝트를 전달하면 지정된 형식을 확장자로 하는 임시 파일이 생성됩니다. W&B RunProject 페이지의 Media 섹션에서 비디오를 볼 수 있습니다. 더 많은 사용 정보는 video-file을 참조하세요.

Text

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을 참조하세요.