QnxprU69yCNg8XJ
commited on
Commit
·
44626f7
1
Parent(s):
0d28e32
we can start now
Browse files- .gitattributes +1 -0
- app.py +15 -4
- notebooks/quick_start.ipynb +0 -0
- requirements.txt +4 -0
- utils/inference.py +27 -0
- utils/preprocessing.py +7 -0
.gitattributes
CHANGED
|
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
root_env filter=lfs diff=lfs merge=lfs -text
|
app.py
CHANGED
|
@@ -1,11 +1,22 @@
|
|
| 1 |
-
from fastapi import FastAPI
|
|
|
|
|
|
|
| 2 |
|
| 3 |
app = FastAPI()
|
| 4 |
|
| 5 |
@app.get("/")
|
| 6 |
-
def
|
| 7 |
return {"Hello": "World!"}
|
| 8 |
|
| 9 |
|
| 10 |
-
|
| 11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from fastapi import FastAPI, File, UploadFile
|
| 2 |
+
from utils.preprocessing import load_audio
|
| 3 |
+
from utils.inference import get_embeddings, predict_risk
|
| 4 |
|
| 5 |
app = FastAPI()
|
| 6 |
|
| 7 |
@app.get("/")
|
| 8 |
+
def hello():
|
| 9 |
return {"Hello": "World!"}
|
| 10 |
|
| 11 |
|
| 12 |
+
@app.post("/predict")
|
| 13 |
+
async def predict(file: UploadFile = File(...)):
|
| 14 |
+
temp_path = f"/tmp/{file.filename}"
|
| 15 |
+
with open(temp_path, "wb") as f:
|
| 16 |
+
f.write(await file.read())
|
| 17 |
+
|
| 18 |
+
waveform, sr = load_audio(temp_path)
|
| 19 |
+
embeddings = get_embeddings(waveform, sr)
|
| 20 |
+
score = predict_risk(embeddings)
|
| 21 |
+
|
| 22 |
+
return {"risk_score": score}
|
notebooks/quick_start.ipynb
ADDED
|
File without changes
|
requirements.txt
CHANGED
|
@@ -1,2 +1,6 @@
|
|
| 1 |
fastapi
|
| 2 |
uvicorn[standard]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
fastapi
|
| 2 |
uvicorn[standard]
|
| 3 |
+
torch
|
| 4 |
+
torchaudio
|
| 5 |
+
numpy
|
| 6 |
+
transformers
|
utils/inference.py
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import torch
|
| 2 |
+
from transformers import AutoFeatureExtractor, AutoModel
|
| 3 |
+
|
| 4 |
+
# Charger HeAR depuis Hugging Face
|
| 5 |
+
MODEL_NAME = "google/hear"
|
| 6 |
+
feature_extractor = AutoFeatureExtractor.from_pretrained(MODEL_NAME)
|
| 7 |
+
hear_model = AutoModel.from_pretrained(MODEL_NAME)
|
| 8 |
+
hear_model.eval()
|
| 9 |
+
|
| 10 |
+
def get_embeddings(waveform, sr):
|
| 11 |
+
"""
|
| 12 |
+
Transforme un audio en embeddings HeAR
|
| 13 |
+
"""
|
| 14 |
+
# Transformer waveform en input pour HeAR
|
| 15 |
+
inputs = feature_extractor(waveform, sampling_rate=sr, return_tensors="pt")
|
| 16 |
+
with torch.no_grad():
|
| 17 |
+
embeddings = hear_model(**inputs).last_hidden_state
|
| 18 |
+
# embeddings : (batch, sequence, features)
|
| 19 |
+
return embeddings
|
| 20 |
+
|
| 21 |
+
def predict_risk(embeddings):
|
| 22 |
+
"""
|
| 23 |
+
Pour le moment : score factice basé sur la norme L2 des embeddings
|
| 24 |
+
Plus tard : utiliser ton classifieur pneumonie
|
| 25 |
+
"""
|
| 26 |
+
score = torch.norm(embeddings, dim=-1).mean().item()
|
| 27 |
+
return score
|
utils/preprocessing.py
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import torchaudio
|
| 2 |
+
|
| 3 |
+
def load_audio(file_path, target_sr=16000):
|
| 4 |
+
waveform, sr = torchaudio.load(file_path)
|
| 5 |
+
if sr != target_sr:
|
| 6 |
+
waveform = torchaudio.transforms.Resample(orig_freq=sr, new_freq=target_sr)(waveform)
|
| 7 |
+
return waveform, target_sr
|