1.模型改進
在上週對簡單的模型和複雜模型進行了簡單的初步對比後,本週工作內容爲在複雜模型上進行結構調整,試圖尋找到比簡單模型更好的模型結構。
主要嘗試的調整包括以下四個方面的內容:
不使用眼部圖像,單獨使用臉部圖像和眼睛相對於的屏幕的信息構建網絡
在複雜模型基礎上,減少臉部特徵的提取數量(一層卷積)
在複雜模型上減少臉部圖像卷積後的全連接層(一層全連接)
在獲取所有特徵後只經過一層全連接輸出
具體結果詳見:
https://blog.csdn.net/AFXBR/article/details/89643998
2.手勢功能
本週實現用戶手勢的語義理解,從而實現根據手勢操作應用.
之前隊友使用了Face++進行情緒分析,Face++同樣也有手勢識別,但是手勢的種類有限,因此採用了百度的API.
http://ai.baidu.com/ 找到對應的模塊 註冊 獲得各類Key以後即可使用.
具體的一些要求和Face++類似,無非是圖片的一些要求,不再贅述.
2.1.Node.js SDK
整體包結構如下,主要用到的是核心是AipBodyAnalysis.其中的getGesture方法.
├── src
│ ├── auth //授權相關類
│ ├── http //Http通信相關類
│ ├── client //公用類
│ ├── util //工具類
│ └── const //常量類
├── AipBodyAnalysis.js //人體分析交互類
├── index.js //入口文件
└── package.json //npm包描述文件
Nodejs SDK代碼已開源,github鏈接:https://github.com/Baidu-AIP/nodejs-sdk
2.2.連接使用
直接使用node開發包步驟如下:
1.在官方網站下載node SDK壓縮包。
2.將下載的aip-node-sdk-version.zip
解壓後,複製到工程文件夾中。
3.進入目錄,運行npm install安裝sdk依賴庫
4.把目錄當做模塊依賴
其中,version
爲版本號,添加完成後,用戶就可以在工程中使用人體分析 Node SDK。
直接使用npm安裝依賴:
npm install baidu-aip-sdk
新建AipBodyAnalysisClient
AipBodyAnalysisClient是人體分析的node客戶端,爲使用人體分析的開發人員提供了一系列的交互方法
var AipBodyAnalysisClient = require("baidu-aip-sdk").bodyanalysis;
// 設置APPID/AK/SK
var APP_ID = "App ID";
var API_KEY = "Api Key";
var SECRET_KEY = "Secret Key";
// 新建一個對象
var client = new AipBodyAnalysisClient(APP_ID, API_KEY, SECRET_KEY);
此外模塊提供了設置全局參數和全局請求攔截器的方法;
var HttpClient = require("baidu-aip-sdk").HttpClient;
// 設置request庫的一些參數,例如代理服務地址,超時時間等
// request參數請參考 https://github.com/request/request#requestoptions-callback
HttpClient.setRequestOptions({timeout: 5000});
// 也可以設置攔截每次請求(設置攔截後,調用的setRequestOptions設置的參數將不生效),
// 可以按需修改request參數(無論是否修改,必須返回函數調用參數)
// request參數請參考 https://github.com/request/request#requestoptions-callback
HttpClient.setRequestInterceptor(function(requestOptions) {
// 查看參數
console.log(requestOptions)
// 修改參數
requestOptions.timeout = 5000;
// 返回參數
return requestOptions;
});
2.3.手勢識別具體接口說明
識別圖片中的手勢類型,返回手勢名稱、手勢矩形框、概率分數,可識別24種手勢,支持動態手勢識別,適用於手勢特效、智能家居手勢交互等場景;支持的24類手勢列表:拳頭、OK、祈禱、作揖、作別、單手比心、點贊、Diss、我愛你、掌心向上、雙手比心(3種)、數字(9種)、Rock、豎中指。 注:
1)上述24類以外的其他手勢會劃分到other類。
2)除識別手勢外,若圖像中檢測到人臉,會同時返回人臉框位置。
可識別的24種手勢示意圖如下,自拍場景、他人拍攝均適用。
序號 | 手勢名稱 | classname | 示例圖 |
---|---|---|---|
1 | 數字1(原食指) | One | |
2 | 數字5(原掌心向前) | Five | |
3 | 拳頭 | Fist | |
4 | OK | OK | |
5 | 祈禱 | Prayer | |
6 | 作揖 | Congratulation | |
7 | 作別 | Honour | |
8 | 單手比心 | Heart_single | |
9 | 點贊 | Thumb_up | |
10 | Diss | Thumb_down | |
11 | Rock | ILY | |
12 | 掌心向上 | Palm_up | |
13 | 雙手比心1 | Heart_1 | |
14 | 雙手比心2 | Heart_2 | |
15 | 雙手比心3 | Heart_3 | |
16 | 數字2 | two | |
17 | 數字3 | three | |
18 | 數字4 | four | |
19 | 數字6 | six | |
20 | 數字7 | seven | |
21 | 數字8 | eight | |
22 | 數字9 | nine | |
23 | Rock | Rock | |
24 | 豎中指 | Insult |
手勢識別具體調用如下:
var fs = require('fs');
var image = fs.readFileSync("assets/example.jpg").toString("base64");
// 調用手勢識別
client.gesture(image).then(function(result) {
console.log(JSON.stringify(result));
}).catch(function(err) {
// 如果發生網絡錯誤
console.log(err);
});
手勢識別 請求參數詳情
參數名稱 | 是否必選 | 類型 | 說明 |
---|---|---|---|
image | 是 | string | 圖像數據,base64編碼,要求base64編碼後大小不超過4M,最短邊至少15px,最長邊最大4096px,支持jpg/png/bmp格式 |
手勢識別 返回數據參數詳情
字段 | 是否必選 | 類型 | 說明 |
---|---|---|---|
result_num | 是 | int | 結果數量 |
result | 是 | object[] | 檢測到的目標,手勢、人臉 |
+classname | 否 | string | 目標所屬類別,24種手勢、other、face |
+top | 否 | int | 目標框上座標 |
+width | 否 | int | 目標框的寬 |
+left | 否 | int | 目標框最左座標 |
+height | 否 | int | 目標框的高 |
+probability | 否 | float | 目標屬於該類別的概率 |
log_id | 是 | int64 | 唯一的log id,用於問題定位 |
3具體應用
3.1.創建應用
首先需要創建應用,填寫相關信息之後確認,就可以獲得API Key和secret Key,擁有它們纔可以進行下一步的操作:
3.2.獲取access_token
具體方式可以參考如下地址的API文檔:
http://ai.baidu.com/docs#/Auth/top
這裏似乎必須從服務端來獲取,在HTML頁面中直接發post請求就會報跨域的錯誤,這裏我用bash來獲取需要的access_token:
curl -i -k 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【百度雲應用的AK】&client_secret=【百度雲應用的SK】'
從結果中可以看到獲取到了這個access_token。
3.3.實現調用代碼
這裏只需要向接口發送access_token和base64編碼的圖片即可,從返回值中就可以拿到識別結果的json,結果json示例如下:
{
"log_id": 4466502370458351471,
"result_num": 2,
"result": [{
"probability": 0.9844077229499817,
"top": 20,
"height": 156,
"classname": "Face",
"width": 116,
"left": 173
},
{
"probability": 0.4679304957389832,
"top": 157,
"height": 106,
"classname": "Heart_2",
"width": 177,
"left": 183
}]
}
這裏我封裝了一個js文件gesture.js用於調用手勢識別,識別之後打印出識別出的手勢代號以及準確率:
const access_token = [自己的access_token];
window.gesture = {
dealGesture:function(json) {
for(var i = 0; i < json.result_num; i++) {
console.log(json.result[i].classname+' '+json.result[i].probability);
}
},
getGesture:function(base64Image) {
console.log(base64Image);
var image;
if(base64Image.substr(0,4) == 'data')
image = base64Image.substr(22, base64Image.length);
else
image = base64Image;
$.ajax({
type: "POST",
url: "https://aip.baidubce.com/rest/2.0/image-classify/v1/gesture",
contentType: "application/x-www-form-urlencoded",
dataType: "json", //表示返回值類型,不必須
data: {'access_token': access_token, 'image' : image},
success: gesture.dealGesture
});
}
}
其餘具體內容詳見:https://blog.csdn.net/zekdot/article/details/89725549
4.文章選擇功能
從文章列表頁面需要通過視線定位具體文章標題然後進一步進入具體的文章頁面:
我們預計提供兩種進入方式:
利用手勢左劃或者右划來進入、退出頁面
全視線控制的進入、退出頁面
第一種實現方式目前還在調試之中,所以這裏我先使用第二種實現方式來實現文章的進入:
當視線停留在標題塊上的時候,標題塊開始從紅色變爲綠色。
如果在變爲綠色之前移開了視線,則標題塊變回原來的白色。
如果在標題塊最終變爲了綠色,則進入到標題對應的文章頁面。
當視線沒有停留在標題塊上時,什麼都不做。
該功能主要利用JavaScript的計時器來實現,通過計時器來實現顏色的漸變,等時間到了再載入具體的文章HTML頁面.
使用情況如下:
可見標題塊正在逐漸變成綠色,當徹底變爲綠色之後,會跳轉到具體文章頁面。
如圖可見這裏成功跳轉到了具體文章頁面。
代碼詳見https://blog.csdn.net/zekdot/article/details/89725549