热门标签 | HotTags
当前位置:  开发笔记 > 开放平台 > 正文

基于PaddleX的钢板表面缺陷检测

钢材缺陷检测项目案例一、项目简介本项目来源于Kaggle上一个钢材表面缺陷检测竞赛,这也是一个非常好的将深度学习应用于传统工业材料检测的案例。本项目将使用百度飞桨
钢材缺陷检测项目案例

一、项目简介

本项目来源于Kaggle上一个钢材表面缺陷检测竞赛,这也是一个非常好的将深度学习应用于传统工业材料检测的案例。本项目将使用百度飞桨PaddleX深度学习算法套件进行开发,全流程剖析整个实现过程。

钢材是现代最重要的建筑材料之一。刚材结构建筑能够抵抗自然和人为磨损,这使得这种材料在世界各地随处可见。在所有钢材加工环节中,平板钢的生产工艺特别精细。从加热、轧制,再到干燥和切割,需要几台机器协同操作,其中一个重要环节就是利用高清摄像头捕获的图像对加工环节中的钢材进行缺陷自动检测。Kaggle上举办的这场钢材缺陷竞赛希望各位参赛者利用机器学习来改进钢板表面缺陷检测算法精度,提高钢铁生产自动化程度。

29102 12 29346 24 29602 24 29858 24 30114 24 3...
1 0002cc93b.jpg_2 NaN
2 0002cc93b.jpg_3 NaN
3 0002cc93b.jpg_4 NaN
4 00031f466.jpg_1 NaNImageId_ClassId EncodedPixels
0 004f40c73.jpg_1 1 1
1 004f40c73.jpg_2 1 1
2 004f40c73.jpg_3 1 1
3 004f40c73.jpg_4 1 1
4 006f39c41.jpg_1 1 1

注意数据的标注形式,一共2列:第1列:ImageId_ClassId(图片编号+类编号);第2例EncodedPixels(图像标签)。注意这个图像标签和我们平常遇到的不一样,平常的是一个mask灰度图像,里面有许多数字填充,背景为0,但是这里,为了缩小数据,它使用的是像素“列位置-长度”格式。举个例子:

我们把一个图像(h,w)flatten(注意不是按行而是按列),29102 12 29346 24 29602 24表示从29102像素位置开始的12长度均为非背景,后面以此类推。这就相当于在每个图像上画一条竖线。

接下来统计有无缺陷及每类缺陷的图像数量:

class_dict = defaultdict(int)
kind_class_dict = defaultdict(int)
no_defects_num = 0
defects_num = 0for col in range(0, len(train_df), 4):img_names = [str(i).split("_")[0] for i in train_df.iloc[col:col+4, 0].values]if not (img_names[0] == img_names[1] == img_names[2] == img_names[3]):raise ValueErrorlabels = train_df.iloc[col:col+4, 1]if labels.isna().all():no_defects_num += 1else:defects_num += 1kind_class_dict[sum(labels.isna().values == False)] += 1for idx, label in enumerate(labels.isna().values.tolist()):if label == False:class_dict[idx+1] += 1

输出有、无缺陷的图像数量

print("无缺陷钢板数量: {}".format(no_defects_num))
print("有缺陷钢板数量: {}".format(defects_num))

输出结果为:

无缺陷钢板数量: 5902
有缺陷钢板数量: 6666

接下来对有缺陷的图像进行分类统计:

import seaborn as sns
import matplotlib.pyplot as pltfig, ax = plt.subplots()
sns.barplot(x=list(class_dict.keys()), y=list(class_dict.values()), ax=ax)
ax.set_title("the number of images for each class")
ax.set_xlabel("class")
plt.show()
print(class_dict)

输出结果如下:


以上分析可以帮助我们快速掌握数据基本属性,初步了解项目难度。在实际比赛时这些数据分析是非常重要的,通过这些数据分析再挖掘整理成重要的“线索”,然后改进算法模型,往往可以取得出其不意的好效果。

三、制作标准数据集


3.1 PaddleX数据集格式说明

从前面的数据分析中我们看到钢板图像的每个像素只属于1种缺陷类别(或者没缺陷),由于我们需要定位出钢板缺陷的精细区域,因此可以把这个任务看作是一个语义分割任务,即按照像素级别精度判断每个像素所属的缺陷类别。

