这是20年发表在IEEE上的关于细粒度识别的一篇论文。
这篇论文代码,个人认为存在很大的问题,在跑了几篇论文之后,总结出了这样的规律,越是顶会的论文,越容易复现,鲁棒性也特别强,相反,其余的论文质量参差不齐,经受不住读者的检验,更别说是时间的检验了!下面介绍一下跑此篇代码遇到的问题!
论文链接:https://pan.baidu.com/s/1tZ6pz4HOYmbK0jjUqUiL4A
提取码:2021
复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V2的分享
论文源地址:https://ieeexplore.ieee.org/document/9027108
代码地址:https://github.com/mboboGO/MOMN
1、首先就是环境的问题,先来看看github上给的环境:
pytorch1.0,经过我验证有一个load_state_dict_from_url的库需要pytorch>=1.1.0,这不就与给的环境冲突吗???
下面列举下我跑这篇论文的环境:
python 3.7.0
cuda 10.1
Driver Version: 450.102.04
torch 1.4.0
torchvision 0.5.0
还要吐槽的是,训练好的模型竟然还放到外网上去…呜呜,在学长的帮助下才下载下来,最后惊讶的发现没有用到…
我下载好的模型,给大家分享一下:
链接:https://pan.baidu.com/s/1PRJKO79Z66oE8628p2_7Og
提取码:2021
2、就是数据集的加载了,然而不能直接加载,以CUB200数据集为例,得利用官方给的信息,对数据集进行处理,、把信息加载到txt文本中!
下面给出我写的代码,仅供参考:
# *_*coding: utf-8 *_*
# author --liming--
"""
读取images.txt文件,获得每个图像的标签
读取train_test_split.txt文件,获取每个图像的train, test标签.其中1为训练,0为测试
读取image_class_labels.txt文件,获取每个图像的类别标签
"""
import os
import time
time_start = time.time()
# 文件路径
path_images = 'D:/BaiduNetdiskDownload/CUB_200_2011/CUB_200_2011/images.txt'
path_split = 'D:/BaiduNetdiskDownload/CUB_200_2011/CUB_200_2011/train_test_split.txt'
path_class="D:/BaiduNetdiskDownload/CUB_200_2011/CUB_200_2011/image_class_labels.txt"
path="D:/BaiduNetdiskDownload/CUB_200_2011/CUB_200_2011/images/"#图片所在路径
#新建txt文件
f_test=open("D:/BaiduNetdiskDownload/CUB_200_2011/CUB_200_2011/test.txt","w")
f_train=open("D:/BaiduNetdiskDownload/CUB_200_2011/CUB_200_2011/train.txt","w")
# 读取images.txt文件
images = []
with open(path_images,'r') as f:
for line in f:
images.append(list(line.strip('\n').split()))
# 读取train_test_split.txt文件
split = []
with open(path_split, 'r') as f_:
for line in f_:
split.append(list(line.strip('\n').split()))
# 读取image_class_labels.txt文件
clss=[]
with open(path_class, 'r') as f_c:
for cls in f_c:
clss.append(list(cls.strip('\n').split()))
# 根据train_test_split.txt文件信息1、0划分
num = len(images) # 图像的总个数
print(num)
for k in range(num):
file_name = images[k][-1]
label = split[k][-1]
Class=clss[k][-1]
if int(label) == 1: # 划分到训练集
f_train.write(path+file_name+" "+Class+"\n")
else:
f_test.write(path+file_name+" "+Class+"\n")
time_end = time.time()
print('CUB200训练集和测试集划分完毕, 耗时%s!!' % (time_end - time_start))
f_test.close()
f_train.close()
哈哈,如果直接从一开始编号的话,即:1——>200会报错!原因是作者代码分类器那块,是从0开始编号的。
只需把上面代码稍微修改下就可以了!
3、再来看看算法部分吧,我第一次跑的时候,我调用了model/momn.py文件里的momn方法来启动整个程序:
哈哈,这算是一个坑吧,因为刚开始看论文的时候,全文都是讲momn模型,结果,最后的结果只有84%的精度,这才感到不对劲。
还有一个很奇怪的现象是最后的精度都是一模一样…有问题啊
然后就是跑moln这个模型:
孩子很惊讶啊,结果也不是很高,最高只有85%…最后的精度还是保持不变。奇怪
在换上自己的数据集后又跑了一遍!结果这里就不说了…
4、最后,又运行了eval.py是在整个数据集上进行评估,作者在这里做了一些flipping test trick,是我学识浅薄了…
还是看下结果吧:
这是自己的数据集的结果,竟然和main.py的结果差不多…
害,这篇论文的代码质量并不高,就当是练手了!欢迎大家一起交流!
最后笔者又仔细研究了作者提供的训练好的模型,呜呜,最终复现出来了 ,中间也发邮件向作者咨询了,因内容是在太多,没有时间一点一点以博文的方式记录下来,所有遇到的问题我已经以word的形式上传了!欢迎大家指教,也可以私聊我!
https://download.csdn.net/download/hb_learing/18505508