SeetaFace2-master在Windows10+VS環(huán)境中實(shí)現(xiàn)人臉檢測(cè)两曼、關(guān)鍵點(diǎn)定位皂甘、特征提取與比對(duì)的Simple Demos

  • 首先,需要實(shí)現(xiàn)SeetaFace2-master在Windows10 VS20XX搭建項(xiàng)目悼凑。
    可以參考這篇博客:https://blog.csdn.net/sinat_33896833/article/details/100183581
  • 環(huán)境搭建好之后偿枕,會(huì)發(fā)現(xiàn)里面有example.cpp,運(yùn)行能夠基本實(shí)現(xiàn)FaceDetection功能户辫。但還是不夠渐夸,因此我又模擬了幾個(gè)demo,僅供參考渔欢。

在search中添加.cpp文件

引用頭文件

#pragma warning(disable: 4819)

#include <seeta/FaceEngine.h>
#include <seeta/FaceDetector.h>
#include <seeta/FaceLandmarker.h>

#include <seeta/Struct_cv.h>
#include <seeta/Struct.h>

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <array>
#include <map>
#include <string.h>
#include <time.h>
#include <windows.h>
#include <vector>
#include <cstdio>
#include <fstream>
#include <iostream>
using std::string;
using std::vector;
using namespace std;

圖片對(duì)象FaceDetection墓塌、FaceLandmarker

int test_image(seeta::FaceDetector &FD, seeta::FaceLandmarker &FL)
{
    std::string image_path = "C:\\xxx\\xxx\\xxx.jpg";
    std::cout << "Loading image: " << image_path << std::endl;
    auto frame = cv::imread(image_path);
    seeta::cv::ImageData simage = frame;

    if (simage.empty()) {
        std::cerr << "Can not open image: " << image_path << std::endl;
        return EXIT_FAILURE;
    }


    auto faces = FD.detect(simage);

    for (int i = 0; i < faces.size; ++i)
    {
        auto &face = faces.data[i];
        auto points = FL.mark(simage, face.pos);

        cv::rectangle(frame, cv::Rect(face.pos.x, face.pos.y, face.pos.width, face.pos.height), CV_RGB(128, 128, 255), 3);
        for (auto &point : points)
        {
            cv::circle(frame, cv::Point(point.x, point.y), 3, CV_RGB(128, 255, 128), -1);
        }
    }

    auto output_path = image_path + ".pts81.png";
    cv::imwrite(output_path, frame);
    std::cerr << "Saving result into: " << output_path << std::endl;

    cv::namedWindow("Image_Result", 0);
    //cv::resizeWindow("Image_Result",500,500);
    cv::imshow("Image_Result", frame);
    cv::waitKey(0);

    return 0;
    //return EXIT_SUCCESS;
}

視頻對(duì)象FaceDetection、FaceLandmarker

int test_video(seeta::FaceDetector &FD, seeta::FaceLandmarker &FL)
{
    cv::VideoCapture capture;
    cv::Mat video;
    video = capture.open("C:\\xxx\\xxx\\xxx.mp4");
    cv::Mat frame;
    if (!capture.isOpened())
    {
        printf("Can not open the video.\n");
        return -1;
    }
    while (capture.isOpened())
    {
        capture.grab();
        capture.retrieve(frame);

        if (frame.empty()) break;

        seeta::cv::ImageData simage = frame;

        auto faces = FD.detect(simage);

        for (int i = 0; i < faces.size; ++i)
        {
            auto &face = faces.data[i];
            auto points = FL.mark(simage, face.pos);

            cv::rectangle(frame, cv::Rect(face.pos.x, face.pos.y, face.pos.width, face.pos.height), CV_RGB(128, 128, 255), 3);
            for (auto &point : points)
            {
                cv::circle(frame, cv::Point(point.x, point.y), 2, CV_RGB(128, 255, 128), -1);
            }
        }
        cv::namedWindow("Video_Result", 0);
        cv::imshow("Video_Result", frame);
        auto key = cv::waitKey(20);
        if (key == 27)
        {
            break;
        }
    }
    return EXIT_SUCCESS;
}

