关于GSM代码的调试

论文:《cross domain visual matching via generalized similarity measure and feature learning》,

caffe源码:http://www.sysu-hcp.net/cross-domain-visual-matching/

林倞老师这篇论文的代码调试了一周,可算跑通了,写下来记录一下。

因为打算做跨年龄人脸识别,所以想用CACD数据集跑一下GSM代码,但公开的源码用的数据集是CUHK03,所以代码有些地方需要调整。


下载源码,先修改Makefile.comfig文件。然后 make clean、make all 编译源码

1、提示报错:caffe.ph.h 文件不存在

解决办法:在 src/caffe/proto 目录下执行

protoc caffe.proto --cpp_out=./

然后就在该目录下生成 caffe.pb.cc 和caffe.pb.h文件

重新 make clean、 make all 编译

 2、提示报错 function “atomicAdd(double *,double)” has already been defined 

解决办法:打开include/caffe/common.cuh  进行修改

#if !defined(__CUDA_ARCH__) || __CUDA_ARCH__ >= 600  
#else  
  ##这里即common.cuh中atomicAdd函数的定义  
#endif 

修改好之后再重新编译,就会发现编译通过了


用于训练的网络及参数文件在scripts_remote/ 目录下,这里有两种cuhk_pair 和 cuhk_triplet 这两个有啥区别还没搞懂。我自己用的cuhk_pair这里的代码。

先看 train_reid.prototxt 中数据格式是reid_data这里是作者自己定义的层,其中参数

root_folder: CACD数据集所有图片的路径

source 和 sourceone 是txt的路径,这里表示两个不同的域,跨年龄数据的两个域就是指较老和较年轻的两种不同的照片,跟断点发现,reid_data_layer.cpp需要的txt数据只有图片的名称,不需要类别标签,在该层中会根据图片名自动生成类别标签,代码中会判断名字是否一样来判断是否是同一个人。所以这里的txt数据标签只需要图片名称,注意到CACD中每个人的年龄跨度大概在10年,所以我把数据集随机选取200个人,每个人每个年龄选取一张图片,前5年放在较年轻的txt文件中,后5年放在较年长的txt文件中,然后再将一些不够5年的人替换掉。至此生成数据文件。

跟断点调试代码:这里

主要调试reid_data_layer.cpp代码需要修改以下几处

第66行 这句代码是截取每个图片的人物名字,CACD数据集的图片命名是  如 37_Carrie-Anne_Moss_0005.jpg,前三位是固定的,后几位也是固定的,这里需要中间的姓名,所以根据CACD图片命名的特点进行修改:

string class_name_tmp = line.substr(3, line.find_last_of('_')-3);

同样在第106行做同样的修改:

string get_a_classname = secname.substr(3, secname.find_last_of('_')-3);

在读取图片的时候需要图片名,发现头文件中有个变量 filenames_没有用,所以就用来存图片的名称,需要在代码中添加

在上边的跟断点过程中发现,batchsize的大小是class_per_iter*img_per_class

这里 class_per_iter 是一共多少不同的人,img_per_class是每类有多少张图片,我自己设置的是5.

在train_reid.prototxt 文件中,修改 crop_height:180  crop_width:130 

reid_data_param  修改文件路径,class_per_iter:200  img_per_class:5  re_height:250  re_width:250

重新编译,执行 ./scripts_remote/cuhk_pair/run.sh

发现实验室服务器的内存不够,实验中batchsize很大,只能减小class_per_iter,设置为50的时候,才跑起来。

同时需注意在train_reid.prototxt 文件中,slice层的参数slice_point:是class_per_iter*img_per_class;  loss层中参数 pairs_per_class: 是class_per_iter*img_per_class; reid_data_param 参数都要做相应的修改。


第一次写博客,如果有不正确的地方,欢迎指正。

猜你喜欢

转载自blog.csdn.net/weixin_36618362/article/details/81062389