本项目要求对十二种猫进行分类,属于计算机视觉领域的细粒度图像分类,又被称作子类别图像分类,目的是对属于同一基础类别的图像进行更加细致的子类划分,较之普通的图像分类任务,细粒度图像分类难度更大。仔细观察数据集不难发现,同一物种由于姿态、背景和拍摄角度不同,存在较大类内差异,肉眼可以区分的浅层视觉特征在于颜色、轮廓和纹理,卷积神经网络对于图像特征的区分具有强大的辨别能力,而细粒度图像的差异体现在细微之处,关键在于能否找到不同品种间具有区分性的区域块。
本项目旨在比较ResNet和Vision Transformer两种模型对于细粒度图像分类问题的性能表现。
本数据集在官方数据集的基础上,删除了(5 + 1)张脏图像,并Resize图像尺寸为[224, 224]。
名称 | 训练集和验证集 | 测试集 | 图像尺寸 |
---|---|---|---|
官方数据集 | 2160 | 240 | 任意尺寸都有 |
清洗数据集 | 1724 + 431 | 239 | [224, 224] |
#目录结构
dataset/
├── cat_12_train
│ ├── 0aSixIFj9X73z41LMDUQ6ZykwnBA5YJW.jpg
│ ├── 0bBWRPd2t4NDIaO8567oyTgK3MU9rJZS.jpg
│ | ...
├── cat_12_test
│ ├── mXIfNyVxBOZin4KQlYMdkPTSFA85ugrH.jpg
│ ├── zXyot03giwfhecLJlCm5NjQnY6VHq7Da.jpg
│ | ...
|——train_list.txt
|——valid_list.txt
下载数据集到本地,或在云端进行解压,注意数据集解压路径。
!unzip -oq data/data135339/cat12_dataset.zip -d ./
!git clone https://gitee.com/paddlepaddle/PaddleClas.git -b release/2.3
%cd PaddleClas/
!pip install --upgrade -r requirements.txt -i https://mirror.baidu.com/pypi/simple
%cd ../
配置文件保存在config文件夹下
- config/ResNet152.yaml
- config/ViT_small_patch16_224.yaml
-c
指定配置文件路径,-o
修改配置文件参数,加载预训练模型进行微调。
- ResNet模型训练
!python PaddleClas/tools/train.py \
-c config/ResNet152.yaml \
-o Arch.pretrained=True \
- ViT模型训练
!python PaddleClas/tools/train.py \
-c config/ViT_small_patch16_224.yaml \
-o Arch.pretrained=True \
- ResNet模型评估结果:CELoss: 0.19398, loss: 0.19398, top1: 0.94664, top5: 1.00000
!python PaddleClas/tools/eval.py \
-c config/ResNet152.yaml \
-o Global.pretrained_model=output/ResNet152/best_model \
- ViT模型评估结果:CELoss: 0.24738, loss: 0.24738, top1: 0.91183, top5: 1.00000
!python PaddleClas/tools/eval.py \
-c config/ViT_small_patch16_224.yaml \
-o Global.pretrained_model=output/ViT_small_patch16_224/best_model \
预测结果保存为CSV格式文件,替换PaddleClas/ppcls/engine/engine.py
370行for循环代码,并在开头添加import pandas as pd
。
- ResNet模型预测
!python PaddleClas/tools/infer.py \
-c config/ResNet152.yaml \
-o Infer.infer_imgs=dataset/cat_12_test \
-o Global.pretrained_model=output/ResNet152/best_model \
- ViT模型预测
!python PaddleClas/tools/infer.py \
-c config/ViT_small_patch16_224.yaml \
-o Infer.infer_imgs=dataset/cat_12_test \
-o Global.pretrained_model=output/ViT_small_patch16_224/best_model \
所有指标的评估环境如下:
- Arm CPU 的评估环境基于骁龙 855(SD855)。
- Intel CPU 的评估环境基于 Intel(R) Xeon(R) Gold 6148。
- GPU 评估环境基于 V100 机器,在 FP32+TensorRT 配置下运行 2100 次测得(去除前 100 次的 warmup 时间)。
- FLOPs 与 Params 通过
paddle.flops()
计算得到(PaddlePaddle 版本为 2.2)
模型 | Top-1 ACC | Top-5 ACC | FLOPs(G) | Params(M) | 下载链接 |
---|---|---|---|---|---|
ResNet152 | 0.7826 | 0.9396 | 11.56 | 60.34 | 预训练 |
ViT_small_patch16_224 | 0.7769 | 0.9342 | 9.41 | 48.60 | 预训练 |
高级GPU环境配置如下:
- CPU:2核
- GPU:Tesla v100
- 总显存:16GB
- 总内存:16GB
- 总硬盘:100GB
训练结果
- ResNet152 ACC曲线
- ViT_small_patch16_224 ACC曲线
模型 | top-1 acc | top-5 acc | eta | params | score | load |
---|---|---|---|---|---|---|
ResNet152 | 0.94664 | 1.0000 | 0:39:10 | 223MB | 0.91250 | best_model |
ViT_small | 0.92575 | 1.0000 | 0:48:07 | 183MB | 0.92083 | best_model |
ViT_large | 0.94432 | 1.0000 | 1:31:53 | 1.1GB | - | best_model |
就模型的非线性表达能力而言,ViT显然强过ResNet,这就意味着同等条件下的ViT模型,训练时间更长,训练参数更大,训练精度更高。在解决细粒度图像分类任务时,视觉注意力机制具有可观的发掘潜力,结合数据增强技术TimmAutoAugment和GridMask,在Baseline基础上有希望再提升一到两个百分点。