1、项目介绍

1.1项目背景

在商品琳琅满目的今天,消费者对一个品牌的第一印象往往是这个品牌的logo决定的,logo的设计好坏对商品的销量起着很大作用。消费者在辨别商品品牌时也常常通过这个牌子的logo来进行区分,甚至看到这个logo就无脑下单。所以,一些商家就会利用消费者的这种心理,把自己的logo设计得和一些大牌十分相似来鱼目混珠,欺骗消费者来取得更高的销量。而在常用的购物软件上的“拍照搜物”等类似功能中,商品的logo也会成为搜图准确率的重要影响因素,平台也能根据商品的logo相似度来自动屏蔽一些假冒伪劣产品。所以商品logo的识别无论对于消费者还是对于商家或是第三方购物平台,都是非常重要的一项功能

以下为一些相似的logo:

1.2项目目的

通过使用Paddle开源框架训练出一套准确率高的模型自动识别50种不同的商品logo,并在图片上标注出来。

1.3数据集介绍

给出的数据集分为两部分,每部分各有50种商品,共有100种不同的商品和logo。商品包含日常用品,鞋服玩具,电子产品等等,种类丰富,范围全面。一些图片中仅有一处logo,但更多的图片中拥有两个以上的logo。平均每个图片含有的logo为2个。此项目中选用了其中一部分的数据,训练集有2500多张图片,验证集中有7500张图片,一共五十种商品。

若想优化此项目可以试着将两部分的数据合并,并合并他们的标注。

1.4环境选择

若项目部署在aistudio平台,则本项目建议在V100 32G以上的环境下运行。如在V100 16G的环境下运行触发以下报错时建议选择更好的环境:

2、算法介绍

2.1总览

本项目主要使用PaddleDetection套件

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

特性

  • 模型丰富: 包含目标检测、实例分割、人脸检测、关键点检测、多目标跟踪等250+个预训练模型,涵盖多种全球竞赛冠军方案。

  • 使用简洁:模块化设计,解耦各个网络组件,开发者轻松搭建、试用各种检测模型及优化策略,快速得到高性能、定制化的算法。

  • 端到端打通: 从数据增强、组网、训练、压缩、部署端到端打通,并完备支持云端/边缘端多架构、多设备部署。

  • 高性能: 基于飞桨的高性能内核,模型训练速度及显存占用优势明显。支持FP16训练, 支持多机训练。

2.2模型

PP-YOLOE是基于PP-YOLOv2的卓越的单阶段Anchor-free模型,超越了多种流行的YOLO模型。而PP-YOLOE+是基于飞桨云边一体高精度模型PP-YOLOE迭代优化升级的版本。PP-YOLOE+l在COCO test-dev2017达到了53.3的mAP, 同时其速度在Tesla V100上达到了78.1 FPS。PP-YOLOE+s/m/x同样具有卓越的精度速度性价比。
PP-YOLOE由以下方法组成

  • 可扩展的backbone和neck
  • Task Alignment Learning
  • Efficient Task-aligned head with DFL和VFL
  • SiLU(Swish)激活函数
模型EpochGPU个数每GPU图片个数骨干网络输入尺寸Box APval0.5:0.95Box APtest0.5:0.95Params(M)FLOPs(G)V100 FP32(FPS)V100 TensorRT FP16(FPS)模型下载配置文件
PP-YOLOE+s8088cspresnet-s64043.743.97.9317.36208.3333.3modelconfig
PP-YOLOE+m8088cspresnet-m64049.850.023.4349.91123.4208.3modelconfig
PP-YOLOE+l8088cspresnet-l64052.953.352.20110.0778.1149.2modelconfig
PP-YOLOE+x8088cspresnet-x64054.754.998.42206.5945.095.2modelconfig

PP-YOLOE+的模型结构

包含骨干网络(backbone)CSPRepResNet、特征融合CSPPAN、轻量级ET-Head和改进的动态匹配算法TAL(Task Alignment Learning)等模块, 并且根据不同的应用场景设计了一系列模型,即s/m/l/x

2.2.1 backbone与neck

启发于TreeBlock,将残差连接和密集连接相结合,提出了一种新的RepResBlock连接,用于backbone和neck中。RepResBlock可提升精度0.7mAP。训练阶段如图3(b)所示,推理阶段如图3©所示。

