Skip to content

RealGain-5/ML

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

30 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Orbit ResNet Sec9 Inference (BIN → Orbit → normal/abnormal)

이 폴더는 백엔드에서 BIN 파일 1개를 넣으면 아래 결과를 빠르게 뽑기 위한 추론 전용 모듈입니다.

  • 입력: *.BIN (24채널, float32 little-endian, 마지막 10초 구간 사용)
  • 처리: RCP 4개 채널쌍 → sec9(9~10초) 오빗 이미지 1장씩 생성
  • 모델: ResNet18 (normal / abnormal)
  • 출력: RCP별 확률 + 최종 판정(4개 중 하나라도 abnormal이면 abnormal)

1) 추천 폴더 구조 (백엔드에서 쓰기 편한 형태)

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로 고정되어 있으므로, 위 구조를 유지하면 백엔드에서 가장 편합니다.


2) 설치 (추론 전용 최소 의존성)

2.1 가상환경 생성(권장)

cd real_gain/ml_inference/orbit_resnet_sec9

python -m venv .venv
# Windows (PowerShell)
.\.venv\Scripts\Activate.ps1
# Git Bash
source .venv/Scripts/activate

3) CLI 실행 방법 (백엔드에서 subprocess 호출할 때 그대로 사용)

3.1 기본 실행 (콘솔 출력)

python infer_resnet_None.py --bin_path "C:/path/to/your.BIN"

3.2 JSON만 출력 (✅ 백엔드 연동 추천)

백엔드에서는 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": { "...": "..." }
  }
}

3.3 Grad-CAM 시각화(로컬 디버깅용)

python infer_resnet_None.py --bin_path "C:/path/to/your.BIN" --show_cam

⚠️ 주의(백엔드/서버 환경)
--show_cam은 matplotlib로 창을 띄우기 때문에 서버(headless) 환경에서는 비권장입니다.
(백엔드에서는 보통 --json만 사용하세요.)

3.4 device 지정

기본값은 cpu입니다. (서버에서 GPU가 있으면 cuda로 지정 가능)

python infer_resnet_None.py --bin_path "C:/path/to/your.BIN" --device cuda --json

4) 백엔드 연동 가이드

방법 A) subprocess로 호출 (가장 단순/안전)

FastAPI 예시:

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 프로세스를 띄우므로 오버헤드가 있음

방법 B) 파이썬 import로 직접 호출 (성능/속도 유리)

백엔드 내부에서 아래처럼 바로 함수 호출도 가능합니다.

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번만 로드 → 요청마다 재사용)


5) 동작 요약 (내부 로직)

  1. BIN 파일에서 마지막 10초(24채널 × 40kHz × 10초)를 float32 LE로 읽음
  2. 채널쌍을 4개로 묶어 (RCP1A/1B/2A/2B)로 사용
  3. 각 RCP에 대해 sec9(9~10초) 구간만 오빗 이미지(256×256) 1장 생성
  4. ResNet18로 이미지 1장 추론 → normal/abnormal 확률 계산
  5. 4개 중 하나라도 abnormal이면 최종 abnormal

6) 체크리스트 (자주 막히는 지점)

  • models/resnet18_orbit_v3_None.pth 파일이 존재하는가?
  • pip install torch torchvision가 해당 가상환경에 설치되어 있는가?
  • scipy가 설치되어 있는가? (오빗 이미지 blur에 필요)
  • 서버에서는 --show_cam을 쓰지 않는가? (matplotlib 창 이슈)
  • BIN 파일이 “24채널 × 10초 × float32 LE” 형식이며 크기가 충분한가?

7) 운영 팁(권장)

  • 백엔드에서는 기본적으로 --json + subprocess 호출로 먼저 안정화
  • 성능이 필요하면 import 방식으로 전환(모델 warm-up & 재사용)
  • MODEL_PATH를 절대경로/환경변수 기반으로 바꾸면 배포가 더 편합니다

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors