代码部分中main.py的作用是进行svm、resnet模型的训练和测试、评估,代码中各函数含义清晰。其中设置了三个args,分别是实验名exp_name, 模型名model以及数据集dataset,运行python时请指定参数。
代码部分中data.py的作用是加载数据集,其中load_and_split_data用于正常加载公开数据集,load_Tsinghua_data用于加载清华数据集全集,load_scene_Tsinghua_data用于加载不同的scene的清华数据集,StairDataset为继承的Dataset类。
代码部分中model.py是Resnet模型的实现
代码部分中refine.py是将部分清华数据集补充进公开数据集并进行训练和测试的代码。cal_acc函数为分scene计算模型在清华数据集上的正确率,单独运行refine文件时在args中指定模型即可。主函数其余部分为对增补数据集后的模型进行测试的代码,仍然在args中指定模型。
代码部分中GradCAM.py为Graf-CAM算法的实现文件,运行可以查看结果,将img_path改为需要的图片即可。
代码部分中distill.py为模型蒸馏部分代码,只需要指定实验名称运行即可。
代码部分中utils.py为存储io工具的部分,方便对实验过程记录。
其余文件中,json文件夹为存储数据集划分文件的文件夹,requirements.txt为代码依赖库的文件。
logs为此前实验的实验记录以及一些最佳模型的记录,其中的run.log均为运行时的记录可以查看,下面分条意义叙述如下:
神经网络:
Res_public为基本公开数据集上的结果,其中models内的model.t7为resnet最佳模型
Res_tsinghua为在基本清华数据集上测试的结果
Res_finetune_test为在清华数据集上分scene测试的结果
Res_finetune_exp为在增补数据集后,训练、测试的结果,内含重新训练好的模型
Res_finetune_check为改进后重新在清华数据集上分scene测试的结果
以svm为前缀的5个文件夹内涵和上述一致,但是svm不需要保存最佳模型
res50为老师模型finetune的训练结果,内含最佳resnet50的模型
student_model1为学生模型单独训练和测试的结果,内含模型
distill_exp4为蒸馏训练和测试的结果,内含模型
distill_result为蒸馏后的测试结果
代码运行环境为:python==3.8.16 CUDA Version: 12.0
各外部库版本为:
matplotlib==3.7.1
numpy==1.24.3
opencv_python==4.7.0.72
Pillow==9.5.0
scikit_learn==1.2.2
torch==1.11.0+cu113
torchstat==0.0.7
torchvision==0.12.0+cu113
tqdm==4.65.0
注意pytorch和torchvision应当通过torch官方网站下载,直接用pip安装requirements.txt会失败
我的训练中,数据集名称为stairs,分为public和tsinghua两个文件夹。stairs就位于整个项目codes文件夹下,直接放置进去运行就行。
神经网络:
(自动会测试评估)训练:python main.py --exp_name [] --model resnet --dataset public
清华测试:python main.py --exp_name [] --model resnet --dataset tsinghua
注:如果要测试上一步训练好的模型,请将tsinghua_main()最后一行395的test_eval()最后一个参数改为你刚才训练的最佳模型的logs地址,只需要改‘res_public’位置即可
SVM:
(自动会测试评估)训练:python main.py --exp_name [] --model svm --dataset public
清华测试:python main.py --exp_name [] --model svm --dataset tsinghua
请注意:exp_name不要和logs中的文件重名。
也可以整体删除掉codes中的logs文件夹,重新开始训练(那样神经网络的清华测试就必须要改地址,因为我原本训练的最佳模型已经被删除)。