接下来我们就可以使用语义分割算法进行训练和验证。本项目采用百度飞桨PaddleX算法套件来快速训练。PaddleX是飞桨全流程开发工具,集飞桨核心框架、模型库、工具及组件等深度学习开发所需全部能力于一身,打通深度学习开发全流程。简单来说,使用PaddleX有两个明显的好处:

  • 快速验证算法模型:无论是做工业项目还是参加类似Kaggle的竞赛,没有一个算法是通吃的,那么我们必然需要尝试很多不同的算法,这时候快速验证算法模型有效性就显得尤为重要。对于一个未知的深度学习任务来说,我们刚开始并不知道到底使用什么样的模型算法去处理才能得到一个比较好的基准值,这时候就需要有一个接口切换简单、实现快捷方便、算法功能齐全的算法库工具,能够让我们快速的去验证模型有效性,这里PaddleX就是这样一个比较好的工具,它包含了图像分类、分割、检测等常见的、实用的深度学习模型,而且接口进行了高度统一,我们可以使用它来快速的训练各个模型,并选取一个比较好的基准值。在这个基础上,我们再去进行算法优化。
  • 模型快速部署:对于真实的工业任务来说,不光要训练得到一个高精度的算法模型,还需要考虑部署的便捷性和有效性。很多模型尽管精度很高,但是由于采用了非常嵌套的动态图模型编写方式,如果将其直接静态图导出或者转成onnx往往会遇到问题,那么这时候必然需要算法工程师手动去修改模型,这对于真实项目来说会极大的增加项目开发难度,降低项目开发效率。使用PaddleX的好处在于,在PaddleX中的模型基本都已经被验证过了,能够在多种平台上进行落地部署,比如C++推理、手机移动端推理等,同时还给出了详细的部署教程,因此,选择PaddleX进行真实深度学习产品开发或者打比赛都是一个不错的选择。

PaddleX安装方法参考官网。本项目使用PaddleX v2.0.0版本进行实现。

为了能够使用PaddleX进行语义分割训练,我们首先要对数据集格式进行转化。PaddleX语义分割算法要求数据集按照如下方式进行组织:

原图均放在同一目录,如JPEGImages,标注的同名png文件均放在同一目录,如Annotations。示例如下:

MyDataset/ # 语义分割数据集根目录
|--JPEGImages/ # 原图文件所在目录
| |--1.jpg
| |--2.jpg
| |--...
| |--...
|
|--Annotations/ # 标注文件所在目录
| |--1.png
| |--2.png
| |--...
| |--...

JPEGImages目录存放的是原文件图像(jpg格式),Annotations存放对应的标注文件图像(png格式) 。这里的标注图像,如1.png,为单通道图像,像素标注类别需要从0开始递增, 例如0, 1, 2, 3表示4种类别(一般0表示background背景),标注类别最多255个类别(其中像素值255不参与训练和评估)。

3.2 数据转换

数据转换本身并不难,在前面可视化数据的时候已经将缺陷区域显示了出来,因此,数据转化时只需要将缺陷对应的灰度值填入mask即可。

将下载下来的数据集解压后放置在当前项目根目录下,然后执行下面的代码即可:

python prepare_dataset.py

执行完后在当前根目录下会生成PaddleX标准的数据集,名为steel。

执行完以后在生成的steel文件夹下面创建一个标签说明文件,文件名为labels.txt,内容如下:

0
1
2
3
4

这个文件用来指明当前到底有哪些像素标签值(本项目共4种缺陷,对应标签为1、2、3、4,这里的0标签表示背景)

转换完的数据集也可以直接从ai studio上进行下载。

3.3 数据切分

在模型进行训练时,我们需要划分训练集,验证集和测试集,可直接使用paddlex命令将数据集随机划分。本项目将训练集、验证集和测试集按照8.5:1:0.5的比例划分。 PaddleX中提供了简单易用的API,方便用户直接使用进行数据划分。具体命令如下:

paddlex --split_dataset --format SEG --dataset_dir steel --val_value 0.1 --test_val 0.05

数据文件夹切分前后的状态如下:

steel/ steel/├── Annotations/ --> ├── Annotations/├── JPEGImages/ ├── JPEGImages/├── labels.txt ├── labels.txt├── test_list.txt├── train_list.txt├── val_list.txt

执行上面命令行,会在steel下生成train_list.txt, val_list.txt, test_list.txt,分别存储训练样本列表,验证样本列表,测试样本列表。

四、训练和验证

PaddleX提供了丰富的视觉模型,在语义分割中提供了DeepLabV3、UNET、HRNET和FastSCNN系列模型。在本项目中采用重量级HRNET为分割模型进行钢板缺陷检测。

4.1 基于HRNet模型


4.2 基于UNet模型


五、部署


5.1 模型导出

模型训练后保存在output文件夹,如果要使用PaddleInference进行部署需要导出成静态图的模型,运行如下命令,会自动在output文件夹下创建一个inference_model的文件夹,用来存放导出后的模型。

paddlex --export_inference --model_dir=output/hrnet/best_model --save_dir=output/inference_model

5.2 C#桌面部署

模型部署采用了PaddleX提供的C++ inference部署方案,在该方案中提供了C#部署Demo,用户可根据实际情况自行参考修改。



推荐阅读
  • 百度AI的2020
    百度AI的2020-世界的2020,是充满不确定性的变局之年;中国的2020,是团结一心、共克时艰、于变局中开新局的希望之年;百度AI的2020,是坚定信念,拥抱变化,践行“科技为 ... [详细]
  • 聊聊 中国人工智能科技产业 区域竞争力分析及趋势
    原文链接:聊聊中国人工智能科技产业区域竞争力分析及趋势最近看了一个关于国内AI的报告《中国新一代人工智能科技产业区域竞争力评价指数(2021ÿ ... [详细]
  • 学习提醒 | 如何训练RNN?解决梯度消失与梯度爆炸问题!
    点击左上方蓝字关注我们今天就要进入RNN的终章,每日一问:它们如何运行?应用在哪里?你学完了吗?????顾名思 ... [详细]
  • 直播提醒 | 电影精准推荐很难吗?搞定经典DSSM经典模型!
    点击左上方蓝字关注我们自从小编安装了投影仪,看电影已经变成了日常刚需,而且系统总是可以推荐出令我惊喜的老电影,每一步推荐都“踩”在心头爱。 ... [详细]
  • 早晨七点半。北京初秋的凉风叫醒了住在望京西的你,睁开眼睛,一想到又要为人类的信息化事业贡献满满的正能量,你不禁哼唱起那句“早晨起来 ... [详细]
  • 产业智能化升级的浪潮并没有因为疫情等原因停滞不前,作为带来人工智能应用井喷式发展的深度学习技术在近几年也可谓是“时代宠儿”,想要尝试应用深度学习技术解决 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 建立分类感知器二元模型对样本数据进行分类
    本文介绍了建立分类感知器二元模型对样本数据进行分类的方法。通过建立线性模型,使用最小二乘、Logistic回归等方法进行建模,考虑到可能性的大小等因素。通过极大似然估计求得分类器的参数,使用牛顿-拉菲森迭代方法求解方程组。同时介绍了梯度上升算法和牛顿迭代的收敛速度比较。最后给出了公式法和logistic regression的实现示例。 ... [详细]
  • 【论文】ICLR 2020 九篇满分论文!!!
    点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢来自:深度学习技术前沿 ... [详细]
  • 人工智能推理能力与假设检验
    最近Google的Deepmind开始研究如何让AI做数学题。这个问题的提出非常有启发,逻辑推理,发现新知识的能力应该是强人工智能出现自我意识之前最需要发展的能力。深度学习目前可以 ... [详细]
  • 干货 | 携程AI推理性能的自动化优化实践
    作者简介携程度假AI研发团队致力于为携程旅游事业部提供丰富的AI技术产品,其中性能优化组为AI模型提供全方位的优化方案,提升推理性能降低成本࿰ ... [详细]
  • 「爆干7天7夜」入门AI人工智能学习路线一条龙,真的不能再透彻了
    前言应广大粉丝要求,今天迪迦来和大家讲解一下如何去入门人工智能,也算是迪迦对自己学习人工智能这么多年的一个总结吧,本条学习路线并不会那么 ... [详细]
  • 老电影和图片变清晰的秘密!分辨率提升400%的AI算法
    老电影和图片变清晰的秘密!分辨率提升400%的AI算法-如上图,从100x133pix→400x532pix,除了肉眼可见的清晰,拥有可以将分辨率提升400%的技术到底意味着什么 ... [详细]
author-avatar
mhq3022863
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有