In [1]:
!pip install ultralytics roboflow -q
import torch
print(f"PyTorch: {torch.__version__}")
print(f"GPU available: {torch.cuda.is_available()}")
print(f"GPU name: {torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'None'}")
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 41.3/41.3 kB 1.7 MB/s eta 0:00:00
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.3/1.3 MB 30.9 MB/s eta 0:00:00
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 250.0/250.0 kB 24.9 MB/s eta 0:00:00
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 66.8/66.8 kB 7.2 MB/s eta 0:00:00
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 49.9/49.9 MB 19.7 MB/s eta 0:00:00
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.5/1.5 MB 60.6 MB/s eta 0:00:00
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.5/5.5 MB 86.6 MB/s eta 0:00:00
PyTorch: 2.11.0+cu128
GPU available: True
GPU name: Tesla T4
In [2]:
from roboflow import Roboflow

rf = Roboflow(api_key="JqIy7XNhyDH9NonNBBId")
project = rf.workspace("yolo-fisdp").project("solar-panel-fault-dataset-nzzte")
version = project.version(1)
dataset = version.download("yolov8")

print(f"Dataset location: {dataset.location}")
loading Roboflow workspace...
loading Roboflow project...
Downloading Dataset Version Zip in Solar-Panel-Fault-Dataset-1 to yolov8:: 100%|██████████| 197959/197959 [00:04<00:00, 45934.57it/s]

Extracting Dataset Version Zip to Solar-Panel-Fault-Dataset-1 in yolov8:: 100%|██████████| 5538/5538 [00:00<00:00, 5616.05it/s]
Creating new Ultralytics Settings v0.0.6 file ✅ 
View Ultralytics Settings with 'yolo settings' or at '/root/.config/Ultralytics/settings.json'
Update Settings with 'yolo settings key=value', i.e. 'yolo settings runs_dir=path/to/dir'. For help see https://docs.ultralytics.com/quickstart/#ultralytics-settings.
Dataset location: /content/Solar-Panel-Fault-Dataset-1
In [3]:
from ultralytics import YOLO

model = YOLO('yolov8n.pt')

results = model.train(
    data='/content/Solar-Panel-Fault-Dataset-1/data.yaml',
    epochs=50,
    imgsz=640,
    batch=16,
    device=0,
    project='/content/runs',
    name='sprint08_solar_fault_detection',
    exist_ok=True,
    plots=True,
    verbose=True
)

