mmdetection训练记录

mmdetection多GPU训练说明

1、docker环境:

​ docker exec -it dj_mmdetection /bin/bash 进入docker容器,切换到mmdetection目录

cd /home/mmdetection-envs/mmdetection/

2、找到对的配置文件:

​ 当前目录下==>configs文件夹中找到对应的py文件,根据py文件顶部base找到对应的base配置文件(没有的话就只有文件本身)。比如faster_rcnn_x101_64x4d_fpn_1x_coco.py,其base = ‘./faster_rcnn_r50_fpn_1x_coco.py’,说明要一级一级往上找;又比如atss_r50_fpn_1x_coco.py,其base = [
‘…/base/datasets/coco_detection.py’,’…/base/schedules/schedule_1x.py’, ‘…/base/default_runtime.py’],说明自己本身就是配置文件,只需要修改其他三个了。


3、修改参数:

​ 上一步找到最终的base配置后,都会出现dataset、schedules、runtime三个py文件,其中dataset和schedules是一定要修改的,最好每次train之前都确认一下环境。

​ 首先,进入…/base/schedules/schedule_1x.py文件,如果训练不是1x(对应12epochs),就打开对应轮次的文件。这里主要修改学习率 lr 的值:官方是8张GPU ==> 0.02,如果没有特别说明学习率,一般都是线性计算的,即如果我是4张GPU就0.01,两张就0.005…以此类推。修改并检查完毕后,保存该文件。

​ 然后,进入…/base/datasets/coco_detection.py文件,修改第二行"data_root"结果为当前服务器的数据集路径,如果可以的话也可以修改数据集的mean和std。最后检查30行开始的配置中,是否文件夹和文件名和服务器数据集一一对应了。修改并检查完毕后,保存该文件。

​ 接着回到上一步中的网络对应的base.py,搜索一下配置文件中所有"num_classes",找到并修改为当前数据集的分类个数(fridge_coco是52类)。修改完毕后保存文件。

然后换到另外一个大文件夹下:mmdetection/mmdet下面

​ 继续进入mmdet/datasets/coco.py。把CLASSES的tuple改为自己数据集对应的种类即可(fridge_coco有52类)。最后进入mmdet/core/evaluation/class_names.py修改coco_classes()方法return的list的内容,这也就是上面classes的tuple。修改完毕后保存配置文件。

注:以上参数除了学习率可能经常需要根据GPU个数调整外,其他参数都已经调整好了,但是还是建议训练前多检查一遍,避免数据集等发生变化而不知道。

接下来就可以开始训练了。


4、多卡训练网络:

​ 此时可以cd回到mmdetection目录下,运行如下命令:

 tools/dist_train.sh ${configs下面的配置文件} ${GPU个数} --work-dir ${存储输出权重、日志等的目录}
 # 下面是具体的例子
 tools/dist_train.sh configs/atss/atss_r50_fpn_1x_coco.py 4 --work-dir results/atss_r50_fpn_1x_coco/

​ 第一次运行将会下载对应权重到 /root/.cache/torch/checkpoints/文件夹下面,如果太慢了可以自己下载好再传到服务器对应位置,然后等待训练结束…


5、验证训练好的pth文件:

5-1:官方提供的方式
python tools/test.py ${配置文件} ${训练好的模型} [--out ${保存输出结果的位置}] [--eval ${验证类型}] [--show](此项可显示每个图像检测后的结果)
# 举例说明
python test.py configs/atss/atss_r50_fpn_1x_coco.py result/atss_r50_fpn_1x_coco/epoch_12.pth --eval bbox

​ 该脚本将输出指定网络和指定pth文件下的mAP和Recall值。

5-2:其它脚本

​ 如果想计算一下推理图片的速度,可以用以下代码

# -*- coding:utf-8 -*-
from argparse import ArgumentParser
from mmdet.apis import inference_detector, init_detector, show_result_pyplot
import os
import time

def main():
    parser = ArgumentParser()
    parser.add_argument('imgpath', help='Image path')
    parser.add_argument('config', help='Config file')
    parser.add_argument('checkpoint', help='Checkpoint file')
    parser.add_argument(
        '--device', default='cuda:0', help='Device used for inference')
    parser.add_argument(
        '--score-thr', type=float, default=0.3, help='bbox score threshold')
    args = parser.parse_args()
    # build the model from a config file and a checkpoint file
    model = init_detector(args.config, args.checkpoint, device=args.device)
    basepath = args.imgpath
    imglist = os.listdir(basepath)[0:120]  # 前10张预热,后10张收尾,只计算推理中间100张的时间
    print('capacity :', len(imglist))
    for index, img in enumerate(imglist):
        if index == 10:
            print('start count')
            start = time.time()
        _ = inference_detector(model, os.path.join(basepath, img))
        if index == 110:
            print('end count')
            end = time.time()
    
    print("--------------------------------------------------------")
    total = end - start
    print("total:", total)
    print('fps===>', 100 / total)
    print('over')

if __name__ == '__main__':
    main()

具体代码在mmdetection/demo/countfps.py中,调用方式为:

python demo/countfpn.py ${图片目录} ${配置文件} ${训练好的模型}
# 举例子
python demo/countfpn.py  data/data/fridge_coco/val2014/ configs/atss/atss_r50_fpn_1x_coco.py  result/atss_r50_fpn_1x_coco/epoch_12.pth

你可能感兴趣的:(深度学习,环境部署,深度学习,pytorch)