볼륨, 포인트 클라우드, 비디오로 모델 학습하기
칠한 CT 마스크로 3D U-Net을 학습시키고, 라이다 큐보이드로 직접 구성한 OpenPCDet 탐지기를 실행하고, 비디오 트래커를 학습시킵니다. 모두 홀드아웃 항목으로 점수를 매깁니다.
v2.14.0의 새 기능
이 튜토리얼은 Potato 연구 자체의 어노테이션으로 3D 데이터와 움직이는 데이터에 대한 모델 세 개를 학습시킵니다. volume-unet은 CT와 MR 볼륨을 분할하는 3D U-Net을 학습시키고, external-3d는 직접 구성해 실행하는 라이다 탐지기를 돌리며, video-track은 비디오 객체 트래커를 학습시킵니다. 이 페이지는 이미 Potato에서 볼륨, 포인트 클라우드, 비디오에 어노테이션하고 있으며 나머지 항목에 사전 레이블을 달 모델이 필요한 팀을 위한 것입니다. 각 트레이너마다 학습 데이터를 만드는 스키마, potato validate를 통과하는 설정, 실행이 하는 일, 홀드아웃 점수, 예측이 어노테이터에게 전달되는 방식을 다룹니다. 첫 모델 튜토리얼은 GPU가 필요 없는 텍스트 분류기로 Training 페이지를 안내하며, 이 튜토리얼은 그 안내를 읽었다고 전제합니다.
트레이너 요약
세 트레이너는 모두 실행 한 번에 스키마 하나를 학습시키고, 실행의 홀드아웃 val과 test 항목으로 모델 점수를 매기며, 예측을 어노테이터가 수정할 사전 레이블로 되씁니다. volume-unet과 external-3d 뒤의 탐지기는 실제로 GPU가 필요하므로, 이 두 트레이너의 설정은 원격 학습 튜토리얼이 설정하는 대로 ssh를 통해 GPU 서버로 실행을 보냅니다.
| 트레이너 | 스키마 | 항목 | 학습 머신에 설치할 것 | 대표 점수 |
|---|---|---|---|---|
volume-unet | volume_annotation (칠한 마스크) | NIfTI 볼륨, DICOM 시리즈 | pip install "potato-annotation[train-vision,volumes]", 실제로는 GPU | mean_dice |
external-3d | spatial_annotation (큐보이드) | 포인트 클라우드 | 직접 구성한 탐지기 (OpenPCDet, MMDetection3D) | map_3d_50 |
video-track | tracking 또는 combined 모드의 video_annotation | 비디오 | pip install "potato-annotation[train-vision]" opencv-python | idf1 |
모든 트레이너는 디스크의 파일에서 미디어를 읽습니다. 미디어 경로는 작업 디렉터리나 media_directory 안을 가리켜야 하며, 미디어가 http(s) URL인 항목은 학습과 예측에서 제외됩니다.
volume-unet으로 CT와 MR 볼륨 분할하기
volume-unet은 어노테이터가 volume_annotation 스키마에서 칠한 마스크를 학습하고, 아직 아무도 분할하지 않은 볼륨에 마스크를 칠합니다. 이 스키마는 NIfTI 파일이나 DICOM 시리즈를 축상(axial), 관상(coronal), 시상(sagittal)의 세 연동 뷰로 보여 주며, 어노테이터는 브러시로 칠하거나 다각형을 닫아 각 레이블을 칠합니다. source_field가 가리키는 항목 필드에는 .nii 또는 .nii.gz 파일, 또는 DICOM 시리즈 하나가 든 디렉터리가 media_directory 기준 상대 경로로 들어갑니다. 슬라이스에 그린 박스에는 마스크가 없으므로 박스만 있는 답은 학습 대상이 아닙니다. Potato는 임상 또는 규제 승인이 없는 연구용 소프트웨어이며, 여기서 학습한 모델은 어노테이터가 고칠 마스크를 제안할 뿐입니다.
아래 설정은 비장과 간을 분할하고, GPU 서버에서 학습하며, train 분할 밖의 모든 볼륨에 사전 레이블을 답니다.
annotation_task_name: "Spleen segmentation"
task_dir: .
media_directory: media
data_files:
- data/scans.jsonl
item_properties:
id_key: id
text_key: volume
output_annotation_dir: annotation_output
user_config:
allow_all_users: true
annotation_schemes:
- annotation_type: volume_annotation
name: organs
description: "Paint the spleen and the liver on every slice where each organ appears."
source_field: volume
labels:
- {name: Spleen, color: "#e6553a", key_value: "1"}
- {name: Liver, color: "#3a8ee6", key_value: "2"}
tools: [brush, eraser, polygon]
default_window: Soft tissue
model_training:
enabled: true
backend: gpu-server
backends:
gpu-server:
type: ssh
host: gpu.example.edu
python: /opt/conda/bin/python3
gpus: auto
min_free_gpu_mb: 8000
trainer_params:
volume-unet:
patch: 96
writeback:
schemas: [organs]
min_confidence: 0.6
include_unlabeled: true각 데이터 줄은 볼륨 하나를 지정합니다.
{"id": "case_001", "volume": "case_001.nii.gz"}
{"id": "case_002", "volume": "case_002_ct"}patch 값은 네트워크가 학습하는 정육면체 패치의 한 변을 정하며, 기본 세 단계에서는 4의 배수여야 합니다(2의 levels 빼기 1 제곱). 96복셀 패치는 기본값 64보다 복셀마다 더 넓은 맥락을 네트워크에 주지만 GPU 메모리가 더 필요합니다. min_free_gpu_mb: 8000이면 Potato는 여유 메모리가 8,000MB 이상인 GPU에서만 실행을 시작합니다. Potato는 칠한 각 레이블의 마스크 안에서 모델의 평균 확률을 구하고, 그중 가장 낮은 평균을 볼륨의 신뢰도로 보고합니다. min_confidence: 0.6이면 칠한 장기 중 어느 하나라도 평균 확률이 0.6 미만인 볼륨에는 사전 레이블이 달리지 않습니다.
volume-unet 실행의 학습 단계
실행은 어노테이션된 각 볼륨을 위젯이 칠하는 복셀 순서로 읽어 마스크를 복셀당 레이블 하나로 바꿉니다. 두 레이블이 겹치는 곳에서는 NIfTI 내보내기와 마찬가지로 번들의 레이블 순서에서 뒤에 오는 레이블이 이깁니다. 강도는 각 볼륨의 0.5와 99.5 백분위수로 클리핑한 뒤 표준화합니다. 네트워크는 순수 torch로 구현한 3D U-Net(세 단계, 인스턴스 정규화)이며, 에포크마다 무작위 패치 100개로 교차 엔트로피에 소프트 Dice를 더한 손실로 학습합니다. 패치의 절반은 칠한 복셀을 중심으로 잡으므로 작은 구조도 학습에 나타납니다. 각 에포크 뒤에 실행은 val 볼륨에서 평균 Dice 점수를 매겨 최고 에포크를 유지하며, 10 에포크 동안 점수가 나아지지 않으면 멈춥니다. 예측은 패치를 절반씩 겹쳐 가며 볼륨 전체에 밀고 가서 확률을 평균합니다.
train 분할에는 어노테이션된 볼륨이 최소 3개 필요합니다(min_instances). 칠한 모양이 파일의 모양과 다른 볼륨은 실행 로그에 경고를 남기고 제외되며, 파일이 없는 볼륨도 마찬가지입니다. 한 볼륨에 판독자가 여럿이면, 집계기는 답 전체를 비교하므로 실행은 aggregation이 정하는 한 판독자의 마스크로 학습합니다. 여러 판독자와 STAPLE로 CT 볼륨 분할하기는 판독자 간 일치도와 Potato 밖에서 만든 합의 마스크를 다룹니다.
볼륨의 홀드아웃 점수
Potato는 홀드아웃 볼륨마다 각 레이블의 Dice 계수를 계산하고(dice_<label>), 모든 볼륨과 레이블에 대한 평균을 mean_dice로 보고합니다. 레이블이 있는 볼륨에서 모델이 그 레이블을 빠뜨리면 0점입니다. 트레이너는 val에서 최고 에포크를 고르므로, 실행 표는 대표 값을 test에서 가져옵니다(test_mean_dice). 레이블별 점수의 전체 목록은 실행 페이지에 있습니다.
슬라이스 뷰의 마스크 사전 레이블
예측한 마스크는 위젯 고유의 형태, 즉 레이블별 축상 슬라이스로 돌아오며 prefilled_from: model로 표시되고, 어노테이터가 볼륨을 열면 슬라이스 뷰에 나타납니다. 어노테이터는 브러시와 지우개로 마스크를 고치고, 고친 마스크는 그 어노테이터의 답으로 저장됩니다. 실행의 train 분할에 있는 항목에는 사전 레이블이 달리지 않습니다. include_unlabeled가 없으면 실행은 실행의 val과 test 볼륨에서만 예측합니다.
external-3d로 3D 큐보이드 탐지하기
external-3d는 어노테이션된 스캔을 학습 호스트에 설치한 3D 탐지기에 넘기고, 사용자의 학습 및 예측 명령을 실행하고, 예측된 박스를 큐보이드로 읽어 들입니다. Potato는 포인트 클라우드 탐지기를 포함하지 않습니다. 이 트레이너가 염두에 둔 두 탐지기인 OpenPCDet과 MMDetection3D는 GPU 호스트에서 컴파일한 CUDA 연산자가 필요합니다. Potato 쪽에서 이 트레이너에 필요한 것은 numpy뿐입니다.
학습 데이터는 cuboid_3d 도구가 있는 spatial_annotation 스키마에서 나옵니다. 어노테이터는 PCD, PLY, LAS 또는 KITTI .bin 스캔에 방향이 있는 박스를 놓으며, 박스는 스캔 자체 좌표계에서 미터 단위로 저장됩니다(3D 포인트 클라우드와 큐보이드 참조). 큐보이드만 대상이므로 같은 스키마의 점, 폴리라인, 포인트 세그먼트는 무시됩니다. 각 항목은 스캔 하나이며, 트랙 ID가 있는 프레임 시퀀스는 학습 대상이 아닙니다.
탐지기용으로 쓰는 데이터셋 폴더
학습 명령이 실행되기 전에 Potato는 스캔을 {dataset}에 씁니다. 이 폴더는 실행 폴더 안의 dataset이라는 폴더이며 OpenPCDet의 커스텀 데이터셋 레이아웃을 따릅니다.
- **
points/<id>.npy**는 스캔 하나를x y z intensity형태의 float32 행으로 담으며, 파일에 강도가 없으면 강도는 0입니다. - **
labels/<id>.txt**는train과val스캔의 큐보이드마다x y z dx dy dz heading label형태로 한 줄씩 담습니다. heading은 +z 축을 기준으로 한 회전이며 단위는 라디안이고, 피치와 롤은 유지되지 않습니다. 레이블 이름의 공백은 밑줄이 됩니다. - **
ImageSets/train.txt,val.txt,predict.txt**는 스캔 ID를 나열합니다.predict.txt에는val과test스캔이 들어가며,writeback.include_unlabeled가 켜져 있으면 레이블이 없는 스캔도 들어갑니다.
각 <id>는 항목 ID의 SHA-1 앞 16개 16진 문자입니다. 항목 ID에는 파일 이름에 쓸 수 없는 문자가 있을 수 있기 때문입니다. test 스캔의 레이블은 폴더에 절대 쓰이지 않습니다. 지리 참조된 좌표는 float32에 담기에는 너무 크므로, Potato는 지리 참조된 스캔을 스캔의 원점 기준으로 쓰고 예측된 박스를 같은 오프셋만큼 되돌려 이동합니다.
탐지기에서 읽어 들이는 예측 파일
예측 명령은 스캔마다 {predictions}/<id>.txt 파일 하나를 쓰며, 한 줄에 박스 하나를 x y z dx dy dz heading label score 형태로 적습니다. 점수는 선택 사항입니다. Potato는 파싱되지 않는 줄, nan이나 inf가 든 줄, 스키마에 없는 레이블을 가진 줄, 크기가 없는 박스를 나타내는 줄을 제외하며, 실행 로그가 제외한 줄의 수를 셉니다. 남은 박스는 source: model로 표시된 cuboid_3d 객체로 돌아오고, 각 박스의 점수가 그 박스의 신뢰도가 됩니다. Potato는 스캔의 신뢰도를 그 스캔에서 가장 낮은 박스 점수로 정하며, min_confidence는 이 값에 적용됩니다.
학습 및 예측 명령
두 명령은 모두 트레이너 매개변수로 설정합니다. Potato는 각 명령을 셸처럼 단어로 나누고, {dataset}, {workdir}(실행 폴더), {predictions}를 해당 경로로 바꾼 뒤, 셸 없이 실행 폴더에서 명령을 실행합니다. 명령 안의 다른 중괄호는 쓴 그대로 둡니다. 파이프, &&, $VARIABLES는 프로그램에 문자 그대로의 단어로 전달되므로, 여러 단계의 작업은 스크립트에 넣어야 합니다. 포인트 클라우드 연구의 설정에 이 블록을 추가하십시오.
model_training:
enabled: true
backend: gpu-server
backends:
gpu-server:
type: ssh
host: gpu.example.edu
python: /opt/conda/envs/pcdet/bin/python
gpus: auto
trainer_params:
external-3d:
train_command: "/opt/pcdet-jobs/train.sh {dataset} {workdir}"
predict_command: "/opt/conda/envs/pcdet/bin/python /opt/pcdet-jobs/predict.py {dataset} {workdir} {predictions}"
timeout_s: 43200
writeback:
schemas: [objects]
min_confidence: 0.3
include_unlabeled: true경로는 실행 폴더가 있는 학습 호스트의 경로입니다. timeout_s는 각 명령의 제한 시간이며, 여기서 12시간은 기본값 24시간을 대체합니다. 0이 아닌 값으로 종료하는 학습 명령은 실행을 실패시키며, 실행의 오류에는 명령 출력의 마지막 줄들이 표시됩니다.
train.sh는 직접 작성하는 스크립트입니다. OpenPCDet의 경우 스크립트가 OpenPCDet의 커스텀 데이터셋 설정이 {dataset}을 가리키게 하고, python -m pcdet.datasets.custom.custom_dataset create_custom_infos <dataset config>로 정보 파일을 만들고, OpenPCDet의 학습 스크립트를 실행하고, 체크포인트를 {workdir} 아래에 저장합니다. 탐지기 설정의 클래스 이름은 labels/에 쓰인 레이블 이름과 일치해야 합니다. MMDetection3D의 커스텀 데이터셋 가이드는 포인트 클라우드를 .bin 파일로만 읽으므로, MMDetection3D에서는 스크립트가 먼저 각 points/<id>.npy를 .bin 파일로 내보냅니다. train_command를 비워 두면 학습을 건너뛰고, 그러면 predict_command가 다른 곳에서 학습한 모델을 실행합니다.
predict.py는 predict.txt의 ID를 읽고, 각 스캔에 탐지기를 실행하고, 박스를 씁니다. load_model과 detect 함수는 학습한 탐지기를 감싸는 사용자의 코드입니다.
"""predict.py DATASET WORKDIR PREDICTIONS: one line per box, one file per scan."""
import os
import sys
import numpy as np
from my_detector import load_model, detect # your code around OpenPCDet or MMDetection3D
dataset, workdir, out = sys.argv[1:4]
model = load_model(os.path.join(workdir, "output")) # where train.sh saved the checkpoint
os.makedirs(out, exist_ok=True)
with open(os.path.join(dataset, "ImageSets", "predict.txt")) as fh:
scan_ids = fh.read().split()
for scan_id in scan_ids:
points = np.load(os.path.join(dataset, "points", scan_id + ".npy")) # float32, (N, 4)
with open(os.path.join(out, scan_id + ".txt"), "w") as fh:
for x, y, z, dx, dy, dz, heading, label, score in detect(model, points):
fh.write(f"{x} {y} {z} {dx} {dy} {dz} {heading} {label} {score}\n")train_command가 없으면 예측 명령이 실행의 전부이며, 0이 아닌 값으로 종료하는 예측 명령은 실행을 실패시킵니다. 0으로 종료하지만 어떤 스캔에도 <id>.txt를 쓰지 않거나 Potato가 제외하는 줄만 쓰는 예측 명령도 실패로 칩니다. 그 출력으로 점수를 매긴 실행은 아무것도 찾지 못한 모델처럼 보이기 때문입니다. 빈 파일은 객체가 없는 스캔입니다. 학습 명령 뒤에서는 예측 명령이 실패해도 실행이 실패하지 않습니다. 실행은 "Prediction pass failed after 0 prediction(s)"라는 경고와 명령 출력의 마지막 줄들을 남기고 끝나며, 예측도 홀드아웃 점수도 없습니다. 끝난 실행이 "not scored"로 표시되면 실행 로그에서 이 경고를 확인하십시오.
큐보이드의 홀드아웃 점수
Potato는 레이블별 3D 평균 정밀도를 체적 IoU 0.5에서 계산합니다(ap_3d_50_<label>). 이 IoU는 어떤 회전의 방향 있는 큐보이드에도 정확합니다. Potato는 IoU 0.25와 0.5에서 레이블 평균도 보고하고, 0.5에서의 정밀도, 재현율, F1도 보고합니다. 대표 값은 map_3d_50입니다. train_command가 있으면 학습 명령이 {dataset}의 val 레이블을 받아 그 레이블로 체크포인트를 고를 수 있으므로, 실행 표는 대표 값을 먼저 test에서 가져옵니다. train_command가 없으면 모델은 연구의 val 항목을 본 적이 없으므로 대표 값은 val에서 나옵니다.
포인트 클라우드 뷰어의 큐보이드 사전 레이블
예측한 큐보이드는 포인트 클라우드 뷰어에 편집 가능한 박스로 나타나며, 편집한 박스는 어노테이터의 답으로 저장됩니다. Potato는 뷰어가 예측 객체를 그리기 전에 각 객체를 검사하여, 기하가 파싱되지 않는 객체, 크기가 없는 큐보이드, 스키마에 없는 레이블을 제외합니다. 3D 포인트 클라우드 어노테이션하는 방법은 어노테이션 쪽과 3D 박스의 일치도를 다룹니다.
video-track으로 비디오 속 객체 추적하기
video-track은 어노테이터가 tracking 또는 combined 모드의 video_annotation 스키마에서 그린 트랙을 학습하고, 아직 아무도 추적하지 않은 비디오에서 트랙을 예측합니다. 트랙은 레이블과 키프레임마다의 박스이며, 위젯이 키프레임 사이의 박스를 보간합니다. 다른 모드의 video_annotation 스키마는 트랙이 아니라 세그먼트를 저장하며, 그 스키마에는 video-track이 제공되지 않습니다.
annotation_task_name: "Pedestrian tracking"
task_dir: .
media_directory: media
data_files:
- data/clips.jsonl
item_properties:
id_key: id
text_key: video
output_annotation_dir: annotation_output
user_config:
allow_all_users: true
annotation_schemes:
- annotation_type: video_annotation
name: tracks
description: "Track every pedestrian and cyclist with a box at each keyframe."
source_field: video
mode: tracking
video_fps: 25
labels:
- {name: pedestrian, color: "#FF6B6B"}
- {name: cyclist, color: "#45B7D1"}
tracking_options:
interpolation: linear
auto_advance_frames: 5
frame_stepping: true
model_training:
enabled: true
trainer_params:
video-track:
frame_fps: 2
predict_fps: 5
max_age: 4
writeback:
schemas: [tracks]
include_unlabeled: true각 데이터 줄은 media_directory 아래의 클립 하나를 지정합니다.
{"id": "clip_001", "video": "/media/clip_001.mp4"}
{"id": "clip_002", "video": "/media/clip_002.mp4"}video_fps는 클립의 실제 프레임 레이트로 설정하십시오. 키프레임은 프레임 번호로 매겨지며, 트레이너는 예측한 키프레임을 스키마의 video_fps(설정하지 않으면 30)로 번호 매깁니다. 트레이너는 샘플링한 프레임의 박스를 각 트랙 자체의 interpolation 설정(선형, 3차 Catmull-Rom, 상수)에 따라 읽습니다. 따라서 모델이 학습하는 박스는 어노테이터가 본 경로를 따릅니다. 위젯에서와 마찬가지로 키프레임이 하나인 트랙은 모든 프레임에서 유지되고, 위젯이 startFrame과 endFrame을 준 트랙은 그 두 프레임 사이에서 이어집니다. 이 두 프레임 밖의 키프레임도 그 키프레임 자체의 프레임에는 표시됩니다. predict_fps: 5는 초당 2프레임 대신 초당 5프레임에서 탐지합니다. 초당 5프레임은 빠르게 움직이는 객체에 키프레임을 더 주지만 탐지기 통과 횟수도 더 듭니다. 트랙은 일치하는 탐지 없이 샘플링한 프레임이 max_age개를 넘으면 끝나므로, 초당 5프레임에서 max_age: 4이면 트랙이 탐지가 0.8초 동안 빗나가도 살아남습니다. 기둥 뒤로 지나가는 보행자는 탐지기가 0.8초 안에 그 보행자를 다시 찾으면 트랙 하나를 유지합니다. 이 설정은 Potato를 실행하는 머신(local 백엔드)에서 학습하며, 볼륨 설정의 gpu-server 백엔드도 video-track에 사용할 수 있습니다.
video-track 실행의 학습과 트랙 연결
실행은 어노테이션된 각 비디오를 시작부터 마지막 키프레임까지 frame_fps 프레임 속도로 샘플링하고, 샘플링한 각 프레임을 OpenCV로 읽습니다. 캔버스 픽셀은 어노테이터의 화면에 따라 달라지므로, 트레이너는 그 프레임에서 각 트랙의 박스를 그림에 대한 비율로 읽습니다. 프레임에 트랙이 없는 샘플링 프레임은 빈 장면의 예시로 학습에 남습니다. 실행은 이 프레임들로 torchvision Faster R-CNN을 파인튜닝하며, 매개변수와 기본값은 torchvision-detect와 같습니다. 탐지기는 torchvision의 COCO 가중치에서 시작합니다. 각 에포크 뒤에 실행은 val 프레임에서 IoU 0.5의 박스 mAP 점수를 매겨(frame_map_50) 최고 에포크를 유지합니다.
예측은 각 비디오를 predict_fps로 샘플링하고, 샘플링한 모든 프레임에서 탐지하고, 탐지를 트랙으로 연결합니다. 각 프레임의 탐지는 같은 레이블의 살아 있는 트랙과 일대일로 짝지어지며, 각 트랙의 마지막 박스와의 겹침으로 짝을 정하고, 짝이 되려면 IoU가 match_iou(0.3) 이상이어야 합니다. 짝이 없는 탐지 중 점수가 new_track_score(0.5) 이상인 것은 새 트랙을 시작합니다. 트레이너는 탐지가 min_track_keyframes개(기본값 2) 미만인 예측 트랙을 쓰기와 점수 계산 전에 버립니다. 그러지 않으면 위젯이 탐지 하나짜리 트랙을 모든 프레임에서 유지하게 됩니다. 모든 탐지가 키프레임이 되므로, 위젯은 어노테이터의 키프레임 사이를 보간하는 것처럼 모델의 키프레임 사이도 보간합니다.
train 분할에는 어노테이션된 비디오가 최소 2개 필요합니다(min_instances). OpenCV가 디코딩하지 못하는 비디오는 항목을 밝히는 경고와 함께 제외되고, 실행은 나머지로 계속됩니다.
트랙의 홀드아웃 점수
Potato는 각 홀드아웃 비디오 전체에서 초당 2프레임으로 샘플링한 프레임과 어노테이션된 모든 키프레임에서, 예측한 트랙을 어노테이션된 트랙과 비교합니다. 점수는 MOTA, IDF1, ID 전환, 놓침, 거짓 양성이며, 박스는 IoU 0.5에서 찾은 것으로 셉니다. MOTA는 놓침, 거짓 양성, 정체성 전환을 어노테이션된 박스 수에 대해 감점합니다. IDF1은 비디오 전체에서 올바른 정체성에 짝지어진 박스의 F1 점수이며, IDF1이 대표 값입니다(idf1). 트레이너는 val에서 최고 에포크를 고르므로, 실행 표는 대표 값을 test에서 가져옵니다.
비디오 위젯의 트랙 사전 레이블
예측한 트랙은 AI 출력으로 표시되고 탐지기의 점수를 가진 키프레임이 있는 트랙으로 비디오 위젯을 채웁니다. 위젯은 트랙을 그릴 때 박스를 위젯 고유의 캔버스 픽셀로 변환하며, 어노테이터는 다른 트랙과 똑같이 트랙을 고칩니다. 비디오의 신뢰도는 모델 키프레임의 평균 점수입니다. combined 모드에서 사전 레이블에는 트랙만 들어 있고, 세그먼트는 어노테이터가 추가합니다. 비디오 객체 추적 어노테이션하는 방법은 어노테이션 쪽, 가림, 시간적 일치도를 다룹니다.
실행을 시작하고 결과 확인하기
model_training을 추가한 뒤 서버를 다시 시작하고, /admin/training을 열어 스키마와 트레이너를 고른 다음 Train now를 누르십시오. 이 페이지는 각 스키마에 맞는 트레이너만 제공하며, 설치되지 않은 트레이너는 설치 명령과 함께 "not installed"로 표시합니다. 첫 실행 전에 GPU 서버를 확인하려면 다음을 실행하십시오.
potato training check gpu-server config.yaml이 확인은 원격 Python 버전, 각 GPU와 GPU의 여유 메모리, 실행이 받게 될 GPU, 원격 인터프리터에 없는 학습 패키지를 보고합니다. 실행은 API에서도 시작할 수 있으며, 실행별 매개변수가 trainer_params를 덮어씁니다.
curl -X POST -H "X-API-Key: $KEY" -H "Content-Type: application/json" \
http://localhost:8000/admin/training/api/runs \
-d '{"trainer": "video-track", "schemas": ["tracks"], "params": {"predict_fps": 10}}'실행이 끝나면 실행 표에 홀드아웃 점수가 나열되며, 분할과 지표는 툴팁에 나옵니다. 사전 레이블은 어노테이터를 앵커링하므로, 홀드아웃 점수가 모델의 답을 보여 줘도 좋다고 뒷받침할 때 새 연구에서 include_unlabeled를 켜십시오. 모델 인 더 루프 튜토리얼은 신뢰도가 가장 낮은 사전 레이블을 먼저 제공하고 수정본으로 재학습하는 방법을 다루며, 모델 학습 설정과 라우트는 모든 키, 백엔드, 되쓰기 검사를 나열합니다.
더 읽어보기
- 자신의 어노테이션으로 모델 학습하기
- 작업별로 묶은 Potato 모델 트레이너
- 2D 탐지와 분할을 다루는 비전 모델 튜토리얼
- 비디오 추적과 마스크 전파
- 비디오 어노테이션
- 의료 영상 어노테이션
- STAPLE을 이용한 마스크 합의
volume-unet,external-3d,video-track의 업스트림 참조 문서
참고문헌
- Bernardin, K., and Stiefelhagen, R. (2008). Evaluating Multiple Object Tracking Performance: The CLEAR MOT Metrics. EURASIP Journal on Image and Video Processing. https://doi.org/10.1155/2008/246309
- Çiçek, Ö., Abdulkadir, A., Lienkamp, S. S., Brox, T., and Ronneberger, O. (2016). 3D U-Net: Learning Dense Volumetric Segmentation from Sparse Annotation. MICCAI 2016. https://arxiv.org/abs/1606.06650
- Ristani, E., Solera, F., Zou, R. S., Cucchiara, R., and Tomasi, C. (2016). Performance Measures and a Data Set for Multi-Target, Multi-Camera Tracking. ECCV 2016 Workshop on Benchmarking Multi-Target Tracking. https://arxiv.org/abs/1609.01775