前段時間Richard Yu在發佈會上給你們介紹了華爲HMS Core4.0,回顧發佈會信息請戳:
華爲面向全球發佈HMS Core 4.0意味着什麼?java
其中有一個重點被介紹的服務,機器學習服務(Machine Learning Kit 簡稱 MLKit)。android
那機器學習服務能幹什麼呢?能幫助開發者解決應用開發過程當中的哪些問題?git
今天就拋磚引玉一下,以人臉檢測爲例,給你們出一個實戰小樣例,讓你們感覺下機器學習服務所提供的強大功能以及給開發者提供的便捷性。github
先給你們看一下華爲機器學習服務人臉檢測能力的展現:
算法
從這個動圖裏面能夠看到,人臉識別能夠支持識別人臉的朝向,支持檢測人臉的表情(高興、厭惡、驚訝、傷心、憤怒、生氣),支持檢測人臉屬性(性別、年齡、穿戴),支持檢測是否睜眼閉眼,支持人臉以及鼻子、眼睛、嘴脣、眉毛等特徵的座標檢測,另外還支持多人臉同時檢測,是否是很強大!app
核心提示:此功能免費,安卓全機型覆蓋!機器學習
今天就用機器學習服務的多人臉識別+表情檢測能力寫一個微笑抓拍的小demo,作一次實戰演練。demo源碼github下載請戳這裏maven
華爲HMS的kit開發前準備工做都差很少,無非就是添加maven依賴,引入SDKide
增量添加以下maven地址:學習
buildscript { repositories { maven {url 'http://developer.huawei.com/repo/'} } }allprojects { repositories { maven { url 'http://developer.huawei.com/repo/'} }}
把人臉識別的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' }
這個主要是用來模型更新的,後面算法有了優化,能夠自動下載到手機裏面更新
<manifest <application <meta-data android:name="com.huawei.hms.ml.DEPENDENCY" android:value= "face"/> </application></manifest>
<!--相機權限--><uses-permission android:name="android.permission.CAMERA" /><!--使用存儲權限--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
檢測後拍照:
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); } });}
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();}
@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