Powerline Asset Detection and Condition Classification (InsPLAD)
Two ONNX models for inspecting power line hardware in UAV imagery:
- Detector (YOLO11-s, 9.4M params) locating 17 asset classes
- Condition classifier (EfficientNetV2-S) labelling crops of the five defect-prone asset types
Both run on CPU under ONNX Runtime with no PyTorch or Ultralytics dependency at inference time.
Trained on InsPLAD (Vieira-e-Silva et al., 2023). Code, full technical report, and a live demo: https://github.com/Josh-E-S/powerline-inspection-demo
Results
Measured on the InsPLAD benchmark's own test split (2,626 images, 6,324 instances), verified by matching per-class counts against Table 3 of the paper. Metric is COCO Box AP (IoU 0.50:0.95), the same definition the paper uses. Latency is single-image CPU inference on an Apple M5.
| File | Size | Box AP | AP50 | p50 latency |
|---|---|---|---|---|
detector-1280-int8.onnx |
10.6 MB | 0.726 | 0.906 | 127 ms |
detector-1280-fp32.onnx |
38.5 MB | 0.738 | 0.912 | 150 ms |
detector-640-int8.onnx |
10.1 MB | 0.710 | 0.889 | 30 ms |
Published baselines on the same split, for reference: DetectoRS 0.721 Box AP at 990.9 MB, RetinaNet 0.891 AP50 at 756.2 MB, both measured on an RTX 3080Ti. The 1280 INT8 model above exceeds the best published Box AP at roughly 1/93rd the weights size, on CPU.
Condition classifier: 0.960 balanced accuracy on the fault test split (6,417 crops), against the published 0.954.
Per-class results lead on 11 of 17 classes. The three glass-insulator shackle variants remain weak in absolute terms (0.34-0.47 Box AP); they are scarce (around 100 training instances each) and are confused predominantly with one another.
Files
| File | Purpose |
|---|---|
detector-640-int8.onnx |
fastest; used in the live demo |
detector-1280-int8.onnx |
best accuracy per byte |
detector-1280-fp32.onnx |
unquantized reference |
classifier.onnx + classifier.onnx.data |
condition classifier (external data file is required alongside the model) |
classifier_classes.json |
class order for the classifier output |
Usage
import numpy as np, onnxruntime as ort
from PIL import Image
sess = ort.InferenceSession("detector-640-int8.onnx",
providers=["CPUExecutionProvider"])
size = 640
def letterbox(path, size):
img = Image.open(path).convert("RGB")
r = min(size / img.width, size / img.height)
nw, nh = round(img.width * r), round(img.height * r)
canvas = Image.new("RGB", (size, size), (114, 114, 114))
canvas.paste(img.resize((nw, nh), Image.BILINEAR),
((size - nw) // 2, (size - nh) // 2))
x = np.asarray(canvas, np.float32).transpose(2, 0, 1)[None] / 255.0
return x, r, (size - nw) // 2, (size - nh) // 2
x, scale, pad_x, pad_y = letterbox("image.jpg", size)
out = sess.run(None, {sess.get_inputs()[0].name: x})[0][0]
# out is (4 + 17, anchors): xywh box coords then per-class scores.
# Apply your own confidence filter and class-wise NMS, then undo the
# letterbox with scale/pad to map boxes back to the original image.
Class names are in the model metadata under the names key. The
classifier expects 224x224 crops with ImageNet normalization, and has a
single head over all 11 asset__condition classes, so mask its logits to
the conditions valid for the detected asset before the softmax.
A complete reference implementation, including NMS and the two-stage
wiring, is in
app/app.py.
Intended use and limitations
Intended for research and demonstration of inspection pipelines, not for operational decisions about physical infrastructure.
- Condition labels are image-level on cropped components. These models detect components and classify condition; they do not localize defects at pixel level.
- Trained on imagery from one geography and one capture programme. Performance on different hardware types, camera payloads, or environmental conditions is unmeasured.
- The three glass-insulator shackle classes are unreliable (0.34-0.47 Box AP) and should not be trusted without human review.
- Detection confidence is well calibrated enough to threshold, but the intended pattern is confidence gating with a human review queue rather than autonomous acceptance.
Training
YOLO11-s fine-tuned from COCO weights at 1280px for 60 epochs with rare-class oversampling, on a single A100. EfficientNetV2-S fine-tuned on fault crops with class-balanced sampling. INT8 is ONNX Runtime static quantization, QDQ format, per-channel weights, calibrated on 800 real validation images and restricted to Conv/MatMul operations.
That last restriction matters: quantizing the detection head's output tensor, which holds box coordinates and class probabilities on very different numeric scales, collapses every probability to zero. Full details in the technical report.
Licence and attribution
CC BY-NC 3.0, non-commercial use only. These weights are derivative works of the InsPLAD dataset and inherit its licence. Attribution to the dataset authors is required:
@article{vieira2023insplad,
title = {InsPLAD: A Dataset and Benchmark for Power Line Asset
Inspection in UAV Images},
author = {Vieira-e-Silva, Andr\'e Luiz Buarque Vieira and
Felix, Heitor and Sim\~oes, Francisco and
Teichrieb, Veronica},
journal = {International Journal of Remote Sensing},
volume = {44},
number = {23},
year = {2023}
}
Commercial use requires permission from the dataset authors.