update code and src
update code and src
BIN
hejiong0.jpeg
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
hejiong1.jpeg
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
hejiong2.jpeg
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
hejiong3.jpeg
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
hejiong4.jpeg
Normal file
|
After Width: | Height: | Size: 87 KiB |
BIN
hejiong5.jpeg
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
libingbing.jpeg
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
result0.jpg
Normal file
|
After Width: | Height: | Size: 176 KiB |
BIN
result1.jpg
Normal file
|
After Width: | Height: | Size: 89 KiB |
@@ -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<Vec3b>(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<Vec3b>(rowI, colK)[0] - *p), 2) +
|
||||
pow((image.at<Vec3b>(rowI, colK)[1] - *p), 2) +
|
||||
pow((image.at<Vec3b>(rowI, colK)[2] - *p), 2);
|
||||
stdsum += pow((image.at<Vec3b>(rowI, colK)[0] - p), 2) +
|
||||
pow((image.at<Vec3b>(rowI, colK)[1] - p), 2) +
|
||||
pow((image.at<Vec3b>(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++;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
using namespace std;
|
||||
//#define mydataFmt double
|
||||
#define Num 128
|
||||
typedef double mydataFmt;
|
||||
typedef float mydataFmt;
|
||||
|
||||
|
||||
struct pBox : public cv::String {
|
||||
|
||||
132
src/pikaqiu.cpp
@@ -56,16 +56,16 @@ float compare(vector<mydataFmt> &lineArray0, vector<mydataFmt> &lineArray1) {
|
||||
return result;
|
||||
}
|
||||
|
||||
void run_mtcnn(Mat &image, vector<Rect> &vecRect) {
|
||||
vector<Point> vecPoint;
|
||||
void run_mtcnn(Mat &image, vector<Rect> &vecRect, vector<Point> &vecPoint) {
|
||||
// vector<Point> 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<Rect> &vecRect, int csv_num = 0) {
|
||||
@@ -84,37 +84,66 @@ void run_facenet(Mat &image, vector<Rect> &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<mydataFmt> &lineArray0, vector<mydataFmt> &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<Rect> &vecRect, vector<mydataFmt> &n) {
|
||||
Mat fourthImage;
|
||||
resize(image(vecRect[0]), fourthImage, Size(160, 160), 0, 0, cv::INTER_LINEAR);
|
||||
facenet ggg;
|
||||
// mydataFmt *o = new mydataFmt[Num];
|
||||
// vector<mydataFmt> n;
|
||||
vector<vector<mydataFmt>> 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<Rect> vecRect;
|
||||
run_mtcnn(image, vecRect);
|
||||
run_facenet(image, vecRect,13);// 第三个参数csv数量,如果为0,则是保存emb到csv功能
|
||||
vector<Point> 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<Rect> vecRect0, vecRect1;
|
||||
vector<mydataFmt> n0, n1;
|
||||
vector<Point> 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 "<<start/10e3<<endl;
|
||||
cout << "time is " << (double) start / CLOCKS_PER_SEC * 1000 << "ms" << endl;
|
||||
waitKey(0);
|
||||
image0.release();
|
||||
image1.release();
|
||||
}
|
||||
|
||||
int main() {
|
||||
for (int i = 0; i < 1; ++i) {
|
||||
run();
|
||||
test();
|
||||
cout << "==============================" << endl;
|
||||
}
|
||||
}
|
||||
|
||||
BIN
xiena.jpeg
Normal file
|
After Width: | Height: | Size: 7.6 KiB |
BIN
zhangjie0.jpeg
Normal file
|
After Width: | Height: | Size: 123 KiB |
BIN
zhangjie1.jpeg
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
zhangjie2.jpeg
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
zhangjie3.jpeg
Normal file
|
After Width: | Height: | Size: 12 KiB |