Input Video (2-second clip, 16 frames)
↓
ResNet50 (ImageNet pretrained, frozen)
↓
Frame Embeddings (16 × 2048)
↓
LayerNorm → Dense(256) → Dropout(0.4)
↓
Bidirectional GRU (64 units)
↓
Temporal Attention Layer
↓
Dense(64) → Dropout(0.6)
↓
Sigmoid Output → P(Suspicious / Normal)| Parameter | Value |
|---|---|
| Framework | TensorFlow / Keras |
| Backbone | ResNet50 (frozen) |
| Sequence length | 16 frames |
| Clip duration | ~2 seconds |
| Batch size | 32 |
| Epochs | ~19 (early stopping applied) |
| Optimizer | Adam (clipnorm = 1.0) |
| Loss | Focal Loss (α = 0.60, γ = 2.0) |
| LR Schedule | ReduceLROnPlateau |
| Early Stopping | Based on validation AUC |
| Split | Clips | Normal | Suspicious |
|---|---|---|---|
| Train | 1,328 | 51.2% | 48.8% |
| Validation | 332 | 51.2% | 48.8% |
| Test | 290 | 51.7% | 48.3% |
| Metric | Score |
|---|---|
| Accuracy | 95.24% |
| AUC-ROC | 0.9895 |
| Macro F1 | 0.903 |
| Class | Precision | Recall |
|---|---|---|
| Normal | 89.6% | 92.0% |
| Suspicious | 91.2% | 88.6% |
| Issue | Mitigation |
|---|---|
| Class imbalance bias | Focal Loss tuning |
| Overfitting | Frozen backbone |
| Slow preprocessing | Batched GPU feature extraction |
| Threshold bias | Macro-F1 optimization |
| Serialization issues | Keras serializable registration |
| Training interruptions | Checkpointing with resume support |
| Feature extraction crashes | Incremental checkpointing |
| Dataset path issues | Auto-discovery logic |
| Data leakage risk | Video-level splitting |