论文代码:代码地址
参考的博客:前面环境部分参考这位博主
这次因为我下载了git工具,所以我是复制了github上的代码链接,然后克隆到本地的:
当然也可以直接下载压缩包,也没什么问题,这种克隆的方式免去了下载解压缩过程,会比较快。
在本地打开文件,打开文件后应该会自动弹出来一个提示:就是问你是否要根据environment.yml来创建一个conda环境,由于我手快,直接点了X号,如果你是用服务器,就可以点击X号,如果不是,可以尝试一下。
(1)根据官方代码的说明,首先使用conda env create -f environment.yml命令根据项目中提供的environment.yml文件创建一个名为m2release的Conda环境。
因为我的连接了阿里云服务器,我就不能用之前那种创建虚拟环境的方法了,步骤是:
cd /tmp/meshed-memory-transformer
,然后回车,就进入到文件里面了,这样就可以找到environment.yml文件了。cd /tmp/meshed-memory-transformer
这条命令运行出错了。参考博客
将environment.yml中31行的- openssl=1.1.1=h7b6447c_0
改为(加了个g):
- openssl=1.1.1g=h7b6447c_0
将environment.yml中17行注释掉:
# - intel-openmp=2019.5=281
然后第三个错误,我网上找不到其他方式,我打算去掉版本限制,将- mkl=2019.5=281
改为:
- mkl
conda env create -f environment.yml
这个命令。这个时候命令开始成功运行,这个过程比较慢,不要着急。
创建好虚拟环境,并且下载好其中的库后,在右边Remote Host这里的文件夹envs下是能找到m2release的。
conda activate m2release
这条命令激活虚拟环境
激活之后可以看到命令行前面就不熟Base了,而是m2release。
python -m spacy download en
下载成功!
首先,去官方github的说明中下载annotations.zip,解压完成后放到本地目录下面。如果此时远程还没有同步,点击一下刷新就好了。
接着,需要准备特征文件,也就是提到的coco_detections.hdf5,在官方代码中有链接,下载就行。下载成功后,把它放在项目下面,我新建了一个features文件,用来放置coco_detections.hdf5。(下载真的慢的要死)
下载链接
我忽略了一点,我要用m2release这个虚拟环境的话,需要在终端(terminal)进入服务器映射文件,激活m2release,然后再用python train.py
执行train.py才行,不然我的虚拟环境下载的库就没有作用。根据下图操作,就不会再报没有pytorch的错误了。
错误出现原因:在train.by文件的第161行,调用了ImageDetectionsField类的构造函数,传入了一个detections_path参数,但是该参数值为NoneType,而不是预期的字符串类型。
class ImageDetectionsField(RawField): def __init__(self, preprocessing=None, postprocessing=None, detections_path=None, max_detections=100, sort_by_prob=False, load_in_tmp=True): # detections_path:用于指明检测结果的存储路径 # sort_by_prob:用于指示是否按照概率进行排序 # load_in_tmp:用于指示是否在临时目录中加载数据 self.max_detections = max_detections self.detections_path = detections_path self.sort_by_prob = sort_by_prob tmp_detections_path = os.path.join('/tmp', os.path.basename(detections_path)) # tmp_detections_path:用于指明一个临时的检测结果路径,用os.path.join函数将多个路径组合成同一个路径。 # 创造临时路径是为了确保在处理数据时不会直接修改原始的detections_path路径,而是将结果存储在临时路径中,以避免对原始数据造成影响。 if load_in_tmp: # 如果在临时目录中加载路径 if not os.path.isfile(tmp_detections_path): # 如果tmp_detections_path指向的不是一个文件 if shutil.disk_usage("/tmp")[-1] < os.path.getsize(detections_path): # 使用shutil.disk_usage函数来获取/tmp目录的磁盘使用情况 warnings.warn('Loading from %s, because /tmp has no enough space.' % detections_path) else: warnings.warn("Copying detection file to /tmp") shutil.copyfile(detections_path, tmp_detections_path)() warnings.warn("Done.") self.detections_path = tmp_detections_path # 如果临时路径不是一个文件,则会检查/tmp目录的剩余空间是否足够存储detections_path文件,不过不够,输出警告信息, # 如果够,则将detections_path文件复制到tmp_detections_path,并更新self.detections_path。 else: # 如果tmp_detections_path指向的是一个文件 self.detections_path = tmp_detections_path # 这里要判断tmp_detections_path是不是一个文件的逻辑在于:tmp_detections_path指向一个有效的文件,而不是目录或其他类型的路径。
3.但是这样还是不能解决这个问题,我的路径好像赋值不够准确(sorry)再进行查看,发现train.py的161行对detections_path用args.features_path进行了赋值,所以要继续查看这个args.features_path,我尝试打印args.features_path的值,果然打印出来是None。
python train.py --exp_name m2_transformer --batch_size 50 --m 40 --head 8 --warmup 10000 --features_path /path/to/features --annotation_folder /path/to/annotations
错误原因:–annotation_folder这个参数后面的文件夹路径不对
--annotation_folder
后面的/path/to/annotations
改为annotations
,也就是正确的运行命令是:
python train.py --exp_name m2_transformer --batch_size 50 --m 40 --head 8 --warmup 10000 --features_path /path/to/features --annotation_folder annotations
意思是找不到path/to/features这个路径
--features_path features/coco_detections.hdf5
。所以运行train.py的命令是:
python train.py --exp_name m2_transformer --batch_size 50 --m 40 --head 8 --warmup 10000 --features_path features/coco_detections.hdf5 --annotation_folder annotations
首先查看了我这个服务器的cuda支持的最高版本
接着查看我虚拟环境中的pytorch的版本:
所以应该是我的pytorch的版本太低了,与cuda不兼容。因此重新去下载pytorch试试看。
升级pytorch之后又说tensorboard的版本太低了
先卸载掉旧版本的tensorboard:pip uninstall tensorboard
再重新下载tensorboard,我这里下载需要加上版本号:
pip install tensorboard==2.6.0
错误原因是:gather()函数期待的索引值是个int。而beam.expand(*([self.b_s, self.beam_size] + shape[1:]))返回的索引不是一个整数(beam_search.py文件中)。
beam.expand(*([self.b_s, self.beam_size] + shape[1:]))返回的索引转换为整数类型。
s = torch.gather(s.view(*([self.b_s, cur_beam_size] + shape[1:])), 1, beam.expand(*([self.b_s, self.beam_size] + shape[1:])).long())
比如:python train.py --exp_name m2_transformer --batch_size 50 --m 40 --head 8 --warmup 10000 --features_path features/coco_detections.hdf5 --annotation_folder annotations --resume_last
下载meshed_memory-transformer.pth,将它放在项目工程下面,可以按照放置的位置更改test.py代码中的data的路径。然后按照以下代码运行:
python test.py --batch_size 10 --workers 10 --features_path features/coco_detections.hdf5 --annotation_folder annotations
下图使用作者预训练好的权重文件还原了论文最后的结果:
如果想要按照自己的训练结果去评估,也是把data的路径更改合适,然后按照上面的命令运行即可(我目前只跑了17个epoch,所以效果比较差)。