人臉識別實戰教程
本教程介紹如何使用Alibaba Cloud SDK for Java進行人體屬性識別、人體計數和人臉搜索任務。
背景信息
人臉人體識別技術是基於阿里雲深度學習算法,結合圖像或視頻的人臉檢測、分析、比對以及人體檢測等技術,為您提供人臉人體的檢測定位、人臉屬性識別和人臉比對等能力。可以為開發者和企業提供高性能的在線API服務,應用於人臉AR、人臉識別和認證、大規模人臉檢索、照片管理等各種場景。
前提條件
在開始之前,請確保完成以下步驟:
- 開通人臉人體能力,請參見上述開發前準備。
- 在您的Java工程中添加人臉人體能力的pom依賴:
<!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-facebody -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-facebody</artifactId>
<version>1.0.8</version>
</dependency>
人臉屬性識別
RecognizeFace可以識別檢測人臉的性別、年齡、表情、眼鏡四種屬性。返回人臉的1024維深度學習特徵,基於這個特徵並按照特徵比較規則,您可實現高性能的人臉識別。
例如需要識別以下圖片中的人臉屬性。
示例代碼如下:
import com.aliyun.CommonConfig;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.facebody.model.v20191230.RecognizeFaceRequest;
import com.aliyuncs.facebody.model.v20191230.RecognizeFaceResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
public class RecognizeFaceDemo {
private static DefaultProfile profile = DefaultProfile.getProfile("cn-shanghai", "<access key id>", "<access key secret>");
private static IAcsClient client = new DefaultAcsClient(profile);
public static void main(String[] args) {
String recognizeFaceURL = "https://visionapi-test.oss-cn-shanghai.aliyuncs.com/recognize_1.jpg";
recognizeFace(recognizeFaceURL);
}
/**
* 人臉屬性識別
* @param imageURL 圖片URL地址
*/
private static void recognizeFace(String imageURL)
{
RecognizeFaceRequest recognizeFaceRequest = new RecognizeFaceRequest();
recognizeFaceRequest.setImageURL(imageURL);
try {
RecognizeFaceResponse recognizeFaceResponse = client.getAcsResponse(recognizeFaceRequest);
System.out.println("人臉屬性識別:");
System.out.println(new Gson().toJson(recognizeFaceResponse));
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
System.out.println("RequestId:" + e.getRequestId());
}
}
}
代碼返回結果類似如下:
{
"requestId": "9E461AFC-B125-4B04-8644-4D39C495B61A",
"data": {
"faceCount": 1,
"landmarkCount": 105,
"denseFeatureLength": 1024,
"faceRectangles": [
604,
124,
128,
160
],
"faceProbabilityList": [
55.0
],
"poseList": [
-8.399615,
-10.90538,
14.451606
],
"landmarks": [
614.1295,
161.77643,
647.84894,
...
],
"pupils": [
637.25793,
177.63129,
5.2395487,
689.71075,
192.1905,
5.2395487
],
"genderList": [
0
],
"ageList": [
24
],
"expressions": [
1
],
"glasses": [
1
],
"denseFeatures": [
"-0.0080740926787257195",
"0.011421392671763897",
"-0.027754634618759155",
...
]
}
}
從返回結果中得到的該圖片人臉屬性識別結果如下:
- 人臉個數:1
- 性別:女性
- 年齡:24
- 是否微笑:微笑
- 是否戴眼鏡:有眼鏡
人體計數
DetectBodyCount可以檢測輸入圖片中人體的個數。
待檢測圖片如下:
示例代碼如下:
import com.aliyun.CommonConfig;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.facebody.model.v20191230.DetectBodyCountRequest;
import com.aliyuncs.facebody.model.v20191230.DetectBodyCountResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
/**
* 人體計數
*/
public class DetectBodyCountDemo {
private static DefaultProfile profile = DefaultProfile.getProfile("cn-shanghai", "<access key id>", "<access key secret>");
private static IAcsClient client = new DefaultAcsClient(profile);
public static void main(String[] args) {
String detectBodyCountURL = "https://visionapi-test.oss-cn-shanghai.aliyuncs.com/multiplayer.jpg";
detectBodyCount(detectBodyCountURL);
}
/**
* 人體計數
* @param imageURL 圖片URL地址
*/
private static void detectBodyCount(String imageURL)
{
DetectBodyCountRequest detectBodyCountRequest = new DetectBodyCountRequest();
detectBodyCountRequest.setImageURL(imageURL);
try {
DetectBodyCountResponse detectBodyCountResponse = client.getAcsResponse(detectBodyCountRequest);
System.out.println("人體計數:");
System.out.println(new Gson().toJson(detectBodyCountResponse));
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
System.out.println("RequestId:" + e.getRequestId());
}
}
}
代碼返回結果類似如下:
{
"requestId": "15170328-DF69-4F24-900D-9915645A4237",
"data": {
"personNumber": 3
}
}
從返回結果中得到該圖片被檢測到有3個人。
人臉搜索
人臉搜索可以根據輸入圖片,在數據庫中搜索相似的人臉圖片數據。
人臉搜索操作流程示意圖如下:
說明: 公測階段每個阿里雲主賬號只能創建一個數據庫,且開通服務後默認創建一個名稱為default的數據庫,每個數據庫最多可以添加5萬張圖片。
涉及的API如下:
例如我們有以下人臉數據:
將上面圖片樣本加入人臉庫,使用下面人臉數據搜索人臉庫。
示例代碼如下:
import com.aliyun.CommonConfig;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.facebody.model.v20191230.*;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
public class SearchFaceDemo {
private static DefaultProfile profile = DefaultProfile.getProfile("cn-shanghai", CommonConfig.ACCESSKEY_ID, CommonConfig.ACCESSKEY_SECRET);
private static IAcsClient client = new DefaultAcsClient(profile);
public static void main(String[] args) throws InterruptedException {
String dbName = "default";
String human1_1 = "https://visionapi-test.oss-cn-shanghai.aliyuncs.com/human_11.jpg";
String human1_2 = "https://visionapi-test.oss-cn-shanghai.aliyuncs.com/human_12.jpg";
String human2_1 = "https://visionapi-test.oss-cn-shanghai.aliyuncs.com/human_21.jpg";
String human2_2 = "https://visionapi-test.oss-cn-shanghai.aliyuncs.com/human_22.jpg";
String sample = "https://visionapi-test.oss-cn-shanghai.aliyuncs.com/sample.jpg";
String entityId1 = "human1";
String entityId2 = "human2";
// 1.創建人臉樣本
addFaceEntity(dbName, entityId1);
addFaceEntity(dbName, entityId2);
// 2.向人臉樣本中加入人臉,每個樣本人臉上限為5
addFace(dbName,entityId1,human1_1);
addFace(dbName,entityId1,human1_2);
addFace(dbName,entityId2,human2_1);
addFace(dbName,entityId2,human2_2);
Thread.currentThread().sleep(3000);
// 3.到人臉庫中查找
searchFace(dbName,sample,1);
}
/**
* 添加人臉樣本
* @param dbName 數據庫名稱
* @param entityId 實體ID
*/
private static void addFaceEntity(String dbName, String entityId)
{
AddFaceEntityRequest addFaceEntityRequest = new AddFaceEntityRequest();
addFaceEntityRequest.setDbName(dbName);
addFaceEntityRequest.setEntityId(entityId);
try{
AddFaceEntityResponse addFaceEntityResponse = client.getAcsResponse(addFaceEntityRequest);
System.out.println("添加人臉樣本:");
System.out.println(new Gson().toJson(addFaceEntityResponse));
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
System.out.println("RequestId:" + e.getRequestId());
}
}
/**
* 添加人臉數據
* @param dbName 數據庫名稱
* @param entityId 實體ID
* @param imageUrl 人臉圖片地址,必須是同Region的OSS的圖片地址。人臉必須是正面無遮擋單人人臉。
*/
private static void addFace(String dbName, String entityId, String imageUrl)
{
AddFaceRequest addFaceRequest = new AddFaceRequest();
addFaceRequest.setDbName(dbName);
addFaceRequest.setEntityId(entityId);
addFaceRequest.setImageUrl(imageUrl);
try{
AddFaceResponse addFaceResponse = client.getAcsResponse(addFaceRequest);
System.out.println("添加人臉數據:");
System.out.println(new Gson().toJson(addFaceResponse));
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
System.out.println("RequestId:" + e.getRequestId());
}
}
/**
* 搜索人臉
* @param dbName 數據庫名稱
* @param imageUrl 圖片URL地址。必須是同Region的OSS地址。
*/
private static void searchFace(String dbName, String imageUrl, Integer limit)
{
SearchFaceRequest searchFaceRequest = new SearchFaceRequest();
searchFaceRequest.setDbName(dbName);
searchFaceRequest.setImageUrl(imageUrl);
searchFaceRequest.setLimit(limit);
try{
SearchFaceResponse searchFaceResponse = client.getAcsResponse(searchFaceRequest);
System.out.println("搜索人臉:");
System.out.println(new Gson().toJson(searchFaceResponse));
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
System.out.println("RequestId:" + e.getRequestId());
}
}
}
返回結果類似如下:
添加人臉樣本:
{"requestId":"718AE1B9-F1B3-4720-98FA-69E2A41F4C31"}
添加人臉樣本:
{"requestId":"9CE55AD1-1E21-49F0-BB2C-B3C07A015EAE"}
添加人臉數據:
{"requestId":"9551C7C7-8027-4E82-82FB-15FEC0EB8161","data":{"faceId":"1589791311965000"}}
添加人臉數據:
{"requestId":"C193A2E0-F22A-4418-AAD3-F28749BDDC17","data":{"faceId":"1589791312203000"}}
添加人臉數據:
{"requestId":"687D9D8B-5EDE-4774-B377-C1CB4E0FB855","data":{"faceId":"1589791312433000"}}
添加人臉數據:
{"requestId":"1E0948E3-7D75-4709-A624-073B4CB54874","data":{"faceId":"1589791312679000"}}
搜索人臉:
{
"requestId": "F0543F2A-216F-495A-8B4D-20CA06B605A7",
"data": {
"matchList": [
{
"faceItems": [
{
"faceId": "1589791312203000",
"score": 0.86908734,
"extraData": "",
"entityId": "human1"
}
],
"location": {
"x": 592,
"y": 132,
"width": 152,
"height": 204
}
}
]
}
}
從返回結果中得出輸入圖片:
- 被匹配到的樣本數據faceId為1589791312203000。
- 匹配到的樣本名稱為human1。
- 與樣本數據相似度為0.86908734。