File size: 2,658 Bytes
f17af10
00c8599
 
 
 
f17af10
00c8599
f17af10
00c8599
 
f17af10
 
896740b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
---
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
```