前言
前段時間Richard Yu在發布會上給大家介紹了華為HMS Core4.0,回顧發布會信息請戳:
華為面向全球發布HMS Core 4.0意味着什么?
其中有一個重點被介紹的服務,機器學習服務(Machine Learning Kit 簡稱 MLKit)。
那機器學習服務能干什么呢?能幫助開發者解決應用開發過程中的哪些問題?
今天就拋磚引玉一下,以人臉檢測為例,給大家出一個實戰小樣例,讓大家感受下機器學習服務所提供的強大功能以及給開發者提供的便捷性。
機器學習服務人臉檢測所提供的能力
先給大家看一下華為機器學習服務人臉檢測能力的展示:
從這個動圖里面可以看到,人臉識別可以支持識別人臉的朝向,支持檢測人臉的表情(高興、厭惡、驚訝、傷心、憤怒、生氣),支持檢測人臉屬性(性別、年齡、穿戴),支持檢測是否睜眼閉眼,支持人臉以及鼻子、眼睛、嘴唇、眉毛等特征的坐標檢測,另外還支持多人臉同時檢測,是不是很強大!
核心提示:此功能免費,安卓全機型覆蓋!
機器學習服務人臉檢測所提供的能力
今天就用機器學習服務的多人臉識別+表情檢測能力寫一個微笑抓拍的小demo,做一次實戰演練。demo源碼github下載請戳這里
1、開發准備
華為HMS的kit開發前准備工作都差不多,無非就是添加maven依賴,引入SDK
1.1 在項目級gradle里添加華為maven倉
增量添加如下maven地址:
buildscript {
repositories {
maven {url 'http://developer.huawei.com/repo/'}
} }allprojects {
repositories {
maven { url 'http://developer.huawei.com/repo/'}
}}
1.2 在應用級的build.gradle里面加上SDK依賴
把人臉識別的SDK和基礎SDK引入
dependencies{
// 引入基礎SDK
implementation 'com.huawei.hms:ml-computer-vision:1.0.2.300'
// 引入人臉檢測能力包
implementation 'com.huawei.hms:ml-computer-vision-face-recognition-model:1.0.2.300'
}
1.3 在AndroidManifest.xml文件里面增量添加模型自動下載
這個主要是用來模型更新的,后面算法有了優化,可以自動下載到手機里面更新
<manifest
<application
<meta-data
android:name="com.huawei.hms.ml.DEPENDENCY"
android:value= "face"/>
</application></manifest>
1.4 在AndroidManifest.xml文件里面申請相機和存儲權限
<!--相機權限--><uses-permission android:name="android.permission.CAMERA" /><!--使用存儲權限--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2、代碼開發
2.1 創建人臉分析器,檢測到微笑后進行拍照
檢測后拍照:
- 進行分析器參數配置
- 把分析器參數配置傳給分析器
- 在analyzer.setTransacto內通過重寫transactResult處理人臉識別后的內容,人臉識別后會返回一個微笑的置信度(簡單可以理解為是微笑的概率),只要設置大於一定置信度進行拍照就可以了。
private MLFaceAnalyzer analyzer;private void createFaceAnalyzer() {
MLFaceAnalyzerSetting setting =
new MLFaceAnalyzerSetting.Factory()
.setFeatureType(MLFaceAnalyzerSetting.TYPE_FEATURES)
.setKeyPointType(MLFaceAnalyzerSetting.TYPE_UNSUPPORT_KEYPOINTS)
.setMinFaceProportion(0.1f)
.setTracingAllowed(true)
.create();
this.analyzer = MLAnalyzerFactory.getInstance().getFaceAnalyzer(setting);
this.analyzer.setTransactor(new MLAnalyzer.MLTransactor<MLFace>() {
@Override public void destroy() {
}
@Override public void transactResult(MLAnalyzer.Result<MLFace> result) {
SparseArray<MLFace> faceSparseArray = result.getAnalyseList();
int flag = 0;
for (int i = 0; i < faceSparseArray.size(); i++) {
MLFaceEmotion emotion = faceSparseArray.valueAt(i).getEmotions();
if (emotion.getSmilingProbability() > smilingPossibility) {
flag++;
}
}
if (flag > faceSparseArray.size() * smilingRate && safeToTakePicture) {
safeToTakePicture = false;
mHandler.sendEmptyMessage(TAKE_PHOTO);
}
}
});}
拍照存儲部分:
private void takePhoto() {
this.mLensEngine.photograph(null,
new LensEngine.PhotographListener() {
@Override public void takenPhotograph(byte[] bytes) {
mHandler.sendEmptyMessage(STOP_PREVIEW);
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
saveBitmapToDisk(bitmap);
}
});}
2.2 創建視覺引擎,捕捉相機動態視頻流后傳給分析器
private void createLensEngine() {
Context context = this.getApplicationContext();
// Create LensEngine
this.mLensEngine = new LensEngine.Creator(context, this.analyzer).setLensType(this.lensType)
.applyDisplayDimension(640, 480)
.applyFps(25.0f)
.enableAutomaticFocus(true)
.create();}
2.3 動態權限申請,掛接分析器和視覺引擎創建代碼
@Overridepublic void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_live_face_analyse);
if (savedInstanceState != null) {
this.lensType = savedInstanceState.getInt("lensType");
}
this.mPreview = this.findViewById(R.id.preview);
this.createFaceAnalyzer();
this.findViewById(R.id.facingSwitch).setOnClickListener(this);
// Checking Camera Permissions
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
this.createLensEngine();
} else {
this.requestCameraPermission();
}}
private void requestCameraPermission() {
final String[] permissions = new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
ActivityCompat.requestPermissions(this, permissions, LiveFaceAnalyseActivity.CAMERA_PERMISSION_CODE);
return;
}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
if (requestCode != LiveFaceAnalyseActivity.CAMERA_PERMISSION_CODE) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
return;
}
if (grantResults.length != 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
this.createLensEngine();
return;
}}
結束語
怎么樣,開發過程是不是特別簡單,30分鍾就可以開發一個新特性出來!讓我們一起體驗下這個多人臉微笑抓包的效果。
單人笑臉抓拍:
多人笑臉抓拍:
基於人臉檢測能力,還可以做哪些功能出來,請開放你的腦洞!這里不妨再給一些提示,比如:
- 通過識別耳朵、眼睛、鼻子、嘴巴、眉毛等臉部特征的位置,添加一些有趣的裝飾特效。
- 通過識別面部的輪廓,做一些誇張的變形、拉伸,生成一些有趣好玩的人像圖片,或者針對輪廓區域開發美顏功能。
- 通過年齡識別,對兒童沉迷於電子類產品的痛點,開發一些家長管控類功能。
- 通過檢測眼睛盯着屏幕的時長,開發護眼提示的特性。
- 通過隨機指令(搖頭、眨眼、張嘴等)實現用戶動作配合式活體檢測功能。
- 通過綜合運用用戶的年齡、性別等的檢測結果,給用戶做相關商品推薦;
更詳細的開發指南參考華為開發者聯盟官網
華為開發者聯盟機器學習服務開發指南
內容來源:https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201198419687680377&fid=18
原作者:AI_talking