print("Training complete.")
print(f"Best model: {results.save_dir}")
Downloading https://github.com/ultralytics/assets/releases/download/v8.4.0/yolov8n.pt to 'yolov8n.pt': 100% ━━━━━━━━━━━━ 6.2MB 110.4MB/s 0.1s
Ultralytics 8.4.76 🚀 Python-3.12.13 torch-2.11.0+cu128 CUDA:0 (Tesla T4, 14913MiB)
engine/trainer: agnostic_nms=False, amp=True, angle=1.0, augment=False, auto_augment=randaugment, batch=16, bgr=0.0, box=7.5, cache=False, cfg=None, classes=None, close_mosaic=10, cls=0.5, cls_pw=0.0, compile=False, conf=None, copy_paste=0.0, copy_paste_mode=flip, cos_lr=False, cutmix=0.0, data=/content/Solar-Panel-Fault-Dataset-1/data.yaml, degrees=0.0, deterministic=True, device=0, dfl=1.5, dnn=False, dropout=0.0, dynamic=False, embed=None, end2end=None, epochs=50, erasing=0.4, exist_ok=True, fliplr=0.5, flipud=0.0, format=torchscript, fraction=1.0, freeze=None, half=False, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, imgsz=640, int8=False, iou=0.7, keras=False, kobj=1.0, line_width=None, lr0=0.01, lrf=0.01, mask_ratio=4, max_det=300, mixup=0.0, mode=train, model=yolov8n.pt, momentum=0.937, mosaic=1.0, multi_scale=0.0, name=sprint08_solar_fault_detection, nbs=64, nms=False, opset=None, optimize=False, optimizer=auto, overlap_mask=True, patience=100, perspective=0.0, plots=True, pose=12.0, pretrained=True, profile=False, project=/content/runs, rect=False, resume=False, retina_masks=False, rle=1.0, save=True, save_conf=False, save_crop=False, save_dir=/content/runs/sprint08_solar_fault_detection, save_frames=False, save_json=False, save_period=-1, save_txt=False, scale=0.5, seed=0, shear=0.0, show=False, show_boxes=True, show_conf=True, show_labels=True, simplify=True, single_cls=False, source=None, split=val, stream_buffer=False, task=detect, time=None, tracker=tracktrack.yaml, translate=0.1, val=True, verbose=True, vid_stride=1, visualize=False, warmup_bias_lr=0.1, warmup_epochs=3.0, warmup_momentum=0.8, weight_decay=0.0005, workers=8, workspace=None
Downloading https://ultralytics.com/assets/Arial.ttf to '/root/.config/Ultralytics/Arial.ttf': 100% ━━━━━━━━━━━━ 755.1KB 25.5MB/s 0.0s
Overriding model.yaml nc=80 with nc=7

                   from  n    params  module                                       arguments                     
  0                  -1  1       464  ultralytics.nn.modules.conv.Conv             [3, 16, 3, 2]                 
  1                  -1  1      4672  ultralytics.nn.modules.conv.Conv             [16, 32, 3, 2]                
  2                  -1  1      7360  ultralytics.nn.modules.block.C2f             [32, 32, 1, True]             
  3                  -1  1     18560  ultralytics.nn.modules.conv.Conv             [32, 64, 3, 2]                
  4                  -1  2     49664  ultralytics.nn.modules.block.C2f             [64, 64, 2, True]             
  5                  -1  1     73984  ultralytics.nn.modules.conv.Conv             [64, 128, 3, 2]               
  6                  -1  2    197632  ultralytics.nn.modules.block.C2f             [128, 128, 2, True]           
  7                  -1  1    295424  ultralytics.nn.modules.conv.Conv             [128, 256, 3, 2]              
  8                  -1  1    460288  ultralytics.nn.modules.block.C2f             [256, 256, 1, True]           
  9                  -1  1    164608  ultralytics.nn.modules.block.SPPF            [256, 256, 5]                 
 10                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']          
 11             [-1, 6]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           
 12                  -1  1    148224  ultralytics.nn.modules.block.C2f             [384, 128, 1]                 
 13                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']          
 14             [-1, 4]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           
 15                  -1  1     37248  ultralytics.nn.modules.block.C2f             [192, 64, 1]                  
 16                  -1  1     36992  ultralytics.nn.modules.conv.Conv             [64, 64, 3, 2]                
 17            [-1, 12]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           
 18                  -1  1    123648  ultralytics.nn.modules.block.C2f             [192, 128, 1]                 
 19                  -1  1    147712  ultralytics.nn.modules.conv.Conv             [128, 128, 3, 2]              
 20             [-1, 9]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           
 21                  -1  1    493056  ultralytics.nn.modules.block.C2f             [384, 256, 1]                 
 22        [15, 18, 21]  1    752677  ultralytics.nn.modules.head.Detect           [7, 16, None, [64, 128, 256]] 
Model summary: 130 layers, 3,012,213 parameters, 3,012,197 gradients, 8.2 GFLOPs

