Spaces:
Running
Running
/model API
๋ชจ๋ธ ๋ค์ด๋ก๋ ์๋ํฌ์ธํธ๋ ์ต์ ๋ชจ๋ธ๊ณผ ํน์ ๋ฒ์ ์ ๋ชจ๋ธ์ ๋ชจ๋ ์ ๊ณตํ๋ฉฐ, ์๋ต ํค๋๋ฅผ ํตํด ์ค์ ๋ฒ์ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
์์ฒญ ํ์
GET /model
GET /model?version={๋ฒํธ}
GET /model?version={๋ฒํธ}&filename={ํ์ผ๋ช
}
| ํ๋ผ๋ฏธํฐ | ํ์ | ์ค๋ช |
|---|---|---|
version (์ ํ) |
int | ์๋ตํ๊ฑฐ๋ ๋น ๊ฐ์ด๋ฉด ์ต์ ๋ชจ๋ธ. ์ง์ ํ๋ฉด ํด๋น ๋ฒ์ ํ์ธ ํ ๋ค์ด๋ก๋. |
filename (์ ํ) |
string | ๋ด๋ ค๋ฐ์ ํ์ผ๋ช
. ๊ธฐ๋ณธ๊ฐ์ ํ๊ฒฝ ๋ณ์ HF_E2E_MODEL_FILE (๊ธฐ๋ณธ cnn_gru_fatigue.tflite). |
์๋ต
- ๋ณธ๋ฌธ: ์์ฒญํ ๋ชจ๋ธ ๋ฐ์ด๋๋ฆฌ (์:
.tflite,.keras, ๋ฉํ๋ฐ์ดํฐ ๋ฑ) - ํค๋:
X-Model-Version: ์ค์ ๋ค์ด๋ก๋๋ ๋ชจ๋ธ ๋ฒ์ X-Model-Filename: ๋ฐํ๋ ํ์ผ๋ช
- ์๋ฌ:
404โ ์์ฒญํ ๋ฒ์ ์ด ํ์ฌmodel_version๋ณด๋ค ํฌ๊ฑฐ๋ manifest์ ์กด์ฌํ์ง ์์ ๋500โ Hugging Face Hub ๋ค์ด๋ก๋ ์คํจ ๋ฑ ๋ด๋ถ ์ค๋ฅ
๋์ ๊ท์น
- ์๋ฒ๋
training_state.json์model_version๊ฐ์ ์ฝ์ด ํ์ฌ ํ์ฉ ๊ฐ๋ฅํ ์ต๋ ๋ฒ์ ์ ํ์ธํฉ๋๋ค. version์ ์ง์ ํ์ง ์์ผ๋ฉด ์ต์ ๋ชจ๋ธ(ํ์ฌ ๋ฒ์ )์ ๋ค์ด๋ก๋ํฉ๋๋ค.version์ ์ง์ ํ๋ฉด ์๋ฒ๊ฐ ํ์ฌmodel_version์ดํ์ธ์ง ํ์ธํ ๋ค, ๋์ผํ ํ์ผ๋ช ์ ๋ด๋ ค์ค๋๋ค(๋ฒ์ ๋ณ๋ก ํ์ผ๋ช ์ ๊ตฌ๋ถํ์ง ์์ต๋๋ค).- ์์ฒญํ ๋ฒ์ ์ด ํ์ฌ ๋ฒ์ ๋ณด๋ค ํฌ๊ฑฐ๋ ํ์ผ์ด ์กด์ฌํ์ง ์์ผ๋ฉด
404๋ฅผ ๋ฐํํฉ๋๋ค.
์ฌ์ฉ ์์
์ต์ ๋ชจ๋ธ ๋ค์ด๋ก๋
curl -L -o cnn_gru_fatigue_latest.tflite \
"https://merry99-musclecare-train-ai.hf.space/model"
๋ฒ์ 3 ๋ชจ๋ธ ๋ค์ด๋ก๋
curl -L -o cnn_gru_fatigue_v3.tflite \
"https://merry99-musclecare-train-ai.hf.space/model?version=3"
๋ฒ์ 3 ๋ฉํ๋ฐ์ดํฐ ๋ค์ด๋ก๋
curl -L -o metadata_v3.json \
"https://merry99-musclecare-train-ai.hf.space/model?version=3&filename=cnn_gru_fatigue_metadata.json"
ํค๋ ํ์ธ
curl -I "https://merry99-musclecare-train-ai.hf.space/model?version=3"
์๋ต ํค๋ ์์:
X-Model-Version: 3
X-Model-Filename: cnn_gru_fatigue.tflite
์ฃผ์ ์ฌํญ
training_state.json์model_version๊ฐ์ด ๊ธฐ์ค์ด ๋๋ฉฐ, ๊ทธ๋ณด๋ค ๋์ ๋ฒ์ ์ ์์ฒญํ๋ฉด 404๊ฐ ๋ฐํ๋ฉ๋๋ค.- ๋ฒ์ ๋ณ๋ก ๋ค๋ฅธ ํ์ผ์ ์ ์งํ์ง ์๊ณ , ๊ฐ์ ํ์ผ๋ช
์ ๋ด๋ ค์ฃผ๋ ํค๋(
X-Model-Version)๋ก ์ค์ ๋ฒ์ ์ ํ์ธํฉ๋๋ค. - ์คํจ(์: 404) ์ JSON ์๋ต์ด ๋ด๋ ค์ค๋ฏ๋ก, ํด๋ผ์ด์ธํธ๋ ์ํ ์ฝ๋๋ฅผ ๋จผ์ ํ์ธํ ๋ค 200์ผ ๋๋ง
body๋ฅผ ํ์ผ๋ก ์ ์ฅํ์ธ์.
Flutter ์์ (Dio):
final response = await dio.get<List<int>>(
'https://merry99-musclecare-train-ai.hf.space/model',
options: Options(responseType: ResponseType.bytes),
);
if (response.statusCode == 200) {
final version = response.headers.value('X-Model-Version');
final filename = response.headers.value('X-Model-Filename') ?? 'model.tflite';
await File('/path/$filename').writeAsBytes(response.data!);
} else {
final errorText = utf8.decode(response.data ?? []);
// ์๋ฌ ์ฒ๋ฆฌ
}
- Space ํ๊ฒฝ ๋ณ์
HF_E2E_MODEL_TOKEN,HF_E2E_MODEL_REPO_ID๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋ผ ์์ด์ผ/model๋ฐ/trigger๊ฐ ์ ์ ๋์ํฉ๋๋ค.
๋ชจ๋ธ ์ ๋ ฅ ์ฌ์ (Flutter ์ฐธ๊ณ )
- ์
๋ ฅ ํ์:
(batch_size, input_dim)์ด๋ฉฐ ๊ธฐ๋ณธinput_dim = 10 (FEATURE_COLUMNS) + embedding_dim. FEATURE_COLUMNS:rms_acc,rms_gyro,mean_freq_acc,mean_freq_gyro,entropy_acc,entropy_gyro,jerk_mean,jerk_std,stability_index,fatigue_prev.user_emb: ๋ฉํ๋ฐ์ดํฐ์embedding_dim๊ณผ ๋์ผํ ๊ธธ์ด. ๋ถ์กฑํ๋ฉด ๋ค๋ฅผ0.0f๋ก ํจ๋ฉ.- ๋ฉํ๋ฐ์ดํฐ(
cnn_gru_fatigue_metadata.json)์scaler.mean,scaler.scale๋ก ํ์คํํ ๋ค ๋ชจ๋ธ์ ์ ๋ฌ.
Flutter์์ ์คํ ์์
- ๋ฉํ๋ฐ์ดํฐ ๋ก๋: JSON์์
feature_columns,scaler.mean,scaler.scale,embedding_dim,input_dim์ ์ฝ๋๋ค. - ํน์ง ์ถ์ถ: ์ธก์ ๋ฒํผ์ ๋๋ฌ ์ป์ ์๋์ฐ์์ 10๊ฐ ํผ์ฒ ๊ฐ์ ๊ณ์ฐํ๋ค.
- ํ์คํ:
(value - mean) / scale์ ์ํํ๋scale์ด 0์ด๋ฉด 0์ผ๋ก ๋์ฒด. - ์
๋ ฅ ๋ฒกํฐ ๊ตฌ์ฑ:
[์ ๊ทํ๋ 10๊ฐ ํผ์ฒ, user_emb(ํจ๋ฉ ํฌํจ)]์ ์ด์ด ๋ถ์ฌFloat32List๋ก ๋ง๋ ๋ค. - TFLite ์คํ: ์
๋ ฅ์
[1, input_dim]์ผ๋ก reshape ํinterpreter.run(input, output)์ ํธ์ถํ๋ค.
final meta = await loadMetadata(); // JSON ํ์ฑ: scaler, embedding_dim ๋ฑ
final features = computeFeatureVector(); // ๊ธธ์ด 10, float
final userEmb = ensureEmbeddingLength(rawEmb, meta.embeddingDim); // ํจ๋ฉ
final normalized = List<double>.generate(features.length, (i) {
final scale = meta.scalerScale[i] == 0 ? 1.0 : meta.scalerScale[i];
return (features[i] - meta.scalerMean[i]) / scale;
});
final inputVector = Float32List.fromList([
...normalized,
...userEmb.map((e) => e.toDouble()),
]);
final outputBuffer = Float32List(1);
interpreter.run(inputVector.reshape([1, inputVector.length]), outputBuffer);
final fatigueScore = outputBuffer[0];
์ฃผ์
- ์ต์ด ์ธก์ ๋ถํฐ ๋ฐ๋ก ์์ธก ๊ฐ๋ฅํ๋ฉฐ, ๋ ์ด์ 5๊ฐ ์๋์ฐ ๋์ ์ด ํ์ํ์ง ์์ต๋๋ค.
fatigue_prev๋ ์ง์ ์ธก์ ์ ํผ๋ก๋ ์งํ๋ก, ๊ฐ์ด ์๋ค๋ฉด0๋๋ ์ง์ ์์ธก์น๋ก ์ด๊ธฐํํด ์ฃผ์ธ์.- ํผ์ฒ ์ถ์ถ ๋ก์ง๊ณผ ์๋ฒ ๋ฉ ์ฐจ์์ ๋ฐฑ์๋ ํ์ต ํ์ดํ๋ผ์ธ๊ณผ ๋์ผํด์ผ ํฉ๋๋ค.