溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Qt如何實(shí)現(xiàn)人臉識(shí)別在線版

發(fā)布時(shí)間:2021-12-15 10:15:30 來源:億速云 閱讀:402 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容主要講解“Qt如何實(shí)現(xiàn)人臉識(shí)別在線版”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Qt如何實(shí)現(xiàn)人臉識(shí)別在線版”吧!

一、前言

關(guān)于人臉識(shí)別這塊,前些年不要太火,哪怕是到了今天依然火的一塌糊涂,什么玩意都要跟人臉識(shí)別搭個(gè)邊,這東西應(yīng)該只是人工智能的一個(gè)很小的部分,人臉識(shí)別光從字面上理解就是識(shí)別出人臉區(qū)域,其實(shí)背后真正的處理是拿到人臉區(qū)域圖片,提取人臉特征值,再用這些特征值去做比對(duì)分析處理,識(shí)別出到底是誰,國(guó)內(nèi)廠家也不少,比拼的就是準(zhǔn)確度誤報(bào)率,速度無非就是靠堆硬件來,什么VPU各種并行運(yùn)算都堆上去,速度杠杠的,好多廠家都做到了幾個(gè)毫秒的級(jí)別,估計(jì)很多廠家都是在開源的基礎(chǔ)上加上了自家的算法,一直跑呀跑的整出了符合自家算法的人臉模型文件,比如百度的人臉識(shí)別模型文件,經(jīng)過好幾年的發(fā)展,越來越大越來越細(xì)越來越準(zhǔn)。

聽某個(gè)大神說過,很多時(shí)候人工智能其實(shí)并不是完全的智能,絕大部分都停留在半智能階段,而且這種半智能階段還需要借助很多輔助的硬件甚至人為的判斷,很多模型庫文件的生成就是靠一小小姑娘在那邊流水線上類似的不停的點(diǎn)呀點(diǎn),號(hào)稱深度學(xué)習(xí)算法,就是讓他識(shí)別更多的數(shù)據(jù),使得更準(zhǔn)確。關(guān)于人臉識(shí)別或者人工智能,外行一般覺得很科幻,內(nèi)行一般覺得很絕望,業(yè)界領(lǐng)袖和領(lǐng)袖各種打雞血。

國(guó)內(nèi)的廠家大部分都提供了官網(wǎng)對(duì)應(yīng)的api來進(jìn)行處理,注冊(cè)個(gè)賬號(hào),搞個(gè)key,直接就可以擼起來,關(guān)于這塊技術(shù)上沒有任何難點(diǎn),初學(xué)者都可以搞定,無非就是先post數(shù)據(jù),拿到返回的數(shù)據(jù)進(jìn)行解析,要搞清楚的就是如何填充要post的數(shù)據(jù),比如帶上key,組織其他數(shù)據(jù)比如圖片是base64字符串上傳還是二進(jìn)制文件上傳等,返回的數(shù)據(jù)都是json啦,直接用現(xiàn)成的json庫進(jìn)行解析就ok。

百度人臉識(shí)別在線版和離線版SDK的封裝:

  1. 離線版要求支持C++11的編譯器,而且必須為MSVC。不支持mingw編譯器。

  2. 在線版中的密鑰等信息,務(wù)必記得換成自己申請(qǐng)的。

  3. 離線版本只能在windows上使用。

  4. 離線版本需要自己申請(qǐng)密鑰。找到facebaidusdk文件夾下的LicenseTool.exe,填寫后臺(tái)離線SDK管理中申請(qǐng)到的序列號(hào),單擊激活按鈕。

  5. 離線版本對(duì)應(yīng)的動(dòng)態(tài)庫和模型文件自行從官網(wǎng)下載。

  6. 如果源碼包中有facebaidusdk+face-resource文件夾則說明帶了動(dòng)態(tài)庫和模型庫文件夾,只需要將facebaidusdk文件夾下的所有文件復(fù)制到可執(zhí)行文件同一目錄,face-resource文件夾復(fù)制到可執(zhí)行文件夾目錄同等級(jí)目錄即可。目錄位置見snap文件夾下的示例圖。

  7. facebaidusdk目錄下的TestFaceApi.exe為百度提供的測(cè)試程序,先要將USB攝像頭插到電腦上,會(huì)實(shí)時(shí)找人臉框。