使用RepResBlock来构建主干和颈部。与ResNet类似,我们的主干命名为CSPRepResNet,包含三个卷积层和其之后由RepResBlock组成的四个阶段,如图3(d)所示。neck部分也采用了新设计的CSPPAN结构。新的backbone和neck在增强模型表征能力的同时提升了模型的推理速度,并且可以通过width multiplier和depth multiplier灵活地配置模型的大小。

2.2.2 anchor-free

PP-YOLOv2使用anchor-based方法分配GT。然而,anchor-based机制引入了许多超参数,并依赖于手工设计,这可能导致不能很好地泛化到其他数据集。基于上述原因, 我们在PP-YOLOv2中引入了anchor-free方法。基于FCOS,在每个像素上分配一个anchor, 我们将三个检测头的上下限设置,对应到相应GT特征图。然后计算边界框的中心,以选择最近的像素作为正样本。和YOLO系列一样,预测4D向量(x、y、w、h)进行回归。这个修改使模型更快一些,同时损失0.3AP,如表2所示。虽然上下 边界是根据PPYOLOv2的anchor尺寸仔细设置的,但使用anchor-based和anchor-free的方法存在较小的不一致性,这可能会导致较小的精度下降。

2.2.3 TAL

为了提升准确度,标签分配是需要考虑的另一个方面。 TOOD提出了任务对齐学习(TAL),它由动态标签分配和与任务相关的损失。动态标签分配意味着预测/损失感知。根据预测,为每个GT分配动态的、正的anchors数量。 通过明确调整这两个任务,TAL可以获得最高分类分数和最精确的检测框。
对于任务丢失,TOOD使用标准化的t,即tˆ来替换loss中的目标。它采用每个实例中最大的IoU进行归一化。分类的Binary交叉熵(BCE)可以重写为:

我们使用不同的标签分配策略来分析性能。我们在上述模型上进行了此实验,该模型使用CSPRepResNet作为主干。为了快速获得验证结果,我们仅在COCO train2017上训练了36个epochs,并在COCO val上进行了验证。如表3所示,TAL实现了最佳的45.2%AP性能。我们使用TAL替代FCOS风格的标签分配,并实现0.9%的AP改进–50.4%AP。

2.2.4 ET头

在目标检测中,分类与定位之间的任务冲突是一个众所周知的问题,相应的解决方案在许多论文中提出。YOLOX提出的头部解耦是从大多数单阶段和两阶段探测器中总结出来的,并成功应用于YOLO模型,以提高准确性。然而,解耦头可能将分类和定位任务分开,导致缺乏针对特定任务的学习。基于TOOD,我们对头部做了改进,并提出速度和准确性目标兼具的ET头。如图2所示,我们使用ESE替换TOOD中的层注意力,简化分类分支对齐的分配方式为shortcut,并将回归分支的分配方式用distribution focal loss(DFL)替换。通过上述更改,ET头只在V100上增加了0.9ms。对于分类和定位任务的学习, 我们分别选择varifocal loss(VFL)和distribution focal loss(DFL)。PP-Picodet成功将VFL和DFL应用到目标检测器中,并获得性能改善。Zhang等人方法中的VFL使用目标分数对正样本的损失进行加权,此实现使高IoU正样本对损失的贡献相对较大。这也使得模型在训练期间更加关注高质量的样本,而不是那些低质量的样本。与此相同的还有,两者都使用IoU感知分类得分(IACS)作为预测的目标。这能有效学习分类分数和定位质量估计的联合表示,这使得训练和推理之间具有高度的一致性。对于DFL,为了解决检测框表示不灵活的问题,Li等人方法建议使用通用分布预测检测框。我们的模型由如下损失函数监督:

式中,tˆ表示归一化目标分数,见2.2.2。如表2,ET头获得0.5%的AP改善–50.9%AP。

2.2.5 PPYOLOE+相较于PPYOLOE的改进部分

  • 使用大规模数据集obj365预训练模型
  • 在backbone中block分支中增加alpha参数
  • 优化端到端推理速度,提升训练收敛速度

3、安装库和相关环境

3.1安装并引入库

#安装相关包
!pip install pycocotools
!pip install mmcv
!pip install -U seaborn
!pip install paddlepaddle-gpu
!pip install paddlex
#引入相关库
import paddle
import paddlex
import os
import numpy as np
import cv2
import matplotlib.pyplot as plt
import random
import pycocotools
import os.path as osp
from PIL import Image
import glob
import mmcv
from collections import Counter

3.2克隆PaddleDetection套件

if not os.path.exists("/home/aistudio/PaddleDetection"):
    !git clone https://gitee.com/PaddlePaddle/PaddleDetection.git

