?? 歡迎關注 點贊 收藏 ?? 留言
本文由派大星原創編撰
系列專欄:項目從0搭建
本系列項目從設計到實現源碼全部開源免費學習使用,一起追向理想,歡迎各位大佬監督打卡開發!
難度分析:
由于使用的是百度云AI/face++這兩個平臺的現有的Api接口,所以分別對二者的難度進行分析介紹:
? 曠視face++的難度在于需要自己對官方提供的代碼段進行獨立封裝,這就比較考驗開發者的代碼抽取能力和 自我獨立封裝的技能,如果不能很好地進行抽取封裝,就會造成代碼的冗余以及內存的浪費,這樣封裝的效 果并不能達到最佳。比較耗費時間,在抽取face++平臺的代碼段時需要對IO流有著比較好的理解,從而讀取 讀取配置文件中的內容,這里就不多做介紹。
? 百度云AI可以讓開發者對開發難度有所選擇,因為該平臺提供了兩種方式:第一種方式類似于face++需要抽 取代碼然后進行代碼封裝,難度分析見上述face++對分析;第二種方式則是百度云提供了Maven倉庫,可以 直接導入依賴,直接調用相應的Api進行開發即可!有較好的選擇性!
項目回顧(百度云AI) 最終效果演示:
技術選型: 項目需求分析
為了用戶登錄的便捷,不再輸入賬號密碼進行手動登錄與注冊,而是使用調用本機的攝像頭進行拍攝照片,然后調用人臉識別接口將人臉信息自動注冊進所使用的平臺(百度云/Face++)后,用戶即可進行人臉掃描實現登錄操作。
項目搭建 1. 前期準備 ① 進入百度云的人臉識別控制臺
如果沒有百度賬號可以使用手機號快速進行注冊進入百度云AI控制臺
②創建人臉識別應用
【1】創建應用
【2】可以選擇自己想要使用的接口:比如人臉識別、語音技術等,本次項目采用的是人臉識別,官方也默認選擇了人臉識別的全部接口,所以也不需要做改動,只需要填寫應用名稱即可!
【3】獲取秘鑰
2. 測試百度云API ① 導入依賴
<dependency>
<groupId>com.baidu.aipgroupId>
<artifactId>java-sdkartifactId>
<version>4.9.0version>
dependency>
② 測試部分API(人臉注冊、人臉檢測、人臉搜索等)
用于從人臉庫中新增用戶,可以設定多個用戶所在組及組內用戶的人臉圖片
典型應用場景:構建屬于自己人臉庫,比如:會員人臉注冊、已有用戶補全人臉信息
測試代碼
//人臉注冊

