实操教程|使用图像分割来做缺陷检测的一个例子

 
 

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

作者丨Vinithavn

来源丨AI公园

1. 介绍

什么是物体检测? 给定一张图像,我们人类可以识别图像中的物体。例如,我们可以检测图像中是否有汽车,树木,人等。如果我们可以分析图像并检测物体,我们可以教机器做同样的事情吗?答案是肯定的。随着深度学习和计算机视觉的兴起,我们可以实现目标检测的自动化。我们可以建立深度学习和计算机视觉模型,可以检测和定位目标,计算它们之间的距离,预测它们的未来的位置等。目标检测在计算机视觉和机器学习中有着广泛的应用。目标跟踪、闭路电视监控、人类活动识别,甚至自动驾驶汽车都利用了这项技术。为了更好地理解它,考虑下面的图片。

46d33eb97f42b651ce1ffdefcd3d1c55.jpeg

图1,路面交通的物体检测

图中为一幅道路交通图像从车辆上看的目标检测。这里我们可以看到它正在检测其他车辆,交通信号等。如果车辆是自动驾驶汽车,应该能够检测到行驶路径、其他车辆、行人、交通信号等,以便平稳、安全驾驶。现在我们已经了解了目标检测,让我们转移到一个稍微高级的技术,称为图像分割。通过分析下图,我们可以很容易地理解目标检测和图像分割之间的区别。

826bb89c19188ddf0335b4af3bf0b233.jpeg

图2,目标检测和图像分割

这两种方法都试图识别和定位图像中的物体。在目标检测中,这是通过边界框实现的。该算法或模型将通过在目标周围绘制一个矩形边界框来定位目标。在图像分割中,对图像中的每个像素进行标注。这意味着,给定一幅图像,分割模型试图通过将图像的所有像素分类成有意义的对象类别来进行像素级分类。这也被称为密集预测,因为它通过识别和理解每个像素属于什么对象来预测每个像素的含义。“图像分割的返回格式称为掩码:一个与原始图像大小相同的图像,但对于每个像素,它只有一个布尔值指示目标是否存在。“我们将在本案例研究中使用这种技术。现在我们有了目标检测和图像分割的概念。让我们进一步理解问题陈述。

2. 问题陈述

我们得到了一些产品的图像。有些产品有缺陷,有些没有。考虑到产品的图像,我们需要检测它是否有缺陷。我们还需要定位这个缺陷。

3. 机器学习的形式

这个问题可以表述为图像分割任务。给定一个产品的图像,我们需要为其绘制分割掩模。如果产品有缺陷,分割图应该能够定位该缺陷。

4. 性能度量

