Thompson001 commited on
Commit
36cdccd
ยท
verified ยท
1 Parent(s): 45a3144

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +47 -21
app.py CHANGED
@@ -1,13 +1,17 @@
1
  # app.py
2
  from fastapi import FastAPI, UploadFile, File
3
  from fastapi.middleware.cors import CORSMiddleware
4
- import requests
5
  import uvicorn
 
 
 
 
6
  import os
7
 
8
  app = FastAPI()
9
 
10
- # CORS ์„ค์ •
11
  app.add_middleware(
12
  CORSMiddleware,
13
  allow_origins=["*"],
@@ -16,41 +20,63 @@ app.add_middleware(
16
  allow_headers=["*"],
17
  )
18
 
19
- # HuggingFace ๋ชจ๋ธ ์—”๋“œํฌ์ธํŠธ
20
- HF_API_URL = "https://api-inference.huggingface.co/models/keremberke/yolov8n-concrete-crack"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
 
22
- # โ— ํ† ํฐ์€ ์ ˆ๋Œ€๋กœ ๋ฌธ์ž์—ด๋กœ ๋„ฃ์œผ๋ฉด ์•ˆ ๋จ. ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ๋งŒ!
23
- HF_TOKEN = os.getenv("HF_TOKEN")
24
- headers = {"Authorization": f"Bearer {HF_TOKEN}"} if HF_TOKEN else {}
25
 
26
  @app.post("/predict")
27
  async def predict(img: UploadFile = File(...)):
 
28
  bytes_data = await img.read()
 
 
29
 
30
- response = requests.post(
31
- HF_API_URL,
32
- headers=headers,
33
- data=bytes_data
34
- )
35
-
36
- try:
37
- results = response.json()
38
- except:
39
- return {"data": [{"label": "normal", "confidence": 1.0}]}
40
 
41
- if not isinstance(results, list) or len(results) == 0:
42
- return {"data": [{"label": "normal", "confidence": 1.0}]}
 
 
 
 
 
 
43
 
44
- max_conf = max(item.get("score", 0) for item in results)
 
 
45
 
46
  return {
47
  "data": [
48
  {
49
  "label": "crack",
50
- "confidence": float(max_conf)
51
  }
52
  ]
53
  }
54
 
 
55
  if __name__ == "__main__":
56
  uvicorn.run(app, host="0.0.0.0", port=7860)
 
1
  # app.py
2
  from fastapi import FastAPI, UploadFile, File
3
  from fastapi.middleware.cors import CORSMiddleware
4
+ from ultralytics import YOLO
5
  import uvicorn
6
+ import numpy as np
7
+ from PIL import Image
8
+ import io
9
+ import requests
10
  import os
11
 
12
  app = FastAPI()
13
 
14
+ # CORS ํ—ˆ์šฉ
15
  app.add_middleware(
16
  CORSMiddleware,
17
  allow_origins=["*"],
 
20
  allow_headers=["*"],
21
  )
22
 
23
+ # -----------------------------
24
+ # ๋‹ค์šด๋กœ๋“œํ•  ๋ชจ๋ธ ๊ฒฝ๋กœ (HF Repo)
25
+ # -----------------------------
26
+ MODEL_URL = "https://huggingface.co/OpenSistemas/YOLOv8-crack-seg/resolve/main/yolov8n/weights/best.pt"
27
+ MODEL_PATH = "best.pt"
28
+
29
+ # -----------------------------
30
+ # ์ตœ์ดˆ ์‹คํ–‰ ์‹œ ๋ชจ๋ธ ๋‹ค์šด๋กœ๋“œ
31
+ # -----------------------------
32
+ if not os.path.exists(MODEL_PATH):
33
+ print("๐Ÿ”ต Downloading YOLOv8 crack model...")
34
+ r = requests.get(MODEL_URL)
35
+ with open(MODEL_PATH, "wb") as f:
36
+ f.write(r.content)
37
+ print("โœ… YOLOv8 model downloaded.")
38
+
39
+
40
+ # -----------------------------
41
+ # YOLOv8 ๋ชจ๋ธ ๋กœ๋“œ
42
+ # -----------------------------
43
+ print("๐Ÿ”ต Loading YOLOv8 crack segmentation model...")
44
+ model = YOLO(MODEL_PATH)
45
+ print("โœ… Model loaded!")
46
 
 
 
 
47
 
48
  @app.post("/predict")
49
  async def predict(img: UploadFile = File(...)):
50
+ # ์ด๋ฏธ์ง€ ์ฝ๊ธฐ
51
  bytes_data = await img.read()
52
+ image = Image.open(io.BytesIO(bytes_data)).convert("RGB")
53
+ np_img = np.array(image)
54
 
55
+ # YOLO inference
56
+ result = model(np_img)[0]
 
 
 
 
 
 
 
 
57
 
58
+ # segmentation mask confidence ์ถ”์ถœ
59
+ if result.masks is None:
60
+ # ๊ท ์—ด ์—†์Œ
61
+ return {
62
+ "data": [
63
+ {"label": "normal", "confidence": 1.0}
64
+ ]
65
+ }
66
 
67
+ # segmentation mask๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ โ†’ crack ๊ฐ์ง€๋จ
68
+ # mask์˜ confidence ํ‰๊ท ๊ฐ’ ์‚ฌ์šฉ
69
+ conf = float(result.boxes.conf.cpu().numpy().max()) if result.boxes else 0.9
70
 
71
  return {
72
  "data": [
73
  {
74
  "label": "crack",
75
+ "confidence": conf
76
  }
77
  ]
78
  }
79
 
80
+
81
  if __name__ == "__main__":
82
  uvicorn.run(app, host="0.0.0.0", port=7860)