ek-5 commited on
Commit
07c9540
·
verified ·
1 Parent(s): 8405331

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +77 -67
app.py CHANGED
@@ -1,82 +1,92 @@
1
- import shutil
2
  import torch
3
- from fastapi import FastAPI, UploadFile, File
4
- from PIL import Image
5
- from io import BytesIO
6
- from ultralytics import YOLO
7
- from huggingface_hub import hf_hub_download
8
  from transformers import AutoProcessor, AutoModelForCausalLM
 
 
 
9
 
10
- # --- 1. إعداد تطبيق FastAPI ---
11
- app = FastAPI(title="Object Detection & Captioning API")
12
-
13
- # --- 2. تحميل الموديلات (يتم لمرة واحدة عند بدء التشغيل) ---
14
- # تحميل موديل YOLO
15
- model_path = hf_hub_download(
16
- repo_id="GradTeam/yolov26-objectDetection",
17
- filename="best.pt"
18
- )
19
- yolo_model = YOLO(model_path)
20
 
21
- # تحميل موديل الوصف (GIT)
22
  device = "cuda" if torch.cuda.is_available() else "cpu"
23
- processor = AutoProcessor.from_pretrained("microsoft/git-large")
24
- git_model = AutoModelForCausalLM.from_pretrained("microsoft/git-large").to(device)
25
 
26
- # --- 3. الدوال المساعدة ---
 
 
27
 
28
- def get_yolo_detections(image_path):
29
- results = yolo_model(image_path)
30
- objects = []
31
- for r in results:
32
- boxes = r.boxes.xyxy.tolist()
33
- classes = r.boxes.cls.tolist()
34
- for box, cls in zip(boxes, classes):
35
- name = yolo_model.names[int(cls)]
36
- objects.append({
37
- "name": name,
38
- "box": [round(coord, 2) for coord in box] # تقريب الإحداثيات
39
- })
40
- return objects
41
-
42
- def get_image_caption(image_path, objects):
43
- image = Image.open(image_path).convert("RGB")
44
- names = [obj["name"] for obj in objects]
45
-
46
- # بناء الـ Prompt بناءً على الأجسام المكتشفة
47
- text_prompt = "Objects detected: " + ", ".join(names) if names else "Describe this image."
48
-
49
- inputs = processor(images=image, text=text_prompt, return_tensors="pt").to(device)
50
- generated_ids = git_model.generate(**inputs, max_length=50)
51
- caption = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
52
- return caption
53
-
54
- # --- 4. نقطة النهاية (API Endpoint) ---
55
 
56
  @app.post("/analyze")
57
  async def analyze_image(file: UploadFile = File(...)):
58
- # حفظ الملف المرفوع مؤقتاً
59
- temp_path = "temp_image.jpg"
60
- with open(temp_path, "wb") as buffer:
61
- shutil.copyfileobj(file.file, buffer)
62
-
63
- try:
64
- # 1. تنفيذ كشف الأجسام
65
- detected_objects = get_yolo_detections(temp_path)
66
-
67
- # 2. تنفيذ وصف الصورة بناءً على الأجسام
68
- description = get_image_caption(temp_path, detected_objects)
69
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  return {
71
- "status": "success",
72
- "detected_objects_count": len(detected_objects),
73
- "objects": detected_objects,
74
- "description": description
75
  }
76
- except Exception as e:
77
- return {"status": "error", "message": str(e)}
78
 
79
- # --- 5. التشغيل (اختياري محلياً) ---
 
 
 
 
 
80
  if name == "__main__":
81
- import uvicorn
82
  uvicorn.run(app, host="0.0.0.0", port=7860)
 
 
1
+ import os
2
  import torch
3
+ import io
4
+ import shutil
5
+ from fastapi import FastAPI, File, UploadFile
 
 
6
  from transformers import AutoProcessor, AutoModelForCausalLM
7
+ from ultralytics import YOLO
8
+ from PIL import Image
9
+ import uvicorn
10
 
11
+ # --- 1. إعداد التطبيق والموديلات ---
12
+ app = FastAPI(title="YOLO + GIT Captioning")
 
 
 
 
 
 
 
 
13
 