Transferred 319/355 items from pretrained weights
Freezing layer 'model.22.dfl.conv.weight'
AMP: running Automatic Mixed Precision (AMP) checks...
Downloading https://github.com/ultralytics/assets/releases/download/v8.4.0/yolo26n.pt to 'yolo26n.pt': 100% ━━━━━━━━━━━━ 5.3MB 104.9MB/s 0.1s
AMP: checks passed ✅
train: Fast image access ✅ (ping: 0.0±0.0 ms, read: 1535.3±710.1 MB/s, size: 61.2 KB)
train: Scanning /content/Solar-Panel-Fault-Dataset-1/train/labels... 2007 images, 0 backgrounds, 0 corrupt: 100% ━━━━━━━━━━━━ 2007/2007 1.9Kit/s 1.1s
train: /content/Solar-Panel-Fault-Dataset-1/train/images/195_png_jpg.rf.99dcacece79ebf7885ff8a4d14da0e78.jpg: 1 duplicate labels removed
train: New cache created: /content/Solar-Panel-Fault-Dataset-1/train/labels.cache
WARNING ⚠️ Box and segment counts should be equal, but got len(segments) = 6587, len(boxes) = 10559. To resolve this only boxes will be used and all segments will be removed. To avoid this please supply either a detect or segment dataset, not a detect-segment mixed dataset.
albumentations: Blur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01, method='weighted_average', num_output_channels=3), CLAHE(p=0.01, clip_limit=(1.0, 4.0), tile_grid_size=(8, 8))
val: Fast image access ✅ (ping: 0.0±0.0 ms, read: 604.3±387.9 MB/s, size: 69.9 KB)
val: Scanning /content/Solar-Panel-Fault-Dataset-1/valid/labels... 327 images, 0 backgrounds, 0 corrupt: 100% ━━━━━━━━━━━━ 327/327 832.7it/s 0.4s
val: New cache created: /content/Solar-Panel-Fault-Dataset-1/valid/labels.cache
WARNING ⚠️ Box and segment counts should be equal, but got len(segments) = 1329, len(boxes) = 1585. To resolve this only boxes will be used and all segments will be removed. To avoid this please supply either a detect or segment dataset, not a detect-segment mixed dataset.
optimizer: 'optimizer=auto' found, ignoring 'lr0=0.01' and 'momentum=0.937' and determining best 'optimizer', 'lr0' and 'momentum' automatically... 
optimizer: AdamW(lr=0.000909, momentum=0.9) with parameter groups 57 weight(decay=0.0), 64 weight(decay=0.0005), 63 bias(decay=0.0)
Plotting labels to /content/runs/sprint08_solar_fault_detection/labels.jpg... 
Image sizes 640 train, 640 val
Using 2 dataloader workers
Logging results to /content/runs/sprint08_solar_fault_detection
Starting training for 50 epochs...

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
       1/50      2.38G      1.512      3.265      1.802         57        640: 100% ━━━━━━━━━━━━ 126/126 3.3it/s 37.8s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 2.3it/s 4.8s
                   all        327       1585       0.16      0.151     0.0548     0.0327

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
       2/50      3.24G      1.482      2.688      1.783         40        640: 100% ━━━━━━━━━━━━ 126/126 3.5it/s 35.8s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.1it/s 3.5s
                   all        327       1585       0.22      0.193       0.13     0.0758

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
       3/50      3.48G      1.471      2.532      1.757         33        640: 100% ━━━━━━━━━━━━ 126/126 3.6it/s 34.9s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.4it/s 3.3s
                   all        327       1585      0.163      0.155      0.106     0.0702

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
       4/50      3.48G      1.447      2.436      1.747         82        640: 100% ━━━━━━━━━━━━ 126/126 3.7it/s 34.4s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.2it/s 3.4s
                   all        327       1585      0.337      0.219      0.158      0.104

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
       5/50      3.48G       1.43      2.351      1.748        134        640: 100% ━━━━━━━━━━━━ 126/126 3.8it/s 33.1s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 2.5it/s 4.4s
                   all        327       1585      0.529      0.203      0.211      0.142

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
       6/50      3.48G      1.378      2.241      1.699         99        640: 100% ━━━━━━━━━━━━ 126/126 3.8it/s 33.0s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 2.3it/s 4.7s
                   all        327       1585      0.529       0.24      0.206      0.135

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
       7/50      3.78G      1.369      2.233      1.697         44        640: 100% ━━━━━━━━━━━━ 126/126 3.8it/s 33.3s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 2.6it/s 4.2s
                   all        327       1585      0.486      0.236      0.222      0.159

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
       8/50      3.78G      1.338       2.14       1.67         46        640: 100% ━━━━━━━━━━━━ 126/126 3.8it/s 33.4s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.3it/s 3.4s
                   all        327       1585      0.383      0.274      0.244      0.165

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
       9/50      3.78G      1.338      2.114      1.668         65        640: 100% ━━━━━━━━━━━━ 126/126 3.8it/s 33.0s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.1it/s 3.6s
                   all        327       1585      0.387      0.273      0.247      0.171

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      10/50      3.78G      1.299      2.077       1.63         49        640: 100% ━━━━━━━━━━━━ 126/126 3.7it/s 33.8s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.1it/s 3.5s
                   all        327       1585      0.382      0.241      0.217      0.149

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      11/50      4.09G      1.274      2.038      1.623        123        640: 100% ━━━━━━━━━━━━ 126/126 3.8it/s 33.4s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.2it/s 3.5s
                   all        327       1585      0.425      0.313      0.244      0.172

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      12/50      4.09G      1.284      1.999      1.635         37        640: 100% ━━━━━━━━━━━━ 126/126 3.8it/s 32.9s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 2.5it/s 4.3s
                   all        327       1585      0.358      0.304      0.258      0.182

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      13/50      4.09G      1.234      1.959      1.598         63        640: 100% ━━━━━━━━━━━━ 126/126 3.9it/s 32.1s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 2.4it/s 4.5s
                   all        327       1585      0.366      0.301      0.237      0.163

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      14/50      4.09G      1.246      1.937      1.603         83        640: 100% ━━━━━━━━━━━━ 126/126 3.9it/s 32.6s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.4it/s 3.3s
                   all        327       1585      0.533       0.27      0.264      0.186

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      15/50      4.09G      1.232      1.932      1.582         68        640: 100% ━━━━━━━━━━━━ 126/126 3.8it/s 33.5s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.3it/s 3.4s
                   all        327       1585      0.365      0.318      0.269      0.189

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      16/50      4.09G      1.221      1.908      1.582         38        640: 100% ━━━━━━━━━━━━ 126/126 3.7it/s 33.7s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.5it/s 3.1s
                   all        327       1585      0.328      0.322       0.27      0.193

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      17/50      4.09G      1.206      1.853      1.565         93        640: 100% ━━━━━━━━━━━━ 126/126 3.7it/s 33.7s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.1it/s 3.5s
                   all        327       1585      0.348      0.324      0.248      0.173

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      18/50      4.09G       1.19       1.84       1.56         61        640: 100% ━━━━━━━━━━━━ 126/126 3.7it/s 33.8s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.1it/s 3.6s
                   all        327       1585      0.374      0.319      0.267      0.184

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      19/50      4.09G      1.203      1.839      1.569         47        640: 100% ━━━━━━━━━━━━ 126/126 3.9it/s 32.6s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 2.4it/s 4.6s
                   all        327       1585      0.488      0.276      0.271      0.194

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      20/50      4.09G      1.164      1.804       1.53         54        640: 100% ━━━━━━━━━━━━ 126/126 4.0it/s 31.8s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 2.9it/s 3.8s
                   all        327       1585      0.336      0.385      0.296       0.21

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      21/50      4.09G       1.17      1.806      1.545         51        640: 100% ━━━━━━━━━━━━ 126/126 3.8it/s 33.5s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.5it/s 3.2s
                   all        327       1585        0.4      0.336      0.276      0.197

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      22/50      4.09G      1.182      1.804      1.545         79        640: 100% ━━━━━━━━━━━━ 126/126 3.8it/s 33.6s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.1it/s 3.6s
                   all        327       1585      0.329      0.325       0.27      0.194

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      23/50      4.09G      1.145      1.754       1.52         98        640: 100% ━━━━━━━━━━━━ 126/126 3.7it/s 34.2s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.3it/s 3.3s
                   all        327       1585      0.464      0.266      0.269      0.188

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      24/50      4.09G      1.155      1.755      1.536         87        640: 100% ━━━━━━━━━━━━ 126/126 3.6it/s 34.6s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.3it/s 3.4s
                   all        327       1585      0.356      0.309       0.27      0.192

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      25/50      4.09G      1.132       1.69      1.501         64        640: 100% ━━━━━━━━━━━━ 126/126 3.8it/s 33.2s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 2.6it/s 4.2s
                   all        327       1585      0.364      0.344      0.288      0.207

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      26/50      4.09G      1.112       1.68      1.491         75        640: 100% ━━━━━━━━━━━━ 126/126 3.8it/s 32.8s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 2.5it/s 4.4s
                   all        327       1585      0.362      0.367      0.297      0.206

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      27/50      4.09G      1.099       1.65      1.483         90        640: 100% ━━━━━━━━━━━━ 126/126 3.9it/s 32.7s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 2.7it/s 4.0s
                   all        327       1585      0.353       0.36      0.281      0.199

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      28/50      4.09G      1.123      1.663      1.506         65        640: 100% ━━━━━━━━━━━━ 126/126 3.9it/s 32.7s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.0it/s 3.7s
                   all        327       1585      0.322      0.358      0.276      0.198

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      29/50       4.1G      1.114      1.664      1.494         63        640: 100% ━━━━━━━━━━━━ 126/126 3.7it/s 34.3s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.0it/s 3.6s
                   all        327       1585       0.38      0.371      0.315       0.22

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      30/50       4.1G      1.116       1.65      1.496         47        640: 100% ━━━━━━━━━━━━ 126/126 3.7it/s 34.4s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.2it/s 3.5s
                   all        327       1585       0.35      0.363      0.311      0.221

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      31/50       4.1G      1.108      1.621      1.493         83        640: 100% ━━━━━━━━━━━━ 126/126 3.7it/s 34.3s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.1it/s 3.6s
                   all        327       1585      0.347      0.363       0.29       0.21

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      32/50       4.1G      1.094      1.586      1.474         66        640: 100% ━━━━━━━━━━━━ 126/126 3.7it/s 34.5s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.1it/s 3.6s
                   all        327       1585      0.345      0.383       0.32      0.228

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      33/50       4.1G      1.096       1.61      1.488         52        640: 100% ━━━━━━━━━━━━ 126/126 3.8it/s 33.5s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 2.5it/s 4.4s
                   all        327       1585      0.384      0.368      0.319      0.225

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      34/50       4.1G      1.061      1.556      1.457         39        640: 100% ━━━━━━━━━━━━ 126/126 3.8it/s 32.8s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 2.5it/s 4.5s
                   all        327       1585      0.369      0.326      0.291      0.214

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      35/50       4.1G      1.067      1.549      1.459         70        640: 100% ━━━━━━━━━━━━ 126/126 3.8it/s 32.9s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.2it/s 3.4s
                   all        327       1585      0.355      0.356      0.296      0.214

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      36/50       4.1G      1.075      1.564      1.468         33        640: 100% ━━━━━━━━━━━━ 126/126 3.8it/s 33.5s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.4it/s 3.2s
                   all        327       1585      0.357      0.389      0.318      0.231

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      37/50       4.1G      1.045      1.532      1.443        106        640: 100% ━━━━━━━━━━━━ 126/126 3.7it/s 34.2s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.3it/s 3.3s
                   all        327       1585      0.344      0.371      0.298      0.216

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      38/50      4.44G      1.062      1.538      1.448         60        640: 100% ━━━━━━━━━━━━ 126/126 3.7it/s 33.8s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.0it/s 3.7s
                   all        327       1585      0.312      0.397      0.296      0.214

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      39/50      4.44G      1.058      1.529      1.443         78        640: 100% ━━━━━━━━━━━━ 126/126 3.7it/s 34.5s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.4it/s 3.2s
                   all        327       1585      0.348      0.392      0.312      0.228

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      40/50      4.44G      1.023      1.494      1.426         71        640: 100% ━━━━━━━━━━━━ 126/126 3.7it/s 33.7s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.1it/s 3.5s
                   all        327       1585      0.373      0.347      0.308      0.229