@Test
public void testFaceRegister() throws IOException {
//1. 創建Java代碼和百度云交互的Client對象
AipFace client = new AipFace("AppId","Api_key","Api_secret");
//2. 參數設置(示例下表格對參數進行介紹)
HashMap<String,String> map = new HashMap<>();
map.put("quality_control","NORMAL");//圖片質量
map.put("liveness_control","LOW");//活體檢測
//3. 構造圖片
String path = "本地圖片路徑";
//上傳的圖片 兩種格式:url地址 Base64字符串形式
byte[] bytes = Files.readAllBytes(Paths.get(path));
String encode = Base64Util.encode(bytes);
//4.調用api方法完成人臉注冊
/**
* 參數1:圖片的url或者base64字符串
* 參數2:圖片形式(URL,BASE64)
* 參數3:組Id(固定一個字符串)
* 參數4:用戶Id
* 參數5:hashMap基本參數配置
*/
JSONObject res = client.addUser(encode, "BASE64", "pdx", "1000", map);
System.out.println(res.toString());
}
測試結果:只要最后為0則表示測試成功,后續封裝代碼也是需要判斷的值
參數介紹:
參數名稱是否必選類型默認值說明
image
是
圖片信息(總數據大小應小于10M),圖片上傳方式根據來判斷
是
圖片類型:圖片的值,編碼后的圖片數據,編碼后的圖片大小不超過2M;URL:圖片的 URL地址( 可能由于網絡等原因導致下載圖片時間過長);: 人臉圖片的唯一標識,調用人臉檢測接口時,會為每個人臉圖片賦予一個唯一的,同一張圖片多次檢測得到的是同一個。
否
包age,,,,,,,,,,,mask,信息逗號分隔. 默認只返回、人臉框、概率和旋轉角度
否
最多處理人臉的數目,默認值為1,根據人臉檢測排序類型檢測圖片中排序第一的人臉(默認為人臉面積最大的人臉)百度上傳圖片參數錯誤,最大值120
否
人臉的類型LIVE表示生活照:通常為手機、相機拍攝的人像圖片、或從網絡獲取的人像圖片等
表示身份證芯片照:二代身份證內置芯片中的人像照片表示帶水印證件照:一般為帶水印的小圖,如公安網小圖CERT表示證件照片:如拍攝的身份證、工卡、護照、學生證等證件圖片默認LIVE
判斷圖片是否具有面部信息
測試代碼
@Test
public void testFaceCheck() throws IOException {
//1. 創建Java代碼和百度云交互的Client對象
AipFace client = new AipFace("AppId","Api_key","Api_secret");
//2. 構造圖片
String path = "本地圖片路徑";
//上傳的圖片 兩種格式:url地址 Base64字符串形式
byte[] bytes = Files.readAllBytes(Paths.get(path));
String encode = Base64Util.encode(bytes);
//調用Api方法進行人臉檢測
/**
* 參數1:圖片的url或者base64字符串
* 參數2:圖片形式(URL,BASE64)
* 參數3:hashMap中的基本參數配置(null:使用默認配置)
*/

JSONObject res = client.detect(encode, "BASE64", null);
System.out.println(res.toString(2));
}
測試結果:
參數介紹:
參數名稱是否必選類型默認值說明
image
是
圖片信息(總數據大小應小于10M),圖片上傳方式根據來判斷
是
圖片類型:圖片的值,編碼后的圖片數據,編碼后的圖片大小不超過2M;URL:圖片的 URL地址( 可能由于網絡等原因導致下載圖片時間過長);: 人臉圖片的唯一標識,調用人臉檢測接口時,會為每個人臉圖片賦予一個唯一的,同一張圖片多次檢測得到的是同一個。
否
包age,,,,,,,,,,,mask,信息逗號分隔. 默認只返回、人臉框、概率和旋轉角度
否
最多處理人臉的數目,默認值為1,根據人臉檢測排序類型檢測圖片中排序第一的人臉(默認為人臉面積最大的人臉)百度上傳圖片參數錯誤,最大值120
否
人臉的類型LIVE表示生活照:通常為手機、相機拍攝的人像圖片、或從網絡獲取的人像圖片等
表示身份證芯片照:二代身份證內置芯片中的人像照片表示帶水印證件照:一般為帶水印的小圖,如公安網小圖CERT表示證件照片:如拍攝的身份證、工卡、護照、學生證等證件圖片默認LIVE
根據用戶上傳的圖片和指定人臉庫中的所有人臉進行比較,獲取相似度最高的一個或者某幾個的評分
返回值(數據,只需要第一條,相似度最高的數據)score:相似度評分(80分以上可以認為是同一個人)
測試代碼:
@Test
public void testFaceSearch() throws IOException {

//1. 創建Java代碼和百度云交互的Client對象
AipFace client = new AipFace("AppId","Api_key","Api_secret");
//2. 構造圖片
String path = "本地圖片路徑";
//上傳的圖片 兩種格式:url地址 Base64字符串形式
byte[] bytes = Files.readAllBytes(Paths.get(path));
String encode = Base64Util.encode(bytes);
//人臉搜索
JSONObject res = client.search(encode, "BASE64", "pdx", null);
System.out.println(res.toString(2));
}
測試結果:
小結:
整體測試下來,和平常對數據庫的操作類似,都是增刪改查的操作,除了這些Api,還有其他的就不再贅述了,操作類似!所有測試代碼也會同項目案例一并上傳到Gitee倉庫中!
3. 搭建項目(使用模板引擎) ① 創建Maven項目
引入相關依賴,構建所需文件目錄
② 編寫配置文件
ai.appId="api_id"
ai.apiKey="api_key"
ai.secretKey="api_secret"
ai.imageType=BASE64
ai.groupId="自定義組"
server.max-http-header-size=1000KB
spring.thymeleaf.cache=false
③ 展示對上述部分Api接口進行二次封裝
private AipFace client;
private HashMap<String,String> map = new HashMap<>();

private BaiduAiUtils(){
map.put("quality_control","NORMAL");//圖片質量
map.put("liveness_control","LOW");//活體檢測
}
@PostConstruct
public void init(){
client = new AipFace(APP_ID,API_KEY,SECRET_KEY);
}
/**
* 人臉注冊,將用戶照片存入人臉庫中
* @param userId
* @param image
* @return
*/
public Boolean faceRegister(String userId,String image){
//人臉注冊
JSONObject res = client.addUser(image, IMAGE_TYPE, groupId, userId, map);
Integer errorCode = res.getInt("error_code");
return errorCode == 0? true : false;
}
/**
* 人臉更新,更新人臉庫中的用戶照片
* @param userId
* @param image
* @return
*/
public Boolean faceUpdate(String userId,String image){
//人臉更新
JSONObject res = client.updateUser(image, IMAGE_TYPE, groupId, userId, map);
Integer errorCode = res.getInt("error_code");
return errorCode == 0 ? true : false;
}