18
README.md
18
README.md
@@ -4,8 +4,24 @@ MTCNN-FaceNet-light with c++
|
|||||||
|
|
||||||
只用opencv实现MTCNN和FaceNet
|
只用opencv实现MTCNN和FaceNet
|
||||||
|
|
||||||
|
运行环境:
|
||||||
|
|
||||||
|
Windows下 Clion VS OpenCV
|
||||||
|
|
||||||
|
Opencv配置环境变量
|
||||||
|
|
||||||
|
```
|
||||||
|
OpenCV_DIR D:/opencv/build/
|
||||||
|
```
|
||||||
|
|
||||||
|
VS无需特殊配置
|
||||||
|
|
||||||
|
Clion将解释器设置成VS的
|
||||||
|
|
||||||
|
项目导入Clion,reload CMakeLists.txt,run
|
||||||
|
|
||||||
2019-12-06 修改多处bug,卷积初始化后直接进行卷积
|
2019-12-06 修改多处bug,卷积初始化后直接进行卷积
|
||||||
|
|
||||||
2019-12-24 添加BN层
|
2019-12-24 添加BN层
|
||||||
|
|
||||||
需要模型文件的可以给我发邮件
|
需要模型文件的可以给我发邮件
|
||||||
159
src/pikaqiu.cpp
159
src/pikaqiu.cpp
@@ -26,56 +26,6 @@ Mat RS(Mat &src) {
|
|||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 加载csv中的emb
|
|
||||||
* @param num csv的个数
|
|
||||||
* @param vecVec 将emb参数存在二维vector中,外层定位某个人,内层定位某个emb值
|
|
||||||
*/
|
|
||||||
void load_emb_csv(int num, vector<vector<mydataFmt>> &vecVec) {
|
|
||||||
for (int i = 0; i < num; ++i) {
|
|
||||||
ifstream inFile("../emb_csv/" + to_string(i) + ".csv", ios::in);
|
|
||||||
string lineStr;
|
|
||||||
// vector<vector<mydataFmt>> strArray;
|
|
||||||
vector<mydataFmt> lineArray;
|
|
||||||
while (getline(inFile, lineStr)) {
|
|
||||||
// 打印整行字符串
|
|
||||||
// cout << lineStr << endl;
|
|
||||||
// 存成二维表结构
|
|
||||||
stringstream ss(lineStr);
|
|
||||||
string str;
|
|
||||||
// vector<mydataFmt> lineArray;
|
|
||||||
// 按照逗号分隔
|
|
||||||
// mydataFmt nnn = 0;
|
|
||||||
while (getline(ss, str, ',')) {
|
|
||||||
lineArray.push_back(atof(str.c_str()));
|
|
||||||
// cout << str << endl;
|
|
||||||
}
|
|
||||||
// strArray.push_back(lineArray);
|
|
||||||
}
|
|
||||||
vecVec.push_back(lineArray);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 预处理,保存emb值到csv中
|
|
||||||
* @param o 保存一个人的emb值
|
|
||||||
* @param num 第几个人,确定文件名
|
|
||||||
*/
|
|
||||||
void write_emb_csv(vector<mydataFmt> &o, int num) {
|
|
||||||
ofstream outFile;
|
|
||||||
outFile.open("../emb_csv/" + to_string(num) + ".csv", ios::out); // 打开模式可省略
|
|
||||||
for (int l = 0; l < Num; ++l) {
|
|
||||||
// cout << o[l] << endl;
|
|
||||||
if (l == Num - 1) {
|
|
||||||
outFile << o[l];
|
|
||||||
} else {
|
|
||||||
outFile << o[l] << ',';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
outFile << endl;
|
|
||||||
outFile.close();
|
|
||||||
cout << "write over!" << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 对比两个人的emb值,计算空间欧氏距离
|
* 对比两个人的emb值,计算空间欧氏距离
|
||||||
@@ -113,98 +63,6 @@ void run_mtcnn(Mat &image, vector<Rect> &vecRect, vector<Point> &vecPoint) {
|
|||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 执行facenet网络(一张图与数据库里的多个人脸做比对)
|
|
||||||
* @param image 图片
|
|
||||||
* @param vecRect 人脸框
|
|
||||||
* @param csv_num csv数量 缺省 0 写csv模式
|
|
||||||
*/
|
|
||||||
void run_facenet(Mat &image, vector<Rect> &vecRect, int csv_num = 0) {
|
|
||||||
for (int i = 0; i < vecRect.size(); ++i) {
|
|
||||||
Mat fourthImage;
|
|
||||||
resize(image(vecRect[i]), 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, i);
|
|
||||||
|
|
||||||
// write_emb_csv(n, i);
|
|
||||||
// return;
|
|
||||||
if (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.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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 执行run_mtcnn和run_facenet
|
|
||||||
* 一张图,通过run_mtcnn找到n个人脸
|
|
||||||
* n个人脸通过run_facenet与数据库里的m个人脸数据做匹配,看看这n个人分别是谁
|
|
||||||
*/
|
|
||||||
void run() {
|
|
||||||
int b = 0;
|
|
||||||
if (b == 0) {
|
|
||||||
|
|
||||||
Mat image = imread("../test_img/zhangjie0.jpeg");
|
|
||||||
|
|
||||||
clock_t start;
|
|
||||||
start = clock();
|
|
||||||
vector<Rect> vecRect;
|
|
||||||
vector<Point> vecPoint;
|
|
||||||
run_mtcnn(image, vecRect, vecPoint);
|
|
||||||
|
|
||||||
run_facenet(image, vecRect, 13);// 第三个参数csv数量,如果为0,则是保存emb到csv功能
|
|
||||||
|
|
||||||
imshow("result", image);
|
|
||||||
imwrite("../test_img/result.jpg", image);
|
|
||||||
start = clock() - start;
|
|
||||||
// cout<<"time is "<<start/10e3<<endl;
|
|
||||||
cout << "time is " << (double) start / CLOCKS_PER_SEC * 1000 << "ms" << endl;
|
|
||||||
waitKey(5000);
|
|
||||||
image.release();
|
|
||||||
} else {
|
|
||||||
Mat image;
|
|
||||||
VideoCapture cap(0);
|
|
||||||
if (!cap.isOpened())
|
|
||||||
cout << "fail to open!" << endl;
|
|
||||||
cap >> image;
|
|
||||||
if (!image.data) {
|
|
||||||
cout << "读取视频失败" << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
mtcnn find(image.rows, image.cols);
|
|
||||||
clock_t start;
|
|
||||||
int stop = 1200;
|
|
||||||
//while (stop--) {
|
|
||||||
while (true) {
|
|
||||||
start = clock();
|
|
||||||
cap >> image;
|
|
||||||
vector<Rect> vecRect;
|
|
||||||
vector<Point> vecPoint;
|
|
||||||
find.findFace(image, vecRect, vecPoint);
|
|
||||||
imshow("result", image);
|
|
||||||
if (waitKey(1) >= 0) break;
|
|
||||||
start = clock() - start;
|
|
||||||
cout << "time is " << (double) start / CLOCKS_PER_SEC * 1000 << "ms" << endl;
|
|
||||||
}
|
|
||||||
waitKey(0);
|
|
||||||
image.release();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 执行单次单人的facenet网络
|
* 执行单次单人的facenet网络
|
||||||
@@ -212,7 +70,7 @@ void run() {
|
|||||||
* @param vecRect 人脸框
|
* @param vecRect 人脸框
|
||||||
* @param n emb值
|
* @param n emb值
|
||||||
*/
|
*/
|
||||||
void test_facenet(Mat &image, vector<Rect> &vecRect, vector<mydataFmt> &n) {
|
void run_facenet(Mat &image, vector<Rect> &vecRect, vector<mydataFmt> &n) {
|
||||||
Mat fourthImage;
|
Mat fourthImage;
|
||||||
resize(image(vecRect[0]), fourthImage, Size(160, 160), 0, 0, cv::INTER_LINEAR);
|
resize(image(vecRect[0]), fourthImage, Size(160, 160), 0, 0, cv::INTER_LINEAR);
|
||||||
facenet ggg;
|
facenet ggg;
|
||||||
@@ -225,9 +83,10 @@ void test_facenet(Mat &image, vector<Rect> &vecRect, vector<mydataFmt> &n) {
|
|||||||
/**
|
/**
|
||||||
* 对比两张图两个人的emb
|
* 对比两张图两个人的emb
|
||||||
*/
|
*/
|
||||||
void test() {
|
void run() {
|
||||||
Mat image0 = imread("../test_img/tom1.jpeg");
|
Mat image0 = imread("../test_img/tom0.jpeg");
|
||||||
Mat image1 = imread("../test_img/tom0.jpeg");
|
Mat image1 = imread("../test_img/tom1.jpeg");
|
||||||
|
//缩放一下图像
|
||||||
image0 = RS(image0);
|
image0 = RS(image0);
|
||||||
image1 = RS(image1);
|
image1 = RS(image1);
|
||||||
|
|
||||||
@@ -237,9 +96,9 @@ void test() {
|
|||||||
vector<mydataFmt> n0, n1;
|
vector<mydataFmt> n0, n1;
|
||||||
vector<Point> vecPoint0, vecPoint1;
|
vector<Point> vecPoint0, vecPoint1;
|
||||||
run_mtcnn(image0, vecRect0, vecPoint0);
|
run_mtcnn(image0, vecRect0, vecPoint0);
|
||||||
test_facenet(image0, vecRect0, n0);
|
run_facenet(image0, vecRect0, n0);
|
||||||
run_mtcnn(image1, vecRect1, vecPoint1);
|
run_mtcnn(image1, vecRect1, vecPoint1);
|
||||||
test_facenet(image1, vecRect1, n1);
|
run_facenet(image1, vecRect1, n1);
|
||||||
|
|
||||||
for (int i = 0; i < vecRect0.size(); ++i) {
|
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);
|
rectangle(image0, vecPoint0[7 * i + 0], vecPoint0[7 * i + 1], Scalar(0, 0, 255), 2, 8, 0);
|
||||||
@@ -270,7 +129,7 @@ void test() {
|
|||||||
start = clock() - start;
|
start = clock() - start;
|
||||||
// cout<<"time is "<<start/10e3<<endl;
|
// cout<<"time is "<<start/10e3<<endl;
|
||||||
cout << "time is " << (double) start / CLOCKS_PER_SEC * 1000 << "ms" << endl;
|
cout << "time is " << (double) start / CLOCKS_PER_SEC * 1000 << "ms" << endl;
|
||||||
waitKey(5000);
|
waitKey(0);
|
||||||
image0.release();
|
image0.release();
|
||||||
image1.release();
|
image1.release();
|
||||||
}
|
}
|
||||||
@@ -281,7 +140,7 @@ void test() {
|
|||||||
*/
|
*/
|
||||||
int main() {
|
int main() {
|
||||||
for (int i = 0; i < 1; ++i) {
|
for (int i = 0; i < 1; ++i) {
|
||||||
test();
|
run();
|
||||||
cout << "==============================" << endl;
|
cout << "==============================" << endl;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user