课程

mim很好用,感觉需要更多地研究一下

流程

下载配置文件和模型

1
mim download mmcls --config mobilenetblablabla --dest .

使用API

1
2
3
4
5
6
from mmcls.apis import init_model, inference_model
model = init_model('config.py', 'model.pth', device='cuda:0')
result = inference_model(model, 'pic.jpg')

from mmcls.apis import show_result_pyplot
show_result_pyplot(model, 'pic.jpg', result)

修改配置文件

1
2
3
4
5
6
7
8
num_classes = 10
load_from = 'model_path.pth'
type = 'CustomDataset'
ann_file = None # 为空则按文件夹结构推断
lr = 0.005 # n卡至1k、微调训练均需降低lr
runner = dict(type='EpochBasedRunner', max_epochs=5)
checkpoint_config # 可适度升高避免频繁存储模型
log_config # 可适度提升

开始训练

1
mim train mmcls mobilenet-v2_fruit.py

作业记录

作业很简单。top-1能到95以上。进阶作业比较同质化,又没啥原创性的想法改网络结构,懒得做了。一些注意事项记录如下。

解决ImportError: cannot import name 'blablabla' from 'mmcv'问题:重装mmcv-full

  1. pip list | grep mmcv 发现有mmcvmmcv-full
  2. 卸载mmcv
  3. 重装mmcv-fullmim uninstall mmcv-full + mim install mmcv-full

更新pip包:pip install -U

mim命令行工具很好用,调config文件的时候用非常方便,且下载的config文件是完整而非基于__base__的。

1
mim download mmcls --config mobilenet-v2_8xb32_in1k --dest .

关于保存最好的一次,请见issue和我的回答

关于evaluation其实有一些令人迷惑的地方,比如这里的metric='accuracy'ClsHead里的topk=(1, 5)之间有什么关系?config文件中是这样写的:

1
evaluation = dict(interval=1, metric='accuracy', save_best='accuracy_top-1')

这里的intervalsave_best是传给EvalHook的,而metric等其他参数则是传给CustomDataset(或其他数据集类)的。实际上还有别的metric,base_dataset.py代码文件中evaluate函数是这样写的

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
# def evaluate(...):
# ...
if metric_options is None:
metric_options = {'topk': (1, 5)}
if isinstance(metric, str):
metrics = [metric]
else:
metrics = metric
allowed_metrics = [
'accuracy', 'precision', 'recall', 'f1_score', 'support'
]
# ...
if 'accuracy' in metrics:
if thrs is not None:
acc = accuracy(results, gt_labels, topk=topk, thrs=thrs)
else:
acc = accuracy(results, gt_labels, topk=topk)
if isinstance(topk, tuple):
eval_results_ = {
f'accuracy_top-{k}': a
for k, a in zip(topk, acc)
}
else:
eval_results_ = {'accuracy': acc}
# ...
return eval_results

所以这个save_best传递的accuracy_top-1实际上是eval_result的一个key