-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathModel_Development.py
More file actions
106 lines (91 loc) · 4.08 KB
/
Copy pathModel_Development.py
File metadata and controls
106 lines (91 loc) · 4.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
"""
SAM3 Defect Studio — 데스크탑 앱 진입점 (UI 전용)
==============================================================================
이 파일은 실행 설정 → 이미지 선택 → 메인 윈도우 부팅만 담당한다.
레이어 구성
-----------
- sam3_defect.py : SAM3 검출 엔진 (UI 와 무관)
- features/ : "기능" = 개별 모듈. 새 기능은 여기에 파일 하나 추가하면
UI 에 버튼/레이어가 자동으로 생긴다 (Model_Development.py 수정 불필요).
- ui/ : PySide6 위젯/렌더링/스레드
사용법
------
python Model_Development.py # 아래 if __name__ == "__main__" 설정값으로 실행
설정은 파일 아래쪽 if __name__ == "__main__" 블록의 args 값을 직접 수정합니다.
예: image=r"C:\\path\\to\\image.png", image_size=768, fp32=True
==============================================================================
"""
from __future__ import annotations
import sys
from PIL import Image
from PySide6.QtWidgets import QApplication
from defect_dataset import DefectDataset
from log_utils import get_logger, log_system_state, setup_logging
from sam3_defect import Sam3DefectDetector
from ui import MainWindow
from ui.theme import DARK_QSS
def main(
image: str | None = None,
image_size: int | None = None,
dataset_dir: str = "dataset",
lora_dir: str | None = None,
fp32: bool = False,
):
log_file = setup_logging()
logger = get_logger(__name__)
logger.info(
"app starting log_file=%s argv=%s image=%s image_size=%s dataset_dir=%s lora_dir=%s fp32=%s",
log_file, sys.argv, image, image_size, dataset_dir, lora_dir, fp32,
)
log_system_state("app_start")
app = QApplication(sys.argv)
app.setApplicationName("Auto Labelling Tool — Labelling")
app.setStyleSheet(DARK_QSS)
logger.info("QApplication initialized")
# 이미지를 미리 선택하지 않고 빈 상태로 UI 를 띄운다.
# image 인자가 주어진 경우에만 시작 이미지를 미리 로드한다(없으면 UI 의 열기 버튼 사용).
image_path = image or None
pil_image = None
if image_path:
logger.info("image load start path=%s", image_path)
pil_image = Image.open(image_path).convert("RGB")
logger.info(
"image load done path=%s size=%sx%s mode=%s",
image_path,
pil_image.width,
pil_image.height,
pil_image.mode,
)
log_system_state("image_loaded", image_path=image_path)
detector = Sam3DefectDetector(image_size=image_size, use_fp16=not fp32, lora_dir=lora_dir)
logger.info(
"detector created model_id=%s image_size=%s use_fp16=%s lora_dir=%s",
detector.model_id,
detector.image_size,
detector.use_fp16,
lora_dir,
)
# LoRA 학습용 확정 데이터셋 — 사용자가 [Confirm & Save]로 쌓는다.
# (실제 학습은 coco_export.py -> lora_train.py 를 터미널에서 별도 실행)
dataset = DefectDataset(root=dataset_dir)
try:
dataset.load()
except Exception: # noqa: BLE001
logger.exception("dataset load failed at startup")
logger.info("dataset created dir=%s stats=%s", dataset_dir, dataset.stats())
win = MainWindow(detector, pil_image, image_path, dataset=dataset)
win.show()
logger.info("main window shown")
exit_code = app.exec()
logger.info("QApplication exited code=%s", exit_code)
log_system_state("app_exit", image_path=image_path)
sys.exit(exit_code)
if __name__ == "__main__":
# 터미널에 --image, --fp32 같은 옵션을 입력하지 않고 여기 값을 고쳐 실행합니다.
main(
image=None, # 예: r"C:\path\to\image.png"; None이면 파일 선택 창을 엽니다.
image_size=None, # 예: 768 또는 560; None이면 모델 기본값 1008을 씁니다.
dataset_dir="dataset",
lora_dir=None, # 예: r"dataset\lora_adapter\best"; None이면 base 모델(Zero-Shot).
fp32=False, # GTX 10xx 계열처럼 fp16이 느리면 True 권장.
)