圖片對(duì)象FaceRecognizer

int identify_pic(){
    seeta::ModelSetting::Device device = seeta::ModelSetting::CPU;
    int id = 0;
    seeta::ModelSetting FD_model("./model/fd_2_00.dat", device, id);
    seeta::ModelSetting PD_model("./model/pd_2_00_pts5.dat", device, id);
    seeta::ModelSetting FR_model("./model/fr_2_10.dat", device, id);
    seeta::ModelSetting FL_model("./model/pd_2_00_pts81.dat", device, id);
    seeta::FaceEngine engine(FD_model, PD_model, FR_model, 2, 16);

    seeta::FaceDetector FD(FD_model);
    seeta::FaceLandmarker FL(FL_model);

    // recognization threshold
    float threshold = 0.5f;

    //set face detector's min face size
    engine.FD.set(seeta::FaceDetector::PROPERTY_MIN_FACE_SIZE, 50);

    //this is the picture identity database directory
    std::ifstream fin("C:\\xxx\\xxx\\xxx\\list.txt");
        
    if (!fin.is_open())
    {
        cout << "can not open listfile." << endl;
    }

    std::vector<std::string> GalleryImageFilename;
    string str;
    while (std::getline(fin, str))
    {
        GalleryImageFilename.push_back(str);
    }
    fin.close();

    std::vector<int64_t> GalleryIndex(GalleryImageFilename.size());
    for (size_t i = 0; i < GalleryImageFilename.size(); ++i)
    {
        //register face into facedatabase
        std::string &filename = GalleryImageFilename[i];
        
        int64_t &index = GalleryIndex[i];
        std::cerr << "Registering... " << filename << std::endl;
        seeta::cv::ImageData image = cv::imread(filename);
        auto id = engine.Register(image);
        /*
        //刪除文件夾中無(wú)效圖片
        if (id == -1)
        {
            const char* p = filename.data();
            remove(p);
        }*/
        index = id;
        std::cerr << "Registered id = " << id << std::endl;
    }
    std::map<int64_t, std::string> GalleryIndexMap;
    for (size_t i = 0; i < GalleryIndex.size(); ++i)
    {
        // save index and name pair
        if (GalleryIndex[i] < 0) continue;
        GalleryIndexMap.insert(std::make_pair(GalleryIndex[i], GalleryImageFilename[i]));
    }
    std::string image_path = "C:\\xxx\\xxx\\xxx.jpg";
    std::cout << "Loading image: " << image_path << std::endl;
    auto frame = cv::imread(image_path);
    int width1 = frame.cols;
    int height1 = frame.rows;
    cv::resize(frame, frame, cv::Size(width1 / 2, height1 / 2));
    
        seeta::cv::ImageData image = frame;

        // Detect all faces
        std::vector<SeetaFaceInfo> faces = engine.DetectFaces(image);

        for (SeetaFaceInfo &face : faces)
        {
            // Query top 1
            int64_t index = -1;
            float similarity = 0;

            auto points = engine.DetectPoints(image, face);
            
            auto faces = FD.detect(image);

            for (int i = 0; i < faces.size; ++i)
            {
                auto &face = faces.data[i];
                auto points = FL.mark(image, face.pos);

                cv::rectangle(frame, cv::Rect(face.pos.x, face.pos.y, face.pos.width, face.pos.height), CV_RGB(128, 128, 255), 3);
                for (auto &point : points)
                {
                    cv::circle(frame, cv::Point(point.x, point.y), 3, CV_RGB(128, 255, 128), -1);
                }
            }

            auto queried = engine.QueryTop(image, points.data(), 1, &index, &similarity);

            /*cv::rectangle(frame, cv::Rect(face.pos.x, face.pos.y, face.pos.width, face.pos.height), CV_RGB(128, 128, 255), 3);
            for (int i = 0; i < 5; ++i)
            {
                auto &point = points[i];
                cv::circle(frame, cv::Point(int(point.x), int(point.y)), 2, CV_RGB(128, 255, 128), -1);
            }*/

            // no face queried from database
            if (queried < 1) continue;

            std::cerr << similarity << std::endl;
            std::cout << "top_person:" << GalleryIndexMap[index] << std::endl;
            // similarity greater than threshold, means recognized
            if (similarity > threshold)
            {
                std::cout << "right_person:" << GalleryIndexMap[index] << std::endl;
                cv::putText(frame, GalleryIndexMap[index], cv::Point(face.pos.x, face.pos.y - 5), 3, 1, CV_RGB(255, 128, 128));
            }
            else {
                std::cerr << "Nothing similar." << std::endl;
            }
        }
            cv::namedWindow("Compare_Result", 0);
            cv::imshow("Compare_Result", frame);
            cv::waitKey(0);
    return 0;
}

