בינה מלאכותית RB108-11 : אימון זיהוי תמונה – חלק ב
חלק א : אימון באנקונדה שימוש ב JUPITTER LAB זיהוי טנקים
קובץ להורדה : tanks.rar
https://drive.google.com/file/d/17t6GjltQIDjRLIEy-APrNudGfz99bEYb/view?usp=sharing

שלב אחרי שלב
שימו לב קבצי הנתונים בספריה : C:\temp\tanks
קובץ data.yaml נימצא ב \C:\temp\tanks

קבצי הנתונים נמצאים
שלב 1 : התקנה של ספריות
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# Install / upgrade each package used in the notebook. # Tip: you can keep it as one line, but here it is line-by-line so it's clear. # YOLOv8 library (Ultralytics): training + inference API (YOLO("yolov8m.pt"), .train(), .predict()) %pip install -U ultralytics # PyTorch: deep learning engine + CUDA support used by YOLO under the hood %pip install -U torch # TorchVision: image utilities/models; often required by YOLO/PyTorch image pipelines %pip install -U torchvision # TorchAudio: not needed for images, but some PyTorch installs keep versions aligned; safe to include %pip install -U torchaudio # Pillow (PIL): image loading/saving utilities used by many vision tools %pip install -U pillow # Matplotlib: plotting graphs and showing the test result image in the notebook %pip install -U matplotlib print("done") |
שלב 2: קונפיגורציה סבבת עבודה
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# ============================================================ # Block 2) Imports + paths + select device (CUDA else CPU) # ============================================================ from ultralytics import YOLO import torch from pathlib import Path import matplotlib.pyplot as plt import matplotlib.image as mpimg DATA_YAML = Path(r"C:\temp\tanks\data.yaml") TEST_IMG = Path(r"C:\temp\tanks\test\T3.jfif") # Check files exist if not DATA_YAML.exists(): raise FileNotFoundError(f"Missing YAML: {DATA_YAML}") if not TEST_IMG.exists(): raise FileNotFoundError(f"Missing test image: {TEST_IMG}") # Choose device device = 0 if torch.cuda.is_available() else "cpu" print("Device:", "CUDA (GPU 0)" if device == 0 else "CPU") print("YAML:", DATA_YAML) print("Test image:", TEST_IMG) |
שלב 3 : אימון ה מודל YOLO קבלת מודל best.pt – ראה הסבר בהמשך על המדדים כיצד הרשת לומדת ולמדה
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# ============================================================ # Block 3) Train YOLOv8m (150 epochs, batch 8) # ============================================================ # Load pretrained YOLOv8m weights (transfer learning) model = YOLO("yolov8m.pt") # Train train_results = model.train( data=str(DATA_YAML), epochs=50, batch=8, device=device, imgsz=640, project="C:/temp/tanks/runs", name="yolov8m_train", exist_ok=True ) # Get output paths trainer = model.trainer run_dir = Path(trainer.save_dir) best_pt = Path(trainer.best) last_pt = Path(trainer.last) print("\nTraining run folder:", run_dir) print("Best model path:", best_pt) print("Last model path:", last_pt) |
שלב 4: בדיקת המודל על תמונה לדוגמא
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# ============================================================ # Block 4) Load best.pt and run prediction on the test image # ============================================================ best_model = YOLO(str(best_pt)) pred = best_model.predict( source=str(TEST_IMG), device=device, conf=0.25, save=True ) # Where Ultralytics saved the predicted image (with boxes) save_dir = Path(pred[0].save_dir) out_img = save_dir / TEST_IMG.name print("\nPrediction folder:", save_dir) print("Predicted image:", out_img) if not out_img.exists(): raise FileNotFoundError(f"Prediction image not found: {out_img}") |
שלב 5: הצגת התמונה למסך אחרי זיהוי
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
from pathlib import Path import matplotlib.pyplot as plt import matplotlib.image as mpimg # If out_img is already defined, keep it. Otherwise set it: # out_img = Path("path/to/your/result.png") out_img = Path(out_img) # works if out_img is str or Path # 1) Verify file exists print("Image path:", out_img.resolve()) print("Exists:", out_img.exists()) if not out_img.exists(): raise FileNotFoundError(f"Image not found: {out_img.resolve()}") # 2) Force inline rendering (safe in Jupyter) %matplotlib inline # 3) Read + show img = mpimg.imread(out_img) plt.figure(figsize=(10, 6)) plt.imshow(img) plt.axis("off") plt.title("YOLOv8m - Test Result") plt.show() |
שלב 6 : ניתוח – הסבר מדדים בזמן האימון ובסוף האימון
תזכורת :
mAP50 : בזמן האימון”: ברוב הריצות YOLO מחשב את mAP50 בסוף כל epoch על סט ה-val, לא על הבאצ’ים של ה-train –
mAP50 מחושב – בסוף כל epoch מריצים את המודל על כל תמונות ה-val, משווים כל תיבת ניבוי לתיבת אמת.
טבלת סיכום :
טבלה מסכמת (ככל שיותר קרוב ל-1 טוב / ככל שיותר קטן טוב).
| פרמטר | מה מודד בקצרה | כיוון “טוב יותר” | גרוע | טוב | מעולה |
|---|---|---|---|---|---|
| GPU_mem | שימוש זיכרון GPU | לא “ל-1”; צריך יציב | 0G כשמצופה GPU / OOM |
יציב ללא OOM | יציב ומאפשר batch/imgsz גבוה |
| box_loss | דיוק מיקום/גודל תיבה | קטן יותר טוב → שואף ל-0 | > 2.0 |
0.7–1.5 |
< 0.7 |
| cls_loss | שגיאת סיווג כיתה | קטן יותר טוב → שואף ל-0 | > 1.5 |
0.3–1.0 |
< 0.3 |
| dfl_loss | חדות/דיוק גבולות תיבה | קטן יותר טוב → שואף ל-0 | > 2.0 |
0.8–1.8 |
< 0.8 |
| Instances | כמה אובייקטים ב-batch | לא “ל-1”; תלוי דאטה | לרוב 0–2 |
לרוב 5–50 |
כיסוי מגוון ועקבי |
| Precision (P) | כמה מהזיהויים נכונים (פחות FP) | גדול יותר טוב → שואף ל-1 | < 0.30 |
0.50–0.80 |
> 0.85 |
| Recall (R) | כמה מהאובייקטים נמצאו (פחות FN) | גדול יותר טוב → שואף ל-1 | < 0.30 |
0.50–0.80 |
> 0.85 |
| mAP50 | איכות כוללת IoU=0.50 | גדול יותר טוב → שואף ל-1 | < 0.30 |
0.50–0.75 |
> 0.80 |
| mAP50-95 | איכות מחמירה IoU 0.50:0.95 | גדול יותר טוב → שואף ל-1 | < 0.20 |
0.35–0.60 |
> 0.65 |
הערה: ב-lossים אין “יעד מספרי” אוניברסלי — העיקר שה-loss יורד לאורך אפוקים ובמקביל mAP/P/R עולים.
הסבר : בזמן אימון (Training)
GPU_mem
מה זה: שימוש זיכרון GPU.
- גרוע:
0Gכשציפית ל-GPU (כנראה רץ על CPU) - טוב: יציב ולא מגיע ל-OOM
- מעולה: מנצל את ה-GPU בצורה יציבה עם batch/imgsz גבוהים בלי קריסות
box_loss (דיוק תיבה)
מה זה: כמה התיבות רחוקות מהאמת.
- גרוע:
> 2.0או לא יורד לאורך אפוקים - טוב:
0.7 – 1.5ויורד - מעולה:
< 0.7ויורד בצורה יציבה
cls_loss (סיווג)
מה זה: שגיאת כיתה.
- גרוע:
> 1.5או לא יורד - טוב:
0.3 – 1.0ויורד - מעולה:
< 0.3(במיוחד אם יש מעט כיתות) ויציב
dfl_loss (דיוק גבולות)
מה זה: חדות/דיוק גבולות התיבה.
- גרוע:
> 2.0או לא יורד - טוב:
0.8 – 1.8ויורד - מעולה:
< 0.8ויציב
Instances
מה זה: כמה אובייקטים נכנסו ב-batch.
- גרוע: 0–2 לרוב (דאטה דל / באצ’ים “ריקים”)
- טוב: משתנה סביב 5–50 (תלוי משימה)
- מעולה: הרבה מופעים מגוונים בכל אפוק (לא מספר אחד, אלא כיסוי טוב של הדאטה)
בסוף אפוק (Validation)
Precision (P)
מה זה: כמה מהזיהויים היו נכונים (פחות FP).
- גרוע:
< 0.30 - טוב:
0.50 – 0.80 - מעולה:
> 0.85
Recall (R)
מה זה: כמה מהאובייקטים נמצאו (פחות FN).
- גרוע:
< 0.30 - טוב:
0.50 – 0.80 - מעולה:
> 0.85
mAP50
מה זה: איכות כוללת ב-IoU=0.50 (סלחני יחסית).
- גרוע:
< 0.30 - טוב:
0.50 – 0.75 - מעולה:
> 0.80
mAP50-95
מה זה: איכות מחמירה (IoU 0.50 עד 0.95).
- גרוע:
< 0.20 - טוב:
0.35 – 0.60 - מעולה:
> 0.65
פירוש מהיר למספרים שלך
box_loss 0.755טוב-קרוב למעולהcls_loss 0.694טובdfl_loss 1.106טובP 0.52טוב (בסיסי)R 0.444בינוני (מפספסים)mAP50 0.476בינוניmAP50-95 0.275נמוך-בינוני- אבל:
Images=5, Instances=9קטן מאוד ולכן המדדים לא יציבים.
אימון YOLOv8 על עשרות אלפי תמונות – דגשים הכי חשובים (מה באמת מזיז ביצועים)
1) דאטה ותיוגים (הכי קריטי)
- איכות תיוג: תיבות מדויקות, עקביות בין מתייגים, בלי “תיבה ענקית”/חצי אובייקט.
- אובייקטים חסרים (missing labels) זה הרסני: המודל לומד שרקע = אובייקט ואז P יורד.
- חלוקת Train/Val/Test נכונה:
- לא לערבב “סדרות” דומות בין train ל-val (אותו וידאו/אותו מקום/אותו יום).
- Test נפרד שמדמה שימוש אמיתי.
- איזון כיתות: כיתה נדירה → להוסיף דוגמאות/oversample/איסוף ממוקד.
מדד לבעיה: train loss יורד אבל P נמוך ו-FP גבוה → הרבה פעמים missing labels או רקעים מבלבלים.
2) ולידציה אמינה
- Val מספיק גדול ומגוון (לא 50 תמונות).
- מדדים יציבים: mAP צריך לעלות עקבית, לא “לקפוץ”.
מדד לבעיה: mAP קופץ חזק מאפוק לאפוק → val קטן/לא מייצג.
3) גודל מודל ורזולוציה
- מודל: על דאטה גדול לרוב עדיף
yolov8m/lאם יש GPU. - imgsz:
- אם יש אובייקטים קטנים: 832/1024 יכול לשפר R ו-mAP50-95.
- אם האובייקטים גדולים: 640 מספיק ולרוב יעיל.
מדד לבעיה: mAP50 סביר אבל mAP50-95 נמוך → לרוב צריך imgsz גבוה יותר/תיוגים מדויקים יותר.
4) Batch ו-LR (יציבות ומהירות)
- batch גדול (כמה שיותר שנכנס ב-GPU) נותן אימון יציב.
- כוונון lr0 בהתאם ל-batch:
- LR גבוה מדי → loss קופץ/NaN.
- נמוך מדי → שיפור איטי.
כלל אצבע: אם הגדלת batch פי 2, לעיתים אפשר להעלות LR פי ~2 (לא חובה; לבדוק יציבות בלוג).
5) אוגמנטציות – פחות “קסם”, יותר התאמה למציאות
- על דאטה גדול: לא צריך אוגמנטציות אגרסיביות מדי.
- mosaic/mixup: טובים בתחילת אימון, אבל אם תיבות צריכות להיות מאוד מדויקות—סגור/החלש לקראת הסוף (
close_mosaic). - התאמה לתרחיש אמיתי (תאורה/טשטוש/זווית/מרחק) עדיפה על טרנספורמציות לא ריאליות.
מדד לבעיה: train משתפר, val נתקע או יורד → אוגמנטציה לא מתאימה/חזקה מדי או יש domain gap.
6) Multi-GPU / ביצועים
- להשתמש ב-GPU בפועל (לוודא
GPU_memלא 0G). - AMP (mixed precision) לרוב נותן מהירות וחוסך VRAM.
- מספיק
workersכדי למנוע “צוואר בקבוק” בטעינת נתונים.
מדד לבעיה: GPU utilization נמוך וזמן/איטרציה גבוה → data loader איטי (workers, cache, דיסק).
7) ניטור איכות – לא רק mAP
מעקב חובה:
- PR curve, confusion matrix (מי מתבלבל עם מי).
- בדיקה ידנית של FP/FN על דוגמאות קשות.
- מדדים לפי תת-קבוצות: יום/לילה, מרחק, גודל אובייקט (small/medium/large).
8) כללי “ברזל” לפרודקשן
- לא לשפוט לפי אפוק אחד. על דאטה גדול צריך לראות מגמה.
- לשמור best checkpoint לפי val mAP50-95 (לרוב המדד הכי אמיתי לדיוק תיבות).
- אם יש שינוי בדאטה לאורך זמן: לבצע fine-tune מחזורי עם דוגמאות חדשות.
חומר העשרה – שימוש בבינה מלאכותית
חלק א
יצירת מצגת על ידי בינה מלאכותית : gamma.app
תרגיל כיתה1 :
חלק א
- צור מצגת בעזרת gamma.app ניתן לעבוד בזוגות
- יצא את המצגת ל PDF וצור בורדקאסט
- יצא את המצגת ל POWERPOINT
- צור ב veo 3 סרטון פתיחה למצגת