3.3配置相关环境

#配置相关变量
%cd /home/aistudio/PaddleDetection
!pip install -r requirements.txt
%env CUDA_VISIBLE_DEVICES=0
#检查是否可以调用GPU
paddle.fluid.install_check.run_check()

4、数据集处理

4.1数据集解压

#解压数据集
if not osp.exists("/home/aistudio/work/data/train"):
    if not osp.exists("/home/aistudio/work/data"):
        os.makedirs('/home/aistudio/work/data')
    %cd /home/aistudio
    ! unzip -oq data/data151249/fewshotlogodetection_round1_test_202204.zip -d work/data
    ! unzip -oq data/data151249/fewshotlogodetection_round1_train_202204.zip -d work/data
#删除原数据集压缩包,减少内存占用
if osp.exists("/home/aistudio/data/data151249/fewshotlogodetection_round1_test_202204.zip"):
    os.remove("/home/aistudio/data/data151249/fewshotlogodetection_round1_test_202204.zip")
    os.remove("/home/aistudio/data/data151249/fewshotlogodetection_round1_train_202204.zip")
    os.remove("/home/aistudio/data/data151249/fewshotlogodetection_round2_test_202205.zip")
    os.remove("/home/aistudio/data/data151249/fewshotlogodetection_round2_train_202205.zip")

4.2图片大小统计

root = '/home/aistudio/work/data/'   #根目录
img_dir = '/home/aistudio/work/data/train/images'#设置训练图片的目录
img_paths = glob.glob(img_dir + '/*')#训练图片的列表
def get_img_size(img_path):
    image = Image.open(img_path)
    w, h = image.size
    return (w, h)  #拿到宽和高

results = mmcv.track_parallel_progress(get_img_size, img_paths, 8) #进度条可视化

wlist = [x[0] for x in results]
hlist = [x[1] for x in results]

import seaborn as sns
f, ax = plt.subplots(1,3, figsize=(16,4))
#绘制宽、高、宽高比的三幅图
sns.histplot(wlist, ax=ax[0], palette=sns).set_title('width');
sns.histplot(hlist, ax=ax[1], palette=sns).set_title('height');
sns.histplot(np.array(wlist)/np.array(hlist), ax=ax[2]).set_title('width/height');
#统计数据集中宽/高度最多的数据
collection_w = Counter(wlist)
most_w = collection_w.most_common(1)
print(f'数据集中宽度最多的是{most_w[0][0]}')
collection_h = Counter(hlist)
most_h = collection_h.most_common(1)
print(f'数据集中高度最多的是{most_h[0][0]}')
[>>>>>>>>>>>>>>>>>>>>>>>>>>] 2476/2476, 1558.4 task/s, elapsed: 2s, ETA:     0s


/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/ipykernel_launcher.py:16: UserWarning: Ignoring `palette` because no `hue` variable has been assigned.
  app.launch_new_instance()
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/ipykernel_launcher.py:17: UserWarning: Ignoring `palette` because no `hue` variable has been assigned.


数据集中宽度最多的是800
数据集中高度最多的是800

的是800

在这里插入图片描述

可以看到,数据集中大部分图片的宽和高是800,长宽比为1:1

4.3划分数据集

if not osp.exists("/home/aistudio/MyDataset"):
    !mkdir MyDataset
%cd
!cp -r work/data/train/images MyDataset/JPEGImages
!cp work/data/train/annotations/instances_train2017.json MyDataset/annotations.json

!paddlex --split_dataset --format COCO --dataset_dir MyDataset --val_value 0.1
#这里设置训练集占90%,验证集占10%,比例可更改

5、利用PaddleDetection中的模型进行训练

5.1模型修改

这里使用PaddleDetection套件中目前在目标检测项目中效果最好的模型——PPyoloe+进行训练

下面给出参数修改的部分,需要自行修改:

①/home/aistudio/PaddleDetection/configs/datasets路径下的coco_detection.yml

此部分为文件路径的修改

②/home/aistudio/PaddleDetection/configs/ppyoloe/_base_路径下的optimizer_80e.yml

此部分为学习率的设置,可自行更改

③/home/aistudio/PaddleDetection/configs/ppyoloe/_base_路径下的ppyoloe_plus_reader.yml

此部分为学习率的设置,可自行更改

由于CPU内存不够大,所以将worker_num调小,如果使用更高级的环境可将此调大以获取更高的运行速度

