I.はじめに
顔の認識に関しては、数年前はあまり人気がありませんでした。今日でもまだ混乱しています。顔の認識には何でもしなければなりません。これは人工知能のほんの一部であるはずです。認識ライトは文字通り顔の領域を認識することを意味します。実際、その背後にある実際の処理は、顔の領域の画像を取得し、顔の特徴値を抽出し、これらの特徴値を使用して比較、分析、およびそれが誰であるかを識別することです。国内メーカーも多い。誤警報率の正確さ、スピードはハードウェアの積み重ねに過ぎない。VPUのあらゆる並列運転が積み重なっている。多くのメーカーが数ミリ秒のレベルを達成している。メーカーはオープンソースに基づいて独自のアルゴリズムを追加し、Baiduの顔認識モデルファイルなど、独自のアルゴリズムに準拠した顔モデルファイルを作成するために実行および実行しています。数年の開発の後、ますます多くの大きく、小さく、より正確に。
偉大な神から、人工知能は完全にインテリジェントではないことが多く、そのほとんどはセミインテリジェンス段階にとどまっていると聞いています。このセミインテリジェンス段階には、多くの補助ハードウェア、さらには人間の判断、多くのモデルライブラリファイルも必要です。の生成は、向こうのパイプラインにある小さな女の子の同様のノンストップドットに基づいています。いわゆるディープラーニングアルゴリズムにより、彼はより多くのデータを識別し、より正確にすることができます。顔認識や人工知能に関しては、素人は一般的にSFだと感じ、専門家は一般的に必死に感じ、業界のリーダーとリーダーは皆戦っています。
国内メーカーの多くは、公式サイトに対応したAPIを提供しており、処理、アカウント登録、キー取得が可能で、直接押すことができます。技術的な問題はありません。初心者でもデータを投稿するだけで対応できます。返されたデータを分析用に取得した後、キーの持ち込み、画像がbase64文字列またはバイナリファイルのどちらでアップロードされているかなどの他のデータの整理など、投稿するデータの入力方法を理解する必要があります。返されるデータはすべてjsonです。既製のjsonライブラリを直接使用して解析することは問題ありません。
Baiduの顔認識オンラインおよびオフラインSDKパッケージ:
- オフラインバージョンには、C ++ 11をサポートするコンパイラが必要であり、MSVCである必要があります。mingwコンパイラはサポートされていません。
- オンライン版の鍵やその他の情報を、申請したものに置き換えることを忘れないでください。
- オフラインバージョンはWindowsでのみ使用できます。
- オフラインバージョンは、自分でキーを申請する必要があります。facebaidusdkフォルダーでLicenseTool.exeを見つけ、バックグラウンドのオフラインSDK管理で適用されたシリアル番号を入力して、アクティブ化ボタンをクリックします。
- オフライン版に対応するダイナミックライブラリとモデルファイルは、公式サイトからダウンロードできます。
- ソースコードパッケージにfacebaidusdk + face-resourceフォルダーがある場合は、動的ライブラリフォルダーとモデルライブラリフォルダーが含まれていることを意味します。facebaidusdkフォルダー内のすべてのファイルを実行可能ファイルの同じディレクトリにコピーし、face-resourceフォルダーを実行可能ファイルにコピーするだけで済みます。同じレベルのディレクトリでフォルダディレクトリを実行するだけです。ディレクトリの場所については、snapフォルダーのサンプル図を参照してください。
- facebaidusdkディレクトリのTestFaceApi.exeは、Baiduが提供するテストプログラムです。まず、USBカメラをコンピュータに接続すると、リアルタイムでフェイスフレームが検出されます。
2.機能
- サポートされている機能には、顔認識、顔比較、顔検索、生体検出などがあります。
- オンライン版では、IDカード、運転免許証、運転許可証、銀行カードの識別もサポートされています。
- プロトコルのオンラインバージョンはBaiduとMegviiをサポートし、オフラインバージョンはカスタマイズ可能なBaiduをサポートします。
- X86アーキテクチャのサポートに加えて、contex-A9、RaspberryPiなどの組み込みLinuxもサポートします。
- 各関数を実行すると、結果だけでなく実行時間も返されます。
- 現在の処理タイプを制御するタイプを介したマルチスレッド処理。
- 最も類似した画像の単一画像検索をサポートします。
- 指定されたディレクトリ画像をサポートして、顔の特徴値ファイルを生成します。
- キューで処理されるのを待っている画像の数を設定できます。
- 各実行には、成功または失敗のシグナルが返されます。
- 顔検索の結果には、元の画像+最大の類似性画像+類似性などが含まれます。
- 顔の比較は、2つの写真と2つの特徴値の同時比較をサポートします。
- 関連する機能は、TCP通信を介して相互作用できるクライアントとサーバーの一連のプロトコルをカスタマイズします。
- カスタムの顔認識プロトコルは、中央のサーバーがサイト上の複数のデバイスから要求されるシーンに非常に適しています。
- 各モジュールは独立したクラスであり、クリーンなコードと適切なコメントが付いています。
3、レンダリング
4つの関連サイト
- 国内サイト:https://gitee.com/feiyangqingyun/QWidgetDemo
- 国際サイト:https://github.com/feiyangqingyun/QWidgetDemo
- 個人ホームページ:https://blog.csdn.net/feiyangqingyun
- Zhihuホームページ:https://www.zhihu.com/people/feiyangqingyun/
- エクスペリエンスアドレス:https://blog.csdn.net/feiyangqingyun/article/details/97565652
5、コアコード
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();
//发送接收数据信号
emit receiveData(data);
//初始化脚本引擎
QScriptEngine engine;
//构建解析对象
QScriptValue script = engine.evaluate("value=" + data);
//获取鉴权标识符
QString token = script.property("access_token").toString();
if (!token.isEmpty()) {
this->token = token;
emit receiveResult(0, "鉴权标识返回成功");
return;
}
//通用返回结果字段
int code = script.property("error_code").toInt32();
QString msg = script.property("error_msg").toString();
emit receiveResult(code, msg);
//图片识别部分
QScriptValue result = script.property("result");
if (!result.isNull()) {
//人脸识别
if (data.contains("location")) {
QScriptValue face_list = result.property("face_list");
checkFaceList(face_list);
}
//人脸比对
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();
}
}
//活体检测
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)
{
//创建迭代器逐个解析具体值
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);
//如果需要活体检测则NONE改为LOW 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)
{
//记住最后一次处理的时间,限制频繁的调用
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);
}