使用飞桨的paddleX-yoloV3对钢材缺陷检测开发和部署

项目链接:https://aistudio.baidu.com/aistudio/projectdetail/2265951

使用飞桨的paddleX-yoloV3对钢材缺陷检测开发和部署_第1张图片

1 项目背景

目前, 基于机器视觉的表面缺陷装备已经在各工业领域广泛替代人工肉眼检测,包括3C、汽车、家电、机械制造、半导体及电子、化工、医药、航空航天、轻工等行业。传统的基于机器视觉的表面缺陷检测方法,往往采用常规图像处理算法或人工设计特征加分类器方式。一般来说,通常利用被检表面或缺陷的不同性质进行成像方案的设计,合理的成像方案有助于获得光照均匀的图像,并将物体表面缺陷明显的体现出来。近年来,不少基于深度学习的缺陷检测方法也被广泛应用在各种工业场景中。这是工业场景表面缺陷检测数据集及论文集可能对你有帮助,建议收藏。

今天的项目是关于钢材缺陷检测的项目,这是我通过查看paddleX的官方文档一步步从数据处理到项目部署所做的完整项目,希望也对你有所帮助。

2 技术介绍

PaddleX目前提供了FasterRCNN和YOLOv3两种检测结构,多种backbone模型,可满足开发者不同场景和性能的需求。本项目中采用YOLOv3-MobileNetV3作为检测模型进行钢材缺陷检测。模型优点是模型小,移动端上预测速度有优势。因为之后要部署到移动端所以我选择了这个模型。

  • Box MMAP: 模型在COCO数据集上的测试精度
  • 预测速度:单张图片的预测用时(不包括预处理和后处理)
  • "-"表示指标暂未更新
模型(点击获取代码) Box MMAP 模型大小 GPU预测速度 Arm预测速度 备注
YOLOv3-MobileNetV1 29.3% 99.2MB 15.442ms - 模型小,预测速度快,适用于低性能或移动端设备
YOLOv3-MobileNetV3 31.6% 100.7MB 143.322ms - 模型小,移动端上预测速度有优势
YOLOv3-DarkNet53 38.9% 249.2MB 42.672ms - 模型较大,预测速度快,适用于服务端
PPYOLO 45.9% 329.1MB - - 模型较大,预测速度比YOLOv3-DarkNet53更快,适用于服务端
FasterRCNN-ResNet50-FPN 37.2% 167.7MB 197.715ms - 模型精度高,适用于服务端部署
FasterRCNN-ResNet18-FPN 32.6% 173.2MB - - 模型精度高,适用于服务端部署
FasterRCNN-HRNet-FPN 36.0% 115.MB 81.592ms - 模型精度高,预测速度快,适用于服务端部署

3 采用paddleX进行训练

PaddleX 集成飞桨智能视觉领域图像分类、目标检测、语义分割、实例分割任务能力,将深度学习开发全流程从数据准备、模型训练与优化到多端部署端到端打通,并提供统一任务API接口及图形化开发界面Demo。开发者无需分别安装不同套件,以低代码的形式即可快速完成飞桨全流程开发。

PaddleX 经过质检、安防、巡检、遥感、零售、医疗等十多个行业实际应用场景验证,沉淀产业实际经验,并提供丰富的案例实践教程,全程助力开发者产业实践落地。

  • PaddleX官方链接

3.1 安装PaddleX

!pip install paddlex==2.0rc

3.2 数据集准备

数据集介绍

地址:http://faculty.neu.edu.cn/yunhyan/NEU_surface_defect_database.html

使用飞桨的paddleX-yoloV3对钢材缺陷检测开发和部署_第2张图片

由东北大学(NEU)发布的表面缺陷数据库,收集了热轧钢带的六种典型表面缺陷,即轧制氧化皮(RS),斑块(Pa),开裂(Cr),点蚀表面( PS),内含物(In)和划痕(Sc)。该数据库包括1,800个200×200像素的灰度图像:六种不同类型的典型表面缺陷,每一类缺陷包含300个样本。对于缺陷检测任务,数据集提供了注释,指示每个图像中缺陷的类别和位置。对于每个缺陷,黄色框是指示其位置的边框,绿色标签是类别分数。

数据集结构

本项目使用的钢材缺陷检测数据集已经按VOC格式进行标注,数据集按照如下方式进行组织:

MyDataset/ # 目标检测数据集根目录
|--Annotations/ # 标注文件所在目录
|  |--crazing_1.xml
|  |--crazing_2.xml
|  |--...
|  |--... 
|--JPEGImages/ # 原图文件所在目录
|  |--crazing_1.jpg
|  |--crazing_2.jpg
|  |--...
|  |--...
|   

使用paddleX的数据划分后,会在MyDataset下生成labels.txt, train_list.txt, val_list.txttest_list.txt,分别存储类别信息,训练样本列表,验证样本列表,测试样本列表

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

解压数据集

# 解压数据集到MyDataset文件夹中
!unzip data/data102850/NEU-DET.zip -d ./MyDataset/
  inflating: ./MyDataset/JPEGImages/scratches_99.jpg  

数据切分

使用paddlex命令即可将数据集随机划分成70%训练集,20%验证集和10%测试集:

划分好的数据集会额外生成labels.txt, train_list.txt, val_list.txt, test_list.txt四个文件,之后可直接进行训练。

# 数据划分
!paddlex --split_dataset --format VOC --dataset_dir MyDataset --val_value 0.2 --test_value 0.1

3.3 模型训练

