SecureMLAPI / README.md
yenslife's picture
feat: integrate ppnet inference backend
896740b
---
title: SecureML
emoji: 😻
colorFrom: purple
colorTo: red
sdk: docker
app_file: app.py
pinned: false
license: mit
short_description: 成大資安計畫使用
---
# SecureMLAPI
這個專案提供一個 FastAPI 服務,用來判斷圖片中是否有人。
目前已整合兩種推論後端:
- `ppnet_baseline`:使用 `people_detection_baseline/baseline_40_model.pt.tar`
- `resnet18_presence`:使用 `best_global_model_presence.pt`
預設模型是 `ppnet_baseline`
## 開發環境
請使用 `uv` 安裝依賴與執行指令。
```bash
uv sync
```
## 啟動服務
```bash
uv run uvicorn app:app --host 0.0.0.0 --port 8000 --reload
```
啟動後可使用以下路徑:
- `/docs`:Swagger UI
- `/health`:健康檢查
- `/predict`:上傳圖片並取得 JSON 推論結果
- `/demo`:簡易網頁測試介面
## 切換模型
目前不需要從 HTML 介面切換模型,直接用程式設定即可。
### 方式一:用環境變數切換
```bash
SECUREML_MODEL=ppnet_baseline uv run uvicorn app:app --host 0.0.0.0 --port 8000
```
```bash
SECUREML_MODEL=resnet18_presence uv run uvicorn app:app --host 0.0.0.0 --port 8000
```
### 方式二:修改預設值
可直接修改 `model_service.py` 裡的:
```python
DEFAULT_MODEL_NAME = os.getenv("SECUREML_MODEL", "ppnet_baseline")
```
以及 `MODEL_CONFIGS` 中對應模型的設定。
## 本地推論
專案提供 `inference.py`,可直接對單張圖片做推論:
```bash
uv run python inference.py --image person.jpg
```
指定模型:
```bash
uv run python inference.py --image person.jpg --model ppnet_baseline
```
```bash
uv run python inference.py --image person.jpg --model resnet18_presence
```
## API 使用方式
使用 `curl` 呼叫 `/predict`
```bash
curl -X POST \
-F "file=@person.jpg" \
http://127.0.0.1:8000/predict
```
回傳格式範例:
```json
{
"label": "person",
"prediction_index": 1,
"probabilities": {
"no_person": 0.0,
"person": 1.0
},
"model_name": "ppnet_baseline",
"model_backend": "ppnet",
"model_path": "baseline_40_model.pt.tar",
"filename": "person.jpg",
"content_type": "image/jpeg"
}
```
## 目前模型設定位置
模型切換與設定集中在 `model_service.py`
- `MODEL_CONFIGS`:定義可用模型
- `DEFAULT_MODEL_NAME`:定義預設模型
- `get_model_service()`:建立對應推論服務
如果之後要新增模型,建議直接在 `MODEL_CONFIGS` 增加一筆設定,並在 `_load_model()` 補上對應後端載入方式。
## 驗證
可先做基本語法檢查:
```bash
uv run python -m py_compile app.py main.py inference.py model_service.py protopnet.py
```