人工智能小白,最近在学习目标检测,在此分享所学与学习过程中的问题
项目仓库地址(源码):https://github.com/open-mmlab/mmdetection
(注:官方提供的代码默认要求使用coco格式的数据集)
新建data文件夹存储coco数据集,coco数据集按照如下目录存储(部分源码中的文件下图未体现,但不代表训练时未体现文件不需要):
mmdetection-master
├── mmdet
├── tools
├── configs
├── data
│ ├── coco
│ │ ├── annotations
│ │ ├── train2017
│ │ ├── val2017
(1)configs/base/datasets下的
coco_detection.py
coco_instace.py
coco_instace_semantic.py
这三个文件当中的img_scale=(,)(图片的最大长度和最小长度)根据自己电脑的GPU适当改动(以上三个文件当中,各有两处img_scale需要改,即总共需要改六处)
(2)configs/yolox/yolox_s_8x8_300e_coco.py(yolox->选择自己要使用的算法,不一定是我写的这个;yolox_s_8x8_300e_coco.py->自己所需的配置文件,不一定是这个名)下的
修改两个文件中的num_classes=80,将“80”改为自己数据集的种类个数(例如猫狗模型,那么种类即为2)
(3)mmdet/core/evaluation/classnames.py下的
CLASSES = (‘Glass_Insulator’, ‘Composite_Insulator’, ‘Clamp’, ‘Drainage_Plate’)替换为自己数据分类id
eg:我的数据分类id为1,因此我的修改如下图:
mmdetection/mmdet/core/evaluation/class_names.py下的
def coco_classes():
return [
‘Glass_Insulator’, ‘Composite_Insulator’, ‘Clamp’, ‘Drainage_Plate’
]修改为自己的数据分类id(即标定数据集时的命名)
(1)打开tool/train.py进行训练
输入命令python tools/train.py configs/yolox(你选择的算法)/yolox_s_8x8_300e_coco.py(上面“第二步修改”时自己所选的配置文件名) --gpus 1 --work-dir demo1_test
(2)一旦开始训练后立即掐断(使用Ctrl+C掐断)
eg:大约看到像如下图片时就可以掐断了
(3)此时我们再看目录会发现生成一个“demo1_test”文件(名称与上一小步的–work-dir demo1_test相同),此时我们会发现在此文件下包含三个文件(目录大致如下图)
eg:下面文件名可能略有不同
├── demo1_test
│ ├── 20220122_104751.log
│ ├── 20220122_104751.log.json
│ ├── yolox_s_8x8_300e_coco.py
打开其中的生成的配置文件“yolox_s_8x8_300e_coco.py”(这个生成的文件与“第二大步修改”所选取的配置文件名相同)
找到 log_config=dict(interval=50,hooks=…)
interval=50表示50次迭代才会生成一次日志信息,但我们希望日志信息越详细越好,所以建议调小一点(例如:调成5)
(4)用自己生成的配置文件进行训练(在此训练前先删掉“demo1_test”文件下的两个.log.json和.log文件)
输入命令python tools/train.py demo1_test/yolox_s_8x8_300e_coco.py(生成的配置文件名)–gpus 1 --work-dir demo1_test
打开tools/analyze_logs.py
a.将某些参数生成折线图
输入命令将某些参数生成折线图的命令语句,便于观察:
python tools/analize_logs.py pot_curve demo1_test/20220122_104751.log.json(生成的.json文件名) --keys acc(可以将acc替换成你所要查看的参数,也可以多个一起查看 --keys loss_cls loss_bbox loss_mask)
b.将生成的折线图保存成pdf(或jpg)
输入将生成的图片保存成pdf的命令语句:
python tools/analysis_tools/analyze_logs.py plot_curve demo1_test/20220122_104751.log.json --keys loss_obj loss time --out out.pdf(若要生成jpg文件,则将其换成–out out.jpg)
(1)tools/test.py下
输入命令:
python tools/test.py demo1_test/yolox_s_8x8_300e_coco.py(你的配置文件)demo1_test/epoch_24.pth(你所选择的用来检测的模型,一般用最后一个模型) --show
此时展示的只是图片的ID并非名字
解决方法:在json文件中删掉有关“furty_186.jpg”的图片信息: 例如:报错如题目所示,则在json文件中删掉如下图的两部分
解决方法:报这种错误,表示目录错误按照报错的目录重新排布一下即可
解决方法: 找运行入口的参数
num_classes
(1) in Shared2FCBBoxHead of MMDataParallel does not matches the length of CLASSES
80) in CocoDataset解决方法:可能是源码或生成的配置文件内的num_classes没有改成自己数据集的“类”个数