一、背景意义

       油罐作为储存液体燃料的关键设施,在石油化工企业中扮演着至关重要的角色。由于油罐长期受到压力、雨水和油品的侵蚀,罐壁可能产生凹坑、裂纹、内部孔洞等缺陷,这些缺陷不仅会导致油品泄漏,甚至可能引发火灾等严重安全事故。因此,定期对油罐进行检测是确保石油化工企业安全运行的必要措施。传统的人工检测方法效率低下且危险性高,迫切需要一种自动化、智能化的检测手段来替代。基于深度学习的油罐检测系统能够实现对油罐的自动化监测,提高检测效率,降低人工检测的风险,同时为石油化工企业的安全管理提供准确的数据支持,预防和减少安全事故的发生。

二、数据集

2.1数据采集

       数据采集是制作数据集的第一步,涉及到收集油罐的图像数据。这些图像可以来自卫星遥感、无人机航拍或者现场拍摄。在采集过程中,需要确保图像的多样性和覆盖性,包括不同类型油罐(如外浮顶油罐、封闭顶油罐、球形压力罐等)在不同环境和光照条件下的图像。这一步骤是构建有效数据集的基础,确保了数据的广度和深度。

       数据清洗是指对采集到的原始数据进行预处理,以去除无效、错误或不完整的数据。这一步骤包括处理图像中的缺失值、异常值和不一致性。例如,可以使用Python的pandas库来删除或填充缺失的数据,或者使用机器学习算法如KNNImputer来预测并填补缺失值。此外,还需要转换错误的数据类型,比如将日期时间类型转换为数字类型,以及进行数据归一化处理,使得数据在相同的尺度上,便于后续的模型训练。

2.2数据标注

       数据标注是为图像中的油罐添加标签的过程,这是训练深度学习模型的关键步骤。标注通常采用VOC格式,需要对每个油罐实例绘制边界框,并指定其类别。标注工具如LabelImg可以辅助完成这一工作。标注完成后,需要将VOC格式的标注文件转换为YOLO格式,以适配YOLO模型的训练需求。这一步骤可以通过编写Python脚本来实现,脚本中定义类别映射,并逐个处理VOC文件,提取出必要的信息并转换为YOLO所需的格式。

       使用LabelImg对每张图像中的油罐进行标注。这包括绘制边界框以精确覆盖油罐的整个区域,并为每个边界框指定类别标签(在本例中为“油罐”)。由于油罐的形状和大小各异,且可能受到遮挡或环境干扰,这一步骤需要高度的注意力和精确度,以确保标注的准确性。在标注过程中,可能会遇到一些复杂情况,如油罐部分被遮挡、油罐之间相互重叠、背景与油罐颜色相近等。这些情况增加了标注的难度,需要更多的时间和专业知识来正确处理。完成标注后,需要对标注结果进行验证,以确保边界框的准确性和类别标签的正确性。这一步骤可能需要反复检查和修正,增加了工作量和复杂度。

 包含1124张图片,数据集中包含以下类别:

油罐:用于存储液体燃料的罐体。

2.3数据预处理

       数据预处理包括数据转换、数据过滤和数据增强等操作。数据转换可能涉及到将数据从一种格式转换为另一种格式,例如将CSV格式转换为JSON格式。数据过滤则是删除数据中质量不佳的部分或异常值。数据增强则是通过旋转、缩放、裁剪等方法增加数据集的多样性,提高模型的泛化能力。这些步骤可以通过Python脚本实现,使用如pandas、numpy等库进行数据处理

       在使用深度学习进行训练任务时,通常需要将数据集划分为训练集、验证集和测试集。这种划分是为了评估模型的性能并确保模型的泛化能力。数据集划分为训练集、验证集和测试集的比例。常见的比例为 70% 训练集、20% 验证集和 10% 测试集,也就是7:2:1。数据集已经按照标准比例进行划分。 

标注格式:

  • VOC格式 (XML)
  • YOLO格式 (TXT)
yolo_dataset/
│
├── train/
│   ├── images/
│   │   ├── image1.jpg
│   │   ├── image2.jpg
│   │   ├── ...
│   │
│   └── labels/
│       ├── image1.txt
│       ├── image2.txt
│       ├── ...
│
└── test...
└── valid...

voc_dataset/
│
├── train/
│   ├───├
│   │   ├── image1.xml
│   │   ├── image2.xml
│   │   ├── ...
│   │
│   └───├
│       ├── image1.jpg
│       ├── image2.jpg
│       ├── ...
│
└── test...
└── valid...

三、模型训练

3.1理论技术

       油罐检测系统利用深度学习技术来自动识别和定位油罐的缺陷和异常。其操作流程主要包括数据收集、预处理、模型构建、训练和检测。首先,收集包含正常油罐和缺陷油罐的图像数据集,并进行标注。接着,对图像进行预处理,如归一化和数据增强,以提高模型的泛化能力。然后,构建CNN模型,定义卷积层、池化层和全连接层的结构。通过前向传播,模型提取图像特征,并在训练过程中利用反向传播算法不断调整权重参数,优化模型性能。完成训练后,模型可以实时分析新图像,自动识别油罐的状态,提供缺陷类型和位置的信息。

       CNN在油罐检测中的优势特征包括自动化特征提取和高效的图像处理能力。与传统的图像处理方法相比,CNN能够自动学习到油罐缺陷的特征,无需人工设计特征提取器,这减少了人为错误的可能性并提高了检测精度。此外,CNN具有较强的鲁棒性,能够适应不同的环境条件和光照变化,确保在多种实际场景中都能保持良好的检测性能。

       CNN还具备较高的计算效率,能够处理大量图像数据,适合于实时监测和评估油罐的安全状态。其深层架构使得模型能够捕捉复杂的特征模式,从而提高了对油罐缺陷的识别能力。这种融合深度学习和计算机视觉的技术,推动了油罐检测的智能化和自动化进程,为油气行业的安全管理提供了有力支持。 

