dk - edit
This commit is contained in:
@@ -0,0 +1,46 @@
|
|||||||
|
# Normal Object Detection
|
||||||
|
|
||||||
|
YOLO 기반 일반 객체 탐지 스크립트입니다. 원격 이미지 URL을 받아 추론하고, 결과를 JSON으로 출력하며 ClearML에 기록합니다.
|
||||||
|
|
||||||
|
## 요구 사항
|
||||||
|
|
||||||
|
- Python 3.11+
|
||||||
|
- [uv](https://docs.astral.sh/uv/) (권장)
|
||||||
|
|
||||||
|
## 설치
|
||||||
|
|
||||||
|
```bash
|
||||||
|
uv sync
|
||||||
|
```
|
||||||
|
|
||||||
|
## 사용법
|
||||||
|
|
||||||
|
```bash
|
||||||
|
uv run main.py --image_url "https://example.com/image.jpg"
|
||||||
|
```
|
||||||
|
|
||||||
|
- `--image_url`: 추론할 이미지 URL (필수)
|
||||||
|
- 모델: `weights/yolo26m.pt` (Ultralytics YOLO)
|
||||||
|
- 탐지 결과가 그려진 이미지는 `*_marked.jpg`로 저장됩니다.
|
||||||
|
|
||||||
|
## 출력
|
||||||
|
|
||||||
|
표준 출력으로 JSON이 출력됩니다.
|
||||||
|
|
||||||
|
| 필드 | 설명 |
|
||||||
|
|------|------|
|
||||||
|
| `path` | 입력 이미지 경로 |
|
||||||
|
| `marked_path` | 바운딩 박스가 그려진 이미지 경로 |
|
||||||
|
| `shape` | 이미지 크기 (width, height) |
|
||||||
|
| `speed_ms` | 추론 속도 (ms) |
|
||||||
|
| `detections` | 탐지 객체 목록 (클래스, 신뢰도, `xywh` 박스) |
|
||||||
|
|
||||||
|
## ClearML
|
||||||
|
|
||||||
|
실행 시 ClearML Task가 생성됩니다.
|
||||||
|
|
||||||
|
- **Project**: `Normal_Object_Detection`
|
||||||
|
- **Task**: `model-yolo26-human`
|
||||||
|
- **Artifact**: `final_result` (추론 결과 JSON)
|
||||||
|
|
||||||
|
ClearML 서버 연결 설정이 필요합니다 (`clearml-init`).
|
||||||
|
|||||||
@@ -11,16 +11,6 @@ from clearml import Task # 1. ClearML 임포트
|
|||||||
model = YOLO("./weights/yolo26m.pt") # Medium 크기 가중치 자동 다운로드
|
model = YOLO("./weights/yolo26m.pt") # Medium 크기 가중치 자동 다운로드
|
||||||
|
|
||||||
|
|
||||||
def init_acai_task(output):
|
|
||||||
task = Task.init(
|
|
||||||
project_name="Normal_Object_Detection",
|
|
||||||
task_name="model-yolo26-human"
|
|
||||||
)
|
|
||||||
|
|
||||||
result_data = {"output": output, "status": "PASS"}
|
|
||||||
task.upload_artifact(name="final_result", artifact_object=result_data)
|
|
||||||
|
|
||||||
|
|
||||||
def xyxy_to_xywh(box: dict) -> dict:
|
def xyxy_to_xywh(box: dict) -> dict:
|
||||||
x1 = math.floor(box["x1"])
|
x1 = math.floor(box["x1"])
|
||||||
y1 = math.floor(box["y1"])
|
y1 = math.floor(box["y1"])
|
||||||
@@ -57,7 +47,20 @@ def main(image_path: str):
|
|||||||
}
|
}
|
||||||
print(json.dumps(output, indent=2, ensure_ascii=False))
|
print(json.dumps(output, indent=2, ensure_ascii=False))
|
||||||
|
|
||||||
init_acai_task(output)
|
return output
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
task = Task.init(
|
||||||
|
project_name="Normal_Object_Detection",
|
||||||
|
task_name="model-yolo26-human"
|
||||||
|
)
|
||||||
|
def init_acai_task(output):
|
||||||
|
result_data = {"output": output, "status": "PASS"}
|
||||||
|
task.upload_artifact(name="final_result", artifact_object=result_data)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
@@ -77,4 +80,6 @@ if __name__ == "__main__":
|
|||||||
f.write(image_data)
|
f.write(image_data)
|
||||||
image_path = "image.jpg"
|
image_path = "image.jpg"
|
||||||
|
|
||||||
main(image_path)
|
output = main(image_path)
|
||||||
|
|
||||||
|
init_acai_task(output)
|
||||||
Reference in New Issue
Block a user