同理GPU内存较大,将bs调大换取更高的运行速度

5.2开始训练

#生成锚框
%cd /home/aistudio/PaddleDetection/
!python tools/anchor_cluster.py -c /home/aistudio/PaddleDetection/configs/ppyoloe/ppyoloe_plus_crn_l_80e_coco.yml -n 9 -s 608 -m v2 -i 100

–eval 边训练边评估,每次评估后还会评出最佳mAP模型保存到best_model文件夹下,如果验证集很大,测试将会比较耗时,建议调整configs/runtime.yml 文件中的 snapshot_epoch配置以减少评估次数,或训练完成后再进行评估。

–use_vdl=True 开启loss等参数的可视化

–amp 混合精度训练

–vdl_log_dir=“./output” 将生成的可视化日志放在output文件夹下
在左侧工具栏中的“可视化”栏中的“设置logdir”中选择下面的文件路径即可

#训练前记得把可视化打开,参数的变化过程一目了然
!nvidia-smi
%cd /home/aistudio/PaddleDetection
!python tools/train.py -c configs/ppyoloe/ppyoloe_plus_crn_l_80e_coco.yml \
    --eval --amp --use_vdl=True --vdl_log_dir="./output"

5.3数据可视化


5.4导出模型

!python tools/export_model.py -c configs/ppyoloe/ppyoloe_plus_crn_l_80e_coco.yml -o weights=https://paddledet.bj.bcebos.com/models/ppyoloe_plus_crn_l_80e_coco.pdparams trt=True

5.5模型对比

模型ap @[ IoU=0.50:0.95]FPS训练耗时epochloss
PPyoloe+0.62622.33h801.10
faster_rcnn0.4516.12.5h600.22
切图+PPyoloe-sod0.59433.09h801.05

6、模型预测

if not osp.exists("/home/aistudio/inferout"):
  os.makedirs('/home/aistudio/inferout')
!python tools/infer.py -c /home/aistudio/PaddleDetection/configs/ppyoloe/ppyoloe_plus_crn_l_80e_coco.yml \
                      --infer_img=/home/aistudio/work/data/val/images/68c7c00a2ee3a94ccd9157f96cb61ad8.jpg \
                      --output_dir=/home/aistudio/inferout/\
                    -o weights=/home/aistudio/PaddleDetection/output/ppyoloe_plus_crn_l_80e_coco/best_model.pdparams \
  #也可以通过--infer_dir指定测试集并推理测试集下所有图像,但是不建议这么做,因为很多图片标注是用中文标注,容易报错
  #可以通过把所有的标注修改为英文来解决,这里就不修改了
#对测试结果图片进行可视化
img_path= "/home/aistudio/inferout/68c7c00a2ee3a94ccd9157f96cb61ad8.jpg"
img=Image.open(img_path)
plt.figure("test_img", figsize=(8,8))
plt.imshow(img)
plt.show()

在这里插入图片描述

模型推理结果正确!

7、项目优点

①本文详细介绍了PPYOLOE+模型相较于其他模型的不同之处以及对于之前的YOLO系列模型的的改进部分

②本篇项目使用了PaddleDetection套件中的多种模型,经过长时间的训练后得出了几种不同模型的训练结果并将多种参数完整地记录下来放在项目中进行对比,使读者可以简单方便快捷地了解不同模型在训练上的差异,了解到在相似的目标检测项目中选择何种模型能达到最优效果。

③写本项目的原则是让刚接触深度学习以及计算机视觉领域的小白也能看懂本项目是如何运行的,所以在注释部分写的非常详细,在模型修改部分框选出了需要修改的部分。

④经过自己的多次调参找到了较为适合的一套参数,确保速度和精度兼顾,使得最后的ap能收敛到0.626,loss收敛到1.10。在模型训练完成后提供了训练中完整数据的可视化图片。

8、结语

除了调参以外,在此项目中没有对数据集和模型进行更多的处理,商品logo多为小目标,若想要优化此项目可从以下几点入手:

1、合并数据集

2、不依赖现有的模型而手搭网络

3、对数据集使用切图等其他方法优化小目标的检测

4、优化学习率相关设置

此外,项目中的推理速度也比较慢,可以在牺牲准确度的情况下选择更小规模的模型

学员:凤梓贤-武汉理工大学-七月长安灯初上

导师:顾茜

本项目文章参考:

知乎博主LiteAI的回答

CSDN-风巽·剑染春水

GitHub

此文章为搬运
原项目链接

Logo

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

更多推荐