Closing dataloader mosaic
albumentations: Blur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01, method='weighted_average', num_output_channels=3), CLAHE(p=0.01, clip_limit=(1.0, 4.0), tile_grid_size=(8, 8))

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      41/50      4.44G      1.127      1.598      1.536         60        640: 100% ━━━━━━━━━━━━ 126/126 3.6it/s 35.1s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.1it/s 3.6s
                   all        327       1585      0.309      0.381       0.31      0.228

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      42/50      4.44G        1.1      1.547       1.52         58        640: 100% ━━━━━━━━━━━━ 126/126 4.0it/s 31.4s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 2.6it/s 4.3s
                   all        327       1585      0.357      0.366      0.306      0.227

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      43/50      4.44G      1.102      1.533      1.521         42        640: 100% ━━━━━━━━━━━━ 126/126 4.0it/s 31.7s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.1it/s 3.6s
                   all        327       1585       0.32      0.394      0.308      0.229

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      44/50      4.44G      1.103      1.516      1.526         29        640: 100% ━━━━━━━━━━━━ 126/126 3.9it/s 32.7s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.3it/s 3.3s
                   all        327       1585      0.368      0.366      0.313       0.23

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      45/50      4.44G       1.07      1.482      1.486         39        640: 100% ━━━━━━━━━━━━ 126/126 4.0it/s 31.9s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.0it/s 3.7s
                   all        327       1585      0.361      0.369      0.308       0.23

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      46/50      4.44G      1.075      1.475      1.496         39        640: 100% ━━━━━━━━━━━━ 126/126 4.0it/s 31.9s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 2.3it/s 4.7s
                   all        327       1585      0.361      0.392      0.317      0.234

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      47/50      4.44G      1.061      1.459      1.488         21        640: 100% ━━━━━━━━━━━━ 126/126 3.9it/s 31.9s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.2it/s 3.5s
                   all        327       1585      0.362      0.378       0.31      0.229

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      48/50      4.44G       1.06      1.465      1.495         15        640: 100% ━━━━━━━━━━━━ 126/126 3.8it/s 32.8s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.5it/s 3.1s
                   all        327       1585       0.37      0.374      0.314      0.233

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      49/50      4.44G      1.042      1.437       1.47         11        640: 100% ━━━━━━━━━━━━ 126/126 3.9it/s 32.4s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 3.1it/s 3.5s
                   all        327       1585      0.371      0.373      0.317      0.233

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      50/50      4.44G      1.055      1.441      1.486         65        640: 100% ━━━━━━━━━━━━ 126/126 4.0it/s 31.5s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 2.3it/s 4.7s
                   all        327       1585       0.37      0.388      0.321      0.238