PaddleX提供了丰富的视觉模型,通过查阅PaddleX模型库,在目标检测中提供了RCNN和YOLO系列模型。在本项目中采用YOLOv3-MobileNetV3作为检测模型进行钢材缺陷检测。

import paddlex as pdx
from paddlex import transforms as T
# 定义训练和验证时的transforms
# API说明:https://github.com/PaddlePaddle/PaddleX/blob/release/2.0-rc/paddlex/cv/transforms/operators.py
train_transforms = T.Compose([
    T.MixupImage(mixup_epoch=250), T.RandomDistort(),
    T.RandomExpand(im_padding_value=[123.675, 116.28, 103.53]), T.RandomCrop(),
    T.RandomHorizontalFlip(), T.BatchRandomResize(
        target_sizes=[320, 352, 384, 416, 448, 480, 512, 544, 576, 608],
        interp='RANDOM'), T.Normalize(
            mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

eval_transforms = T.Compose([
    T.Resize(
        608, interp='CUBIC'), T.Normalize(
            mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
# 定义训练和验证所用的数据集
# API说明:https://github.com/PaddlePaddle/PaddleX/blob/release/2.0-rc/paddlex/cv/datasets/voc.py#L29
train_dataset = pdx.datasets.VOCDetection(
    data_dir='MyDataset',
    file_list='MyDataset/train_list.txt',
    label_list='MyDataset/labels.txt',
    transforms=train_transforms,
    shuffle=True)

eval_dataset = pdx.datasets.VOCDetection(
    data_dir='MyDataset',
    file_list='MyDataset/val_list.txt',
    label_list='MyDataset/labels.txt',
    transforms=eval_transforms,
    shuffle=False)
# 初始化模型,并进行训练
# 可使用VisualDL查看训练指标,参考https://github.com/PaddlePaddle/PaddleX/tree/release/2.0-rc/tutorials/train#visualdl可视化训练指标
num_classes = len(train_dataset.labels)
model = pdx.models.YOLOv3(num_classes=num_classes, backbone='MobileNetV3_ssld')
# API说明:https://github.com/PaddlePaddle/PaddleX/blob/release/2.0-rc/paddlex/cv/models/detector.py#L155
# 各参数介绍与调整说明:https://paddlex.readthedocs.io/zh_CN/develop/appendix/parameters.html
model.train(
    num_epochs=300,
    train_dataset=train_dataset,
    train_batch_size=2,
    eval_dataset=eval_dataset,
    learning_rate=0.001 / 8,
    warmup_steps=1000,
    warmup_start_lr=0.0,
    save_interval_epochs=20,
    lr_decay_epochs=[216, 243, 275],
    save_dir='output/yolov3_mobilenet')

3.4 训练可视化

使用飞桨的paddleX-yoloV3对钢材缺陷检测开发和部署_第3张图片

!visualdl --logdir output/yolov3_darknet53/vdl_log --port 8001
VisualDL 2.2.0
Running VisualDL at http://localhost:8001/ (Press CTRL+C to quit)
Serving VisualDL on localhost; to expose to the network, use a proxy or pass --host 0.0.0.0
^C

3.5 模型预测

import glob
import numpy as np
import threading
import time
import random
import os
import base64
import cv2
import json
import paddlex as pdx

image_name = 'MyDataset/JPEGImages/patches_24.jpg'

model = pdx.load_model('output/yolov3_mobilenet/best_model')

img = cv2.imread(image_name)
result = model.predict(img)

keep_results = []
areas = []
f = open('output/yolov3_mobilenet/result.txt','a')
count = 0
for dt in np.array(result):
    cname, bbox, score = dt['category'], dt['bbox'], dt['score']
    if score < 0.5:
        continue
    keep_results.append(dt)
    count+=1
    f.write(str(dt)+'\n')
    f.write('\n')
    areas.append(bbox[2] * bbox[3])
areas = np.asarray(areas)
sorted_idxs = np.argsort(-areas).tolist()
keep_results = [keep_results[k]
                for k in sorted_idxs] if len(keep_results) > 0 else []
print(keep_results)
print(count)
f.write("the total number is :"+str(int(count)))
f.close()
2021-08-09 13:05:54 [INFO]	Model[YOLOv3] loaded.
[{'category_id': 2, 'category': 'patches', 'bbox': [0.6319522857666016, 14.399604797363281, 35.7954158782959, 184.60039520263672], 'score': 0.7574456334114075}, {'category_id': 2, 'category': 'patches', 'bbox': [139.18118286132812, 12.687393188476562, 41.870513916015625, 61.410430908203125], 'score': 0.9936814904212952}, {'category_id': 2, 'category': 'patches', 'bbox': [156.6752471923828, 97.38316345214844, 38.1483154296875, 40.77000427246094], 'score': 0.9909656643867493}]
3
pdx.visualize_detection(image_name, result, threshold=0.5, save_dir='./output/yolov3_mobilenet')
2021-08-09 13:05:57 [INFO]	The visualized result is saved at ./output/yolov3_mobilenet/visualize_patches_24.jpg

从预测结果可以看出对部分缺陷类型目标检测效果不错但对个别类型效果却没有那么理想,如果你有兴趣可以尝试修改上方的模型参数或是模型的backbone进行预测。

4 项目部署

正在更新中

5 参考资料

  • PaddleX目标检测——钢筋计数
  • PaddleX官方链接
  • 工业场景表面缺陷检测数据集及论文集

6 个人介绍

我在AI Studio上获得白银等级,点亮2个徽章,来互关呀~ https://aistudio.baidu.com/aistudio/personalcenter/thirdview/791590

你可能感兴趣的:(深度学习,paddle飞桨,python,深度学习,paddlepaddle)