From 88499210e85ee0dfe46aec48f0dad9481dff7e5e Mon Sep 17 00:00:00 2001 From: ChrisKong <609027949@qq.com> Date: Wed, 14 Oct 2020 12:19:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=9A=E5=8A=A1=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新业务代码 删除写入csv部分 Co-Authored-By: Chris Kong <609027949@qq.com> --- README.md | 18 +++++- src/pikaqiu.cpp | 159 +++--------------------------------------------- 2 files changed, 26 insertions(+), 151 deletions(-) diff --git a/README.md b/README.md index a40a48e..3cf7f24 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,24 @@ MTCNN-FaceNet-light with c++ 只用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-24 添加BN层 -需要模型文件的可以给我发邮件 +需要模型文件的可以给我发邮件 \ No newline at end of file diff --git a/src/pikaqiu.cpp b/src/pikaqiu.cpp index cdf129d..5827819 100644 --- a/src/pikaqiu.cpp +++ b/src/pikaqiu.cpp @@ -26,56 +26,6 @@ Mat RS(Mat &src) { return dst; } -/** - * 加载csv中的emb - * @param num csv的个数 - * @param vecVec 将emb参数存在二维vector中,外层定位某个人,内层定位某个emb值 - */ -void load_emb_csv(int num, vector> &vecVec) { - for (int i = 0; i < num; ++i) { - ifstream inFile("../emb_csv/" + to_string(i) + ".csv", ios::in); - string lineStr; -// vector> strArray; - vector lineArray; - while (getline(inFile, lineStr)) { - // 打印整行字符串 -// cout << lineStr << endl; - // 存成二维表结构 - stringstream ss(lineStr); - string str; -// vector 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 &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值,计算空间欧氏距离 @@ -113,98 +63,6 @@ void run_mtcnn(Mat &image, vector &vecRect, vector &vecPoint) { // } } -/** - * 执行facenet网络(一张图与数据库里的多个人脸做比对) - * @param image 图片 - * @param vecRect 人脸框 - * @param csv_num csv数量 缺省 0 写csv模式 - */ -void run_facenet(Mat &image, vector &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 n; - vector> 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 vecRect; - vector 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 "<> 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 vecRect; - vector 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网络 @@ -212,7 +70,7 @@ void run() { * @param vecRect 人脸框 * @param n emb值 */ -void test_facenet(Mat &image, vector &vecRect, vector &n) { +void run_facenet(Mat &image, vector &vecRect, vector &n) { Mat fourthImage; resize(image(vecRect[0]), fourthImage, Size(160, 160), 0, 0, cv::INTER_LINEAR); facenet ggg; @@ -225,9 +83,10 @@ void test_facenet(Mat &image, vector &vecRect, vector &n) { /** * 对比两张图两个人的emb */ -void test() { - Mat image0 = imread("../test_img/tom1.jpeg"); - Mat image1 = imread("../test_img/tom0.jpeg"); +void run() { + Mat image0 = imread("../test_img/tom0.jpeg"); + Mat image1 = imread("../test_img/tom1.jpeg"); + //缩放一下图像 image0 = RS(image0); image1 = RS(image1); @@ -237,9 +96,9 @@ void test() { vector n0, n1; vector vecPoint0, vecPoint1; run_mtcnn(image0, vecRect0, vecPoint0); - test_facenet(image0, vecRect0, n0); + run_facenet(image0, vecRect0, n0); run_mtcnn(image1, vecRect1, vecPoint1); - test_facenet(image1, vecRect1, n1); + run_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); @@ -270,7 +129,7 @@ void test() { start = clock() - start; // cout<<"time is "<