50 epochs completed in 0.523 hours.
Optimizer stripped from /content/runs/sprint08_solar_fault_detection/weights/last.pt, 6.3MB
Optimizer stripped from /content/runs/sprint08_solar_fault_detection/weights/best.pt, 6.3MB

Validating /content/runs/sprint08_solar_fault_detection/weights/best.pt...
Ultralytics 8.4.76 🚀 Python-3.12.13 torch-2.11.0+cu128 CUDA:0 (Tesla T4, 14913MiB)
Model summary (fused): 73 layers, 3,007,013 parameters, 0 gradients, 8.1 GFLOPs
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 11/11 2.2it/s 4.9s
                   all        327       1585      0.372      0.382      0.321      0.238
             Bird Drop         34        233      0.322      0.176      0.149     0.0481
             Defective        208        287      0.579      0.723       0.64       0.56
                 Dusty        107        319      0.406      0.357      0.309      0.197
         Non Defective         55        151      0.443      0.616      0.555      0.457
       Physical Damage        136        283      0.204      0.124      0.097     0.0485
                  Snow         41        312      0.282      0.298      0.176      0.114
Speed: 0.2ms preprocess, 2.3ms inference, 0.0ms loss, 3.8ms postprocess per image
Results saved to /content/runs/sprint08_solar_fault_detection
Training complete.
Best model: /content/runs/sprint08_solar_fault_detection
In [4]:
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from PIL import Image
import numpy as np
from pathlib import Path
import random

