关于GSM代码的调试

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_36618362/article/details/81062389

 

论文:《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 参数都要做相应的修改。

 

 


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

展开阅读全文

gsm模块的代码问题

10-27

有人编写了下面的代码是关于gsm接口的模块,要我在里面编写sms发送,接受,初始化。。。。。的代码(此人暂时联系不上),可是我现在不知道怎么读下面的代码,不知道它们的意思是什么,比如说 这个宏定义 #define GSM_INTERFACE_MSGQ_MSG_CNT 20 ,#define GSM_INTERFACE_TIMER_STEP 500 要说明什么问题是什么意思,什么是多线程,什么是定时器。。。。。???是个初学的大家不要见笑,我只是实话实话,想读懂代码然后在编写代码。因为没什么开发的经验所以想问问大家如何快的入门真正的开发。先谢谢大家了rn *******************************************************************************/rn#include "fsu.h"rn#include "osvl.h"rnrn#define GSM_INTERFACE_MSGQ_MSG_CNT 20rn#define GSM_INTERFACE_MSGQ_MSG_MAX_LEN 40rn#define GSM_INTERFACE_THREAD_PRIORITY OSVL_THREAD_PRIORITY_BELOW_NORMALrn#define GSM_INTERFACE_THREAD_STACK_SIZE 8096rn#define GSM_INTERFACE_TIMER_STEP 500rn#define GSM_INTERFACE_TIMER_OPTION OSVL_TIMER_FOREVERrnrnOSVL_HANDLE g_hGSM_interfaceMsgQ = OSVL_NULL;rnOSVL_HANDLE g_hGSM_interfaceThread = OSVL_NULL;rnOSVL_INT g_hGSM_interfaceTimer;rnrnOSVL_DWORD fsu_GSM_interface_Thread(OSVL_DWORD dwParam)rnrn int bSuc = 0;rn char buf[200];rn int len;rn osvl_DateTime DateTime;rn rn while(1)rn rn len = osvl_msg_Read(g_hGSM_interfaceMsgQ, (OSVL_CHAR *)buf, sizeof(buf), OSVL_INFINITE);rn if((len)&&(buf[0] == 'S'))rn rn osvl_rtc_GetCurDateTime(&DateTime);rn osvl_trace("fsu_GSM_interface_Thread Rece At %04d-%02d-%02d %02d:%02d:%02d\r\n",rn DateTime.year,rn DateTime.month,rn DateTime.day,rn DateTime.hour,rn DateTime.min,rn DateTime.secrn );rn rn rnrn return bSuc;rnrnrnOSVL_VOID fsu_GSM_interface_Timer(OSVL_INT nTimerID, OSVL_DWORD dwParam, OSVL_DWORD dwOption)rnrn char buf[]="S";rn// osvl_msg_Write(g_hGSM_interfaceMsgQ, (OSVL_CHAR *)buf, sizeof(buf), 0, OSVL_MSG_NORMAL);rnrnrnrn/*******************************************************************************rn * GSM接口初始化rn ******************************************************************************/rnint GSM_interface_Init(void)rnrn// GSM_interface_config *pGSM_interface_Conf;rn int bSuc = 1;rnrn g_hGSM_interfaceMsgQ = osvl_msg_Create(GSM_INTERFACE_MSGQ_MSG_CNT, GSM_INTERFACE_MSGQ_MSG_MAX_LEN, 0);rn osvl_assert(g_hGSM_interfaceMsgQ);rn if (!g_hGSM_interfaceMsgQ)rn rn osvl_set_errno(FSU_ER_GSM_INTERFACE_INIT_MSGQ);rn return 0;rn rn rn g_hGSM_interfaceThread = osvl_thread_CreateThread(GSM_INTERFACE_THREAD_PRIORITY, rn fsu_GSM_interface_Thread, (OSVL_DWORD)g_hGSM_interfaceMsgQ, GSM_INTERFACE_THREAD_STACK_SIZE);rn osvl_assert(g_hGSM_interfaceThread);rn if (!g_hGSM_interfaceThread)rn rn osvl_set_errno(FSU_ER_GSM_INTERFACE_INIT_THREAD);rn return bSuc;rn rnrn g_hGSM_interfaceTimer = osvl_timer_CreateTimer(fsu_GSM_interface_Timer, 0);rn osvl_assert(g_hGSM_interfaceTimer);rn if (!g_hGSM_interfaceTimer)rn rn osvl_set_errno(FSU_ER_GSM_INTERFACE_INIT_CREATE_TIMER);rn return 0;rn rn rn bSuc = osvl_timer_SetTimer(g_hGSM_interfaceTimer, GSM_INTERFACE_TIMER_STEP, GSM_INTERFACE_TIMER_OPTION);rn osvl_assert(bSuc);rn if (!bSuc)rn rn osvl_set_errno(FSU_ER_GSM_INTERFACE_INIT_SET_TIMER);rn return bSuc;rn rnrn return bSuc;rnrnrn/*******************************************************************************rn * GSM接口关闭rn ******************************************************************************/rnint GSM_interface_DeInit(void)rnrn int bSuc = 1;rnrn bSuc = osvl_timer_DeleteTimer(g_hGSM_interfaceTimer);rn osvl_assert(bSuc);rn if (!bSuc)rn rn osvl_set_errno(FSU_ER_GSM_INTERFACE_DEINIT_TIMER);rn return bSuc;rn rnrn bSuc = osvl_thread_KillThread(g_hGSM_interfaceThread);rn osvl_assert(bSuc);rn if (!bSuc)rn rn osvl_set_errno(FSU_ER_GSM_INTERFACE_DEINIT_THREAD);rn return bSuc;rn rnrn bSuc = osvl_msg_Close(g_hGSM_interfaceMsgQ);rn osvl_assert(bSuc);rn if (!bSuc)rn rn osvl_set_errno(FSU_ER_GSM_INTERFACE_DEINIT_THREAD);rn return bSuc;rn rnrn return bSuc;rnrnrn/*******************************************************************************rn * 读GSM接口数据rn ******************************************************************************/rnunsigned int GSM_interface_GPRS_ReadNChars(int nChannel,rn unsigned char *buffer,rn unsigned int chars_to_read)rnrn unsigned int nNum = 0;rnrn return nNum;rnrnrn/*******************************************************************************rn * 往GSM接口写数据rn ******************************************************************************/rnunsigned int GSM_interface_GPRS_WriteNChars(int nChannel,rn unsigned char *buffer,rn unsigned int chars_to_write)rnrn unsigned int i;rn unsigned int nNum = chars_to_write;rn rn osvl_trace("GSM_interface_GPRS_WriteNChars Len=%d --", chars_to_write);rn for(i=0; i 论坛

没有更多推荐了,返回首页