参考博客:【小样本目标检测实践VOC格式】Frustratingly Simple Few-Shot Object Detection-优快云博客
一、配置环境
1、代码下载链接:GitHub - wz940216/few-shot-object-detection: Implementations of few-shot object detection benchmarks
2、创建环境
conda create -n tfa python=3.7 #创建名为tfa的环境
conda activate tfa #激活环境
3、pytorch安装
这里我安装的是torch 1.9.0 + cu111
pytorch网址链接:PyTorch
pip install torch==1.9.0+cu111 torchvision==0.10.0+cu111 torchaudio==0.9.0 -f https://download.pytorch.org/whl/torch_stable.html
4、detectron2安装
我安装的是对应torch1.9.0 + cu111的 detectron2 v0.5 版本(注意:detetron2需根据torch版本选择对应版本进行安装)
detetron2网址:Releases · facebookresearch/detectron2 (github.com)
python -m pip install detectron2==0.5 -f \
https://dl.fbaipublicfiles.com/detectron2/wheels/cu111/torch1.9/index.html
5、其他库安装
cd 到下载的代码文件下,安装requirements.txt中所写库
python3 -m pip install -r requirements.txt
二、制作数据集
1、将自己的数据集准备好后放入代码中的datasets文件下,其中datasets/VOC2007/Annotations保存的为标签文件,datasets/VOC2007/ImageSets/Main保存的是训练,测试的txt文件,datasets/VOC2007/JPEGImages保存的是所有的图像(包括所有基类和新类训练、验证以及测试的图像)
2、下载官方预训练权重
下载链接:
3、制作few-shot数据集
修改fsdet/data/builtin.py文件中有关voc数据集代码
由于我的数据集中只有voc2007,为了方便起见,所有year中只保留了2007
修改fsdet/data/builtin_meta .py中类别,我的数据集结构为 2 basec lasses,1 novel class
修改fsdet/data/meta_pascal_voc .py中数据集路径
修改 datasets/prepare_voc_fews_shot .py中类别、路径后,运行,会在dadasets/vocsplit下生成few-shot数据集
三、训练
(1)基础训练
修改configs/Base-Rcnn-FPN.yaml中学习率(自行选择是否修改)
修改configs/PascalVOC-detection/split/faster_rcnn_R_101_FPN_base1.yaml文件
weights修改为之前下载好的pkl文件路径,num_classes修改为基类,Datasets中train和test修改为我们注册好的数据集,max_iter可修改迭代次数
修改好后我们开始第一阶段训练,在终端运行以下代码 ,我采用单卡训练,故num-gpus为1
python3 -m tools.train_net --num-gpus 1 \
--config-file configs/PascalVOC-detection/split1/faster_rcnn_R_101_FPN_base1.yaml
(2)初始化检测头
在进行完基础训练后,会生成checkpoint文件夹,在其中找到model_final.pth文件,则证明训练完成
在tools/ckpt_surgery.py中修改src1,save-dir,method参数,其中src1为上一步所提到的checkpoint文件夹下model_final.pth文件,save-dir为初始化检测头后权重文件保存路径,method为初始化方法,这里选择随机初始化
运行tools/ckpt_surgery.py,在save-dir中路径产生初始化后权重文件
(3)迁移训练
这里我选择10shot训练方式,修改configs/pascalvoc/split1/faster_rcnn_ R_101_FPN_ft_all1_10shot.yaml文件中weights为上一步中转换后的权重文件,num-classes为所有类别,datasets修改为已注册的自定义数据集。
base-lr为学习率参数,可自行修改,ims_per_batch为batchsize参数,可自行修改,max-iters为迭代次数,可自行修改。
修改好后,终端运行
python3 -m tools.train_net --num-gpus 1 \
--config-file configs/pascalvoc/split1/faster_rcnn_ R_101_FPN_ft_all1_10shot.yaml
训练完后,发现新类类别AP为0,故不冻结backbone进行训练,修改configs/pascalvoc/split1/faster_rcnn_ R_101_FPN_ft_all1_10shot.yaml文件中backbone中freeze参数为false
重新训练后得到
至此,完成所有训练。