model_path = '/content/runs/sprint08_solar_fault_detection/weights/best.pt'
test_img_dir = Path('/content/Solar-Panel-Fault-Dataset-1/test/images')

model = YOLO(model_path)

CLASS_COLORS = {
    0: '#4ECDC4',  # Bird Drop
    1: '#FF6B6B',  # Defective
    2: '#FFD700',  # Dust
    3: '#FFE66D',  # Dusty
    4: '#00FF88',  # Non Defective
    5: '#FF6B6B',  # Physical Damage
    6: '#00BFFF',  # Snow
}

CLASS_NAMES = ['Bird Drop','Defective','Dust','Dusty','Non Defective','Physical Damage','Snow']

test_images = list(test_img_dir.glob('*.jpg'))
samples = random.sample(test_images, min(9, len(test_images)))

plt.style.use('dark_background')
fig, axes = plt.subplots(3, 3, figsize=(18, 14))
fig.patch.set_facecolor('#0c0c0c')
fig.suptitle(
    'Sprint 08 — Solar Panel Fault Detection · YOLOv8n · 50 Epochs\nInference on Held-Out Test Set · 7 Fault Classes',
    color='white', fontsize=13, fontweight='bold'
)

for ax, img_path in zip(axes.flat, samples):
    img = Image.open(img_path).convert('RGB')
    results = model(img_path, verbose=False)[0]

    ax.imshow(np.array(img))
    ax.set_facecolor('#0c0c0c')
    ax.axis('off')

    for box in results.boxes:
        cls = int(box.cls[0])
        conf = float(box.conf[0])
        x1, y1, x2, y2 = map(int, box.xyxy[0].tolist())
        color = CLASS_COLORS.get(cls, '#ffffff')

        rect = patches.Rectangle(
            (x1, y1), x2-x1, y2-y1,
            linewidth=2, edgecolor=color, facecolor='none'
        )
        ax.add_patch(rect)
        ax.text(
            x1, max(y1-5, 10),
            f"{CLASS_NAMES[cls]} {conf:.2f}",
            color=color, fontsize=7, fontweight='bold',
            fontfamily='monospace',
            bbox=dict(boxstyle='round,pad=0.2', facecolor='#0c0c0c', alpha=0.7, edgecolor='none')
        )

