미디어 및 오브젝트 로깅
이미지, 비디오, 오디오 등을 지원합니다. 풍부한 미디어를 로깅하여 결과를 탐색하고 run, 모델, 데이터셋을 시각적으로 비교해보세요. 예시 및 사용 방법 가이드는 계속해서 읽어보세요.
미디어 타입에 대한 참조 문서를 찾고 있나요? 이 페이지를 참조하세요.
이러한 미디어 오브젝트를 로깅하는 작동 코드는 이 Colab 노트북에서 확인할 수 있으며, wandb.ai에서 결과를 여기에서 확인하고, 위에 링크된 비디오 튜토리얼을 따라할 수 있습니다.
이미지
입력, 출력, 필터 가중치, 활성화 등을 로깅하여 추적하세요!

이미지는 NumPy 배열, PIL 이미지 또는 파일 시스템에서 직접 로깅할 수 있습니다.
트레이닝 중 로깅이 병목 현상이 되지 않도록 하고 결과를 볼 때 이미지 로딩이 병목 현상이 되지 않도록 스텝 당 50개 미만의 이미지를 로깅하는 것이 좋습니다.
- 배열을 이미지로 로깅하기
- PIL 이미지 로깅하기
- 파일에서 이미지 로깅하기
예를 들어, torchvision에서 make_grid를 사용하여 수동으로 이미지를 구성할 때 배열을 직접 제공하세요.
배열은 Pillow를 사용하여 png로 변환됩니다.
images = wandb.Image(image_array, caption="Top: Output, Bottom: Input")
wandb.log({"examples": images})
이미지가 회색조인 경우 마지막 차원이 1이고, RGB인 경우 3이며, RGBA인 경우 4입니다. 배열에 부동 소수점이 포함된 경우 0에서 255 사이의 정수로 변환합니다. 이미지를 다르게 정규화하고 싶다면, mode를 수동으로 지정하거나 PIL.Image을 직접 제공하면 됩니다. 이 패널의 "PIL 이미지 로깅하기" 탭에서 설명한 것처럼요.
배열을 이미지로 변환하는 것에 대해 더 많은 제어를 원한다면, PIL.Image를 직접 구성하고 제공하세요.
images = [PIL.Image.fromarray(image) for image in image_array]
wandb.log({"examples": [wandb.Image(image) for image in images]})
im = PIL.fromarray(...)
rgb_im = im.convert("RGB")
rgb_im.save("myimage.jpg")
wandb.log({"example": wandb.Image("myimage.jpg")})
이미지 오버레이
- 분할 마스크
- 경계 상자
W&B UI에서 (불투명도 조정, 시간에 따른 변경 사항 보기 등) 상호 작용하며 시멘틱 세그멘테이션 마스크를 로깅하세요.

오버레이를 로깅하려면 wandb.Image의 masks 키워드 인수에 다음 키와 값을 포함하는 사전을 제공해야 합니다:
- 이미지 마스크를 나타내는 두 가지 키 중 하나:
"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": {
# ...
},
# ...
},
)

경계 상자를 로깅하려면 wandb.Image의 boxes 키워드 인수에 다음 키와 값을 포함하는 사전을 제공해야 합니다:
box_data: 각 상자에 대해 하나씩, 사전의 리스트입니다. 상자 사전 형식은 아래에 설명되어 있습니다.position: 아래에 설명된 두 가지 형식 중 하나로 상자의 위치와 크기를 나타내는 사전입니다. 모든 상자가 동일한 형식을 사용할 필요는 없습니다.- 옵션 1:
{"minX", "maxX", "minY", "maxY"}. 각 상자 차원의 상한과 하한을 정의하는 좌표 세트를 제공합니다. - 옵션 2:
{"middle", "width", "height"}.middle좌표를[x,y]로,width와height를 스칼라로 지정하는 좌표 세트를 제공합니다.
- 옵션 1:
class_id: 상자의 클래스 신원을 나타내는 정수입니다. 아래class_labels키를 참조하세요.scores: UI에서 상자를 필터링하는 데 사용될 수 있는 스코어에 대한 문자열 레이블과 숫자 값의 사전입니다.domain: 상자 좌표의 단위/형식을 지정합니다. 상자 좌표가 픽셀 공간에서 표현되는 경우(즉, 이미지 차원의 경계 내에서 정수로 표현됨) 이를 "pixel"로 설정하세요. 기본적으로 도메인은 이미지의 분수/백분율(0과 1 사이의 부동 소수점)로 가정됩니다.box_caption: (선택 사항) 이 상자에 표시될 레이블 텍스트로 사용될 문자열입니다.
class_labels: (선택 사항)class_id를 문자열에 매핑하는 사전입니다. 기본적으로class_0,class_1등의 클래스 레이블을 생성합니다.
이 예제를 확인하세요:
class_id_to_label = {
1: "car",
2: "road",
3: "building",
# ...
}
img = wandb.Image(
image,
boxes={
"predictions": {
"box_data": [
{
# one box expressed in the default relative/fractional domain
"position": {"minX": 0.1, "maxX": 0.2, "minY": 0.3, "maxY": 0.4},
"class_id": 2,
"box_caption": class_id_to_label[2],
"scores": {"acc": 0.1, "loss": 1.2},
# another box expressed in the pixel domain
# (for illustration purposes only, all boxes are likely
# to be in the same domain/format)
"position": {"middle": [150, 20], "width": 68, "height": 112},
"domain": "pixel",
"class_id": 3,
"box_caption": "a building",
"scores": {"acc": 0.5, "loss": 0.7},
# ...
# Log as many boxes an as needed
}
],
"class_labels": class_id_to_label,
},
# Log each meaningful group of boxes with a unique key name
"ground_truth": {
# ...
},
},
)
wandb.log({"driving_scene": img})
테이블에서의 이미지 오버레이
- 분할 마스크
- 경계 상자

