目录
1. EfficientFormer介绍
2. 环境配置和修改文件
3.修改文件
4. 启动
运行环境:Windows10 I7-13700k RTX4080 Cuda11.3
1. 介绍
Transformer和CNN在CV领域广泛使用,CNN和Transformer已经对战多年, 在目标检测中通常是CNN比较常用,因为transfomer参数量大且训练时间长.
最近的一篇论文提出了EfficientFormer是改进的VIT(vision transformer),其在轻量化的同时也能提高精度,并且目标是达到移动设备可以使用的速度。为了水论文,我们可以跑通这个模型,并训练自己的数据集,接下来我将一步步介绍如何训练自己的模型.从官方论文结果来看改进后的参数量和速度提升了很多. 源代码是基于mmdetction框架实现的。
代码论文:EfficientFormer
github源码:GitHub - snap-research/EfficientFormer: EfficientFormerV2 [ICCV 2023] & EfficientFormer [NeurIPs 2022]
2. 环境配置
打开pycharm,创建一个环境,然后在终端依次输入以下代码,注意如果要用CUDA加速,pytorch可以到官网根据自己对应CUDA版本下载.
pip install -r requirements.txt
pip install -U openmim
mim install mmcv-full==1.7.1
mim install mmdet==2.28.2
mim install timm==0.6.13
pip install yapf==0.40.1
pip install apex
注意:训练的数据集格式是CocoDataset,大家可以自己查找如何制作COCO2017数据集格式。
3. 文件修改
由于源代码是分布式训练的,且classes num数量不一致,我们需要修改代码。
(1)由于不使用实例分割,我们需要修改模型datasets为检测 configs/mask_rcnn_efficientformerv2_l_fpn_1x_coco.py修改 _base_ =[ ]中的datasets为cocodetction.py 如下
(2) 由于官方模型框架使用了Coco数据集有80类分类,我们使用自己的数据集时需要修改detection/configs/_base_/models/mask_rcnn_r50_fpn 47行,66行num_classes 为你数据集的类别数,如我的是2.
如果用不上实例分割,需要把56行至68行注释掉
(3) 修改detection/configs/datasets/coco_detection.py
修改此文件中第二行的data_root到你的COCO数据集目录,并且把下面的代码改到对应的json 标签文件。
(4)在根目录创建一个weights文件夹,将预训练模型放进去.
预训练模型在google,我这里提供百度网盘:EfficientFormerv2_L 提取码:1xlc
如下
(5)由于使用的是MMdetection框架,其源代码的CocoDataset也是Coco数据集的类别,在训练自己的数据时会出现错误,所以我们要对mmdetection的coco代码进行修改,打开对应aconda环境的目录如我的C:\ProgramData\Anaconda3\envs\EfficientFormer-main\Lib\site-packages\mmdet\core\evaluation\class_names.py 将68行coco classes 改成自己的类别如图
然后是同样是以上目录,到mmdet\datasets\coco.py中24行的CLASSES也修改为自己的.
(6)因为源代码为分布式训练,对于单卡训练我们还需要修改源代码(后面才知道为什么要多卡训练,因为单卡4080要训练2天,哈哈)
修改如下:C:\ProgramData\Anaconda3\envs\EfficientFormer-main\lib\site-packages\torch\nn\modules\batchnorm.py 中726行增加一个强行关闭分布式训练,如果多卡训练,那可以跳过。
need_sync = False
如图:
4. 启动
最后在终端cd 到detection文件夹下,使用命令即可启 动训练:
python train.py configs/mask_rcnn_efficientformerv2_l_fpn_1x_coco.py
得到如下效果,eta显示要训练差不多2天.