二、功能特點(diǎn)

  1. 支持的功能包括人臉識(shí)別、人臉比對(duì)、人臉?biāo)阉?、活體檢測(cè)等。

  2. 在線版還支持身份證、駕駛證、行駛證、銀行卡等識(shí)別。

  3. 在線版的協(xié)議支持百度、曠視,離線版的支持百度,可定制。

  4. 除了支持X86架構(gòu),還支持嵌入式linux比如contex-A9、樹莓派等。

  5. 每個(gè)功能的執(zhí)行除了返回結(jié)果還返回執(zhí)行用時(shí)時(shí)間。

  6. 多線程處理,通過type控制當(dāng)前處理類型。

  7. 支持單張圖片檢索相似度最高的圖片。

  8. 支持指定目錄圖片用來生成人臉特征值文件。

  9. 可設(shè)置等待處理圖片隊(duì)列中的數(shù)量。

  10. 每次執(zhí)行都有成功或者失敗的信號(hào)返回。

  11. 人臉?biāo)阉鞯姆祷亟Y(jié)果包含了原圖+最大相似度圖+相似度等。

  12. 人臉比對(duì)同時(shí)支持兩張圖片和兩個(gè)特征值比對(duì)。

  13. 相關(guān)功能自定義一套協(xié)議用于客戶端和服務(wù)端,可以通過TCP通信進(jìn)行交互。

  14. 自定義人臉識(shí)別協(xié)議非常適用于中心一臺(tái)服務(wù)器,現(xiàn)場(chǎng)若干設(shè)備請(qǐng)求的場(chǎng)景。

  15. 每個(gè)模塊全部是獨(dú)立的一個(gè)類,代碼整潔、注釋完善。

三、效果圖

Qt如何實(shí)現(xiàn)人臉識(shí)別在線版

四、核心代碼

void FaceWebBaiDu::finished(QNetworkReply *reply)
{
    QString error = reply->errorString();
    if (!error.isEmpty() && error != "Unknown error") {
        emit receiveError(error);
    }

    if (reply->bytesAvailable() > 0 && reply->error() == QNetworkReply::NoError) {
        QString data = reply->readAll();
        reply->deleteLater();

        //發(fā)送接收數(shù)據(jù)信號(hào)
        emit receiveData(data);

        //初始化腳本引擎
        QScriptEngine engine;
        //構(gòu)建解析對(duì)象
        QScriptValue script = engine.evaluate("value=" + data);

        //獲取鑒權(quán)標(biāo)識(shí)符
        QString token = script.property("access_token").toString();
        if (!token.isEmpty()) {
            this->token = token;
            emit receiveResult(0, "鑒權(quán)標(biāo)識(shí)返回成功");
            return;
        }

        //通用返回結(jié)果字段
        int code = script.property("error_code").toInt32();
        QString msg = script.property("error_msg").toString();
        emit receiveResult(code, msg);

        //圖片識(shí)別部分
        QScriptValue result = script.property("result");
        if (!result.isNull()) {
            //人臉識(shí)別
            if (data.contains("location")) {
                QScriptValue face_list = result.property("face_list");
                checkFaceList(face_list);
            }

            //人臉比對(duì)
            if (data.contains("score") && !data.contains("location")) {
                QScriptValue score = result.property("score");
                float result = score.toString().toFloat();
                if (result > 0) {
                    emit receiveFaceCompare(QRect(), QRect(), result);
                } else {
                    emit receiveFaceCompareFail();
                }
            }

            //活體檢測(cè)
            if (data.contains("face_liveness")) {
                QScriptValue face_liveness = result.property("face_liveness");
                float result = face_liveness.toString().toFloat();
                if (result >= 0) {
                    emit receiveLive(result);
                }
            }           
        }        
    }
}

