PaddleX+PaddleClas低代码快速实现体育实践分类
1. 引言
本项目旨在使用百度飞桨提供的Paddlex和PaddleClas快速的实现图像分类。当有项目快速落地需求时可依此项目实现模型原型设计及后期训练与部署。
1.1 项目介绍
本项目主要通过模型搭建和训练实现划船、羽毛球、马球、地掷球、单板滑雪、槌球、帆船和攀岩等8种体育活动实践的自动分类识别。
1.2 数据集介绍
本项目数据集来自斯坦福大学视觉训练集
该数据集包含 8 个体育赛事类别:划船(250 张图片)、羽毛球(200 张图片)、马球(182 张图片)、地掷球(137 张图片)、单板滑雪(190 张图片)、槌球(236 张图片)、帆船(190 张图片)及攀岩(194张图片)。 图像根据人的主体判断分为简单和中等。 还为每个图像提供了前景物体的距离信息。
图片命名规则如下:
以 Easy_Close_Rowing_504.jpg为例。Easy表示识别难度等级、Close表示前景距离较近、Rowing表示体育实践类型、504表示图片的索引号。
2.环境准备
本项目使用了PaddleX和PaddleClas两个快速的构建工具。
2.1 PaddleX介绍
PaddleX是飞桨全流程开发工具,集飞桨核心框架、模型库、工具及组件等深度学习开发所需全部能力于一身,打通深度学习开发全流程。PaddleX同时提供简明易懂的Python API,及一键下载安装的图形化开发客户端。用户可根据实际生产需求选择相应的开发方式,获得飞桨全流程开发的最佳体验。
PaddleX 集成飞桨智能视觉领域图像分类、目标检测、语义分割、实例分割任务能力,将深度学习开发全流程从数据准备、模型训练与优化到多端部署端到端打通,并提供统一任务API接口及图形化开发界面Demo。开发者无需分别安装不同套件,以低代码的形式即可快速完成飞桨全流程开发。PaddleX 经过质检、安防、巡检、遥感、零售、医疗等十多个行业实际应用场景验证,沉淀产业实际经验,并提供丰富的案例实践教程,全程助力开发者产业实践落地。
本项目中只了使用PaddleX的数据集处理功能,如向零代码实现项目功能,可以参考PaddleX GUI的使用手册,只需点击几个按钮即可完成模型训练与部署。
2.2 PaddleClas介绍
飞桨图像识别套件PaddleClas是飞桨为工业界和学术界所准备的一个图像识别和图像分类任务的工具集,助力使用者训练出更好的视觉模型和应用落地。PaddleClas支持多种前沿图像分类、识别相关算法,发布产业级特色骨干网络PP-HGNet、PP-LCNetv2、 PP-LCNet和SSLD半监督知识蒸馏方案等模型,在此基础上打造PULC超轻量图像分类方案和PP-ShiTu图像识别系统。
2.3 安装环境
2.3.1 PaddleX的安装
如果使用的AI Studio的BML CodeLab模式,可以在右侧工具栏点击“包管理”后,输入PaddleX搜索后进行图形化形式的安装。
也可以使用如下命令进行安装:
!pip install paddlex
2.3.2 PaddleClas的安装
PaddleClas的安装需要从github或者gitee等clone代码下载:
代码如下:
!git clone https://gitee.com/paddlepaddle/PaddleClas.git --depth=1
3.数据准备
本数据集已在AI Studio公开,将本数据导入项目使用如下代码进行解压。
!rar x "data/data182029/event_dataset.rar" # 传入rar文件路径
本项目属于图像分类任务,需要使用ImageNet格式进行数据准备。
3.1数据格式
在PaddleX中,图像分类任务支持的ImageNet数据集格式要求如下:
数据文件夹结构
数据集目录event_img
下包含多个文件夹,每个文件夹中的图像均属于同一个类别,文件夹的命名即为类别名(注意路径中不要包括中文,空格)。
文件夹结构示例如下:
event_img/ # 图像分类数据集根目录
|--badminton/ # 当前文件夹所有图片属于badminton类别
| |--d1.jpg
| |--d2.jpg
| |--...
| |--...
|
|--...
|
|--bocce/ # 当前文件夹所有图片属于bocce类别
| |--s1.jpg
| |--s2.jpg
| |--...
| |--...
训练集、验证集列表和类别标签列表
为了完成模型的训练和精度验证。我们需要在event_img
目录下准备train_list.txt
, val_list.txt
和labels.txt
三个文件,分别用于表示训练集列表,验证集列表和类别标签列表。点击下载图像分类示例数据集查看具体的数据格式。
- labels.txt
labels.txt用于列出所有类别,类别对应行号表示模型训练过程中类别的id(行号从0开始计数),例如labels.txt为以下内容
0 RockClimbing
1 badminton
2 bocce
3 croquet
4 polo
5 rowing
6 sailing
7 snowboarding
即表示该分类数据集中共有8个类别,在模型训练中RockClimbing
对应的类别id为0, badminton
对应1,其他以此类推。
- train_list.txt
train_list.txt列出用于训练时的图片集合,与其对应的类别id,示例如下
RockClimbing/Easy_Mid_RockClimbing_838.jpg 0
...
sailing/Easy_Mid_sailing_258.jpg 6
snowboarding/Easy_Mid_snowboarding_285.jpg 7
其中第一列为相对对event_img
的相对路径,第二列为图片对应类别的类别id
- val_list.txt
val_list列出用于验证时的图片集成,与其对应的类别id,格式与train_list.txt一致。
本项目的数据集已经为我们做好了处理,我们只需直接解压即可。但是个别文件夹中存在Thumb.db文件,在划分数据前请务必删除,否则会影响后期的训练。
%ls Thumb.db
3.2 使用PaddleX划分数据集
PaddleX提供了全套数据标注流程,用户可先安装、启动标注软件并标注数据,再将数据集标注格式转换成PaddleX要求的格式,最后进行数据划分。
在模型进行训练时,我们需要划分训练集,验证集和测试集,可直接使用paddlex命令将数据集随机划分。也可以借助PaddleX可视化客户端进行模型训练,数据集划分功能集成在客户端内,无需自行使用paddlex命令划分,只需将划分好的txt文件上传到event_img文件夹中即可。
可以使用下述指令直接进行划分。
参数中
–split_dataset 表示需要使用paddleX的数据集划分功能
–format是指明需要划分的数据类型,本项目使用的PaddleClas工具,故需要指定为ImageNet类型。
–dataset_dir 是指训练集的名称,指定需要进行划分的数据集文件夹
–val_value 表示验证集比例
–test_value 表示测试集比例
!paddlex --split_dataset --format ImageNet --dataset_dir enent_img --val_value 0.2 --test_value 0.1
4.修改模型
paddleClas为我们提供了大量的预训练模型,他们是使用在某个较大的数据集训练好的预训练模型,即被预置了参数的权重,可以帮助模型在新的数据集上更快收敛。尤其是对一些训练数据比较稀缺的任务,在神经网络参数十分庞大的情况下,仅仅依靠任务自身的训练数据可能无法训练充分,加载预训练模型的方法可以认为是让模型基于一个更好的初始状态进行学习,从而能够达到更好的性能。
此项目中我们使用了一个较为轻量的预训练模型来训练,首先复制/home/aistudio/PaddleClas/ppcls/configs/quick_start/new_user/ShuffleNetV2_x0_25.yaml文件到根目录,也可以不复制,复制的目的就是在填写训练指令参数时可以更加方便。打开yaml文件进行配置,配置选项意义见每行后的注释。
# global configs
Global:
checkpoints: null #指定断点模型路径,用于恢复训练
pretrained_model: null #预训练模型路径
output_dir: ./output/ #保存模型路径
device: gpu #使用GPU进行训练
save_interval: 10 #每隔多少个 epoch 保存模型
eval_during_train: True #是否在训练时进行评估
eval_interval: 10 #每隔多少个 epoch 进行模型评估
epochs: 60 #训练总 epoch 数
print_batch_step: 10 #每隔多少个 mini-batch 打印输出
use_visualdl: Ture #是否是用 visualdl 可视化训练过程
# used for static mode and model export
image_shape: [3, 224, 224] #图片大小,paddleClas会自动对输入的图像进行处理,此处使用原模型参数,不要修改
save_inference_dir: ./inference
# model architecture
Arch:
name: ShuffleNetV2_x0_25 #模型结构名字
class_num: 8 #分类数,本项目共需要对8个体育实践进行分类,故设置为8
# loss function config for traing/eval process #配置损失函数
Loss:
Train: #训练集损失函数
- CELoss: #使用交叉熵损失函数
weight: 1.0 #CELoss 在整个 Loss 中的权重
Eval: #验证集损失函数
- CELoss: #使用交叉熵损失函数
weight: 1.0 #CELoss 在整个 Loss 中的权重
Optimizer:
name: Momentum #优化器方法名,此处使用了动量优化,也可选择其他优化器如:RmsProp等
momentum: 0.9 #momentum 值
lr: #配置学习率
name: Cosine #学习率下降方式,也可以设置"Linear"、"Piecewise"等其他下降方式
learning_rate: 0.0125 #学习下降率
warmup_epoch: 5 #warmup 轮数
regularizer: #配置正则化方式
name: 'L2' #正则化方式名称 也可选L1
coeff: 0.00001 #正则化系数
# data loader for train and eval #数据读取模块
DataLoader:
Train: #训练集读取
dataset:
name: ImageNetDataset #训练集名称,可以不改
image_root: /home/aistudio/event_img #指定训练集路径
cls_label_path: /home/aistudio/event_img/train_list.txt #数据集标签 list
transform_ops: #单张图片的数据预处理
- DecodeImage:
to_rgb: True
channel_first: False
- RandCropImage:
size: 224
- RandFlipImage:
flip_code: 1
- NormalizeImage:
scale: 1.0/255.0
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
order: ''
sampler: #sampler 类型
name: DistributedBatchSampler
batch_size: 256
drop_last: False
shuffle: True
loader:
num_workers: 4
use_shared_memory: True
Eval:
dataset:
name: ImageNetDataset #验证集名称,可不修改
image_root: /home/aistudio/event_img #验证集存放路径
cls_label_path: /home/aistudio/event_img/val_list.txt #验证集标签文件
transform_ops:
- DecodeImage:
to_rgb: True
channel_first: False
- ResizeImage:
resize_short: 256
- CropImage:
size: 224
- NormalizeImage:
scale: 1.0/255.0
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
order: ''
sampler:
name: DistributedBatchSampler
batch_size: 64
drop_last: False
shuffle: False
loader:
num_workers: 4
use_shared_memory: True
Infer: #预测
infer_imgs: /home/aistudio/event_img/badminton/Hard_Mid_badminton_28.jpg #需要预测的图片
batch_size: 10
transforms:
- DecodeImage:
to_rgb: True
channel_first: False
- ResizeImage:
resize_short: 256
- CropImage:
size: 224
- NormalizeImage:
scale: 1.0/255.0
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
order: ''
- ToCHWImage:
PostProcess:
name: Topk
topk: 5
class_id_map_file: /home/aistudio/event_img/labels.txt
Metric:
Train: #评估指标
- TopkAcc:
topk: [1, 5]
Eval:
- TopkAcc:
topk: [1, 5]
5.模型训练
在准备好数据、模型后,便可以开始迭代模型并更新模型的参数。经过多次迭代最终可以得到训练好的模型来做图像分类任务。图像分类的训练过程需要很多经验,涉及很多超参数的设置,PaddleClas 提供了一些列的训练调优方法,可以快速助你获得高精度的模型。
同时,PaddleClas 还支持使用VisualDL 可视化训练过程。VisualDL 是飞桨可视化分析工具,以丰富的图表呈现训练参数变化趋势、模型结构、数据样本、高维数据分布等。可帮助用户更清晰直观地理解深度学习模型训练过程及模型结构,进而实现高效的模型优化。
通过上述的配置文件即可开始训练模型,首先进入PaddleClas目录
%cd ~/PaddleClas
/home/aistudio/PaddleClas
!python tools/train.py \ #模型训练
-c /home/aistudio/ShuffleNetV2_x0_25.yaml \ #训练的配置文件
-o Arch.pretrained=True #是否加载预训练模型
-o Global.device=gpu #使用GPU进行训练,也可换为cpu 表示使用cpu训练
训练过程可视化
VisualDL 是飞桨可视化分析工具,以丰富的图表呈现训练参数变化趋势、模型结构、数据样本、高维数据分布等。可帮助用户更清晰直观地理解深度学习模型训练过程及模型结构,进而实现高效的模型优化。更多细节请查看VisualDL。
现在 PaddleClas 支持在训练阶段使用 VisualDL 查看训练过程中学习率(learning rate)、损失值(loss)以及准确率(accuracy)的变化情况。
在启动训练程序后,可以在新的终端 session 中启动 VisualDL 服务:
!python3 tools/train.py -c config.yaml
上述命令中,参数--logdir
用于指定保存 VisualDL 日志的目录,VisualDL 将遍历并且迭代寻找指定目录的子目录,将所有实验结果进行可视化。
6.模型推理
当训练得到一个模型之后,如何确定模型的好坏,需要将模型在验证集上进行评估。评估指标一般是 Top1-Acc 或者 Top5-Acc,该指标越高往往代表模型性能越好。
!python3 tools/infer.py \
-c /home/aistudio/ShuffleNetV2_x0_25.yaml \ #指定需要使用的配置文件
-o Infer.infer_imgs=/home/aistudio/event_img/badminton/Easy_Close_badminton_107.jpg \#指定需要预测的图片
-o Global.pretrained_model=output/ShuffleNetV2_x0_25/latest #指定需要加载的模型
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/__init__.py:107: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
from collections import MutableMapping
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/rcsetup.py:20: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
from collections import Iterable, Mapping
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/colors.py:53: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
from collections import Sized
[2022/12/08 21:34:09] ppcls INFO:
===========================================================
== PaddleClas is powered by PaddlePaddle ! ==
===========================================================
== ==
== For more info please go to the following website. ==
== ==
== https://github.com/PaddlePaddle/PaddleClas ==
===========================================================
[2022/12/08 21:34:09] ppcls INFO: Arch :
[2022/12/08 21:34:09] ppcls INFO: class_num : 8
[2022/12/08 21:34:09] ppcls INFO: name : ShuffleNetV2_x0_25
[2022/12/08 21:34:09] ppcls INFO: DataLoader :
[2022/12/08 21:34:09] ppcls INFO: Eval :
[2022/12/08 21:34:09] ppcls INFO: dataset :
[2022/12/08 21:34:09] ppcls INFO: cls_label_path : /home/aistudio/event_img/val_list.txt
[2022/12/08 21:34:09] ppcls INFO: image_root : /home/aistudio/event_img
[2022/12/08 21:34:09] ppcls INFO: name : ImageNetDataset
[2022/12/08 21:34:09] ppcls INFO: transform_ops :
[2022/12/08 21:34:09] ppcls INFO: DecodeImage :
[2022/12/08 21:34:09] ppcls INFO: channel_first : False
[2022/12/08 21:34:09] ppcls INFO: to_rgb : True
[2022/12/08 21:34:09] ppcls INFO: ResizeImage :
[2022/12/08 21:34:09] ppcls INFO: resize_short : 256
[2022/12/08 21:34:09] ppcls INFO: CropImage :
[2022/12/08 21:34:09] ppcls INFO: size : 224
[2022/12/08 21:34:09] ppcls INFO: NormalizeImage :
[2022/12/08 21:34:09] ppcls INFO: mean : [0.485, 0.456, 0.406]
[2022/12/08 21:34:09] ppcls INFO: order :
[2022/12/08 21:34:09] ppcls INFO: scale : 1.0/255.0
[2022/12/08 21:34:09] ppcls INFO: std : [0.229, 0.224, 0.225]
[2022/12/08 21:34:09] ppcls INFO: loader :
[2022/12/08 21:34:09] ppcls INFO: num_workers : 4
[2022/12/08 21:34:09] ppcls INFO: use_shared_memory : True
[2022/12/08 21:34:09] ppcls INFO: sampler :
[2022/12/08 21:34:09] ppcls INFO: batch_size : 64
[2022/12/08 21:34:09] ppcls INFO: drop_last : False
[2022/12/08 21:34:09] ppcls INFO: name : DistributedBatchSampler
[2022/12/08 21:34:09] ppcls INFO: shuffle : False
[2022/12/08 21:34:09] ppcls INFO: Train :
[2022/12/08 21:34:09] ppcls INFO: dataset :
[2022/12/08 21:34:09] ppcls INFO: cls_label_path : /home/aistudio/event_img/train_list.txt
[2022/12/08 21:34:09] ppcls INFO: image_root : /home/aistudio/event_img
[2022/12/08 21:34:09] ppcls INFO: name : ImageNetDataset
[2022/12/08 21:34:09] ppcls INFO: transform_ops :
[2022/12/08 21:34:09] ppcls INFO: DecodeImage :
[2022/12/08 21:34:09] ppcls INFO: channel_first : False
[2022/12/08 21:34:09] ppcls INFO: to_rgb : True
[2022/12/08 21:34:09] ppcls INFO: RandCropImage :
[2022/12/08 21:34:09] ppcls INFO: size : 224
[2022/12/08 21:34:09] ppcls INFO: RandFlipImage :
[2022/12/08 21:34:09] ppcls INFO: flip_code : 1
[2022/12/08 21:34:09] ppcls INFO: NormalizeImage :
[2022/12/08 21:34:09] ppcls INFO: mean : [0.485, 0.456, 0.406]
[2022/12/08 21:34:09] ppcls INFO: order :
[2022/12/08 21:34:09] ppcls INFO: scale : 1.0/255.0
[2022/12/08 21:34:09] ppcls INFO: std : [0.229, 0.224, 0.225]
[2022/12/08 21:34:09] ppcls INFO: loader :
[2022/12/08 21:34:09] ppcls INFO: num_workers : 4
[2022/12/08 21:34:09] ppcls INFO: use_shared_memory : True
[2022/12/08 21:34:09] ppcls INFO: sampler :
[2022/12/08 21:34:09] ppcls INFO: batch_size : 256
[2022/12/08 21:34:09] ppcls INFO: drop_last : False
[2022/12/08 21:34:09] ppcls INFO: name : DistributedBatchSampler
[2022/12/08 21:34:09] ppcls INFO: shuffle : True
[2022/12/08 21:34:09] ppcls INFO: Global :
[2022/12/08 21:34:09] ppcls INFO: checkpoints : None
[2022/12/08 21:34:09] ppcls INFO: device : gpu
[2022/12/08 21:34:09] ppcls INFO: epochs : 60
[2022/12/08 21:34:09] ppcls INFO: eval_during_train : True
[2022/12/08 21:34:09] ppcls INFO: eval_interval : 10
[2022/12/08 21:34:09] ppcls INFO: image_shape : [3, 224, 224]
[2022/12/08 21:34:09] ppcls INFO: output_dir : ./output/
[2022/12/08 21:34:09] ppcls INFO: pretrained_model : output/ShuffleNetV2_x0_25/latest
[2022/12/08 21:34:09] ppcls INFO: print_batch_step : 10
[2022/12/08 21:34:09] ppcls INFO: save_inference_dir : ./inference
[2022/12/08 21:34:09] ppcls INFO: save_interval : 10
[2022/12/08 21:34:09] ppcls INFO: use_visualdl : False
[2022/12/08 21:34:09] ppcls INFO: Infer :
[2022/12/08 21:34:09] ppcls INFO: PostProcess :
[2022/12/08 21:34:09] ppcls INFO: class_id_map_file : /home/aistudio/event_img/labels.txt
[2022/12/08 21:34:09] ppcls INFO: name : Topk
[2022/12/08 21:34:09] ppcls INFO: topk : 5
[2022/12/08 21:34:09] ppcls INFO: batch_size : 10
[2022/12/08 21:34:09] ppcls INFO: infer_imgs : /home/aistudio/event_img/badminton/Easy_Close_badminton_107.jpg
[2022/12/08 21:34:09] ppcls INFO: transforms :
[2022/12/08 21:34:09] ppcls INFO: DecodeImage :
[2022/12/08 21:34:09] ppcls INFO: channel_first : False
[2022/12/08 21:34:09] ppcls INFO: to_rgb : True
[2022/12/08 21:34:09] ppcls INFO: ResizeImage :
[2022/12/08 21:34:09] ppcls INFO: resize_short : 256
[2022/12/08 21:34:09] ppcls INFO: CropImage :
[2022/12/08 21:34:09] ppcls INFO: size : 224
[2022/12/08 21:34:09] ppcls INFO: NormalizeImage :
[2022/12/08 21:34:09] ppcls INFO: mean : [0.485, 0.456, 0.406]
[2022/12/08 21:34:09] ppcls INFO: order :
[2022/12/08 21:34:09] ppcls INFO: scale : 1.0/255.0
[2022/12/08 21:34:09] ppcls INFO: std : [0.229, 0.224, 0.225]
[2022/12/08 21:34:09] ppcls INFO: ToCHWImage : None
[2022/12/08 21:34:09] ppcls INFO: Loss :
[2022/12/08 21:34:09] ppcls INFO: Eval :
[2022/12/08 21:34:09] ppcls INFO: CELoss :
[2022/12/08 21:34:09] ppcls INFO: weight : 1.0
[2022/12/08 21:34:09] ppcls INFO: Train :
[2022/12/08 21:34:09] ppcls INFO: CELoss :
[2022/12/08 21:34:09] ppcls INFO: weight : 1.0
[2022/12/08 21:34:09] ppcls INFO: Metric :
[2022/12/08 21:34:09] ppcls INFO: Eval :
[2022/12/08 21:34:09] ppcls INFO: TopkAcc :
[2022/12/08 21:34:09] ppcls INFO: topk : [1, 5]
[2022/12/08 21:34:09] ppcls INFO: Train :
[2022/12/08 21:34:09] ppcls INFO: TopkAcc :
[2022/12/08 21:34:09] ppcls INFO: topk : [1, 5]
[2022/12/08 21:34:09] ppcls INFO: Optimizer :
[2022/12/08 21:34:09] ppcls INFO: lr :
[2022/12/08 21:34:09] ppcls INFO: learning_rate : 0.0125
[2022/12/08 21:34:09] ppcls INFO: name : Cosine
[2022/12/08 21:34:09] ppcls INFO: warmup_epoch : 5
[2022/12/08 21:34:09] ppcls INFO: momentum : 0.9
[2022/12/08 21:34:09] ppcls INFO: name : Momentum
[2022/12/08 21:34:09] ppcls INFO: regularizer :
[2022/12/08 21:34:09] ppcls INFO: coeff : 1e-05
[2022/12/08 21:34:09] ppcls INFO: name : L2
[2022/12/08 21:34:09] ppcls INFO: train with paddle 2.4.0 and device Place(gpu:0)
W1208 21:34:09.953636 28924 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 11.2
W1208 21:34:09.962896 28924 gpu_resources.cc:91] device: 0, cuDNN Version: 8.2.
[{'class_ids': [1, 5, 3, 6, 2], 'scores': [0.98893, 0.00943, 0.00102, 0.00035, 0.00023], 'file_name': '/home/aistudio/event_img/badminton/Easy_Close_badminton_107.jpg', 'label_names': ['badminton', 'rowing', 'croquet', 'sailing', 'bocce']}]
me/aistudio/event_img/badminton/Easy_Close_badminton_107.jpg’, ‘label_names’: [‘badminton’, ‘rowing’, ‘croquet’, ‘sailing’, ‘bocce’]}]
从上述结果来看,scores列表中第一项预测概率是0.98893是最大值,对应Label_names中的第一项即:badminton,与实际相符。
7.总结
通过本项目的实践,通过飞桨提供的API只是用了4行代码,修改了1个配置文件即实现了8中体育运动的图片分类,大大减轻了的以往“手堆”网络的工作量,借助于迁移学习可以使用大量著名的预训练模型以提高模型精度。
PaddleClas也同时提供了图像增广算法和蒸馏功能,在此项目中未使用,拟在下一步的项目中使用。
该项目为本人参加飞桨特训营第二期学习项目,感谢导师林旭的大力帮助,感谢各位导师专家的授课辅导。
此文章为搬运
原项目链接