Thompson001 commited on
Commit
f450f93
ยท
verified ยท
1 Parent(s): 51ceac6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +44 -48
app.py CHANGED
@@ -1,13 +1,11 @@
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
 
@@ -20,62 +18,60 @@ app.add_middleware(
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__":
 
1
  # app.py
2
  from fastapi import FastAPI, UploadFile, File
3
  from fastapi.middleware.cors import CORSMiddleware
4
+ from ultralyticsplus import YOLO
 
5
  import numpy as np
6
  from PIL import Image
7
  import io
8
+ import uvicorn
 
9
 
10
  app = FastAPI()
11
 
 
18
  allow_headers=["*"],
19
  )
20
 
21
+ # ===========================================
22
+ # YOLOv8 segmentation model (from keremberke)
23
+ # ===========================================
24
+ MODEL_ID = "keremberke/yolov8n-building-segmentation"
 
25
 
26
+ print(f"๐Ÿ”ต Loading model: {MODEL_ID}")
27
+ model = YOLO(MODEL_ID)
28
+ print("โœ… Model loaded")
 
 
 
 
 
 
29
 
30
+ @app.post("/predict")
31
+ async def predict(img: UploadFile = File(...)):
32
+ try:
33
+ # ์ด๋ฏธ์ง€ ๋กœ๋”ฉ
34
+ bytes_data = await img.read()
35
+ image = Image.open(io.BytesIO(bytes_data)).convert("RGB")
36
+ np_img = np.array(image)
37
 
38
+ # YOLO inference
39
+ results = model(np_img)
40
+ result = results[0]
 
 
 
41
 
42
+ # segmentation mask ์—ฌ๋ถ€๋กœ crack ์œ ๋ฌด ํŒ๋‹จ
43
+ has_mask = result.masks is not None
44
 
45
+ if not has_mask:
46
+ return {
47
+ "data": [
48
+ {"label": "normal", "confidence": 1.0}
49
+ ]
50
+ }
51
 
52
+ # ๊ฐ€์žฅ ๋†’์€ confidence ์ถ”์ถœ
53
+ if result.boxes is not None and len(result.boxes) > 0:
54
+ conf = float(result.boxes.conf.max().item())
55
+ else:
56
+ conf = 0.85 # ๊ธฐ๋ณธ๊ฐ’
57
 
 
 
 
58
  return {
59
  "data": [
60
+ {
61
+ "label": "crack",
62
+ "confidence": conf
63
+ }
64
  ]
65
  }
66
 
67
+ except Exception as e:
68
+ print("โŒ Prediction error:", e)
69
+ return {
70
+ "data": [
71
+ {"label": "normal", "confidence": 1.0}
72
+ ],
73
+ "error": str(e)
74
+ }
 
 
 
 
75
 
76
 
77
  if __name__ == "__main__":