一、项目背景

苹果加工时需要对苹果进行品种分类和缺陷检测,传统人工分拣效率低、实时性差,很难满足现代生产需求,而机器分拣在苹果检测时存在分类准确率低、
细小缺陷检测能力差等问题。在线检测是实现自动生产的重要环节,苹果尺寸检测和表面瑕疵检测一直是困扰苹果自动化分级的难题,随着计算机视觉图像信息处理技术已经广泛应用于农产品品质检测中。本项目基于目标检测实现对苹果的瑕疵检测。

在这里插入图片描述

在这里插入图片描述

二、环境准备

2.1训练环境准备

该项目使用的单卡训练环境如下:

框架版本:PaddlePaddle 2.3.2

CUDA Version: 11.2

模型库版本:PaddleDetection(release2.5)

%cd work/
# gitee 国内下载比较快
!git clone https://gitee.com/paddlepaddle/PaddleDetection.git -b release/2.5
# 安装依赖
%cd /home/aistudio/work/PaddleDetection
# !python -m pip install --upgrade pip
!pip install -r requirements.txt
# 编译安装paddledet
!python setup.py install
#安装其他依赖
from PIL import Image  
import matplotlib.pyplot as plt
import numpy as np
import os 
import random

2.2数据集准备

数据集来源于师兄毕业论文,应该是他在网上下载再加上现实中采集了一部分带有苹果瑕疵的图片,包括生活中常见的斑点、腐烂、缺损。不过数据集的特征比较明显,所以检测出来还是比较容易的。要是进行实际应用的话,还是需要多采集一些真实场景下的数据集,包括小目标,多目标,比较难检测的目标。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.2.1解压数据集

!unzip -oq /home/aistudio/data/data123879/defect.zip -d /home/aistudio/data/

2.2.2生成voc数据集

#划分数据集
#根据挂载的数据集制作制作标签文件,并进行划分
#生成train.txt和val.txt
random.seed(2022)
xml_dir  = '/home/aistudio/data/defect/Annotations'#标签文件地址
img_dir = '/home/aistudio/data/defect/JPEGImages'#图像文件地址
path_list = list()
for img in os.listdir(img_dir):
    img_path = os.path.join(img_dir,img)
    xml_path = os.path.join(xml_dir,img.replace('jpg', 'xml'))
    path_list.append((img_path, xml_path))
random.shuffle(path_list)
ratio = 0.8 #训练集和验证集划分比例0.8:0.2
train_f = open('/home/aistudio/data/defect/train.txt','w') #生成训练文件
val_f = open('/home/aistudio/data/defect/val.txt' ,'w')#生成验证文件

for i ,content in enumerate(path_list):
    img, xml = content
    text = img + ' ' + xml + '\n'
    if i < len(path_list) * ratio:
        train_f.write(text)
    else:
        val_f.write(text)
train_f.close()
val_f.close()

#生成标签文档
label = ['defect']#设置你想检测的类别
with open('/home/aistudio/data/defect/label_list.txt', 'w') as f:
    for text in label:
        f.write(text+'\n')

2.2.3转换数据集格式

执行完上面的程序就可以生成voc格式数据集,我们这里用到的模型是PPYOLO+,暂不支持voc数据集,比较方便的是PaddleDetection套件内提供了其他数据集转coco数据集

!python tools/x2coco.py \
        --dataset_type voc \
        --voc_anno_dir /home/aistudio/data/defect/Annotations \
        --voc_anno_list /home/aistudio/data/defect/train.txt \
        --voc_label_list /home/aistudio/data/defect/label_list.txt \
        --voc_out_name /home/aistudio/data/defect/train.json
!python tools/x2coco.py \
        --dataset_type voc \
        --voc_anno_dir /home/aistudio/data/defect/Annotations \
        --voc_anno_list /home/aistudio/data/defect/val.txt \
        --voc_label_list /home/aistudio/data/defect/label_list.txt \
        --voc_out_name /home/aistudio/data/defect/valid.json
