diff --git a/4.jpeg b/4.jpeg new file mode 100644 index 0000000..b523c21 Binary files /dev/null and b/4.jpeg differ diff --git a/hejiong0.jpeg b/hejiong0.jpeg new file mode 100644 index 0000000..8599805 Binary files /dev/null and b/hejiong0.jpeg differ diff --git a/hejiong1.jpeg b/hejiong1.jpeg new file mode 100644 index 0000000..e7e94bd Binary files /dev/null and b/hejiong1.jpeg differ diff --git a/hejiong2.jpeg b/hejiong2.jpeg new file mode 100644 index 0000000..68ef589 Binary files /dev/null and b/hejiong2.jpeg differ diff --git a/hejiong3.jpeg b/hejiong3.jpeg new file mode 100644 index 0000000..6005dbc Binary files /dev/null and b/hejiong3.jpeg differ diff --git a/hejiong4.jpeg b/hejiong4.jpeg new file mode 100644 index 0000000..700fa56 Binary files /dev/null and b/hejiong4.jpeg differ diff --git a/hejiong5.jpeg b/hejiong5.jpeg new file mode 100644 index 0000000..e9f8c00 Binary files /dev/null and b/hejiong5.jpeg differ diff --git a/libingbing.jpeg b/libingbing.jpeg new file mode 100644 index 0000000..51a6f0e Binary files /dev/null and b/libingbing.jpeg differ diff --git a/result0.jpg b/result0.jpg new file mode 100644 index 0000000..39178f6 Binary files /dev/null and b/result0.jpg differ diff --git a/result1.jpg b/result1.jpg new file mode 100644 index 0000000..e3a50f3 Binary files /dev/null and b/result1.jpg differ diff --git a/src/network.cpp b/src/network.cpp index b4299d4..0d3e116 100755 --- a/src/network.cpp +++ b/src/network.cpp @@ -50,7 +50,7 @@ void image2Matrix(const Mat &image, const struct pBox *pbox, int num) { mydataFmt mymean, mystddev; // prewhiten if (num != 0) { - meanAndDev(image, &mymean, &mystddev); + meanAndDev(image, mymean, mystddev); cout << mymean << "----" << mystddev << endl; size = image.cols * image.rows * image.channels(); sqr = sqrt(double(size)); @@ -78,7 +78,7 @@ void image2Matrix(const Mat &image, const struct pBox *pbox, int num) { } } -void meanAndDev(const Mat &image, mydataFmt *p, mydataFmt *q) { +void meanAndDev(const Mat &image, mydataFmt &p, mydataFmt &q) { mydataFmt meansum = 0, stdsum = 0; for (int rowI = 0; rowI < image.rows; rowI++) { for (int colK = 0; colK < image.cols; colK++) { @@ -88,15 +88,15 @@ void meanAndDev(const Mat &image, mydataFmt *p, mydataFmt *q) { // cout << int(image.at(rowI, colK)[2]) << endl; } } - *p = meansum / (image.cols * image.rows * image.channels()); + p = meansum / (image.cols * image.rows * image.channels()); for (int rowI = 0; rowI < image.rows; rowI++) { for (int colK = 0; colK < image.cols; colK++) { - stdsum += pow((image.at(rowI, colK)[0] - *p), 2) + - pow((image.at(rowI, colK)[1] - *p), 2) + - pow((image.at(rowI, colK)[2] - *p), 2); + stdsum += pow((image.at(rowI, colK)[0] - p), 2) + + pow((image.at(rowI, colK)[1] - p), 2) + + pow((image.at(rowI, colK)[2] - p), 2); } } - *q = sqrt(stdsum / (image.cols * image.rows * image.channels())); + q = sqrt(stdsum / (image.cols * image.rows * image.channels())); } void featurePadInit(const pBox *pbox, pBox *outpBox, const int pad, const int padw, const int padh) { @@ -682,10 +682,12 @@ void BatchNorm(struct pBox *pbox, struct BN *var, struct BN *mean, struct BN *be mydataFmt *vp = var->pdata; mydataFmt *mp = mean->pdata; mydataFmt *bp = beta->pdata; - double scale = 0.995; - double bias = 0.0010000000474974513; + int gamma = 1; + float epsilon = 0.001; long dis = pbox->width * pbox->height; + mydataFmt temp = 0; for (int channel = 0; channel < pbox->channel; channel++) { + temp = gamma / sqrt(((vp[channel]) + epsilon)); for (int col = 0; col < dis; col++) { // *pp = *pp + *vp; // cout << ((*pp) / (sqrt(*vp + bias))) << endl; @@ -693,12 +695,12 @@ void BatchNorm(struct pBox *pbox, struct BN *var, struct BN *mean, struct BN *be // if (*pp == 0) { // cout << *vp << "===" << *mp << "===" << *bp << endl; // } - *pp = ((*pp) * (scale) / (sqrt(*vp + bias))) + ((*bp) - (((*pp) * (*mp) * (scale)) / (sqrt(*vp + bias)))); + *pp = temp * (*pp) + ((bp[channel]) - temp * (mp[channel])); // cout << *pp << endl; pp++; } - vp++; - mp++; - bp++; +// vp++; +// mp++; +// bp++; } } \ No newline at end of file diff --git a/src/network.h b/src/network.h index dfdb3b9..d08bb1f 100755 --- a/src/network.h +++ b/src/network.h @@ -63,7 +63,7 @@ void vectorXmatrix(mydataFmt *matrix, mydataFmt *v, int size, int v_w, int v_h, void convolution(const Weight *weight, const pBox *pbox, pBox *outpBox); -void meanAndDev(const Mat &image, mydataFmt *p, mydataFmt *q); +void meanAndDev(const Mat &image, mydataFmt &p, mydataFmt &q); void initBN(struct BN *var, struct BN *mean, struct BN *beta, int width); diff --git a/src/pBox.h b/src/pBox.h index 705be62..903d4fb 100755 --- a/src/pBox.h +++ b/src/pBox.h @@ -9,7 +9,7 @@ using namespace std; //#define mydataFmt double #define Num 128 -typedef double mydataFmt; +typedef float mydataFmt; struct pBox : public cv::String { diff --git a/src/pikaqiu.cpp b/src/pikaqiu.cpp index 2e92d6a..9515ed9 100755 --- a/src/pikaqiu.cpp +++ b/src/pikaqiu.cpp @@ -56,16 +56,16 @@ float compare(vector &lineArray0, vector &lineArray1) { return result; } -void run_mtcnn(Mat &image, vector &vecRect) { - vector vecPoint; +void run_mtcnn(Mat &image, vector &vecRect, vector &vecPoint) { +// vector vecPoint; mtcnn find(image.rows, image.cols); find.findFace(image, vecRect, vecPoint); - for (int i = 0; i < vecRect.size(); ++i) { - rectangle(image, vecPoint[7 * i + 0], vecPoint[7 * i + 1], Scalar(0, 0, 255), 2, 8, 0); - for (int num = 0; num < 5; num++) - circle(image, vecPoint[7 * i + num + 2], 2, Scalar(0, 255, 255), - -1); - } +// for (int i = 0; i < vecRect.size(); ++i) { +// rectangle(image, vecPoint[7 * i + 0], vecPoint[7 * i + 1], Scalar(0, 0, 255), 2, 8, 0); +// for (int num = 0; num < 5; num++) +// circle(image, vecPoint[7 * i + num + 2], 2, Scalar(0, 255, 255), +// -1); +// } } void run_facenet(Mat &image, vector &vecRect, int csv_num = 0) { @@ -84,37 +84,66 @@ void run_facenet(Mat &image, vector &vecRect, int csv_num = 0) { load_emb_csv(csv_num, o); for (int j = 0; j < o.size(); ++j) { float result = compare(n, o[j]); + cout << "-------------------" << endl; cout << result << endl; - if (result < 0.85) + if (result < 0.45) cout << "it's me" << endl; else cout << "unknow" << endl; + cout << j << endl; } } else { + imwrite("../emb_img/" + to_string(i) + ".jpg", fourthImage); write_emb_csv(n, i); } } } +float test_compare(vector &lineArray0, vector &lineArray1) { + mydataFmt sum = 0; + for (int i = 0; i < Num; ++i) { +// cout << lineArray0[i] << "===" << lineArray1[i] << endl; + mydataFmt sub = lineArray0[i] - lineArray1[i]; + mydataFmt square = pow(sub, 2); + sum += square; + } + mydataFmt result = sqrt(sum); + return result; +} + +void test_facenet(Mat &image, vector &vecRect, vector &n) { + Mat fourthImage; + resize(image(vecRect[0]), fourthImage, Size(160, 160), 0, 0, cv::INTER_LINEAR); + facenet ggg; +// mydataFmt *o = new mydataFmt[Num]; +// vector n; + vector> o; + ggg.run(fourthImage, n, 0); +} + void run() { int b = 0; if (b == 0) { - // Mat image = imread("../40.jpg"); -// Mat image = imread("../3.jpeg"); -// Mat image = imread("../xiena.jpg"); -// Mat image = imread("../kongweiye.jpg"); +// Mat image = imread("../40.jpg"); + Mat image = imread("../3.jpeg"); +// Mat image = imread("../4.jpeg"); +// Mat image = imread("../xiena.jpeg"); +// Mat image = imread("../hejiong.jpeg"); +// Mat image = imread("../libingbing.jpeg"); +// Mat image = imread("../zhangjie.jpg"); +// Mat image = imread("../Kong_Weiye.jpg"); // Mat image = imread("../kkk.jpg"); - Mat image = imread("../20.png"); +// Mat image = imread("../20.png"); // Mat image = imread("../emb_img/0.jpg"); - - clock_t start; start = clock(); vector vecRect; - run_mtcnn(image, vecRect); - run_facenet(image, vecRect,13);// 第三个参数csv数量,如果为0,则是保存emb到csv功能 + vector vecPoint; + run_mtcnn(image, vecRect, vecPoint); + + run_facenet(image, vecRect, 13);// 第三个参数csv数量,如果为0,则是保存emb到csv功能 imshow("result", image); imwrite("../result.jpg", image); @@ -123,24 +152,6 @@ void run() { cout << "time is " << (double) start / CLOCKS_PER_SEC * 1000 << "ms" << endl; waitKey(5000); image.release(); - } else if (b == 1) { - Mat image = imread("../10.jpg"); -// Mat image = imread("../emb_img/0.jpg"); -// Mat image = imread("../20.png"); - Mat Image; - resize(image, Image, Size(160, 160), 0, 0, cv::INTER_LINEAR); - facenet ggg; - mydataFmt *o = new mydataFmt[Num]; -// ggg.run(Image, o, 0); -// imshow("result", Image); - imwrite("../result.jpg", Image); - - for (int i = 0; i < Num; ++i) { - cout << o[i] << endl; - } - - waitKey(0); - image.release(); } else { Mat image; VideoCapture cap(0); @@ -171,9 +182,56 @@ void run() { } } +void test() { + Mat image0 = imread("../kkk.jpg"); + Mat image1 = imread("../hejiong0.jpeg"); + + clock_t start; + start = clock(); + vector vecRect0, vecRect1; + vector n0, n1; + vector vecPoint0, vecPoint1; + run_mtcnn(image0, vecRect0, vecPoint0); + test_facenet(image0, vecRect0, n0); + run_mtcnn(image1, vecRect1, vecPoint1); + test_facenet(image1, vecRect1, n1); + + for (int i = 0; i < vecRect0.size(); ++i) { + rectangle(image0, vecPoint0[7 * i + 0], vecPoint0[7 * i + 1], Scalar(0, 0, 255), 2, 8, 0); + for (int num = 0; num < 5; num++) + circle(image0, vecPoint0[7 * i + num + 2], 2, Scalar(0, 255, 255), + -1); + } + for (int i = 0; i < vecRect1.size(); ++i) { + rectangle(image1, vecPoint1[7 * i + 0], vecPoint1[7 * i + 1], Scalar(0, 0, 255), 2, 8, 0); + for (int num = 0; num < 5; num++) + circle(image1, vecPoint1[7 * i + num + 2], 2, Scalar(0, 255, 255), + -1); + } + + float result = test_compare(n0, n1); + cout << "-------------------" << endl; + cout << result << endl; + if (result < 0.45) + cout << "可能是同一个人" << endl; + else + cout << "很可能不是同一个人" << endl; + + imshow("result0", image0); + imwrite("../result0.jpg", image0); + imshow("result1", image1); + imwrite("../result1.jpg", image1); + start = clock() - start; + // cout<<"time is "<