FCOS for PyTorch [终止随版本演进]

概述

简述

FCOS是一个全卷积的one-stage目标检测模型,相比其他目标检测模型,FCOS没有锚框和提议,进而省去了相关的复杂计算,以及相关的超参, 这些超参通常对目标检测表现十分敏感。借助唯一的后处理NMS,结合ResNeXt-64X4d-101的FCOS在单模型和单尺度测试中取得了44.7%的AP, 因其简化性在现有one-stage目标检测模型中具有显著优势。

  • 参考实现:

    url=https://github.com/open-mmlab/mmdetection
    commit_id=cfd5d3a985b0249de009b67d04f37263e11cdf3d
    
  • 适配昇腾 AI 处理器的实现:

    url=https://gitcode.com/Ascend/DrivingSDK.git
    code_path=model_examples/FCOS
    

准备训练环境

准备环境

安装昇腾环境

请参考昇腾社区中《Pytorch框架训练环境准备》文档搭建昇腾环境。

表 1 昇腾软件版本支持表

软件类型 首次支持版本
FrameworkPTAdapter 7.0.0
CANN 8.1.RC1
  • 当前模型支持的 PyTorch 版本和已知三方库依赖如下表所示。

    表 2 版本支持表

    Torch_Version 三方库依赖版本
    PyTorch 2.1 torchvision==0.16.0

安装模型环境

  1. 激活 CANN 环境

  2. 源码安装 mmcv

    在 FCOS 根目录下,克隆 mmcv 仓,并进入 mmcv 目录安装(安装完为 2.2.0 版本)

    git clone https://github.com/open-mmlab/mmcv
    cd mmcv/
    pip install -r requirements/runtime.txt
    MMCV_WITH_OPS=1 MAX_JOBS=8 FORCE_NPU=1 python setup.py build_ext
    MMCV_WITH_OPS=1 FORCE_NPU=1 python setup.py develop
    cd ../
    
  3. 源码安装 mmengine

    在 FCOS 根目录下,克隆 mmengine 仓,并进入 mmengine 目录应用 patch 后安装

    yes | pip uninstall mmengine
    git clone -b v0.10.6 https://github.com/open-mmlab/mmengine.git
    cd mmengine/
    git checkout a8c74c346d2ef3e5501115529ba588accb5f2a03
    cp ../mmengine.patch ./
    git apply --reject mmengine.patch
    pip install -e .
    cd ../
    
  4. 准备模型源码

    在 FCOS 根目录下,克隆 mmdetection 仓,替换其中部分代码

    git clone https://github.com/open-mmlab/mmdetection.git --depth=1
    cd mmdetection/
    git fetch --unshallow
    git checkout cfd5d3a985b0249de009b67d04f37263e11cdf3d
    cp -rf ../test/ ./
    cp ../mmdet.patch ./
    git apply --reject mmdet.patch
    
  5. 安装其他依赖

    在 mmdetection 代码目录下,安装其他依赖

    pip install torchvision==0.16.0
    pip install -r requirements.txt
    
  6. 安装 Driving SDK 加速库

    参考:https://gitcode.com/Ascend/DrivingSDK

  7. 根据操作系统,安装tcmalloc动态库。

  • OpenEuler系统

在当前python环境和路径下执行以下命令,安装并使用tcmalloc动态库。

mkdir gperftools
cd gperftools
wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.16/gperftools-2.16.tar.gz
tar -zvxf gperftools-2.16.tar.gz
cd gperftools-2.16
./configure --prefix=/usr/local/lib --with-tcmalloc-pagesize=64
make
make install
echo '/usr/local/lib/lib/' >> /etc/ld.so.conf
ldconfig
export LD_LIBRARY_PATH=/usr/local/lib/lib/:$LD_LIBRARY_PATH
export PATH=/usr/local/lib/bin:$PATH
export LD_PRELOAD=/usr/local/lib/lib/libtcmalloc.so.4
  • Ubuntu系统