!mkdir defect
%cd defect
!mkdir images &&mkdir annotations
!mv /home/aistudio/data/defect/train.json /home/aistudio/work/PaddleDetection/defect/annotations
!mv /home/aistudio/data/defect/valid.json /home/aistudio/work/PaddleDetection/defect/annotations
!cp -r /home/aistudio/data/defect/JPEGImages/* /home/aistudio/work/PaddleDetection/defect/images/
%cd ..

三、模型训练

3.1模型选择

PaddleDetection为基于飞桨PaddlePaddle的端到端目标检测套件,内置30+模型算法及250+预训练模型,覆盖目标检测、实例分割、跟踪、关键点检测等方向,其中包括服务器端和移动端高精度、轻量级产业级SOTA模型、冠军方案和学术前沿算法,并提供配置化的网络模块组件、十余种数据增强策略和损失函数等高阶优化支持和多种部署方案,在打通数据处理、模型开发、训练、压缩、部署全流程的基础上,提供丰富的案例及教程,加速算法产业落地应用。

我们在项目基于PaddleDetection的设备漏油检测中使用了基于PP-YOLOv2的卓越的单阶段Anchor-free模型PP-YOLOE,超越了多种流行的YOLO模型。而在前段时间PaddleDetection发布了release/2.5版本,提出了PP-YOLOE+,最高精度提升2.4% mAP,达到54.9% mAP,模型训练收敛速度提升3.75倍,端到端预测速度最高提升2.3倍;多个下游任务泛化性提升,所以在这里我们尝尝鲜。下图是YOLO系列目前主流算法的对比。

在这里插入图片描述

3.2PPYOLOE+算法

PPYOLOE+在PPYOLOE的基础上:

使用大规模数据集obj365预训练模型

在backbone中block分支中增加alpha参数

优化端到端推理速度,提升训练收敛速度

该项目由于数据集较小,我们选择一个精度更高的PP-YOLOE+_x 模型

模型库

在这里插入图片描述

该项目以PP-YOLOE+_x为例,展示训练和部署过程。(其他几个都是同样的道理)

3.3修改配置文件

我们使用配置文件PaddleDetection/configs/ppyoloe/ppyoloe_plus_crn_x_80e_coco.yml, 在静态图版本下,在PaddleDetection 2.0后续版本,采用了模块解耦设计,用户可以组合配置模块实现检测器,并可自由修改覆盖各模块配置,用到的文件如下图所示:
在这里插入图片描述

这些文件都在路径/home/aistudio/work/PaddleDetection/configs/ppyoloe下(除coco_detection.yml以外)

  1. ppyoloe_plus_crn_x_80e_coco.yml

文件入口

修改模型保存间隔:snapshot_epoch

  1. coco_detection.yml

主要说明了训练数据和验证数据的路径
在这里插入图片描述

  1. runtime.yml

主要说明了公共的运行参数,比如说是否使用GPU、每多少个epoch存储checkpoint等

optimizer_80e.yml

主要说明了学习率和优化器的配置。

这里主要修改学习率,默认学习率是适配多GPU训练(8x GPU),我们使用的是单GPU训练,须对应调整学习率,除以8

ppyoloe_plus_crn.yml

主要说明模型、和主干网络的情况。

ppyoloe_plus_reader.yml

主要说明数据读取器配置,如batch size,并发加载子进程数等,同时包含读取后预处理操作,如resize、数据增强等等

3.4开始训练

#或者运行下面这条指令,边训练边评估,开启可视化
!python tools/train.py -c /home/aistudio/work/PaddleDetection/configs/ppyoloe/ppyoloe_plus_crn_x_80e_coco.yml --amp --eval --use_vdl=True --vdl_log_dir="./output"

由于数据比较少,所以精度比较低,但是收敛的速度还是比较快的,一会我们将进行测试看看效果

在这里插入图片描述
在这里插入图片描述

3.5模型评估

#评估模型
!python -u tools/eval.py -c /home/aistudio/work/PaddleDetection/configs/ppyoloe/ppyoloe_plus_crn_x_80e_coco.yml  \
-o weights=/home/aistudio/work/PaddleDetection/output/ppyoloe_plus_crn_x_80e_coco/best_model.pdparams

3.6模型推理

#使用图片进行推理测试,这里亦可以通过-c直接指定一些参数
!python tools/infer.py -c configs/ppyoloe/ppyoloe_plus_crn_x_80e_coco.yml \
-o weights=/home/aistudio/work/PaddleDetection/output/ppyoloe_plus_crn_x_80e_coco/best_model.pdparams \
--infer_img=/home/aistudio/2.jpg
#也可以通过--infer_dir指定目录并推理目录下所有图片
#对测试结果图片进行可视化
img_path= "/home/aistudio/work/PaddleDetection/output/2.jpg"
img = Image.open(img_path)
plt.figure("test_img", figsize=(100,100))
plt.imshow(img)
plt.show()

可以看到效果总体上还是可以的,但是仍然存在问题,包括一些小的斑点漏检,还有将整个图片进行了框选。

原因主要有以下几个方面:

数据框选问题,训练集中的苹果瑕疵大多数比较明显的瑕疵,训练出来的模型对小的瑕疵检测效果比较差。

数据集数量问题,数据量比较少导致模型拟合程度不够。

在这里插入图片描述

在这里插入图片描述

3.7模型导出

!python tools/export_model.py -c configs/ppyoloe/ppyoloe_plus_crn_x_80e_coco.yml -o weights=/home/aistudio/work/PaddleDetection/output/ppyoloe_plus_crn_x_80e_coco/best_model.pdparams

四、模型部署

上一步我们直接导出部署模型,PPYOLOE+是支持多端高性能部署的:

  1. Paddle Inference Python & C++

  2. Paddle-TensorRT

  3. PaddleServing

  4. PaddleSlim模型量化

4.1Paddle Inference Python

!python deploy/python/infer.py --model_dir=/home/aistudio/work/PaddleDetection/output_inference/ppyoloe_plus_crn_x_80e_coco --image_file=/home/aistudio/1.jpg --run_mode=paddle --device=gpu --output_dir ../

4.2FastDeploy部署

FastDeploy是一款易用高效的推理部署开发套件。覆盖业界热门AI模型并提供开箱即用的部署体验,包括图像分类、目标检测、图像分割、人脸检测、人脸识别、人体关键点识别、文字识别、语义理解等多任务,满足开发者多场景,多硬件、多平台的产业部署需求。更多详细介绍

可以说是部署的福音,可以方便快速的进行模型的部署。支持40多个主流的AI模型在8大类常见硬件上的部署能力,几乎覆盖目前的主流硬件和主流模型。

这里我们使用PaddleDetection的Python&&GPU部署

4.2.1 FastDeploy安装

!pip install fastdeploy-gpu-python -f https://www.paddlepaddle.org.cn/whl/fastdeploy.html
%cd ..
#下载部署示例代码
!git clone https://github.com/PaddlePaddle/FastDeploy.git

4.2.2GPU推理

输出结果保存在/home/aistudio/FastDeploy/examples/vision/detection/paddledetection/python/visualized_result.jpg

%cd FastDeploy/examples/vision/detection/paddledetection/python/
# GPU推理
thon/
# GPU推理
!python infer_ppyoloe.py --model_dir /home/aistudio/work/PaddleDetection/output_inference/ppyoloe_plus_crn_x_80e_coco --image /home/aistudio/1.jpg --device gpu

五、项目总结

在本项目中体验了PPYOLOE的改进版本,在模型训练方面还有很大的提升空间,后续会继续进行完善。并完成了基于Paddle Inference和FastDeploy Python GPU部署的实现,为项目后续产业落地提供了更加有效的参考。本项目可以作为苹果分拣系统的基础版本,后面可以继续完善相应的功能。比如增加苹果不同属性的区分实现不同类别苹果的分拣,整个流水线无需人工参与,可以大大提高苹果分拣效率,降低苹果收购成本。

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