在分割问题中最常用的指标之一是(IoU分数。参考下面的图像,这清楚地显示了如何IoU分数是计算的。

8e15e6afe48eedf9004077d1f910ee77.jpeg

IoU是预测分割与真实分割的重叠面积除以预测分割与原始分割的并集面积

我们也可以把IoU分数写成TP/TP+FN+FP。这个度量值的范围是0到1。Iou得分为1表示完全重叠,Iou得分为0表示完全不重叠。本案例研究中使用的损失函数是Dice损失。Dice 损失可以被认为是1-Dice 系数,其中Dice 系数定义为,Dice系数 = 2 * 相交的重叠面积

5. 理解数据

该数据集包含两个文件夹 —— train和test。训练集由六类图像组成。每一类图像被分成两个文件夹,其中一个文件夹包含1000张无缺陷图像,另一个文件夹包含130张有缺陷图像。下图显示了train文件夹中的文件夹。

f5add004956383908edef92e1b1e98e0.jpeg

图3,训练数据集

以 “def”结尾的文件夹名称包含相应类的有缺陷的图像,没有“def”的则表示无缺陷的图像。测试文件夹包含一组120个有缺陷的图像,这些图像的分割图将被预测。

6. 数据预处理

6.1 准备图像数据和分割蒙版

现在我们需要为每个图像准备图像数据和相应的分割掩模。我们把图片分成十二个文件夹。让我们来看一些图片。

b9790331d489447a8b7b1c8eca9bbc1b.jpeg 85b99a9e03ba2c7ed85e9dfd28b6762d.jpeg

图4,产品的图像

第一幅图像表示有缺陷的产品,第二幅图像表示无缺陷的图像。现在我们需要为这些图像准备分割图。分割图可以检测出图像中有缺陷的部分。对于上面的图像,预期的分割图是这样的。

b2c56c1e0b406365d1408f755ea9a989.jpeg 876417ccdc12a0e765ec489589833e86.jpeg

图5,图4上的分割蒙版

我们可以看到,在第一幅图像中,椭圆区域代表检测部分。第二幅图像是空白的,因为它没有缺陷。让我们再分析一些有缺陷的图像。

6cbbefa4e5b08edd5578be7309d94bc6.jpeg 8ebd604f170323da8892eaa360073823.jpeg a3eb10b372db9b3dcf7f6f02d12f6ece.jpeg 454ec4cb66c931f975a7795f508b1cea.jpeg

图6,一些缺陷图像的例子

我们可以看到缺陷在图像中以曲线或直线的形式出现。因此,我们可以利用椭圆来将这些区域标记为缺陷。但我们如何准备分割掩码?是否需要手工标注?我们有另一个包含关于分割掩码信息的文件。

9b1dcd36387ec995ca4e206a99d63dee.jpeg

每一行包含关于图像的mask区域的信息。每一列表示图像的文件名、椭圆的半长轴、椭圆的半短轴、椭圆的旋转角度、椭球中心的x位置、椭球中心的y位置。

绘制椭圆所需的数据是使用get_data函数获得的,如下所示:

5c826ab902a086d1234d836fd7f10cb7.jpeg

我们可以使用这些信息,并使用skimage函数绘制一个椭圆分割蒙版。

86daabc2ef06f4e31cae5a534b059979.jpeg

值得注意的是,这只适用于有缺陷的图像。对于无缺陷的图像,我们需要创建空白图像作为分割掩模。

6.2 加载图像

结构化数据以如下所示的形式获得。

3a114e84ed5972899664249841ae9629.jpeg

“images”列包含每个图像的完整文件路径,“mask”列包含相应的掩码图像。

下一步是加载数据。

495ee28c0f76cb1f8073e5a2f2a0fa53.jpeg b7e945f06e3c44f3a346028ad40f6628.jpeg

7. 模型

现在我们得到了所有的数据,下一步是找到一个模型,可以生成图像的分割mask。让我来介绍一下UNet模型,它在图像分割任务中非常流行。UNet架构包含两种路径:收缩路径和扩展路径。下图可以更好地理解Unet架构。

9f2b16a34a4d47ad1df9297bf464f8f6.jpeg

图7,Unet结构

模型结构类似于英文字母“U”,因此得名Unet。模型的左侧包含收缩路径(也称为编码器),它有助于捕获图像中的上下文。该编码器只是一个传统的卷积和最大池层堆栈。在这里我们可以看到,池化层降低了图像的高度和宽度,增加了通道的深度和数量。在收缩路径的末端,模型将理解图像中出现的形状、模式、边缘等,但它丢失了“在哪里”出现的信息。由于我们的问题是获取图像的分割映射,我们从压缩路径中获得的信息是不够的。我们需要一个高分辨率的图像作为输出,其中所有像素都是分类的。”如果我们使用一个规则的卷积网络,pooling层和dense层,我们会丢失WHERE信息,只保留不是我们想要的“WHAT”信息。在分割的情况下,我们既需要“WHAT”信息,也需要“WHERE”信息所以我们需要对图像进行上采样,以保留“where”信息。这是在右边的扩张路径中完成的。扩展路径(也称为解码器)用于使用上采样技术定位捕获的上下文。上采样技术有双线性插值法、最近邻法、转置卷积法等。、

8. 训练

现在我们已经准备好了所有的训练数据,也确定了模型。现在让我们训练模型。由于无缺陷图像的数量远远高于有缺陷图像的数量,所以我们只从无缺陷图像中提取一个样本,以获得更好的结果。采用adam优化器训练模型,并以dice 损失为损失函数。使用的性能指标是iou分数。

8971d3134d9d533008209a9b10d08a2a.jpeg

经过10个epoch,我们能够获得0.98的iou分数和0.007的骰子损失,这是相当不错的。让我们看一些图像的分割图。

7b50277d56a4b2c100360147a7909223.jpeg

我们可以看到,该模型能够预测类似于原始分割图的分割图。

9. 测试数据分割图的预测

现在让我们尝试解决手边的问题,即预测和绘制测试图像的分割蒙版。下图显示了一些测试图像的预测分割图。7372e4e9c5626a53ed671a850562f106.jpeg

d677a96cf7bf91ee32ce216529e9bc9f.jpeg

可以看出,该模型具有良好的测试性能,能够检测出测试图像中的缺陷。

10. 未来的工作

如上所述,与无缺陷图像相比,有缺陷图像的数量非常少。因此,对缺陷图像采用上采样和增强技术可以改善训练效果。

英文原文:https://medium.com/analytics-vidhya/defect-detection-in-products-using-image-segmentation-a87a8863a9e5

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。


下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。


下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的神经网络搭建的例子,详细实操。 我们将使用Python和PyTorch来搭建一个简单的全连接神经网络,用于对手写数字进行分类。 首先,我们需要导入必要的库: ``` python import torch import torch.nn as nn import torchvision.datasets as dsets import torchvision.transforms as transforms ``` 接下来,我们需要加载数据集。这里我们使用MNIST数据集: ``` python train_dataset = dsets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True) test_dataset = dsets.MNIST(root='./data', train=False, transform=transforms.ToTensor()) ``` 然后,我们定义一些超参数: ``` python input_size = 784 hidden_size = 500 num_classes = 10 num_epochs = 5 batch_size = 100 learning_rate = 0.001 ``` 接着,我们定义一个自定义的神经网络类: ``` python class Net(nn.Module): def __init__(self, input_size, hidden_size, num_classes): super(Net, self).__init__() self.fc1 = nn.Linear(input_size, hidden_size) self.relu = nn.ReLU() self.fc2 = nn.Linear(hidden_size, num_classes) def forward(self, x): out = self.fc1(x) out = self.relu(out) out = self.fc2(out) return out net = Net(input_size, hidden_size, num_classes) ``` 然后,我们定义损失函数和优化器: ``` python criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(net.parameters(), lr=learning_rate) ``` 接下来,我们开始训练: ``` python for epoch in range(num_epochs): for i, (images, labels) in enumerate(train_loader): images = images.reshape(-1, 28*28) outputs = net(images) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() if (i+1) % 100 == 0: print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, len(train_dataset)//batch_size, loss.item())) ``` 最后,我们在测试集上进行测试: ``` python with torch.no_grad(): correct = 0 total = 0 for images, labels in test_loader: images = images.reshape(-1, 28*28) outputs = net(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Accuracy of the network on the 10000 test images: {} %'.format(100 * correct / total)) ``` 这就是一个简单的神经网络搭建的例子

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值