PEM (Pose Estimation Model) Server는 SAM-6D 기반의 포즈 추정 모델을 FastAPI로 구현한 서버입니다.
PEM_Server는 SAM-6D 모델을 활용하여 RGB-D 이미지에서 객체의 6D 포즈를 추정하는 서버입니다. ISM (Instance Segmentation Model) 결과를 입력으로 받아 객체의 위치와 방향을 정확하게 추정합니다.
- FastAPI 기반: 고성능 비동기 웹 서버
- 자동 모델 로딩: 서버 시작 시 SAM-6D 모델 자동 로드
- CUDA 지원: GPU 가속을 통한 빠른 추론
- RESTful API: 표준 HTTP API 인터페이스
- 로깅 시스템: 상세한 로그 기록 및 파일 저장
- RGB-D 이미지 입력
- ISM 세그멘테이션 결과 처리
- 6D 포즈 (회전 + 변위) 추정
- 검출 신뢰도 점수 제공
- 모델 상태 확인
- 동적 모델 로딩/언로딩
- GPU 메모리 관리
- 서버 상태 모니터링
- 모델 로딩 상태 확인
- 시스템 리소스 정보
- GPU: NVIDIA GPU (CUDA 지원)
- 메모리: 최소 8GB RAM
- 저장공간: 최소 10GB 여유 공간
- Docker: 20.10 이상
- Docker Compose: 2.0 이상
- NVIDIA Container Toolkit: GPU 지원용
- Python: 3.8 이상
- PyTorch: CUDA 지원 버전
- FastAPI: 웹 서버 프레임워크
# Docker Compose로 서버 실행
docker-compose up -d
# 로그 확인
docker-compose logs -f pem-server# 헬스 체크
curl http://localhost:8003/api/v1/health
# 모델 상태 확인
curl http://localhost:8003/api/v1/model/status# 서버 중지
docker-compose down- 서버 URL:
http://localhost:8003 - API 문서:
http://localhost:8003/docs(Swagger UI) - API 버전: v1
GET /api/v1/health응답 예시:
{
"status": "healthy",
"message": "Server is running",
"uptime": 1234.56,
"model": {
"loaded": true,
"device": "cuda",
"parameters": 107939560,
"loading_time": 45.2
}
}POST /api/v1/pose-estimation요청 형식:
{
"rgb_image": "base64_encoded_rgb_image",
"depth_image": "base64_encoded_depth_image",
"cam_params": {
"cam_K": [[fx, 0, cx], [0, fy, cy], [0, 0, 1]],
"depth_scale": 1000.0
},
"cad_path": "/path/to/cad/model.ply",
"seg_data": [
{
"scene_id": 1,
"image_id": 1,
"category_id": 1,
"bbox": [x, y, w, h],
"score": 0.9,
"segmentation": {
"size": [height, width],
"counts": "encoded_mask"
}
}
],
"template_dir": "/path/to/templates",
"det_score_thresh": 0.2,
"output_dir": "/path/to/output"
}응답 예시:
{
"success": true,
"detections": [...],
"pose_scores": [0.95, 0.87, 0.92],
"pred_rot": [[[r11, r12, r13], [r21, r22, r23], [r31, r32, r33]], ...],
"pred_trans": [[x, y, z], ...],
"num_detections": 3,
"inference_time": 2.45,
"template_dir_used": "/path/to/templates",
"cad_path_used": "/path/to/cad/model.ply",
"output_dir_used": "/path/to/output"
}GET /api/v1/pose-estimation/sample?sample_dir=/path/to/example# 모델 상태 확인
GET /api/v1/model/status
# 모델 로딩
POST /api/v1/model/load
# 모델 언로딩
POST /api/v1/model/unload# Docker 컨테이너 내에서 실행
docker-compose exec pem-server bash -c "source /opt/conda/bin/activate sam6d && cd PEM_Server && python test_basic_api.py"# 전체 포즈 추정 테스트
docker-compose exec pem-server bash -c "source /opt/conda/bin/activate sam6d && cd PEM_Server && python test_pose_estimation_api.py"🚀 PEM Server API 테스트 시작
서버 URL: http://localhost:8003
==================================================
테스트: 서버 헬스 체크
==================================================
✅ 서버 상태: healthy
✅ 모델 로드됨: True
✅ 디바이스: cuda
✅ 파라미터 수: 107,939,560
==================================================
테스트: 포즈 추정 서비스 상태
==================================================
✅ 서비스 상태: ready
✅ 모델 로드됨: True
✅ 디바이스: cuda
==================================================
테스트: 샘플 데이터 포즈 추정
==================================================
✅ 포즈 추정 성공!
✅ 요청 처리 시간: 11.762s
✅ 추론 시간: 8.485s
✅ 검출된 객체 수: 16
🎉 모든 테스트가 성공했습니다!
증상:
RuntimeError: No CUDA GPUs are available
해결방법:
- NVIDIA Container Toolkit 설치 확인
- Docker Compose의 GPU 설정 확인
- 서버 재시작
docker-compose restart pem-server증상:
Model loading failed: FileNotFoundError
해결방법:
- 모델 파일 경로 확인
- 권한 설정 확인
- Docker 볼륨 마운트 확인
증상:
CUDA out of memory
해결방법:
- GPU 메모리 정리
- 배치 크기 감소
- 모델 언로딩 후 재로딩
# 실시간 로그 확인
docker-compose logs -f pem-server
# 로그 파일 위치
PEM_Server/log/pem_server_YYYYMMDD_HHMMSS.logPEM_Server/
├── api/ # API 엔드포인트
│ ├── endpoints/ # 각 기능별 엔드포인트
│ └── models.py # Pydantic 모델 정의
├── core/ # 핵심 기능
│ ├── config.py # 설정 관리
│ ├── model_manager.py # 모델 관리
│ └── logging_config.py # 로깅 설정
├── model/ # 모델 관련 파일
├── utils/ # 유틸리티 함수
├── main.py # FastAPI 애플리케이션 진입점
├── requirements.txt # Python 의존성
├── docker-compose.yml # Docker 설정
└── Dockerfile # Docker 이미지 정의
- 모델 로딩/언로딩 관리
- GPU 메모리 관리
- 모델 상태 추적
- 포즈 추정 API 구현
- 입력 데이터 검증
- 결과 포맷팅
- 파일 기반 로깅
- 로그 레벨 관리
- 타임스탬프 포함
# 개발용 컨테이너 실행
docker-compose -f docker-compose.dev.yml up -d
# 코드 변경 시 자동 재시작
docker-compose -f docker-compose.dev.yml up --build- Python: PEP 8 준수
- API: RESTful 설계 원칙
- 로깅: 구조화된 로그 메시지
- 에러 처리: 명확한 에러 메시지
- 모델 로딩 시간: ~45초
- 추론 시간: ~8-9초 (16개 객체)
- 메모리 사용량: ~4GB GPU 메모리
- 검출 정확도: 16개 객체 검출 성공
- GPU 메모리 관리: 불필요한 모델 언로딩
- 배치 처리: 여러 요청 동시 처리
- 캐싱: 템플릿 데이터 캐싱
- 비동기 처리: FastAPI 비동기 기능 활용
이 프로젝트는 SAM-6D 모델을 기반으로 하며, 해당 라이선스를 따릅니다.
버그 리포트나 기능 요청은 이슈 트래커를 통해 제출해 주세요.
문제가 발생하거나 질문이 있으시면 로그 파일과 함께 문의해 주세요.
PEM Server v1.0.0 - SAM-6D 기반 포즈 추정 서버