• 复现 MMDetection


    MMDetection 复现

    一、环境配置

    服务器信息

    • 输入nvidia-smi查看显卡驱动。(或者输入nvidia-smi -a显示更详细的信息)
      在这里插入图片描述

    安装CUDA

    下载并安装CUDA

    cuda10.2官网下载地址

    在这里插入图片描述

    # 安装cuda10.2
    sudo bash cuda_10.2.89_440.33.01_linux.run
    
    • 1
    • 2

    在这一步时,一定要按Enter键取消Driver安装,因为我们先前已经安装好了显卡驱动。([ ] 表示不会安装,[X]表示安装)

    在这里插入图片描述

    配置环境变量

    • 修改~/.bashrc文件
    vi ~/.bashrc
    
    • 1
    • 添加如下环境变量:
    export CUDA_HOME=/usr/local/cuda
    export PATH=$PATH:$CUDA_HOME/bin 
    export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
    
    • 1
    • 2
    • 3
    • 让环境变量生效
    source ~/.bashrc
    
    • 1
    • 检查是否安装成功
    nvcc -V
    
    • 1

    在这里插入图片描述

    多个Cuda版本切换 (可选)

    • 在安装了多个cuda版本后,可以在/usr/local/目录下查看自己安装的cuda版本
    cd /usr/local/
    ls
    
    • 1
    • 2

    在这里插入图片描述

    • 使用stat命令查看当前cuda软链接指向的哪个cuda版本
    stat cuda
    
    • 1

    在这里插入图片描述

    • 重新建立软链接
    # 删除当前的软链接
    sudo rm -rf cuda
    # 建立新的软链接到cuda9.2版本上
    sudo ln -s /usr/local/cuda-9.2 /usr/local/cuda
    
    • 1
    • 2
    • 3
    • 4

    安装CUDNN

    • 安装Cudnn
    # 解压
    tar xvf cudnn-10.2-linux-x64-v7.6.5.32.tgz
    # 复制cudnn中的一些文件到cuda下
    sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
    sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/
    # 改变权限
    sudo chmod a+r /usr/local/cuda/include/cudnn.h
    sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    安装Anaconda

    • 选择相应的版本进行下载
    wget https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-x86_64.sh
    
    • 1
    • 安装Anaconda
    bash Anaconda3-2022.05-Linux-x86_64.sh
    # 然后下一步继续就行。
    # 说明:中间需要选择的都选yes或enter。
    
    • 1
    • 2
    • 3
    • 初始化环境变量
    cd ~ && source .bashrc
    
    • 1
    • 启动Anaconda
    conda activate
    
    • 1
    • 退出Anaconda
    conda deactivate
    
    • 1

    搭建虚拟环境

    新建虚拟环境

    # 新建名为open-mmlab的虚拟环境,python=3.8
    conda create -n open-mmlab python=3.8 -y
    # 查看当前存在的虚拟环境
    conda env list
    # 进入open-mmlab
    conda activate open-mmlab
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    安装pytorch

    pip install torch-1.9.0+cu102-cp38-cp38-linux_x86_64.whl
    pip install torchvision-0.10.0+cu102-cp38-cp38-linux_x86_64.whl
    
    • 1
    • 2

    Pycharm 远程连接

    代码同步

    • 选择toolsdeploymentconfiguration

    • 点击左上方的+号选择SFTP协议传输文件。

    • 配置 ssh configuration, 点击

    • 点击左上角的+号,按自己的服务器填写信息

    • 配置完成后点击test connnection测试连接

    在这里插入图片描述

    • 配置mappinglocal path是自己项目的本地地址,deployment path是服务器上我们存放项目的地址。
      在这里插入图片描述

    • 在pycharm中选中要上传的文件,然后点击Upload to Default Server

    • 勾选Automatic Upload,至此我们的文件就不需要手动同步到服务器上了,可以通过upload to命令执行。

    配置服务器解释器

    • 选择filesettings

    • 选择projectpython interpreter,点击右上方add interpreter

    • 选择ssh interpreter

    • 选择existing interpreter ,选择我们刚刚添加的服务器

    在这里插入图片描述

    • 点击interpreter右边的,找到服务器中安装的anaconda
      路径, 然后在该路径下选择解释器 anaconda/envs/环境名称/bin/python3

    • 点击sync folders并将remote path改成我们服务器上存放项目的地址。

    在这里插入图片描述

    二、训练和推理

    自制COCO格式数据集

    coco数据集

    ├── coco2017: 数据集根目录
         ├── train2017: 所有训练图像文件夹(118287张)
         ├── val2017: 所有验证图像文件夹(5000张)
         └── annotations: 对应标注文件夹
                   ├── instances_train2017.json: 对应目标检测、分割任务的训练集标注文件
                   ├── instances_val2017.json: 对应目标检测、分割任务的验证集标注文件
                   ├── captions_train2017.json: 对应图像描述的训练集标注文件
                   ├── captions_val2017.json: 对应图像描述的验证集标注文件
                   ├── person_keypoints_train2017.json: 对应人体关键点检测的训练集标注文件
                   └── person_keypoints_val2017.json: 对应人体关键点检测的验证集标注文件夹
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    coco数据集中的标签文件 .json

    • json 文件类型
    <class 'dict'>
    
    • 1
    • 字典长度
    5
    
    • 1
    • 字典中的key
    dict_keys(['info', 'images', 'licenses', 'annotations', 'categories'])
    
    • 1
    • info 对应的键值
    {'description': 'This is stable 1.0 version of the 2014 MS COCO dataset.', 
    'url': 'http://mscoco.org', 
    'version': '1.0', 
    'year': 2014, 
    'contributor': 'Microsoft COCO group',
     'date_created': '2015-01-27 09:11:52.357475'
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • licenses 对应的键值
    [{'url': 'http://creativecommons.org/licenses/by-nc-sa/2.0/', 'id': 1, 'name': 'Attribution-NonCommercial-ShareAlike License'}, 
    {'url': 'http://creativecommons.org/licenses/by-nc/2.0/',     'id': 2, 'name': 'Attribution-NonCommercial License'}, 
    {'url': 'http://creativecommons.org/licenses/by-nc-nd/2.0/',   id': 3, 'name': 'Attribution-NonCommercial-NoDerivs License'},
    {'url': 'http://creativecommons.org/licenses/by/2.0/',        'id': 4, 'name': 'Attribution License'}, 
    {'url': 'http://creativecommons.org/licenses/by-sa/2.0/',     'id': 5, 'name': 'Attribution-ShareAlike License'},
    {'url': 'http://creativecommons.org/licenses/by-nd/2.0/',     'id': 6, 'name': 'Attribution-NoDerivs License'},
    {'url': 'http://flickr.com/commons/usage/',                   'id': 7, 'name': 'No known copyright restrictions'},
    {'url': 'http://www.usa.gov/copyright.shtml',                 'id': 8, 'name': 'United States Government Work'}
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • **image** 对应的键值

      id : 每一张图片具有唯一的一个独特的编号

      height : 代表的是图片的高

      width:代表的是图片的宽

      file_name:代表的是图片的名字

    'images': [
            {
                'file_name': 'COCO_val2014_000000001268.jpg',
                'height': 427,
                'width': 640,
                'id': 1268  
            },
            ...
        ],
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • **annotation** 对应的键值

      id:指的是这个annotation的一个id
      image_id:等同于前面image字段里面的id。
      category_id:类别id
      segmentation:实例分割的区域
      area:标注区域面积
      bbox:标注框,x,y为标注框的左上角坐标。
      iscrowd:决定是RLE格式还是polygon格式。

    'annotations': [
            {
                'segmentation': [[192.81,
                    247.09,
                    ...
                    219.03,
                    249.06]],  # if you have mask labels
                'area': 1035.749,
                'iscrowd': 0,
                'image_id': 1268,
                'bbox': [192.81, 224.8, 74.73, 33.43],
                'category_id': 16,
                'id': 42986
            },
            ...
        ],
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • categories 对应的键值

      id:类别id

      name:类别名字

    'categories': [
            {'id': 0, 'name': 'car'},
         ]
    
    • 1
    • 2
    • 3

    训练

    • 说明
    num_classes=13
    CLASSES=('Yellow','RedLeft','Red','GreenLeft','Green','off','GreenRight','GreenStraight','GreenStraightRight','RedRight','RedStraight','RedStraightLeft','GreenStraightLeft')
    
    • 1
    • 2

    修改数据集相关参数

    1. 修改数据集路径文件:configs/_base_/datasets/coco_detection.py

      1. 修改data_root为自己数据集的路径
      2. 修改data字典中trainvalteat相关路径
    2. 修改模型配置文件:configs/_base_/models/faster_rcnn_r50_fpn.py

      1. 定位到roi_head字典出,修改bbox_head字典中的num_classes13
    3. 修改coco数据集定义文件:mmdet/datasets/coco.py

      1. CLASSES那里的参数修改为:

        CLASSES = (
            'Yellow', 'RedLeft', 'Red', 'GreenLeft', 'Green', 'off', 'GreenRight', 'GreenStraight', 'GreenStraightRight',
            'RedRight', 'RedStraight', 'RedStraightLeft', 'GreenStraightLeft')
        
        • 1
        • 2
        • 3
      2. PALETTE参数随意选13个留下即可,这个参数用来指定每个类别框的显示颜色

    4. 修改class_name:mmdet/core/evaluation/class_names.py

      1. 定位到coco_classes函数,修改return中的参数为:

        def coco_classes():
            return [
                'Yellow', 'RedLeft', 'Red', 'GreenLeft', 'Green', 'off', 'GreenRight', 'GreenStraight', 'GreenStraightRight',
                'RedRight', 'RedStraight', 'RedStraightLeft', 'GreenStraightLeft'
            ]
        
        • 1
        • 2
        • 3
        • 4
        • 5

    修改训练相关参数

    1. 修改学习率、优化器相关参数:configs/_base_/schedules/schedule_1x.py
      1. 主要修改学习率lr的值,一般按照线性计算,官方8张GPU设置为0.02,则4张为0.01,2张为0.005

    训练模型

    • 在训练前要先编译
    sudo python3 setup.py develop
    
    • 1

    mmdetection目录下新建test_work_dirs文件夹

    • 单GPU训练
    python tools/train.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py --gpus 1 --work-dir test_work_dirs
    
    • 1
    • 多GPU训练

    不指定GPU训练

    python3 tools/train.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py --gpus 1 --validate --work_dir test_work_dirs
    
    • 1

    指定GPU训练

    CUDA_VISIBLE_DEVICES=${指定的GPU} tools/dist_train.sh ${configs下面的配置文件} ${GPU个数} --work-dir ${存储输出权重、日志等的目录}
    
    • 1

    CUDA_VISIBLE_DEVICES=2,3指定使用GPU-3和GPU-4,同时要设置GPUS=2

    CUDA_VISIBLE_DEVICES=2,3 tools/dist_train.sh configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py 2 --work-dir test_work_dirs
    
    • 1

    推理

    对批量数据进行标注

    # Copyright (c) OpenMMLab. All rights reserved.
    import asyncio
    from argparse import ArgumentParser
    
    from mmdet.apis import (async_inference_detector, inference_detector,
                            init_detector, show_result_pyplot)
    import os
    import tqdm
    
    
    def parse_args():
        parser = ArgumentParser()
        # 存放推理数据的文件夹
        parser.add_argument('--img', default='../data/coco/test2017', help='Image file')
        # 存放配置文件
        parser.add_argument('--config', default='../configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py', help='Config file')
        # 存放权重文件
        parser.add_argument('--checkpoint', default='../test_work_dirs/epoch_45.pth', help='Checkpoint file')
        parser.add_argument('--out-file', default='output/rcnn_45', help='Path to output file')
        parser.add_argument('--device', default='cuda:0', help='Device used for inference')
        parser.add_argument(
            '--palette',
            default='coco',
            choices=['coco', 'voc', 'citys', 'random'],
            help='Color palette used for visualization')
        parser.add_argument('--score-thr', type=float, default=0.2, help='bbox score threshold')
        args = parser.parse_args()
        return args
    
    
    def main(args):
        # build the model from a config file and a checkpoint file
        model = init_detector(args.config, args.checkpoint, device=args.device)
    
        for filename in tqdm.tqdm(os.listdir(args.img)):
            img = os.path.join(args.img, filename)
            result = inference_detector(model, img)
            out_file = os.path.join(args.out_file, filename)
            show_result_pyplot(
                model,
                img,
                result,
                palette=args.palette,
                score_thr=args.score_thr,
                out_file=out_file)
    
    
    if __name__ == '__main__':
        args = parse_args()
        main(args)
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    参考

    • 数据集

    Bosch Small Traffic Lights Dataset

    • 环境配置

    ubuntu18.04 安装多个CUDA版本并可以随时切换_平凡中寻找不平凡的博客-CSDN博客

    Ubuntu18.04安装CUDA11.0 Installation failed. See log at /var/log/cuda-installer.log for details._English ONly的博客-CSDN博客_cuda installer界面

    Pycharm连接服务器中的anaconda环境_LGhoyg的博客-CSDN博客_pycharm使用服务器的conda环境

    mmdetection/get_started.md at master · open-mmlab/mmdetection

    • 训练

    Bosch Small Traffic Lights Dataset

    【ubuntu】如何解压 .zip.001 .zip.002 .zip.003 文件_轮子去哪儿了的博客-CSDN博客_zip.001 zip.002

    COCO数据集的 标签文件.json解读、理解_轮子去哪儿了的博客-CSDN博客_coco数据集标签文件

    COCO数据集标注格式及意义_梦坠凡尘的博客-CSDN博客_coco标注格式

    【MMDetection】v2.22.0入门:训练自己的数据集_嗜睡的篠龙的博客-CSDN博客

    mmdetection_周月亮的博客-CSDN博客_mmdetection

    https://github.com/ming71/toolbox

    https://github.com/spytensor/prepare_detection_dataset

  • 相关阅读:
    【每日一记】OSPF卡在2-way状态、OSPF卡在Exstart状态解析
    P7961 [NOIP2021] 数列
    Ae 效果:CC Bubbles
    乐高Studio打开Solidworks零件/装配体 (sw另存obj文件)
    Node-工具模块
    玩转技巧|如何安全和方便地操作 Github
    功能测试人员如何做到花一个月的时间进阶自动化软件测试工程师
    python+nodejs+java校园网络自主报修系统Vue项目
    强缓存和协商缓存原理,及前端如何和服务端一同控制影响浏览器缓存,以及代码实战
    多线程基础篇(多线程案例)
  • 原文地址:https://blog.csdn.net/zyw2002/article/details/128166335