更新业务代码

更新业务代码
删除写入csv部分

Co-Authored-By: Chris Kong <609027949@qq.com>
This commit is contained in:
2020-10-14 12:19:14 +08:00
parent e1dbedc791
commit 88499210e8
2 changed files with 26 additions and 151 deletions

View File

@@ -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的
项目导入Clionreload CMakeLists.txtrun
2019-12-06 修改多处bug卷积初始化后直接进行卷积 2019-12-06 修改多处bug卷积初始化后直接进行卷积
2019-12-24 添加BN层 2019-12-24 添加BN层
需要模型文件的可以给我发邮件 需要模型文件的可以给我发邮件

View File

@@ -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;