###########################################################################
环境搭建
torch=1.6.0
cuda=10.1
python=3.7
1.mmcv安装 https://download.openmmlab.com/mmcv/dist/index.html
1)pip install mmcv (fail)
2) pip install mmcv_full *** (fail)
3)wget https://download.openmmlab.com/mmcv/dist/latest/torch1.6.0/cu101/mmcv_full-latest%2Btorch1.6.0%2Bcu101-cp37-cp37m-manylinux1_x86_64.whl
pip install *.whl
##########################################################################
模型训练
1. 文件修改
1)修改mmdet/datasets/voc.py
# CLASSES = ('aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car',
# 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse',
# 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train',
# 'tvmonitor')
CLASSES = ('smog','background')
2)mmdet/core/evaluation/class_names.py
return [
# modefied by zwx
# 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat',
# 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person',
# 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor'
'smog','background'
]
3) configs/_base_/datasets/voc0712.py
注释掉voc2012
#data_root + 'VOC2012/ImageSets/Main/trainval.txt'
修改batch_size和numworks
samples_per_gpu=4, #batch_size
workers_per_gpu=4, #num_works
(可选)
################################################################################################
3) configs/_base_/models/cascade_rcnn_r50_fpn.py
存在3处,可能不需要全部修改,建议全部修改(类别数包含背景,否则loss为nan)
#num_classes=80, #modified by zwx
num_classes=1,
4)configs/_base_/datasets/voc0712.py
-修改图像大小:img_scale=704*576
-屏蔽VOC2012的路径,和VOC2012变量 保存文件
5)修改 configs/detectors/detectors_cascade_rcnn_r50_1x_coco.py
_base_ = [
'../_base_/models/cascade_rcnn_r50_fpn.py',
#'../_base_/datasets/coco_detection.py',
'../_base_/datasets/voc0712.py', #modified by zwx
'../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py'
]
2.数据集修改
目录:
./data
--VOC2007
----Annotations
----ImageSets
------Main
----JEPGImages
val.txt 修改为 test.txt
3.tensorboard配置(可选)
1)configs/_base_/default_runtime.py 去掉#dict(type='TensorboardLoggerHook')的注释
2)tensorboard --logdir=work_dirs/detectors_cascade_rcnn_r50_1x_coco --host=服务器内部ip (ifconfig获取)--port=8888(根据自己开放的端口设定) #host和port根据自己的配置更改(注意:服务器的ip会动态变化)
3)本地浏览器中输入:http://服务器外部ip(ssh访问ip):10023/(与8888对应的映射端口)
4.执行命令
1)train
python3 ./tools/train.py configs/detectors/detectors_cascade_rcnn_r50_1x_coco.py
2)demo
#单张图片
python demo/image_demo.py demo/smog.jpg configs/detectors/detectors_cascade_rcnn_r50_1x_coco.py work_dirs/detectors_cascade_rcnn_r50_1x_coco/latest.pth
#图片文件夹(需要自己修改)
python demo/image_demo.py demo/smog configs/detectors/detectors_cascade_rcnn_r50_1x_coco.py work_dirs/detectors_cascade_rcnn_r50_1x_coco/latest.pth
3)test
python tools/test.py configs/detectors/detectors_cascade_rcnn_r50_1x_coco.py work_dirs/detectors_cascade_rcnn_r50_1x_coco/latest.pth --eval mAP
###############################################################
错误记录
1. no moudle named 'mmcv.exit'
解决:根据环境版本,本地安装mmcv,见上诉mcv安装操作
2. KeyError: 'smog'
解决:将一个类('smog')修改为('smog','background')
如果只有一个类别
mmdet/datasets/xml_style.py 文件中 103~105行的self.CLASSES类型为'str',正确的类型应为'tuple'
3. name 'difficult' is not defined
mmdet/datasets/xml_style.py中115~116行新增变量 difficult=False
4. 在运行1300~1900的时候,出现rcnn的loss为nan
解决:
1)调整学习率,configs/_base_/schedules/schedule_1x.py : lr 0.02 -> 0.002 (未解决)
2)梯度裁剪,configs/_base_/schedules/schedule_1x.py: grad_clip =none -> grad_clip=dict(max_norm=35, norm_type=2) (未解决)
3)使用更小的数据集(train.txt前1000行),正常运行(recall:0.765 ,ap:0.652)
原因:
trainval.txt对应的xml文件中bbox存在面积为0的情况。如:
具体为:
005334.xml
012710.xml
小提示:
在测试的时候,batch_size和trainval中的数据集最好为偶数,否则可能存在不能整除的情况(余数=1),程序会报错。
5.locale.Error: unsupported locale setting
$locale 查看配置
$export LC_ALL=C #使用系统默认 locale并覆盖其它值
##############################################################
其它技巧
1. gdb调试
1)设置断点
import pdb
pdb.set_trace()
2)执行命令
python -m pdb ...
3)操作
c 执行到断点
n 单步执行
s 跳入
pp 打印变量,如:pp background
! 动态更改变量的值
l 查看代码段
...
2. pycallgraph可视化函数调用,需要安装相关包
mmdet/apis/train.py :
from pycallgraph import PyCallGraph
from pycallgraph import Config
from pycallgraph.output import GraphvizOutput
config = Config(max_depth=5)
graphviz = GraphvizOutput(output_file=r'trace_detail.png')
with PyCallGraph(output=graphviz): #不同位置执行,会有不同的结果
runner.run
3.