0. NGC(nvcr.io) 계정/API Key 준비 (필수)
이 레포의 Dockerfile은 NGC 베이스 이미지를 사용합니다.
- x86:
nvcr.io/nvidia/pytorch:24.08-py3 - Jetson:
nvcr.io/nvidia/l4t-jetpack:r36.4.0
따라서 **nvcr.io 로그인**이 필요합니다.
- NVIDIA NGC 사이트 로그인
- 계정 설정(Setup)에서 API Key 생성
- 발급된 키를 복사해 둡니다.
(2) nvcr.io 로그인
아래 2가지 중 편한 방법 사용:
방법 A: 인터랙티브 로그인
docker login nvcr.io
# Username: $oauthtoken
# Password: <NGC API Key 붙여넣기>
CPP_Project/third_party/cnpy 등이 submodule일 수 있어 --recurse-submodules 권장
git clone --recurse-submodules https://github.com/ruiny02/LSeg_Image_Encoder_TensorRT/tree/last_fix
cd LSeg_Image_Encoder_TensorRT
이미 clone을 해버렸다면:
git submodule update --init --recursive
cd LSeg_Image_Encoder_TensorRT
git switch real-time
docker build \
-f Dockerfile.x86 \
-t ruiny022/lseg-trt:x86-u22.04 \
.
cd LSeg_Image_Encoder_TensorRT
docker build \
-f Dockerfile.jetson \
-t ruiny022/lseg-trt:jetson-jp62 \
.
Jetson Dockerfile은 기본적으로 C++ 바이너리 빌드를 build 단계에서 스킵합니다.
(Jetson은 docker build 단계에서 DLA/cuDLA 라이브러리 마운트가 없어 링크가 깨질 수 있음)
필요하면 컨테이너 실행 후 runtime에서 빌드하는 방식을 권장합니다. (아래 8절 참고)
호스트에서 어떤 /dev/videoX인지 먼저 확인하세요.
ls -l /dev/video*
v4l2-ctl --list-devices || true- 보통 x86:
/dev/video0또는/dev/video2… (PC마다 다름) - 보통 Jetson USB:
/dev/video0
이 문서에서는 예시로:
- x86:
/dev/video4 - Jetson:
/dev/video0을 사용합니다. 본인 환경에 맞게 바꿔주세요.
호스트에서:
xhost +local:root
cd LSeg_Image_Encoder_TensorRT
docker run --rm -it \
--gpus all \
--net=host \
--privileged \
-e DISPLAY=$DISPLAY \
-e QT_X11_NO_MITSHM=1 \
-v /tmp/.X11-unix:/tmp/.X11-unix:rw \
-v $PWD:/workspace \
-v $HOME/.cache:/root/.cache \
--device /dev/video4:/dev/video4 \
ruiny022/lseg-trt:x86-u22.04
Jetson 호스트에서:
cd LSeg_Image_Encoder_TensorRT
docker run -it \
--runtime nvidia \
--net=host \
--privileged \
-e DISPLAY=$DISPLAY \
-e QT_X11_NO_MITSHM=1 \
-v /tmp/.X11-unix:/tmp/.X11-unix:rw \
-v $PWD:/workspace \
-v $HOME/.cache:/root/.cache \
--device /dev/video0:/dev/video0 \
ruiny022/lseg-trt:jetson-jp62
컨테이너 안에서 아래를 실행하면 **호스트의 repo 폴더(models/weights)**에 저장됩니다.
cd /workspace
mkdir -p models/weights/ViT models/weights/Resnet
pip3 install -U gdown
# ViT-L/16 (demo_e200.ckpt)
gdown 'https://drive.google.com/uc?id=1FTuHY1xPUkM-5gaDtMfgCl3D0gR89WV7' -O models/weights/ViT/demo_e200.ckpt
# ViT-L/16 (FSS, fss_l16.ckpt)
gdown 'https://drive.google.com/uc?id=1Nplkc_JsHIS55d--K2vonOOC3HrppzYy' -O models/weights/ViT/fss_l16.ckpt
# **Nano는 이것만 설치하시면 됩니다.**
# ResNet101 (ZS, fss_rn101.ckpt)
gdown 'https://drive.google.com/uc?id=1UIj49Wp1mAopPub5M6O4WW-Z79VB1bhw' -O models/weights/Resnet/fss_rn101.ckpt
체크포인트 출처: LSeg 공식 레포(lang-seg). 라이선스/배포 정책에 따라 본 레포에는 포함되어 있지 않습니다.
아래 명령들은 **컨테이너 내부(/workspace)**에서 실행합니다.
첫 실행 시 자동으로:
- ONNX 생성:
models/onnx_engines/*.onnx - TensorRT 엔진 생성:
models/trt_engines/*.trt
을 수행합니다. (처음만 시간이 걸립니다)
python3 realtime/lseg_realtime.py \
--device /dev/video4 \
--backend trt \
--weights models/weights/ViT/demo_e200.ckpt \
--labels "person, chair, desk, monitor, keyboard, background"
python3 realtime/lseg_realtime.py \
--device /dev/video4 \
--backend trt \
--weights models/weights/Resnet/fss_rn101.ckpt \
--labels "person, chair, desk, monitor, keyboard, background"
(옵션) Nano 환경에서 onnx로 인해 자동 엔진 빌드 실패 시 FP32 ONNX를 그대로 사용하면서 아래 명령으로 FP16 TensorRT 엔진을 수동으로 생성
python3 conversion/onnx_to_trt.py \
--onnx models/onnx_engines/lseg_img_enc_rn101_fss_rn101.onnx \
--engine models/trt_engines/lseg_img_enc_rn101_fss_rn101_288x512_fp16.trt \
--fp16 \
--min_hw 288 512 --opt_hw 288 512 --max_hw 288 512 \
--workspace 1073741824(옵션) 그 후 다시 데모 수행
python3 realtime/lseg_realtime.py \
--device /dev/video0 \
--backend trt \
--weights models/weights/Resnet/fss_rn101.ckpt \
--labels "person, chair, desk, monitor, keyboard, background"- 종료:
q또는ESC - 종료 시 콘솔에 Avg(ms), FPS 요약이 출력됩니다.
Jetson에서는 --device /dev/video0로 바꿔서 실행하세요.
python3 realtime/lseg_realtime.py \
--device /dev/video4 \
--backend torch \
--weights models/weights/ViT/demo_e200.ckpt \
--labels "person, chair, desk, monitor, keyboard, background"
실시간 스크립트가 자동으로 만들어주지만, 수동으로도 가능합니다.
ViT (Nano환경에서 구현 불가능)
python3 conversion/model_to_onnx.py \
--weights models/weights/ViT/demo_e200.ckpt
# 출력: models/onnx_engines/lseg_img_enc_vit_demo_e200.onnx
ResNet101(ZS)
python3 conversion/model_to_onnx_zs.py \
--weights models/weights/Resnet/fss_rn101.ckpt
# 출력: models/onnx_engines/lseg_img_enc_rn101_fss_rn101.onnx
입력 해상도는 실시간 데모 기본값(288x512)에 맞춘 예시입니다.
python3 conversion/onnx_to_trt.py \
--onnx models/onnx_engines/lseg_img_enc_vit_demo_e200.onnx \
--fp16 \
--min_hw 288 512 --opt_hw 288 512 --max_hw 288 512 \
--workspace $((1<<30))
엔진은 기본적으로 models/trt_engines/ 아래에 자동 이름으로 저장됩니다.
(직접 파일명을 지정하려면 --engine <PATH> 옵션 사용)
- TensorRT 엔진 생성 (Input: 160×256)
python3 conversion/onnx_to_trt.py \
--onnx models/onnx_engines/lseg_img_enc_rn101_fss_rn101.onnx \
--engine models/trt_engines/lseg_img_enc_rn101_fss_rn101_160x256_fp16.trt \
--fp16 \
--min_hw 160 256 --opt_hw 160 256 --max_hw 160 256 \
--workspace 1073741824- 실시간 데모 실행 (Engine: 160×256)
python3 realtime/lseg_realtime.py \
--device /dev/video0 \
--backend trt \
--weights models/weights/Resnet/fss_rn101.ckpt \
--labels "person, chair, desk, monitor, keyboard, background"
--engine models/trt_engines/lseg_img_enc_rn101_fss_rn101_160x256_fp16.trt- TensorRT 엔진 생성 (Input: 224×352)
python3 conversion/onnx_to_trt.py \
--onnx models/onnx_engines/lseg_img_enc_rn101_fss_rn101.onnx \
--engine models/trt_engines/lseg_img_enc_rn101_fss_rn101_224x352_fp16.trt \
--fp16 \
--min_hw 224 352 --opt_hw 224 352 --max_hw 224 352 \
--workspace 1073741824- 실시간 데모 실행 (Engine: 224×352)
python3 realtime/lseg_realtime.py \
--device /dev/video0 \
--backend trt \
--weights models/weights/Resnet/fss_rn101.ckpt \
--labels "person, chair, desk, monitor, keyboard, background"
--engine models/trt_engines/lseg_img_enc_rn101_fss_rn101_224x352_fp16.trt- x86 Dockerfile은 build 단계에서 C++ 바이너리를 미리 빌드해
/opt/prebuilt에 넣고, 컨테이너 시작 시/workspace/CPP_Project/**/build/로 복사합니다. - Jetson은 기본적으로 build 단계 C++ 빌드를 스킵하므로, 컨테이너 내부에서 직접 빌드를 권장합니다.
Jetson 컨테이너 내부에서:
cd /workspace/CPP_Project/Inference_Time_Tester
cmake -B build -S .
cmake --build build -j"$(nproc)"
cd /workspace/CPP_Project/Feature_Extractor
cmake -B build -S .
cmake --build build -j"$(nproc)"
9.1 docker build에서 nvcr.io pull이 실패
docker login nvcr.io가 되어 있는지 확인- Username이 $oauthtoken 인지 확인
- API Key가 만료/삭제되지 않았는지 확인
- 호스트에서
xhost +local:root실행했는지 확인 e DISPLAY=$DISPLAY와/tmp/.X11-unix마운트 확인- Wayland 환경이면 X11 설정이 추가로 필요할 수 있습니다.
/dev/videoX가 컨테이너에 전달되었는지 확인 (-device ...)- 호스트에서 다른 프로그램이 카메라를 잡고 있지 않은지 확인
- 카메라 해상도/프레임이 지원되는지 확인 (
-cam_w/--cam_h/--cam_fps변경)
-
엔진은 Jetson에서 직접 빌드해야 합니다.
-
기존에 x86에서 만든
models/trt_engines/*.trt가 남아있으면 삭제 후 재빌드:rm -f models/trt_engines/*.trt