camera對(duì)象FaceRecognizer

int identify_camera() {
    seeta::ModelSetting::Device device = seeta::ModelSetting::CPU;
    int id = 0;
    seeta::ModelSetting FD_model("./model/fd_2_00.dat", device, id);
    seeta::ModelSetting PD_model("./model/pd_2_00_pts5.dat", device, id);
    seeta::ModelSetting FR_model("./model/fr_2_10.dat", device, id);
    seeta::ModelSetting FL_model("./model/pd_2_00_pts81.dat", device, id);
    seeta::FaceEngine engine(FD_model, PD_model, FR_model, 2, 16);

    seeta::FaceDetector FD(FD_model);
    seeta::FaceLandmarker FL(FL_model);

    // recognization threshold
    float threshold = 0.5f;

    //set face detector's min face size
    engine.FD.set(seeta::FaceDetector::PROPERTY_MIN_FACE_SIZE, 50);

    //this is the picture identity database directory
    std::ifstream fin("C:\\xxx\\xxx\\list.txt");
    if (!fin.is_open())
    {
        cout << "can not open listfile." << endl;
    }

    std::vector<std::string> GalleryImageFilename;
    string str;
    while (std::getline(fin, str))
    {
        GalleryImageFilename.push_back(str);
    }
    fin.close();

    std::vector<int64_t> GalleryIndex(GalleryImageFilename.size());
    for (size_t i = 0; i < GalleryImageFilename.size(); ++i)
    {
        //register face into facedatabase
        std::string &filename = GalleryImageFilename[i];

        int64_t &index = GalleryIndex[i];
        std::cerr << "Registering... " << filename << std::endl;
        seeta::cv::ImageData image = cv::imread(filename);
        auto id = engine.Register(image);
        /*
        //刪除文件夾中無(wú)效圖片,防止數(shù)據(jù)庫(kù)中無(wú)效圖片過(guò)多桃纯。
        if (id == -1)
        {
            const char* p = filename.data();
            remove(p);
        }*/
        index = id;
        std::cerr << "Registered id = " << id << std::endl;
    }
    std::map<int64_t, std::string> GalleryIndexMap;
    for (size_t i = 0; i < GalleryIndex.size(); ++i)
    {
        // save index and name pair
        if (GalleryIndex[i] < 0) continue;
        GalleryIndexMap.insert(std::make_pair(GalleryIndex[i], GalleryImageFilename[i]));
    }
    std::cout << "----open camera----" << std::endl;
    // Open default USB camera
    cv::VideoCapture capture;
    capture.open(0);

    cv::Mat frame;

    while (capture.isOpened())
    {
        capture >> frame;
        if (frame.empty()) continue;

        seeta::cv::ImageData image = frame;

        // Detect all faces
        std::vector<SeetaFaceInfo> faces = engine.DetectFaces(image);

        for (SeetaFaceInfo &face : faces)
        {
            // Query top 1
            int64_t index = -1;
            float similarity = 0;

            auto points = engine.DetectPoints(image, face);

            auto queried = engine.QueryTop(image, points.data(), 1, &index, &similarity);

            cv::rectangle(frame, cv::Rect(face.pos.x, face.pos.y, face.pos.width, face.pos.height), CV_RGB(128, 128, 255), 3);
            for (int i = 0; i < 5; ++i)
            {
                auto &point = points[i];
                cv::circle(frame, cv::Point(int(point.x), int(point.y)), 2, CV_RGB(128, 255, 128), -1);
            }

            // no face queried from database
            if (queried < 1) continue;
            std::cerr << similarity << std::endl;
            // similarity greater than threshold, means recognized
            if (similarity > threshold)
            {
                std::cout << "person:" << GalleryIndexMap[index] << std::endl;
                cv::putText(frame, GalleryIndexMap[index], cv::Point(face.pos.x, face.pos.y - 5), 3, 1, CV_RGB(255, 128, 128));
                capture.release();    //close camera
            }
            else {
                std::cerr << "Nothing similar." << std::endl;
                capture.release();    //close camera
            }
        }

        cv::imshow("Idenify_result", frame);

        auto key = cv::waitKey(20);
        if (key == 27)
        {
            break;
        }
    }
    return 0;
}

主函數(shù)調(diào)用

int main()
{
    
    seeta::ModelSetting::Device device = seeta::ModelSetting::CPU;
    int id = 0;
    seeta::ModelSetting FD_model( "./model/fd_2_00.dat", device, id );
    seeta::ModelSetting PD_model( "./model/pd_2_00_pts5.dat", device, id );
    seeta::ModelSetting FR_model( "./model/fr_2_10.dat", device, id );
    seeta::ModelSetting FL_model("./model/pd_2_00_pts81.dat", device, id);
    seeta::FaceEngine engine( FD_model, PD_model, FR_model, 2, 16 );

    seeta::FaceDetector FD(FD_model);
    seeta::FaceLandmarker FL(FL_model);
    
    // recognization threshold
    float threshold = 0.5f;

    //set face detector's min face size
    engine.FD.set( seeta::FaceDetector::PROPERTY_MIN_FACE_SIZE, 50 );
    
    //test_video(FD, FL);
    //test_image(FD, FL);
    identify_pic();
    //identify_camera();

    //測(cè)試本地?cái)z像頭
    /*
    std::vector<std::string> GalleryImageFilename = { "C:\\xxx\\xxx\\xxx.jpg" };
    std::vector<int64_t> GalleryIndex( GalleryImageFilename.size() );
    for( size_t i = 0; i < GalleryImageFilename.size(); ++i )
    {
        //register face into facedatabase
        std::string &filename = GalleryImageFilename[i];
        int64_t &index = GalleryIndex[i];
        std::cerr << "Registering... " << filename << std::endl;
        seeta::cv::ImageData image = cv::imread( filename );
        auto id = engine.Register( image );
        index = id;
        std::cerr << "Registered id = " << id << std::endl;
    }
    std::map<int64_t, std::string> GalleryIndexMap;
    for( size_t i = 0; i < GalleryIndex.size(); ++i )
    {
        // save index and name pair
        if( GalleryIndex[i] < 0 ) continue;
        GalleryIndexMap.insert( std::make_pair( GalleryIndex[i], GalleryImageFilename[i] ) );
    }

    std::cout << "----open camera----" << std::endl;
    // Open default USB camera
    cv::VideoCapture capture;
    capture.open( 0 );

    cv::Mat frame;

    while( capture.isOpened() )
    {
        capture >> frame;
        if( frame.empty() ) continue;

        seeta::cv::ImageData image = frame;

        // Detect all faces
        std::vector<SeetaFaceInfo> faces = engine.DetectFaces( image );

        for( SeetaFaceInfo &face : faces )
        {
            // Query top 1
            int64_t index = -1;
            float similarity = 0;

            auto points = engine.DetectPoints(image, face);
             
            auto queried = engine.QueryTop( image, points.data(), 1, &index, &similarity );

            cv::rectangle( frame, cv::Rect( face.pos.x, face.pos.y, face.pos.width, face.pos.height ), CV_RGB( 128, 128, 255 ), 3 );
            for (int i = 0; i < 5; ++i)
            {
                auto &point = points[i];
                cv::circle(frame, cv::Point(int(point.x), int(point.y)), 2, CV_RGB(128, 255, 128), -1);
            }

            // no face queried from database
            if (queried < 1) continue;

            // similarity greater than threshold, means recognized
            if( similarity > threshold )
            {
                cv::putText( frame, GalleryIndexMap[index], cv::Point( face.pos.x, face.pos.y - 5 ), 3, 1, CV_RGB( 255, 128, 128 ) );
            }
        }

        cv::imshow( "Frame", frame );

        auto key = cv::waitKey( 20 );
        if( key == 27 )
        {
            break;
        }
    }
    */
    return 0;
}
  • 歡迎提出問(wèn)題建議酷誓,查缺補(bǔ)漏披坏。
    如有幫助态坦,請(qǐng)多多支持,感謝~~~
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末棒拂,一起剝皮案震驚了整個(gè)濱河市伞梯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌帚屉,老刑警劉巖谜诫,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異攻旦,居然都是意外死亡喻旷,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門牢屋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)且预,“玉大人,你說(shuō)我怎么就攤上這事烙无》嫘常” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵截酷,是天一觀的道長(zhǎng)涮拗。 經(jīng)常有香客問(wèn)我,道長(zhǎng)迂苛,這世上最難降的妖魔是什么三热? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮三幻,結(jié)果婚禮上康铭,老公的妹妹穿的比我還像新娘。我一直安慰自己赌髓,他們只是感情好从藤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著锁蠕,像睡著了一般夷野。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荣倾,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天悯搔,我揣著相機(jī)與錄音,去河邊找鬼舌仍。 笑死妒貌,一個(gè)胖子當(dāng)著我的面吹牛通危,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灌曙,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼菊碟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了在刺?” 一聲冷哼從身側(cè)響起逆害,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤空免,失蹤者是張志新(化名)和其女友劉穎吓歇,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體偶妖,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颖杏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年纯陨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片留储。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡翼抠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出欲鹏,到底是詐尸還是另有隱情机久,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布赔嚎,位于F島的核電站膘盖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尤误。R本人自食惡果不足惜侠畔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望损晤。 院中可真熱鬧软棺,春花似錦、人聲如沸尤勋。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)最冰。三九已至瘦棋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間暖哨,已是汗流浹背赌朋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沛慢。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓赡若,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親团甲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逾冬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1,Search Bar 怎樣去掉背景的顏色(storyboard里只能設(shè)置background顏色,可是發(fā)現(xiàn)cl...
    以德扶人閱讀 2,347評(píng)論 2 50
  • 幾千年來(lái)分冈,我們一直在尋找一種能夠延長(zhǎng)壽命的方法圾另,但結(jié)果卻是運(yùn)氣不佳。在過(guò)去的200年里雕沉,發(fā)達(dá)國(guó)家的人均壽命從37歲...
    梓色揚(yáng)光閱讀 467評(píng)論 0 2
  • 清明節(jié)的陵園里集乔, 我靜靜肅立。 讓目光觸摸每一個(gè)墓碑坡椒, 眼前呈現(xiàn)飄揚(yáng)的戰(zhàn)旗扰路。 松柏的長(zhǎng)青, 攪動(dòng)我心的潮汐倔叼。 ...
    左寨小學(xué)王晶霞閱讀 236評(píng)論 0 1
  • 那么一瞬間汗唱,想要談戀愛(ài),想要結(jié)婚丈攒,想要做好多好多的事情哩罪。這種沖動(dòng)提醒著我,自己的人生空白一片巡验。
    千浮生閱讀 116評(píng)論 0 0
  • 今天我回到家看見(jiàn)有一個(gè)大包裹际插,我拆開(kāi)一看,哇喔显设,原來(lái)是媽媽給我買的輪滑鞋框弛,我好興奮喲。 我的新輪滑鞋是黃黑色的...
    M張皓軒M閱讀 182評(píng)論 0 1