테이블에서 분할 마스크를 로깅하려면, 각 행에 대해 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, img)
wandb.log({"Table": table})

테이블에서 경계 상자가 있는 이미지를 로깅하려면, 각 행에 대해 wandb.Image 오브젝트를 제공해야 합니다.
아래 코드 조각에서 예시가 제공됩니다:
table = wandb.Table(columns=["ID", "Image"])
for id, img, boxes in zip(ids, images, boxes_set):
box_img = wandb.Image(
img,
boxes={
"prediction": {
"box_data": [
{
"position": {
"minX": box["minX"],
"minY": box["minY"],
"maxX": box["maxX"],
"maxY": box["maxY"],
},
"class_id": box["class_id"],
"box_caption": box["caption"],
"domain": "pixel",
}
for box in boxes
],
"class_labels": class_labels,
}
},
)
히스토그램
- 기본 히스토그램 로깅
- 유연한 히스토그램 로깅
- 요약에서의 히스토그램
UI에서는 훈련 단계를 x축에, 메트릭 값을 y축에 두고, 색상으로 카운트를 나타내어 훈련 중에 로깅된 히스토그램을 비교하기 쉽게 히스토그램을 그립니다. 이 패널의 "요약에서의 히스토그램" 탭에서 일회성 히스토그램 로깅에 대한 세부 정보를 확인하세요.
wandb.log({"gradients": wandb.Histogram(grads)})

더 많은 제어를 원한다면, np.histogram을 호출하고 반환된 튜플을 np_histogram 키워드 인수로 전달하세요.
np_hist_grads = np.histogram(grads, density=True, range=(0.0, 1.0))
wandb.log({"gradients": wandb.Histogram(np_hist_grads)})
wandb.run.summary.update( # 요약에만 있는 경우, Overview 탭에서만 보임
{"final_logits": wandb.Histogram(logits)}
)
히스토그램이 요약에 있는 경우 Run Page의 Overview 탭에 표시됩니다. 히스토그램이 기록에 있는 경우, 차트 탭에서 시간에 따른 bin의 열지도를 그립니다.
이미지나 미디어를 업로드하지 않고 W&B를 내 프로젝트에 통합하고 싶다면 어떻게 해야 하나요?
W&B는 스칼라만 로그하는 프로젝트에서도 사용할 수 있으며 업로드하고 싶은 파일이나 데이터를 명시적으로 지정할 수 있습니다. 이미지를 로그하지 않는 PyTorch에서의 빠른 예제가 있습니다.
PNG를 로그하는 방법은?
wandb.Image는 numpy 배열이나 PILImage 인스턴스를 기본적으로 PNG로 변환합니다.
wandb.log({"example": wandb.Image(...)})
# 혹은 여러 이미지
wandb.log({"example": [wandb.Image(...) for img in images]})
비디오를 로그하는 방법은?
비디오는 wandb.Video 데이터 타입을 사용하여 로그됩니다:
wandb.log({"example": wandb.Video("myvideo.mp4")})
이제 미디어 브라우저에서 비디오를 볼 수 있습니다. 프로젝트 워크스페이스, run 워크스페이스, 또는 리포트로 이동하여 "시각화 추가"를 클릭하여 리치 미디어 패널을 추가하세요.
포인트 클라우드에서 탐색하고 확대하는 방법은?
컨트롤을 누른 상태에서 마우스를 사용하여 공간 안에서 이동할 수 있습니다.
분자의 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))
wandb.log({"acetic_acid": wandb.Image(pil_image)})