plt.tight_layout()
plt.savefig('/content/sprint08_inference_results.png', dpi=150,
            bbox_inches='tight', facecolor='#0c0c0c')
plt.show()
print("Inference visualization saved.")
No description has been provided for this image
Inference visualization saved.
In [5]:
from IPython.display import display
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from pathlib import Path

results_dir = Path('/content/runs/sprint08_solar_fault_detection')

# Show the training plots Ultralytics auto-generated
plot_files = ['results.png', 'confusion_matrix.png', 'PR_curve.png']

for plot_file in plot_files:
    path = results_dir / plot_file
    if path.exists():
        img = mpimg.imread(path)
        plt.figure(figsize=(14, 6))
        plt.imshow(img)
        plt.axis('off')
        plt.title(plot_file.replace('.png','').replace('_',' ').title(),
                  color='white', fontsize=12)
        plt.tight_layout()
        plt.show()
        print(f"{plot_file} ✓")
    else:
        print(f"{plot_file} not found")
No description has been provided for this image
results.png ✓
No description has been provided for this image
confusion_matrix.png ✓
PR_curve.png not found
In [6]:
import pandas as pd
import matplotlib.pyplot as plt
from pathlib import Path

results_csv = Path('/content/runs/sprint08_solar_fault_detection/results.csv')
df = pd.read_csv(results_csv)
df.columns = df.columns.str.strip()

print("Available columns:")
print(df.columns.tolist())
Available columns:
['epoch', 'time', 'train/box_loss', 'train/cls_loss', 'train/dfl_loss', 'metrics/precision(B)', 'metrics/recall(B)', 'metrics/mAP50(B)', 'metrics/mAP50-95(B)', 'val/box_loss', 'val/cls_loss', 'val/dfl_loss', 'lr/pg0', 'lr/pg1', 'lr/pg2']
In [7]:
plt.style.use('dark_background')
fig, axes = plt.subplots(2, 3, figsize=(18, 10))
fig.patch.set_facecolor('#0c0c0c')
fig.suptitle(
    'Sprint 08 — YOLOv8n Training Curves · 50 Epochs · Solar Panel Fault Detection',
    color='white', fontsize=13, fontweight='bold'
)

