← Back to Portfolio

YOLOv1 from Scratch

A scientific and practical baseline for understanding single-stage detection architecture, mapping the mathematical, structural, and hardware bottlenecks of legacy detection systems.

Object detection stands as a cornerstone of modern computer vision. While off-the-shelf frameworks abstract the complexity, building a foundational model from scratch is critical to mastering the underlying mathematics. I built a complete implementation of the original YOLO algorithm using PyTorch. This deep dive maps the mathematical, structural, and hardware bottlenecks encountered during training.

These empirical findings directly act as the theoretical groundwork for subsequent projects (like estaciona-ai), enabling a calculated transition from this baseline to state-of-the-art YOLOv8 architectures.

1. Hardware Constraints & Engineering

Development and training were conducted under a strict 6GB VRAM constraint (RTX 2060). This physical limitation drove several critical architectural engineering decisions to prevent CUDA Out-Of-Memory (OOM) errors:

2. The Experimental Journey

To validate convergence hypotheses, a series of controlled experiments were executed on the Pascal VOC 2012 dataset. I documented each step of the iterative process, tracking precisely when and why the network failed.

Exp 1: Baseline (From-Scratch)

Result: mAP@0.5 = 0.0049

Goal: Train a simplified YOLO architecture from scratch with random weights on Pascal VOC.

Failure Reason: Reducing the DetectionHead parameters to fit the 6GB VRAM severely limited spatial abstraction capability. Combined with the lack of ImageNet pre-training, the model overfitted to predicting background in most grid cells, resulting in excessive false negatives.

Exp 2: Focal Loss

Result: mAP@0.5 = 0.0000

Goal: Implement Focal Loss to handle the extreme class imbalance and penalize massive background predictions.

Failure Reason: The modulation factor completely zeroed the gradients for background predictions early in training. The network effectively stopped penalizing the background entirely, which flooded the prediction grid with false positives and utterly collapsed overall precision.

Exp 3: Transfer Learning (Frozen ResNet18)

Result: mAP@0.5 = 0.0356

Decision: Because object detection datasets like VOC lack the volume to teach basic feature extraction (edges, textures) from random weights, the custom backbone was discarded in favor of a pre-trained ResNet18 backbone initialized on ImageNet.

Result: Replacing the backbone and keeping it frozen yielded a ~7x improvement in mAP. However, freezing the backbone prevented critical spatial regression adaptation needed for bounding boxes.

Exp 4: Full Fine-Tuning

Result: mAP@0.5 = 0.0236

Goal: Unfreeze the entire ResNet18 backbone and train with a lower learning rate 1e-5 to encourage spatial feature adaptation.

Failure Reason: The mAP degraded. Fine-tuning with an excessively small micro-batch size destabilized the Batch Normalization layers, introducing severe gradient noise that corrupted the pre-trained weights.

3. Mathematical Foundations: The Focal Loss Collapse

Why did Experiment 2 fail so catastrophically? The YOLOv1 loss function is a unified sum of squared errors, balanced by two constants: $\lambda_{coord} = 5$ to emphasize bounding box accuracy, and $\lambda_{noobj} = 0.5$ to penalize the overwhelming number of background cells.

During the Focal Loss Experiment, the standard Mean Squared Error (MSE) for background confidence was replaced with a Focal Loss modulation to handle extreme class imbalance.

A modulating factor $(1 - \hat{C}_i)^\gamma$ (with $\gamma = 2$) was applied to the background confidence loss. Since the target confidence $C_i$ for a background cell is exactly $0$, the focal formula simplifies brutally:

$$ Loss_{noobj}^{(focal)} = \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{noobj} \cdot \hat{C}_i^\gamma \cdot (\hat{C}_i - 0)^2 \implies \lambda_{noobj} \cdot \hat{C}_i^4 $$

Cause of Collapse: When the network initializes, the predicted confidence $\hat{C}_i$ in any given cell is typically close to zero (e.g., $0.1$). Squaring this factor $\hat{C}_i^2$ exponentially shrinks the already small gradients produced by the MSE. The network effectively stopped updating weights to suppress background predictions. The loss vanished before it could backpropagate, leaving the grid vulnerable to false positives.

***

Conclusion: Architecting for YOLOv8

The failures documented in this baseline repository are highly valuable—they empirically validate the necessity of architectural advancements developed in modern detectors. Using YOLOv8 in future projects directly bypasses these exact hardware and mathematical bottlenecks through:

Examine the Source Code on GitHub