14
+ # تحديد الجهاز (GPU إذا توفر، وإلا CPU)
15
  device = "cuda" if torch.cuda.is_available() else "cpu"
 
 
16
 
17
+ # تحميل الموديلات مرة واحدة عند تشغيل السيرفر
18
+ # تأكدي أن ملف best.pt موجود في نفس المجلد
19
+ MY_MODEL_PATH = 'best.pt'
20
 
21
+ print("🔄 جاري تحميل الموديلات... قد يستغرق ذلك دقائق")
22
+
23
+ # تحميل موديل YOLO (الخاص بكِ)
24
+ if os.path.exists(MY_MODEL_PATH):
25
+ detection_model = YOLO(MY_MODEL_PATH)
26
+ print("✅ تم تحميل موديل YOLO بنجاح")
27
+ else:
28
+ # في حال لم يجد ملفك، سيستخدم موديل أساسي مؤقتاً لكي لا يتعطل السيرفر
29
+ detection_model = YOLO("yolov8n.pt")
30
+ print("⚠️ تحذير: لم يتم العثور على best.pt، تم استخدام الموديل الافتراضي.")
31
+
32
+ # تحميل موديل GIT-base (أخف وأسرع للمساحات المجانية)
33
+ processor = AutoProcessor.from_pretrained("microsoft/git-base")
34
+ caption_model = AutoModelForCausalLM.from_pretrained("microsoft/git-base").to(device)
35
+
36
+ @app.get("/")
37
+ def home():
38
+ return {"status": "Running", "message": "Go to /docs to test the API"}
39
+
40
+ # --- 2. وظيفة المعالجة (نفس منطق كود كولاب الخاص بكِ) ---
 
 
 
 
 
 
 
41
 
42
  @app.post("/analyze")
43
  async def analyze_image(file: UploadFile = File(...)):
44
+ data = await file.read()
45
+ original_image = Image.open(io.BytesIO(data)).convert("RGB")
46
+
47
+ # استخدام نفس الإعدادات التي نجحت معكِ في كولاب
48
+ results = detection_model(original_image, conf=0.20)
49
+
50
+ integrated_results = []
51
+
52
+ for r in results:
53
+ for i, box in enumerate(r.boxes):
54
+ label = r.names[int(box.cls)]
55
+ conf_score = float(box.conf[0])
56
+ coords = box.xyxy[0].tolist()
57
+
58
+ # عملية القص (Cropping)
59
+ cropped_img = original_image.crop((coords[0], coords[1], coords[2], coords[3]))
60
+
61
+ # وصف الجزء المقصوص
62
+ inputs = processor(images=cropped_img, return_tensors="pt").to(device)
63
+ generated_ids = caption_model.generate(pixel_values=inputs.pixel_values, max_length=40)
64
+ detailed_desc = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
65
+
66
+ integrated_results.append({
67
+ "object_id": i + 1,
68
+ "yolo_label": label,
69
+ "confidence": f"{conf_score:.2f}",
70
+ "detailed_description": detailed_desc
71
+ })
72
+
73
+ # وصف عام إذا لم يتم اكتشاف أجسام
74
+ if not integrated_results:
75
+ inputs = processor(images=original_image, return_tensors="pt").to(device)
76
+ generated_ids = caption_model.generate(pixel_values=inputs.pixel_values, max_length=40)
77
+ general_desc = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
78
  return {
79
+ "message": "YOLO لم يكتشف أجساماً، إليك وصفاً عاماً.",
80
+ "general_description": general_desc
 
 
81
  }
 
 
82
 
83
+ return {
84
+ "detected_count": len(integrated_results),
85
+ "details": integrated_results
86
+ }
87
+
88
+ # --- 3. تشغيل السيرفر (إعدادات Hugging Face) ---
89
  if name == "__main__":
90
+ # المنفذ 7860 هو الافتراضي والمطلوب في Hugging Face
91
  uvicorn.run(app, host="0.0.0.0", port=7860)
92
+