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.")
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")
results.png ✓
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.")
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.")
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 [ ]: