工业制造中的实时缺陷检测与云计算机视觉建模
在工业制造领域,实时检测表面缺陷对于保证产品质量至关重要。同时,随着计算机视觉技术的发展,在云端进行模型训练以充分利用资源也成为了一种趋势。本文将详细介绍如何构建表面缺陷检测系统以及在云端进行计算机视觉模型训练。
1. 构建表面缺陷检测系统
1.1 创建TFRecord文件
首先,需要将标注数据转换为TFRecord文件,以便后续训练使用。可以使用以下代码执行 generic_xml_to_tf_record.py 脚本来创建TFRecord文件:
%%shell
%tensorflow_version 1.x
python /content/generic_xml_to_tf_record.py \
--label_map_path=/content/steel_label_map.pbtxt \
--data_dir=/content/NEU-DET \
--output_path=/content/NEU-DET/out \
--annotations_dir=ANNOTATIONS \
--image_dir=IMAGES
运行上述脚本后,将在输出目录中看到 train 和 val 两个子目录,分别保存用于训练和验证的TFRecord文件。需要注意的是,输出目录必须存在,否则在执行代码之前需要先创建。
1.2 训练SSD模型
接下来,使用TFRecord格式的输入数据来训练SSD模型。具体步骤如下:
1. 下载预训练模型 :为了进行迁移学习,需要下载一个预训练的SSD模型。可以使用以下代码:
%%shell
%tensorflow_version 1.x
mkdir pre-trained-model
cd pre-trained-model
wget http://download.tensorflow.org/models/object_detection/ssd_inception_v2_coco_2018_01_28.tar.gz
tar -xvf ssd_inception_v2_coco_2018_01_28.tar.gz
- 编辑
pipeline.config文件 :根据当前配置编辑pipeline.config文件,以下是需要编辑的部分示例:
model {
ssd {
num_classes: 6
image_resizer {
fixed_shape_resizer {
height: 300
width: 300
}
}
...
fine_tune_checkpoint: "/content/pre-trained-model/ssd_inception_v2_coco_2018_01_28/model.ckpt"
from_detection_checkpoint: true
num_steps: 100000
}
}
train_input_reader {
label_map_path: "/content/steel_label_map.pbtxt"
tf_record_input_reader {
input_path: "/content/NEU-DET/out/train/*.record"
}
}
eval_config {
num_examples: 8000
max_evals: 10
use_moving_averages: false
}
eval_input_reader {
label_map_path: "/content/steel_label_map.pbtxt"
shuffle: false
num_readers: 1
tf_record_input_reader {
input_path: "/content/NEU-DET/out/val/*.record"
}
}
需要编辑的关键参数如下:
| 参数 | 说明 |
| ---- | ---- |
| num_classes | 类别数量,这里为6 |
| fine_tune_checkpoint | 预训练模型检查点的路径 |
| label_map_path | .pbtxt 文件的路径 |
| input_path | 训练和验证TFRecord文件的路径 |
编辑完成后,将 pipeline.config 文件上传到Colab环境。
3. 执行模型训练 :使用以下脚本执行模型训练:
%%shell
%tensorflow_version 1.x
export PYTHONPATH=$PYTHONPATH:/content/models/research:/content/models/research/slim
cd models/research/
PIPELINE_CONFIG_PATH=/content/pre-trained-model/ssd_inception_v2_coco_2018_01_28/steel_defect_pipeline.config
MODEL_DIR=/content/neu-det-models/
NUM_TRAIN_STEPS=10000
SAMPLE_1_OF_N_EVAL_EXAMPLES=1
python object_detection/model_main.py \
--pipeline_config_path=${PIPELINE_CONFIG_PATH} \
--model_dir=${MODEL_DIR} \
--num_train_steps=${NUM_TRAIN_STEPS} \
--sample_1_of_n_eval_examples=$SAMPLE_1_OF_N_EVAL_EXAMPLES \
--alsologtostderr
在模型训练过程中,日志将打印在Colab控制台。可以记录每个epoch的损失,并根据需要调整模型的超参数。
1.3 导出模型
训练完成后,检查点将保存在 Listing 9-6 中第6行指定的目录中。为了将模型用于实时检测,需要导出TensorFlow图。可以使用以下代码导出SSD模型:
%%shell
%tensorflow_version 1.x
export PYTHONPATH=$PYTHONPATH:/content/models/research
export PYTHONPATH=$PYTHONPATH:/content/models/research/slim
cd /content/models/research
python object_detection/export_inference_graph.py \
--input_type image_tensor \
--pipeline_config_path /content/pre-trained-model/ssd_inception_v2_coco_2018_01_28/steel_defect_pipeline.config \
--trained_checkpoint_prefix /content/neu-det-models/model.ckpt-10000 \
--output_directory /content/NEU-DET/final_model
导出模型后,将其保存到Google Drive,然后从Google Drive下载到本地计算机。这样就可以使用该模型实时检测视频帧中的表面缺陷。
1.4 模型评估
可以通过启动TensorBoard仪表盘来评估模型质量,使用以下代码启动:
%tensorflow_version 2.x
%load_ext tensorboard
%tensorboard --logdir /drive/'My Drive'/NEU-DET-models/
1.5 预测
如果已经按照相关说明设置了工作环境,就可以预测图像中的表面缺陷。只需要更改相关变量并执行以下Python代码:
model_path = "/Users/sansari/Downloads/neu-det-models/final_model"
labels_path = "/Users/sansari/Downloads/steel_label_map.pbtxt"
image_dir = "/Users/sansari/Downloads/NEU-DET/test/IMAGES"
image_file_pattern = "*.jpg"
output_path="/Users/sansari/Downloads/surface_defects_out"
1.6 实时缺陷检测
按照相关说明部署检测系统,该系统可以从摄像头读取视频图像并实时检测表面缺陷。如果连接了多个摄像头,可以在 cv2.VideoCapture(x) 函数中使用适当的 x 值。默认情况下, x = 0 读取计算机内置摄像头的视频, x = 1 、 x = 2 等读取连接到计算机端口的视频。对于基于IP的摄像头, x 的值应为IP地址。
1.7 图像标注
在前面的示例中,使用的是已经标注和标记的图像。这里将介绍如何使用Microsoft Visual Object Tagging Tool (VoTT) 对图像进行标注。
1. 安装VoTT :VoTT需要NodeJS和NPM。安装步骤如下:
- 从 NodeJS官方网站 下载并安装适合操作系统的可执行二进制文件。
- 安装完成后,在终端窗口中执行以下命令检查NodeJS和NPM是否安装成功:
node -v
npm -v
- 从 [GitHub](https://github.com/Microsoft/VoTT/releases) 下载适合操作系统的VoTT安装程序。
- 运行下载的可执行文件安装VoTT。
- 也可以从源代码运行VoTT,在终端中执行以下命令:
git clone https://github.com/Microsoft/VoTT.git
cd VoTT
npm ci
npm start
运行 npm start 命令将启动electron版本和浏览器版本。由于图像在本地文件系统中,因此使用electron版本。
2. 创建连接 :创建两个连接,一个用于输入,一个用于输出。输入连接指向未标记图像的存储目录,输出连接指向标注存储的目录。具体步骤如下:
- 点击左侧导航栏中的 New Connections 图标,打开连接屏幕。
- 点击左上角面板中 CONNECTIONS 对应的加号图标。
- 在 Provider 字段中选择 Local File System 。
- 点击 Select Folder 打开本地文件系统目录结构,选择需要标记的输入图像所在目录。
- 点击 Save Connection 按钮保存连接。
- 同样的方法创建另一个用于存储输出的连接。
3. 创建新项目 :点击主页图标,然后点击 New Project 打开项目设置页面。在项目设置页面中,选择前面创建的输入和输出目录的连接,然后点击 Save Project 按钮。
4. 创建类标签 :保存项目设置后,屏幕将切换到主标记页面。点击右侧面板右上角 TAGS 对应的 (+) 图标,创建所有类标签,如 crazing 、 patch 、 inclusion 等。
5. 标记图像 :从左侧面板中选择图像缩略图,图像将在主标记区域打开。在图像的缺陷区域绘制矩形或多边形,并选择适当的标签进行标注。依次标注所有图像。
6. 导出标签 :VoTT支持多种导出格式,这里将配置设置以TensorFlow TFRecord文件格式导出标注。具体步骤如下:
- 点击左侧导航栏中的导出图标,打开导出设置页面。
- 在 Provider 字段中选择 TensorFlow Records ,然后点击 Save Export Settings 按钮。
- 返回项目页面,点击顶部工具栏中的相应图标将标注导出到TensorFlow Records文件。
- 检查本地文件系统的输出文件夹,会发现输出目录中创建了一个包含 TFRecords-export 的目录。导出为TFRecord格式还会生成一个 tf_label_map.pbtxt 文件,其中包含类和索引的映射。
2. 云计算机视觉建模
2.1 云建模的优势
训练最先进的卷积神经网络需要大量的计算机资源,训练时间可能长达数小时甚至数天。单个GPU可能无法满足训练复杂网络的需求,需要在多个GPU上进行训练。而在单台机器上安装的GPU数量有限,因此在多台机器上进行训练会更快。
云建模是一种很好的扩展训练的方式,大多数云提供商提供按需付费的虚拟机、计算资源和存储服务。这意味着只需要为模型训练期间使用的云资源付费,训练完成后可以删除不再需要的云资源,从而降低成本。
2.2 TensorFlow分布式训练
TensorFlow提供了API来在单台机器或多台机器上的多个CPU和GPU上训练机器学习模型。
1. 什么是分布式训练 :计算机视觉的先进神经网络需要从大量图像中计算数百万个参数。如果所有计算都在单个CPU或GPU上执行,训练会非常耗时,并且整个训练数据集需要加载到内存中,可能会超出单台机器的内存。
在分布式训练中,计算在多个CPU或GPU上并发执行,结果合并以创建最终模型。理想情况下,计算应该与GPU或CPU的数量线性扩展。分布式训练中常用的并行方法有数据并行和模型并行。
2. 数据并行 :大数据集可以分成更小的迷你批次,这些迷你批次可以分布在集群架构中的多台计算机上。随机梯度下降(SGD)可以在拥有小批量数据的单个计算机上独立并行地计算权重,然后将结果合并到中央计算机以获得最终优化的权重。SGD也可以在具有多个CPU或GPU的单台计算机上使用并行处理来优化权重。数据并行可以通过以下两种方式实现:
- 同步方式 :所有节点在不同的数据块上进行训练,并在每一步聚合梯度。梯度的同步通过 all-reduce 方法完成。
- 异步方式 :所有节点独立训练输入数据,并通过称为参数服务器的专用服务器异步更新变量。
以下是数据并行的流程示意图:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([Large number of images]):::startend --> B(GPU0):::process
A --> C(GPU1):::process
A --> D(GPU2):::process
A --> E(...):::process
A --> F(GPU127):::process
B --> G(64 images):::process
C --> H(64 images):::process
D --> I(64 images):::process
F --> J(64 images):::process
G & H & I & J --> K(Batch size = 64 x 128 = 8,192 images):::process
通过以上步骤,可以构建一个完整的表面缺陷检测系统,并在云端进行高效的计算机视觉模型训练。
工业制造中的实时缺陷检测与云计算机视觉建模
2. 云计算机视觉建模(续)
2.3 分布式训练的实现步骤
在云环境中实现TensorFlow分布式训练,一般可以按照以下步骤进行:
1. 环境准备 :选择合适的云服务提供商,如Amazon Web Services (AWS)、Google Cloud Platform (GCP) 或Microsoft Azure,创建所需的虚拟机和存储资源。确保这些虚拟机上安装了TensorFlow以及相关依赖库。
2. 数据准备 :将训练数据存储在云存储中,确保各个计算节点都可以访问到这些数据。可以使用云存储服务提供的接口将数据上传到指定位置。
3. 配置集群 :定义集群的拓扑结构,包括参数服务器和工作节点的数量和地址。可以使用TensorFlow的 tf.train.ClusterSpec 来配置集群信息。以下是一个简单的示例代码:
import tensorflow as tf
# 定义集群配置
cluster = tf.train.ClusterSpec({
"ps": ["ps0.example.com:2222", "ps1.example.com:2222"],
"worker": ["worker0.example.com:2222", "worker1.example.com:2222"]
})
- 启动进程 :在每个计算节点上启动相应的TensorFlow进程,指定其角色(参数服务器或工作节点)。以下是启动工作节点的示例代码:
# 启动工作节点
server = tf.train.Server(cluster, job_name="worker", task_index=0)
server.join()
- 编写分布式训练代码 :在训练代码中,使用TensorFlow的分布式训练API,将计算任务分配到不同的节点上。例如,使用
tf.device来指定操作在哪个设备上执行。
# 分布式训练代码示例
with tf.device(tf.train.replica_device_setter(cluster=cluster)):
# 定义模型和损失函数
model = ...
loss = ...
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train_op = optimizer.minimize(loss)
# 创建会话并启动训练
with tf.train.MonitoredTrainingSession(master=server.target,
is_chief=(task_index == 0),
checkpoint_dir="/tmp/train_logs") as sess:
while not sess.should_stop():
sess.run(train_op)
- 监控和调优 :使用TensorBoard等工具监控训练过程,观察损失函数的变化、梯度的分布等指标。根据监控结果调整超参数,如学习率、批次大小等,以提高训练效果。
2.4 分布式训练的优缺点
| 优点 | 缺点 |
|---|---|
| 可以充分利用多个计算节点的资源,加速训练过程 | 需要复杂的集群配置和管理,增加了系统的复杂度 |
| 可以处理大规模的数据集,避免单台机器内存不足的问题 | 网络通信开销可能会影响训练效率,尤其是在节点之间距离较远时 |
| 具有更好的可扩展性,可以根据需求增加计算节点的数量 | 同步方式下,节点之间的等待时间可能会导致性能下降 |
3. 总结
通过以上介绍,我们了解了如何构建工业制造中的实时缺陷检测系统,包括数据准备、模型训练、评估和部署等环节。同时,也探讨了在云端进行计算机视觉模型训练的方法,利用分布式训练可以充分发挥云资源的优势,提高训练效率和可扩展性。
在实际应用中,可以根据具体的需求和场景选择合适的方法和工具。例如,如果数据量较小且对训练时间要求不高,可以在本地进行模型训练;如果需要处理大规模数据和复杂模型,则可以考虑使用云服务进行分布式训练。
希望本文能够为你在工业制造和计算机视觉领域的实践提供有价值的参考,帮助你更好地应用相关技术解决实际问题。
以下是整个流程的mermaid流程图:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B(构建表面缺陷检测系统):::process
B --> C(创建TFRecord文件):::process
B --> D(训练SSD模型):::process
B --> E(导出模型):::process
B --> F(模型评估):::process
B --> G(预测):::process
B --> H(实时缺陷检测):::process
B --> I(图像标注):::process
A --> J(云计算机视觉建模):::process
J --> K(云建模优势分析):::process
J --> L(TensorFlow分布式训练):::process
L --> M(分布式训练配置):::process
L --> N(分布式训练代码编写):::process
L --> O(监控和调优):::process
J --> P(分布式训练优缺点分析):::process
E --> Q(保存和部署模型):::process
F --> R(根据评估结果调整模型):::process
O --> R
R --> D
Q --> H
Q --> G
I --> C
C --> D
D --> E
E --> F
G --> S([结束]):::startend
H --> S
这个流程图展示了从开始构建系统到最终应用模型的整个过程,包括了表面缺陷检测系统和云计算机视觉建模的各个环节,以及它们之间的相互关系。各个步骤之间的循环表示可以根据评估结果不断调整模型,以提高模型的性能。
超级会员免费看
31

被折叠的 条评论
为什么被折叠?



