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

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

1 项目背景

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

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

2 技术介绍

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

  • Box MMAP: 模型在COCO数据集上的测试精度
  • 预测速度:单张图片的预测用时(不包括预处理和后处理)
  • "-"表示指标暂未更新
模型(点击获取代码)Box MMAP模型大小GPU预测速度Arm预测速度备注
YOLOv3-MobileNetV129.3%99.2MB15.442ms-模型小,预测速度快,适用于低性能或移动端设备
YOLOv3-MobileNetV331.6%100.7MB143.322ms-模型小,移动端上预测速度有优势
YOLOv3-DarkNet5338.9%249.2MB42.672ms-模型较大,预测速度快,适用于服务端
PPYOLO45.9%329.1MB--模型较大,预测速度比YOLOv3-DarkNet53更快,适用于服务端
FasterRCNN-ResNet50-FPN37.2%167.7MB197.715ms-模型精度高,适用于服务端部署
FasterRCNN-ResNet18-FPN32.6%173.2MB--模型精度高,适用于服务端部署
FasterRCNN-HRNet-FPN36.0%115.MB81.592ms-模型精度高,预测速度快,适用于服务端部署

3 采用paddleX进行训练

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

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

3.1 安装PaddleX

!pip install paddlex==2.0rc

3.2 数据集准备

数据集介绍

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

由东北大学(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 训练可视化

!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 参考资料

6 个人介绍

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

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
PaddleX -- 飞桨全流程开发工具,以低代码的形式支持开发者快速实现产业实际项目落地。 PaddleX 集成飞桨智能视觉领域图像分类、目标检测、语义分割、实例分割任务能力,将深度学习开发全流程从数据准备、模型训练与优化到多端部署端到端打通,并提供统一任务API接口及图形化开发界面Demo。开发者无需分别安装不同套件,以低代码的形式即可快速完成飞桨全流程开发PaddleX 经过质检、安防、巡检、遥感、零售、医疗等十多个行业实际应用场景验证,沉淀产业实际经验,并提供丰富的案例实践教程,全程助力开发者产业实践落地。 安装: PaddleX提供三种开发模式,满足用户的不同需求: 1、Python开发模式: 通过简洁易懂的Python API,在兼顾功能全面性、开发灵活性、集成方便性的基础上,给开发者最流畅的深度学习开发体验。 前置依赖 paddlepaddle >= 1.8.4 python >= 3.6 cython pycocotools pip install paddlex -i https://mirror.baidu.com/pypi/simple 详细安装方法请参考PaddleX安装 2、Padlde GUI模式: 无代码开发的可视化客户端,应用Paddle API实现,使开发者快速进行产业项目验证,并为用户开发自有深度学习软件/应用提供参照。 前往PaddleX官网,申请下载PaddleX GUI一键绿色安装包。 前往PaddleX GUI使用教程了解PaddleX GUI使用详情。 PaddleX GUI安装环境说明 3、PaddleX Restful: 使用基于RESTful API开发的GUI与Web Demo实现远程的深度学习全流程开发;同时开发者也可以基于RESTful API开发个性化的可视化界面 前往PaddleX RESTful API使用教程 PaddleX 更新日志: v2.0.0.rc0 全面支持飞桨2.0动态图,更易用的开发模式 目标检测任务新增PP-YOLOv2, COCO test数据集精度达到49.5%、V100预测速度达到68.9 FPS 目标检测任务新增4.2MB的超轻量级模型PP-YOLO tiny 语义分割任务新增实时分割模型BiSeNetV2 C++部署模块全面升级  PaddleInference部署适配2.0预测库  支持飞桨PaddleDetection、PaddleSeg、PaddleClas以及PaddleX的模型部署  新增基于PaddleInference的GPU多卡预测  GPU部署新增基于ONNX的的TensorRT高性能加速引擎部署方式  GPU部署新增基于ONNX的Triton服务化部署方式 Tags:PaddleX源码包 PaddleX2.0 pp飞桨 PaddleX

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值