plots = [
    ('train/box_loss', 'val/box_loss',   'Box Loss',       '#FF6B6B', '#4ECDC4'),
    ('train/cls_loss', 'val/cls_loss',   'Class Loss',     '#FFD700', '#00FF88'),
    ('train/dfl_loss', 'val/dfl_loss',   'DFL Loss',       '#FF6B6B', '#4ECDC4'),
    ('metrics/mAP50(B)',    None,         'mAP50',          '#00FF88', None),
    ('metrics/mAP50-95(B)', None,         'mAP50-95',       '#00BFFF', None),
    ('metrics/precision(B)', 'metrics/recall(B)', 'Precision & Recall', '#FFD700', '#4ECDC4'),
]

labels = [
    ('Train', 'Val'),
    ('Train', 'Val'),
    ('Train', 'Val'),
    ('mAP50', None),
    ('mAP50-95', None),
    ('Precision', 'Recall'),
]

for ax, (col1, col2, title, c1, c2), (l1, l2) in zip(axes.flat, plots, labels):
    ax.set_facecolor('#0c0c0c')
    ax.plot(df['epoch'], df[col1], color=c1, linewidth=2, label=l1)
    if col2:
        ax.plot(df['epoch'], df[col2], color=c2, linewidth=2,
                linestyle='--', label=l2)
    ax.set_title(title, color='white', fontsize=11, fontweight='bold')
    ax.set_xlabel('Epoch', color='#888', fontsize=9)
    ax.tick_params(colors='#666')
    ax.spines['bottom'].set_color('#333')
    ax.spines['left'].set_color('#333')
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.legend(fontsize=8)
    ax.grid(alpha=0.1)

plt.tight_layout()
plt.savefig('/content/sprint08_training_curves.png', dpi=150,
            bbox_inches='tight', facecolor='#0c0c0c')
plt.show()
print("Training curves saved.")
No description has been provided for this image
Training curves saved.
In [8]:
# Final portfolio output — grid of inference results
# Reusing the inference visualization from Cell 4
# Let's make a cleaner, larger version for the sprint output

test_images = list(test_img_dir.glob('*.jpg'))

# Pick images that actually have detections
samples_with_detections = []
for img_path in random.sample(test_images, 50):
    r = model(img_path, verbose=False)[0]
    if len(r.boxes) > 0:
        samples_with_detections.append((img_path, r))
    if len(samples_with_detections) == 9:
        break

plt.style.use('dark_background')
fig, axes = plt.subplots(3, 3, figsize=(18, 14))
fig.patch.set_facecolor('#0c0c0c')
fig.suptitle(
    'Sprint 08 — Solar Panel Fault Detection · YOLOv8n Fine-Tuned\n'
    '7 Fault Classes · 2,763 Images · 50 Epochs · Tesla T4 GPU',
    color='white', fontsize=13, fontweight='bold', y=1.01
)

for ax, (img_path, result) in zip(axes.flat, samples_with_detections):
    img = np.array(Image.open(img_path).convert('RGB'))
    ax.imshow(img)
    ax.set_facecolor('#0c0c0c')
    ax.axis('off')

    for box in result.boxes:
        cls  = int(box.cls[0])
        conf = float(box.conf[0])
        x1, y1, x2, y2 = map(int, box.xyxy[0].tolist())
        color = CLASS_COLORS.get(cls, '#ffffff')
        rect  = patches.Rectangle(
            (x1, y1), x2-x1, y2-y1,
            linewidth=2.5, edgecolor=color, facecolor='none'
        )
        ax.add_patch(rect)
        ax.text(
            x1, max(y1-6, 10),
            f"{CLASS_NAMES[cls]} {conf:.2f}",
            color=color, fontsize=8, fontweight='bold',
            fontfamily='monospace',
            bbox=dict(boxstyle='round,pad=0.2',
                      facecolor='#0c0c0c', alpha=0.75, edgecolor='none')
        )

plt.tight_layout()
plt.savefig('/content/sprint08_final_output.png', dpi=150,
            bbox_inches='tight', facecolor='#0c0c0c')
plt.show()
print("Final portfolio output saved.")
No description has been provided for this image
Final portfolio output saved.
In [9]:
from google.colab import files

# Download the three key outputs
files.download('/content/sprint08_final_output.png')
files.download('/content/sprint08_training_curves.png')
files.download('/content/sprint08_inference_results.png')
files.download('/content/runs/sprint08_solar_fault_detection/weights/best.pt')
In [ ]: