docker exec -it dj_mmdetection /bin/bash 进入docker容器,切换到mmdetection目录
cd /home/mmdetection-envs/mmdetection/
当前目录下==>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’],说明自己本身就是配置文件,只需要修改其他三个了。
上一步找到最终的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个数调整外,其他参数都已经调整好了,但是还是建议训练前多检查一遍,避免数据集等发生变化而不知道。
接下来就可以开始训练了。
此时可以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/文件夹下面,如果太慢了可以自己下载好再传到服务器对应位置,然后等待训练结束…
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值。
如果想计算一下推理图片的速度,可以用以下代码
# -*- 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