diff --git a/.gitignore b/.gitignore index c8a5d5c..00037b8 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,6 @@ cmake-build-debug/ cmake-build-release/ model_128/ model_512/ +model_128.zip +model_512.zip +*.cfg \ No newline at end of file diff --git a/README.md b/README.md index c64db96..3b7ac43 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,12 @@ # FaceNet-light -FaceNet-light with c++ +### FaceNet-light with c++ + +##### 使用C++实现FaceNet,脱离TensorFlow,只是用OpenCV + +##### 模型参数是提取FaceNet的官方模型,2017版本和2018版本 + +##### 切换模型文件 在pBox.h开头,注释或者打开宏 +```c++ +#define Num 512 +//#define Num 128 +``` \ No newline at end of file diff --git a/src/facenet.cpp b/src/facenet.cpp old mode 100755 new mode 100644 index 0c84211..9a844ea --- a/src/facenet.cpp +++ b/src/facenet.cpp @@ -74,7 +74,7 @@ void facenet::Stem(Mat &image, pBox *output) { // conv5_wb->pdata, conv5_var->pdata, conv5_mean->pdata, conv5_beta->pdata, \ // conv6_wb->pdata, conv6_var->pdata, conv6_mean->pdata, conv6_beta->pdata}; mydataFmt *pointTeam[24] = { - conv1_wb->pdata, conv1_beta->pdata, conv1_mean->pdata, conv1_var->pdata, \ + conv1_wb->pdata, conv1_beta->pdata, conv1_mean->pdata, conv1_var->pdata, \ conv2_wb->pdata, conv2_beta->pdata, conv2_mean->pdata, conv2_var->pdata, \ conv3_wb->pdata, conv3_beta->pdata, conv3_mean->pdata, conv3_var->pdata, \ conv4_wb->pdata, conv4_beta->pdata, conv4_mean->pdata, conv4_var->pdata, \ @@ -257,7 +257,7 @@ void facenet::Inception_resnet_A(pBox *input, pBox *output, string filepath, flo // conv7_wb->pdata, conv7_wb->pbias, \ // conv8_wb->pdata, conv8_wb->pbias}; mydataFmt *pointTeam[28] = { - conv1_wb->pdata, conv1_beta->pdata, conv1_mean->pdata, conv1_var->pdata, \ + conv1_wb->pdata, conv1_beta->pdata, conv1_mean->pdata, conv1_var->pdata, \ conv2_wb->pdata, conv2_beta->pdata, conv2_mean->pdata, conv2_var->pdata, \ conv3_wb->pdata, conv3_beta->pdata, conv3_mean->pdata, conv3_var->pdata, \ conv4_wb->pdata, conv4_beta->pdata, conv4_mean->pdata, conv4_var->pdata, \ @@ -406,7 +406,7 @@ void facenet::Reduction_A(pBox *input, pBox *output) { // conv3_wb->pdata, conv3_var->pdata, conv3_mean->pdata, conv3_beta->pdata, \ // conv4_wb->pdata, conv4_var->pdata, conv4_mean->pdata, conv4_beta->pdata}; mydataFmt *pointTeam[16] = { - conv1_wb->pdata, conv1_beta->pdata, conv1_mean->pdata, conv1_var->pdata, \ + conv1_wb->pdata, conv1_beta->pdata, conv1_mean->pdata, conv1_var->pdata, \ conv2_wb->pdata, conv2_beta->pdata, conv2_mean->pdata, conv2_var->pdata, \ conv3_wb->pdata, conv3_beta->pdata, conv3_mean->pdata, conv3_var->pdata, \ conv4_wb->pdata, conv4_beta->pdata, conv4_mean->pdata, conv4_var->pdata}; @@ -531,7 +531,7 @@ void facenet::Inception_resnet_B(pBox *input, pBox *output, string filepath, flo // conv5_wb->pdata, conv5_wb->pbias, \ // conv6_wb->pdata, conv6_wb->pbias}; mydataFmt *pointTeam[20] = { - conv1_wb->pdata, conv1_beta->pdata, conv1_mean->pdata, conv1_var->pdata, \ + conv1_wb->pdata, conv1_beta->pdata, conv1_mean->pdata, conv1_var->pdata, \ conv2_wb->pdata, conv2_beta->pdata, conv2_mean->pdata, conv2_var->pdata, \ conv3_wb->pdata, conv3_beta->pdata, conv3_mean->pdata, conv3_var->pdata, \ conv4_wb->pdata, conv4_beta->pdata, conv4_mean->pdata, conv4_var->pdata, \ @@ -682,7 +682,7 @@ void facenet::Reduction_B(pBox *input, pBox *output) { // conv6_wb->pdata, conv6_var->pdata, conv6_mean->pdata, conv6_beta->pdata, \ // conv7_wb->pdata, conv7_var->pdata, conv7_mean->pdata, conv7_beta->pdata}; mydataFmt *pointTeam[28] = { - conv1_wb->pdata, conv1_beta->pdata, conv1_mean->pdata, conv1_var->pdata, \ + conv1_wb->pdata, conv1_beta->pdata, conv1_mean->pdata, conv1_var->pdata, \ conv2_wb->pdata, conv2_beta->pdata, conv2_mean->pdata, conv2_var->pdata, \ conv3_wb->pdata, conv3_beta->pdata, conv3_mean->pdata, conv3_var->pdata, \ conv4_wb->pdata, conv4_beta->pdata, conv4_mean->pdata, conv4_var->pdata, \ @@ -848,7 +848,7 @@ void facenet::Inception_resnet_C(pBox *input, pBox *output, string filepath, flo // conv5_wb->pdata, conv5_wb->pbias, \ // conv6_wb->pdata, conv6_wb->pbias}; mydataFmt *pointTeam[20] = { - conv1_wb->pdata, conv1_beta->pdata, conv1_mean->pdata, conv1_var->pdata, \ + conv1_wb->pdata, conv1_beta->pdata, conv1_mean->pdata, conv1_var->pdata, \ conv2_wb->pdata, conv2_beta->pdata, conv2_mean->pdata, conv2_var->pdata, \ conv3_wb->pdata, conv3_beta->pdata, conv3_mean->pdata, conv3_var->pdata, \ conv4_wb->pdata, conv4_beta->pdata, conv4_mean->pdata, conv4_var->pdata, \ @@ -979,7 +979,7 @@ void facenet::Inception_resnet_C_None(pBox *input, pBox *output, string filepath // conv4_wb->pdata, conv4_var->pdata, conv4_mean->pdata, conv4_beta->pdata, \ // conv5_wb->pdata, conv5_wb->pbias}; mydataFmt *pointTeam[18] = { - conv1_wb->pdata, conv1_beta->pdata, conv1_mean->pdata, conv1_var->pdata, \ + conv1_wb->pdata, conv1_beta->pdata, conv1_mean->pdata, conv1_var->pdata, \ conv2_wb->pdata, conv2_beta->pdata, conv2_mean->pdata, conv2_var->pdata, \ conv3_wb->pdata, conv3_beta->pdata, conv3_mean->pdata, conv3_var->pdata, \ conv4_wb->pdata, conv4_beta->pdata, conv4_mean->pdata, conv4_var->pdata, \ @@ -1063,20 +1063,6 @@ void facenet::AveragePooling(pBox *input, pBox *output) { avePooling(input, output, input->height, 2); } -/** - * flatten 多维转换到一维 - * @param input - * @param output - */ -void facenet::Flatten(pBox *input, pBox *output) { - output->width = input->channel; - output->height = 1; - output->channel = 1; - output->pdata = (mydataFmt *) malloc(output->channel * output->width * output->height * sizeof(mydataFmt)); - if (output->pdata == NULL)cout << "the maxPoolingInit is failed!!" << endl; - memcpy(output->pdata, input->pdata, output->channel * output->width * output->height * sizeof(mydataFmt)); -} - /** * 全连接网络 * @param input 输入featuremap @@ -1120,14 +1106,6 @@ facenet::~facenet() { } -void facenet::printData(pBox *in) { - for (long i = 0; i < in->height * in->width * in->channel; ++i) { -// if (in->pdata[i] != 0) - printf("%f\n", in->pdata[i]); - } - cout << "printData" << endl; -} - /** * facenet网络运行入口 * @param image diff --git a/src/facenet.h b/src/facenet.h index dc8267f..fb4224f 100644 --- a/src/facenet.h +++ b/src/facenet.h @@ -34,10 +34,6 @@ private: void AveragePooling(pBox *input, pBox *output); void fully_connect(pBox *input, pBox *output, string filepath = ""); - - void Flatten(pBox *input, pBox *output); - - void printData(pBox *output); }; #endif //MAIN_FACENET_H diff --git a/src/network.cpp b/src/network.cpp old mode 100755 new mode 100644 index 9717d95..ffbe80d --- a/src/network.cpp +++ b/src/network.cpp @@ -400,49 +400,6 @@ void avePooling(const pBox *pbox, pBox *Matrix, int kernelSize, int stride) { } } -/** - * 激活函数 有系数 初始化 - * @param prelu 激活函数权重 - * @param width 长度 - */ -void pReluInit(struct pRelu *prelu, int width) { - prelu->width = width; - prelu->pdata = (mydataFmt *) malloc(width * sizeof(mydataFmt)); - if (prelu->pdata == NULL)cout << "prelu apply for memory failed!!!!"; - memset(prelu->pdata, 0, width * sizeof(mydataFmt)); -} - -/** - * 激活函数 有系数 - * @param pbox 输入feature - * @param pbias 偏移 - * @param prelu_gmma 激活函数权重 - */ -void prelu(struct pBox *pbox, mydataFmt *pbias, mydataFmt *prelu_gmma) { - if (pbox->pdata == NULL) { - cout << "the pRelu feature is NULL!!" << endl; - return; - } - if (pbias == NULL) { - cout << "the pRelu bias is NULL!!" << endl; - return; - } - mydataFmt *op = pbox->pdata; - mydataFmt *pb = pbias; - mydataFmt *pg = prelu_gmma; - - long dis = pbox->width * pbox->height; - for (int channel = 0; channel < pbox->channel; channel++) { - for (int col = 0; col < dis; col++) { - *op = *op + *pb; - *op = (*op > 0) ? (*op) : ((*op) * (*pg)); - op++; - } - pb++; - pg++; - } -} - /** * 激活函数 没有系数 * @param pbox 输入feature diff --git a/src/network.h b/src/network.h old mode 100755 new mode 100644 index c311b23..5a81e3a --- a/src/network.h +++ b/src/network.h @@ -24,8 +24,6 @@ void avePooling(const pBox *pbox, pBox *Matrix, int kernelSize, int stride); void featurePad(const pBox *pbox, pBox *outpBox, const int pad, const int padw = 0, const int padh = 0); -void prelu(struct pBox *pbox, mydataFmt *pbias, mydataFmt *prelu_gmma); - void relu(struct pBox *pbox, mydataFmt *pbias); void fullconnect(const Weight *weight, const pBox *pbox, pBox *outpBox); @@ -35,10 +33,6 @@ void readData(string filename, long dataNumber[], mydataFmt *pTeam[], int length long ConvAndFcInit(struct Weight *weight, int schannel, int lchannel, int kersize, int stride, int pad, int w = 0, int h = 0, int padw = 0, int padh = 0); -void pReluInit(struct pRelu *prelu, int width); - -void softmax(const struct pBox *pbox); - void image2MatrixInit(Mat &image, struct pBox *pbox); void featurePadInit(const pBox *pbox, pBox *outpBox, const int pad, const int padw = 0, const int padh = 0); @@ -51,13 +45,6 @@ void convolutionInit(const Weight *weight, pBox *pbox, pBox *outpBox); void fullconnectInit(const Weight *weight, pBox *outpBox); -bool cmpScore(struct orderScore lsh, struct orderScore rsh); - -void nms(vector &boundingBox_, vector &bboxScore_, const mydataFmt overlap_threshold, - string modelname = "Union"); - -void refineAndSquareBbox(vector &vecBbox, const int &height, const int &width); - void vectorXmatrix(mydataFmt *matrix, mydataFmt *v, int v_w, int v_h, mydataFmt *p); void convolution(const Weight *weight, const pBox *pbox, pBox *outpBox); diff --git a/src/pBox.cpp b/src/pBox.cpp index 0969cf4..fe2d07b 100644 --- a/src/pBox.cpp +++ b/src/pBox.cpp @@ -8,14 +8,6 @@ void freepBox(struct pBox *pbox) { delete pbox; } -void freepRelu(struct pRelu *prelu) { - if (prelu->pdata == NULL)cout << "prelu is NULL!" << endl; - else - free(prelu->pdata); - prelu->pdata = NULL; - delete prelu; -} - void freeWeight(struct Weight *weight) { if (weight->pdata == NULL)cout << "weight is NULL!" << endl; else diff --git a/src/pBox.h b/src/pBox.h index 8703500..72a5e87 100644 --- a/src/pBox.h +++ b/src/pBox.h @@ -12,7 +12,8 @@ using namespace std; //#define mydataFmt double -#define Num 128 +#define Num 512 +//#define Num 128 typedef float mydataFmt; struct pBox : public cv::String { @@ -22,11 +23,6 @@ struct pBox : public cv::String { int channel; }; -struct pRelu { - mydataFmt *pdata; - int width; -}; - struct BN { mydataFmt *pdata; int width; @@ -46,29 +42,10 @@ struct Weight { int padh; }; -struct Bbox { - float score; - int x1; - int y1; - int x2; - int y2; - float area; - bool exist; - mydataFmt ppoint[10]; - mydataFmt regreCoord[4]; -}; - -struct orderScore { - mydataFmt score; - int oriOrder; -}; - void freepBox(struct pBox *pbox); void freeWeight(struct Weight *weight); -void freepRelu(struct pRelu *prelu); - void freeBN(struct BN *bn); #endif \ No newline at end of file diff --git a/src/pikaqiu.cpp b/src/pikaqiu.cpp index 631d3bc..dc50541 100644 --- a/src/pikaqiu.cpp +++ b/src/pikaqiu.cpp @@ -113,7 +113,7 @@ void compareperson() { start = clock() - start; // cout<<"time is "<