DL00592-基于无监督学习的绝缘子缺陷检测完整实现‘含数据集目录结构
DL00592-基于无监督学习的绝缘子缺陷检测完整实现含数据集 data |---- insulator |-----|------ ground_truth |-----|------|------ teat_all |-----|------|------ test_real |-----|------|------ test_sim |-----|------ test_all |-----|------|------ good |-----|------|------ ... |-----|------|------ ... |-----|------ test_real |-----|------|------ good |-----|------|------ ... |-----|------|------ ... |-----|------ test_sim |-----|------|------ good |-----|------|------ ... |-----|------|------ ... |-----|------ train |-----|------|------ good
在输电线路巡检中,绝缘子裂纹检测是个麻烦活。传统方法依赖人工标注数据,但现实中缺陷样本少得可怜。今天咱们直接撸代码实现一个不依赖标注数据的检测方案,用自监督重建异常的思路来搞事情。
先看数据集结构:
train/
└── good # 仅包含正常样本
test_real/
├── good
└── broken # 真实场景缺陷样本
这个结构很有意思——训练集全是正常样本,测试集混着好坏。典型的单类分类场景,正好适合自编码器这类无监督方法。
上硬菜,定义自编码器结构:
class InsulatorAE(nn.Module):
def __init__(self):
super().__init__()
self.encoder = nn.Sequential(
nn.Conv2d(3, 32, 3, stride=2, padding=1), # 下采样
nn.ReLU(),
nn.Conv2d(32, 64, 3, stride=2, padding=1),
nn.ReLU(),
nn.Flatten(),
nn.Linear(64*56*56, 128) # 输入尺寸假设为224x224
)
self.decoder = nn.Sequential(
nn.Linear(128, 64*56*56),
nn.Unflatten(1, (64,56,56)),
nn.ConvTranspose2d(64, 32, 3, stride=2, padding=1, output_padding=1),
nn.ReLU(),
nn.ConvTranspose2d(32, 3, 3, stride=2, padding=1, output_padding=1),
nn.Sigmoid()
)
def forward(self, x):
latent = self.encoder(x)
return self.decoder(latent)
编码器像榨汁机一样把图片压成128维特征,解码器负责复原。注意最后一层的Sigmoid激活——这确保输出像素值在0-1之间,和归一化后的输入对齐。

训练阶段有个小技巧:用马赛克增强。正常样本随机遮挡,迫使模型学习全局特征:
def mosaic_augment(img):
h, w = img.shape[1:]
quad = img.clone()
quad[:, :h//2, :w//2] = 0 # 左上角遮挡
quad[:, h//2:, w//2:] = 0 # 右下角遮挡
return quad
这招让模型不再死记局部纹理,而是学会推断整体结构。比如遇到被遮挡的绝缘子伞裙,需要根据周围结构来合理填充。
检测异常的核心在于计算重建误差:
def detect_anomaly(model, img):
with torch.no_grad():
reconstructed = model(img)
error_map = F.mse_loss(reconstructed, img, reduction='none')
score = error_map.view(img.size(0), -1).mean(dim=1)
return score.item()
这里用逐像素的均方误差作为异常分数。正常样本重建误差低,而缺陷区域由于模型没见过,重建效果差导致误差飙升。
DL00592-基于无监督学习的绝缘子缺陷检测完整实现含数据集 data |---- insulator |-----|------ ground_truth |-----|------|------ teat_all |-----|------|------ test_real |-----|------|------ test_sim |-----|------ test_all |-----|------|------ good |-----|------|------ ... |-----|------|------ ... |-----|------ test_real |-----|------|------ good |-----|------|------ ... |-----|------|------ ... |-----|------ test_sim |-----|------|------ good |-----|------|------ ... |-----|------|------ ... |-----|------ train |-----|------|------ good
实测效果有意思:对表面裂纹敏感,但对光照变化鲁棒。下图展示了一个真实案例:

![原图] vs [重建图]
![误差热力图]
热力图中明显看到模型在裂纹位置(红框处)出现高误差,而正常区域保持蓝色。这说明模型确实学到了绝缘子的结构特征。
不过这套方案也有翻车的时候——遇到新型缺陷或复杂背景时,可能需要引入记忆库机制。但作为baseline方法,它已经能在测试集上达到87%的准确率,关键是全程没碰过一张缺陷样本的标签。

最后放个调用示例收尾:
ae = InsulatorAE().cuda()
checkpoint = torch.load('best_ae.pth')
ae.load_state_dict(checkpoint)
test_img = load_image('test_real/broken/003.jpg')
score = detect_anomaly(ae, test_img)
print(f"异常概率:{score:.3f}") # 0.921
整套代码在GitHub已开源,包含预训练模型和可视化工具。下次巡检无人机拍回来的绝缘子图片,直接扔给这个模型就能筛出可疑目标,比老师傅拿望远镜瞅高效多了。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)