Spaces:
Running
on
Zero
Running
on
Zero
Update app.py
Browse files
app.py
CHANGED
|
@@ -35,6 +35,7 @@ from urllib.parse import quote
|
|
| 35 |
from ultralytics import YOLO
|
| 36 |
import traceback
|
| 37 |
import spaces
|
|
|
|
| 38 |
|
| 39 |
# model_yolo = YOLO('yolov8l.pt')
|
| 40 |
|
|
@@ -601,55 +602,74 @@ def preprocess_image(image):
|
|
| 601 |
])
|
| 602 |
|
| 603 |
return transform(image).unsqueeze(0)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 604 |
|
| 605 |
@spaces.GPU
|
| 606 |
async def predict_single_dog(image):
|
| 607 |
"""
|
| 608 |
-
|
| 609 |
-
|
| 610 |
-
image: PIL Image or numpy array
|
| 611 |
-
Returns:
|
| 612 |
-
tuple: (top1_prob, topk_breeds, relative_probs)
|
| 613 |
"""
|
| 614 |
-
|
| 615 |
-
|
| 616 |
-
|
| 617 |
-
|
| 618 |
-
checkpoint = torch.load(model_path, map_location='cuda')
|
| 619 |
-
predict_single_dog.model.load_state_dict(checkpoint['base_model'], strict=False)
|
| 620 |
-
predict_single_dog.model.eval()
|
| 621 |
|
| 622 |
image_tensor = preprocess_image(image).to('cuda')
|
| 623 |
|
| 624 |
with torch.no_grad():
|
| 625 |
-
|
| 626 |
-
logits = predict_single_dog.model(image_tensor)[0]
|
| 627 |
probs = F.softmax(logits, dim=1)
|
| 628 |
|
| 629 |
-
# Classifier prediction
|
| 630 |
top5_prob, top5_idx = torch.topk(probs, k=5)
|
| 631 |
breeds = [dog_breeds[idx.item()] for idx in top5_idx[0]]
|
| 632 |
probabilities = [prob.item() for prob in top5_prob[0]]
|
| 633 |
|
| 634 |
-
|
| 635 |
-
sum_probs = sum(probabilities[:3]) # 只取前三個來計算相對概率
|
| 636 |
relative_probs = [f"{(prob/sum_probs * 100):.2f}%" for prob in probabilities[:3]]
|
| 637 |
|
| 638 |
-
# Debug output
|
| 639 |
-
print("\nClassifier Predictions:")
|
| 640 |
-
for breed, prob in zip(breeds[:5], probabilities[:5]):
|
| 641 |
-
print(f"{breed}: {prob:.4f}")
|
| 642 |
-
|
| 643 |
return probabilities[0], breeds[:3], relative_probs
|
| 644 |
|
| 645 |
|
| 646 |
@spaces.GPU(duration=120)
|
| 647 |
async def detect_multiple_dogs(image, conf_threshold=0.3, iou_threshold=0.55):
|
| 648 |
|
| 649 |
-
|
| 650 |
-
|
| 651 |
-
|
| 652 |
-
|
|
|
|
|
|
|
|
|
|
| 653 |
dogs = []
|
| 654 |
boxes = []
|
| 655 |
for box in results.boxes:
|
|
@@ -881,7 +901,7 @@ def show_details_html(choice, previous_output, initial_state):
|
|
| 881 |
|
| 882 |
def main():
|
| 883 |
with gr.Blocks(css=get_css_styles()) as iface:
|
| 884 |
-
|
| 885 |
|
| 886 |
gr.HTML("""
|
| 887 |
<header style='text-align: center; padding: 20px; margin-bottom: 20px;'>
|
|
|
|
| 35 |
from ultralytics import YOLO
|
| 36 |
import traceback
|
| 37 |
import spaces
|
| 38 |
+
import asyncio
|
| 39 |
|
| 40 |
# model_yolo = YOLO('yolov8l.pt')
|
| 41 |
|
|
|
|
| 602 |
])
|
| 603 |
|
| 604 |
return transform(image).unsqueeze(0)
|
| 605 |
+
|
| 606 |
+
global_models = {
|
| 607 |
+
'classification_model': None,
|
| 608 |
+
'detection_model': None
|
| 609 |
+
}
|
| 610 |
+
|
| 611 |
+
@spaces.GPU
|
| 612 |
+
async def initialize_models():
|
| 613 |
+
"""
|
| 614 |
+
初始化並預熱所有模型
|
| 615 |
+
這個函數集中管理所有模型的初始化,確保它們只被載入一次
|
| 616 |
+
"""
|
| 617 |
+
try:
|
| 618 |
+
# 初始化分類模型
|
| 619 |
+
if global_models['classification_model'] is None:
|
| 620 |
+
model = BaseModel(num_classes=len(dog_breeds), device='cuda').to('cuda')
|
| 621 |
+
checkpoint = torch.load('124_best_model_dog.pth', map_location='cuda')
|
| 622 |
+
model.load_state_dict(checkpoint['base_model'], strict=False)
|
| 623 |
+
model.eval()
|
| 624 |
+
global_models['classification_model'] = model
|
| 625 |
+
|
| 626 |
+
# 初始化檢測模型
|
| 627 |
+
if global_models['detection_model'] is None:
|
| 628 |
+
global_models['detection_model'] = YOLO('yolov8l.pt')
|
| 629 |
+
|
| 630 |
+
return True
|
| 631 |
+
except Exception as e:
|
| 632 |
+
print(f"模型初始化失敗: {str(e)}")
|
| 633 |
+
return False
|
| 634 |
+
|
| 635 |
|
| 636 |
@spaces.GPU
|
| 637 |
async def predict_single_dog(image):
|
| 638 |
"""
|
| 639 |
+
預測狗狗品種
|
| 640 |
+
使用全域模型進行預測,避免重複載入
|
|
|
|
|
|
|
|
|
|
| 641 |
"""
|
| 642 |
+
model = global_models['classification_model']
|
| 643 |
+
if model is None:
|
| 644 |
+
await initialize_models()
|
| 645 |
+
model = global_models['classification_model']
|
|
|
|
|
|
|
|
|
|
| 646 |
|
| 647 |
image_tensor = preprocess_image(image).to('cuda')
|
| 648 |
|
| 649 |
with torch.no_grad():
|
| 650 |
+
logits = model(image_tensor)[0]
|
|
|
|
| 651 |
probs = F.softmax(logits, dim=1)
|
| 652 |
|
|
|
|
| 653 |
top5_prob, top5_idx = torch.topk(probs, k=5)
|
| 654 |
breeds = [dog_breeds[idx.item()] for idx in top5_idx[0]]
|
| 655 |
probabilities = [prob.item() for prob in top5_prob[0]]
|
| 656 |
|
| 657 |
+
sum_probs = sum(probabilities[:3])
|
|
|
|
| 658 |
relative_probs = [f"{(prob/sum_probs * 100):.2f}%" for prob in probabilities[:3]]
|
| 659 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 660 |
return probabilities[0], breeds[:3], relative_probs
|
| 661 |
|
| 662 |
|
| 663 |
@spaces.GPU(duration=120)
|
| 664 |
async def detect_multiple_dogs(image, conf_threshold=0.3, iou_threshold=0.55):
|
| 665 |
|
| 666 |
+
model_yolo = global_models['detection_model']
|
| 667 |
+
if model_yolo is None:
|
| 668 |
+
await initialize_models()
|
| 669 |
+
model_yolo = global_models['detection_model']
|
| 670 |
+
|
| 671 |
+
results = model_yolo(image, conf=conf_threshold, iou=iou_threshold)[0]
|
| 672 |
+
|
| 673 |
dogs = []
|
| 674 |
boxes = []
|
| 675 |
for box in results.boxes:
|
|
|
|
| 901 |
|
| 902 |
def main():
|
| 903 |
with gr.Blocks(css=get_css_styles()) as iface:
|
| 904 |
+
asyncio.create_task(initialize_models())
|
| 905 |
|
| 906 |
gr.HTML("""
|
| 907 |
<header style='text-align: center; padding: 20px; margin-bottom: 20px;'>
|