在当前python环境和路径下执行以下命令,安装并使用tcmalloc动态库。在安装tcmalloc前,需确保环境中含有autoconf和libtool依赖包。

安装libunwind依赖:

git clone https://github.com/libunwind/libunwind.git
cd libunwind
autoreconf -i
./configure --prefix=/usr/local
make -j128
make install

安装tcmalloc动态库:

wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.16/gperftools-2.16.tar.gz
tar -xf gperftools-2.16.tar.gz && cd gperftools-2.16
./configure --prefix=/usr/local/lib --with-tcmalloc-pagesize=64
make -j128
make install
export LD_PRELOAD="$LD_PRELOAD:/usr/local/lib/lib/libtcmalloc.so"

准备数据集

  1. 请用户自行准备好数据集,包含训练集、验证集和标签三部分,可选用的数据集有 COCO、PASCAL VOC 数据集等。

  2. 上传数据集到服务器任意路径下解压,以 coco2017 为例,数据集在 coco2017 目录下分别存放于 train2017、val2017、annotations 文件夹下。

  3. 当前提供的训练脚本中,是以 coco2017 数据集为例,在训练过程中进行数据预处理。 数据集目录结构参考如下:

    ├── coco2017
          ├──annotations
               ├── captions_train2017.json
               ├── captions_val2017.json
               ├── instances_train2017.json
               ├── instances_val2017.json
               ├── person_keypoints_train2017.json
               └── person_keypoints_val2017.json
    
          ├──train2017
               ├── 000000000009.jpg
               ├── 000000000025.jpg
               ├── ...
          ├──val2017
               ├── 000000000139.jpg
               ├── 000000000285.jpg
               ├── ...
    

    说明: 该数据集的训练过程脚本只作为一种参考示例。

准备预训练权重

  1. 联网情况下,预训练权重会自动下载。

  2. 无网络情况下,可以通过该链接自行下载 resnet50_caffe-788b5fa3.pth,并拷贝至对应目录下。默认存储目录为 PyTorch 缓存目录:

~/.cache/torch/hub/checkpoints/resnet50_caffe-788b5fa3.pth

开始训练

训练模型

该模型支持单机 8 卡训练,在 mmdetection 目录下运行训练脚本。

  • 单机 8 卡训练

    cd model_examples/FCOS/mmdetection
    bash ./test/train_8p_full.sh --data_root=/home/datasets/coco2017 # 8p 精度训练,默认 12 epochs
    bash ./test/train_8p_full.sh --data_root=/home/datasets/coco2017 --max_epochs=2 # 8p 性能训练
    

    --data_root 参数填写数据集路径,需写到数据集的一级目录。

    模型训练脚本参数说明如下。

    --data_root                         // 数据集路径,必填参数
    --batch_size                        // 默认 4,训练批次大小,提高会降低ap值,可选参数
    --max_epochs                        // 默认 12,训练轮次,可选参数
    

    训练完成后,权重文件保存在当前路径的 test/output 目录下,并输出模型训练精度和性能信息。

训练结果展示

表 3 训练结果展示表

NAME cards Epochs Global Batchsize FPS mAP
8p-竞品A 8p 12 32 196 0.353
8p-Atlas 800T A2 8p 12 32 196 0.351

版本说明

变更

2024.11.8: 首次提交。

2025.1.23: 资料更新,mmengine 使用源码安装。

2025.2.26: 性能优化,增加训练结果保存到日志功能,删除单机单卡训练脚本,只保留单机 8 卡训练脚本。

FAQ

  1. tcmalloc的动态库文件位置可能因环境配置会有所不同,找不到文件时可以进行搜索,一般安装在/usr/lib64或者/usr/local目录下:
find /usr -name libtcmalloc.so*

找到对应路径下的动态库文件,libtcmalloc.so或者libtcmalloc.so.版本号都可以使用。