void FaceWebBaiDu::checkFaceList(const QScriptValue &scriptValue)
{
    //創(chuàng)建迭代器逐個(gè)解析具體值
    QScriptValueIterator it(scriptValue);
    while (it.hasNext()) {
        it.next();
        if (it.flags() & QScriptValue::SkipInEnumeration) {
            continue;
        }

        QRect rect;
        QString face_token = it.value().property("face_token").toString();
        if (!face_token.isEmpty()) {
            QScriptValue value = it.value().property("location");
            rect = FaceHelper::getRect(value);
        }

        if (rect.width() > 0) {
            emit receiveFaceRect(rect);
            break;
        }
    }
}

void FaceWebBaiDu::getToken()
{
    //具體參見 http://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjhhu
    QStringList list;
    list.append(QString("grant_type=%1").arg("client_credentials"));
    list.append(QString("client_id=%1").arg(key));
    list.append(QString("client_secret=%1").arg(secret));
    QString data = list.join("&");

    QString url = "https://aip.baidubce.com/oauth/2.0/token";
    FaceHelper::sendData(manager, url, data);
}

void FaceWebBaiDu::detect(const QImage &img)
{
    QString imgData = FaceHelper::getImageData2(img);

    QStringList list;
    list.append(QString("{\"image\":\"%1\",\"image_type\":\"BASE64\"}").arg(imgData));
    QString data = list.join("");

    QString url = QString("https://aip.baidubce.com/rest/2.0/face/v3/detect?access_token=%1").arg(token);
    FaceHelper::sendData(manager, url, data);
}

void FaceWebBaiDu::compare(const QImage &img1, const QImage &img2)
{
    QString imgData1 = FaceHelper::getImageData2(img1);
    QString imgData2 = FaceHelper::getImageData2(img2);

    //如果需要活體檢測(cè)則NONE改為L(zhǎng)OW NORMAL HIGH
    QStringList list;
    list.append("[");
    list.append(QString("{\"image\":\"%1\",\"image_type\":\"BASE64\",\"liveness_control\":\"NONE\"}").arg(imgData1));
    list.append(",");
    list.append(QString("{\"image\":\"%1\",\"image_type\":\"BASE64\",\"liveness_control\":\"NONE\"}").arg(imgData2));
    list.append("]");
    QString data = list.join("");

    QString url = QString("https://aip.baidubce.com/rest/2.0/face/v3/match?access_token=%1").arg(token);
    FaceHelper::sendData(manager, url, data);
}

void FaceWebBaiDu::live(const QImage &img)
{
    QList<QImage> imgs;
    if (!img.isNull()) {
        imgs << img;
    }

    live(imgs);
}

void FaceWebBaiDu::live(const QList<QImage> &imgs)
{
    //記住最后一次處理的時(shí)間,限制頻繁的調(diào)用
    QDateTime now = QDateTime::currentDateTime();
    if (lastTime.msecsTo(now) < 500) {
        return;
    }

    lastTime = now;
    QStringList list;
    list.append("[");

    int count = imgs.count();
    for (int i = 0; i < count; i++) {
        QString imgData = FaceHelper::getImageData2(imgs.at(i));
        list.append(QString("{\"image\":\"%1\",\"image_type\":\"BASE64\"}").arg(imgData));
        if (i < count - 1) {
            list.append(",");
        }
    }

    list.append("]");
    QString data = list.join("");

    QString url = QString("https://aip.baidubce.com/rest/2.0/face/v3/faceverify?access_token=%1").arg(token);
    FaceHelper::sendData(manager, url, data);
}

到此,相信大家對(duì)“Qt如何實(shí)現(xiàn)人臉識(shí)別在線版”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

qt
AI