이 폴더는 백엔드에서 BIN 파일 1개를 넣으면 아래 결과를 빠르게 뽑기 위한 추론 전용 모듈입니다.
- 입력:
*.BIN(24채널, float32 little-endian, 마지막 10초 구간 사용) - 처리: RCP 4개 채널쌍 → sec9(9~10초) 오빗 이미지 1장씩 생성
- 모델: ResNet18 (
normal / abnormal) - 출력: RCP별 확률 + 최종 판정(4개 중 하나라도 abnormal이면 abnormal)
real_gain/
backend/ # FastAPI/Flask 등 백엔드 프로젝트
...
ml_inference/ # ✅ 백엔드가 호출하는 추론 전용 폴더
orbit_resnet_sec9/ # (임의 폴더명) “오빗 ResNet sec9 추론 모듈”
infer_resnet_None.py # ✅ 추론 스크립트 (CLI + import 둘 다 가능)
models/
resnet18_orbit_v3_None.pth # ✅ 모델 가중치(체크포인트)
infer_resnet_None.py는 가중치 경로가 기본적으로models/resnet18_orbit_v3_None.pth로 고정되어 있으므로, 위 구조를 유지하면 백엔드에서 가장 편합니다.
cd real_gain/ml_inference/orbit_resnet_sec9
python -m venv .venv
# Windows (PowerShell)
.\.venv\Scripts\Activate.ps1
# Git Bash
source .venv/Scripts/activatepython infer_resnet_None.py --bin_path "C:/path/to/your.BIN"백엔드에서는 stdout를 JSON으로 파싱하기 쉬워서 이 옵션을 추천합니다.
python infer_resnet_None.py --bin_path "C:/path/to/your.BIN" --json출력 JSON 구조(예시):
{
"bin_path": "C:/path/to/your.BIN",
"model_path": "models/resnet18_orbit_v3_None.pth",
"final_label": "normal | abnormal",
"results": {
"RCP1A": {
"prediction": "normal | abnormal",
"probabilities": { "normal": 0.12, "abnormal": 0.88 }
},
"RCP1B": { "...": "..." },
"RCP2A": { "...": "..." },
"RCP2B": { "...": "..." }
}
}python infer_resnet_None.py --bin_path "C:/path/to/your.BIN" --show_cam
--show_cam은 matplotlib로 창을 띄우기 때문에 서버(headless) 환경에서는 비권장입니다.
(백엔드에서는 보통 --json만 사용하세요.)
기본값은 cpu입니다. (서버에서 GPU가 있으면 cuda로 지정 가능)
python infer_resnet_None.py --bin_path "C:/path/to/your.BIN" --device cuda --jsonFastAPI 예시:
import json
import subprocess
def run_infer(bin_path: str) -> dict:
cmd = [
"python",
"infer_resnet_None.py",
"--bin_path", bin_path,
"--json"
]
p = subprocess.run(cmd, capture_output=True, text=True, check=True)
return json.loads(p.stdout)장점: 백엔드 프로세스와 추론 프로세스가 분리되어 안정적
단점: 호출 1회마다 Python 프로세스를 띄우므로 오버헤드가 있음
백엔드 내부에서 아래처럼 바로 함수 호출도 가능합니다.
from infer_resnet_None import infer_bin_sec9, _set_device
def run_infer_inprocess(bin_path: str) -> dict:
_set_device("cpu") # 또는 "cuda"
results, final_label = infer_bin_sec9(bin_path, show_cam=False)
return {
"bin_path": bin_path,
"final_label": final_label,
"results": results,
}import 방식은 모델 로드/메모리 관리 정책을 백엔드에서 더 정교하게 잡을 수 있습니다.
(예: 서버 시작 시 모델 1번만 로드 → 요청마다 재사용)
- BIN 파일에서 마지막 10초(24채널 × 40kHz × 10초)를 float32 LE로 읽음
- 채널쌍을 4개로 묶어 (RCP1A/1B/2A/2B)로 사용
- 각 RCP에 대해 sec9(9~10초) 구간만 오빗 이미지(256×256) 1장 생성
- ResNet18로 이미지 1장 추론 →
normal/abnormal확률 계산 - 4개 중 하나라도 abnormal이면 최종 abnormal
-
models/resnet18_orbit_v3_None.pth파일이 존재하는가? -
pip install torch torchvision가 해당 가상환경에 설치되어 있는가? -
scipy가 설치되어 있는가? (오빗 이미지 blur에 필요) - 서버에서는
--show_cam을 쓰지 않는가? (matplotlib 창 이슈) - BIN 파일이 “24채널 × 10초 × float32 LE” 형식이며 크기가 충분한가?
- 백엔드에서는 기본적으로
--json+ subprocess 호출로 먼저 안정화 - 성능이 필요하면 import 방식으로 전환(모델 warm-up & 재사용)
MODEL_PATH를 절대경로/환경변수 기반으로 바꾸면 배포가 더 편합니다