论文:《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 参数都要做相应的修改。
第一次写博客,如果有不正确的地方,欢迎指正。