3.2模型训练

在油罐检测数据集划分和准备好之后,开发一个YOLO项目可以分为以下三个主要步骤:

步骤一:配置环境和数据集

       首先,需要配置CUDA环境,并获取YOLO的源码。建议新建一个虚拟环境专门用于YOLO模型的训练,并安装剩余的包。在运行测试过程中,依次安装缺少的包。接着,需要将原始数据存放在指定的文件夹下,包括图像和标签,并按照一定比例划分成训练集、验证集和测试集。以下是划分数据集的代码示例:

import shutil
import random
import os

# 原始路径
image_original_path = "data/images/"
label_original_path = "data/labels/"
cur_path = os.getcwd()

# 训练集路径
train_image_path = os.path.join(cur_path, "datasets/images/train/")
train_label_path = os.path.join(cur_path, "datasets/labels/train/")
# 验证集路径
val_image_path = os.path.join(cur_path, "datasets/images/val/")
val_label_path = os.path.join(cur_path, "datasets/labels/val/")
# 测试集路径
test_image_path = os.path.join(cur_path, "datasets/images/test/")
test_label_path = os.path.join(cur_path, "datasets/labels/test/")

# 训练集目录
list_train = os.path.join(cur_path, "datasets/train.txt")
list_val = os.path.join(cur_path, "datasets/val.txt")
list_test = os.path.join(cur_path, "datasets/test.txt")
train_percent = 0.8
val_percent = 0.1
test_percent = 0.1

# 划分数据集
def split_data(image_path, label_path, train_path, val_path, test_path, train_txt, val_txt, test_txt, train_ratio, val_ratio, test_ratio):
    image_names = os.listdir(image_path)
    random.shuffle(image_names)
    train_count = int(len(image_names) * train_ratio)
    val_count = int(len(image_names) * val_ratio)
    for i, img_name in enumerate(image_names):
        if i < train_count:
            shutil.copy(image_path + img_name, train_path + img_name)
            shutil.copy(label_path + img_name.replace('jpg', 'txt'), train_path + img_name.replace('jpg', 'txt'))
            with open(train_txt, 'a') as f:
                f.write(img_name + '\n')
        elif i < train_count + val_count:
            shutil.copy(image_path + img_name, val_path + img_name)
            shutil.copy(label_path + img_name.replace('jpg', 'txt'), val_path + img_name.replace('jpg', 'txt'))
            with open(val_txt, 'a') as f:
                f.write(img_name + '\n')
        else:
            shutil.copy(image_path + img_name, test_path + img_name)
            shutil.copy(label_path + img_name.replace('jpg', 'txt'), test_path + img_name.replace('jpg', 'txt'))
            with open(test_txt, 'a') as f:
                f.write(img_name + '\n')

split_data(image_original_path, label_original_path, train_image_path, val_image_path, test_image_path, list_train, list_val, list_test, train_percent, val_percent, test_percent)

步骤二:修改配置文件

       数据集划分完成后,在根目录文件夹下新建 data.yaml 文件,用于指明数据集路径和类别。以下是 data.yaml 文件的配置示例:

path: ../datasets  # 数据集所在路径
train: train.txt  # 数据集路径下的train.txt
val: val.txt  # 数据集路径下的val.txt
test: test.txt  # 数据集路径下的test.txt
# Classes
names:
  0: oil_tank  # 油罐类别名称

       接着,需要修改模型文件配置。在 ultralytics/cfg/models/v11 文件夹下存放的是 YOLOv11 的各个版本的模型配置文件。在训练自己的数据集时,需要将其中的类别数修改成自己的大小。以下是修改模型配置文件的示例:

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLO11 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect
# Parameters
nc: 1  # number of classes
scales: # model compound scaling constants, i.e. 'model=yolo11n.yaml' will call yolo11.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.50, 0.25, 1024]  # summary: 319 layers, 2624080 parameters, 2624064 gradients, 6.6 GFLOPs

步骤三:训练和验证模型

       最后,使用YOLO11模型进行训练。以下是训练YOLO11n模型的示例代码,训练在COCO8数据集上进行100个epochs,图像大小为640:

from ultralytics import YOLO

# 加载模型
model = YOLO("yolo11n.pt")  # 加载预训练模型(推荐用于训练)

# 训练模型
results = model.train(data="coco8.yaml", epochs=100, imgsz=640)

       训练完成后,需要对模型进行验证以评估其准确性。以下是验证YOLO11n模型的准确性的代码示例:

from ultralytics import YOLO

# 加载模型
model = YOLO("yolo11n.pt")

# 验证模型
metrics = model.val()

四、总结

       开发油罐检测系统的详细步骤。项目从数据集的划分和准备开始,涵盖了环境配置、数据集处理、模型训练与验证等关键环节。通过LabelImg工具,我们精确标注了油罐图像,确保了数据集的高质量。在配置了YOLOv11模型后,我们通过大量实验优化了模型参数,实现了对油罐的高效检测。本研究不仅提高了油罐检测的自动化水平,还为工业安全领域提供了一种新的解决方案。通过深度学习技术,我们能够有效预防油罐泄漏等安全事故,保障石油化工行业的稳定运行。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