超簡單整合HMS Core ML Kit場景識別,構建相簿管理新模式
前言
“給你看下我之前去景區玩拍的照片,風景很好”
”嗯嗯,我正好也準備出去玩,快分享下“
……
”照片呢,還沒找到嗎?“
”等會啊,手機裡太多照片了,給我點時間找找“
這是不是很多人的常態?
看著手機裡上百張甚至上千張照片,想要找到某張特定的照片,簡直堪比海底撈針,費時又費力。難道只能在相簿裡從頭到尾瀏覽一遍,不能按照照片中物品類別進行查詢嗎?
當然可以了,華為機器學習服務場景識別功能就可以通過識別、標籤圖片中的物品,將照片精準分類,建立智慧相簿。有了這個功能,我們就可以快速定位、查詢目標照片了。
功能特性
華為場景識別服務支援對圖片的場景內容進行分類並新增標註資訊,如美食、花朵、綠植、貓、狗、廚房、山峰、洗衣機等102種場景,並基於識別到的資訊,構建更智慧的相簿應用體驗。
場景識別具有以下功能特性:
-
多類場景識別
支援102種場景的識別,並持續增加。 -
識別準確率高
可識別多種物品、場景,識別準確率高。 -
識別響應速度快
毫秒級響應速度,並不斷優化效能表現。 -
整合簡單高效
提供API介面和SDK包,方便客戶整合,操作簡單,減少開發成本。
應用場景
場景識別除了應用於建立智慧相簿、照片檢索和分類外,還可以識別拍攝場景自動選擇相應的場景濾鏡和相機引數,幫助使用者拍攝出更好看的照片。
開發程式碼
1 開發準備工作
1.1 配置AppGallery Connect。
在開發應用前,需要在AppGallery Connect中配置相關資訊。
具體操作步驟,請參考下方連結:
1.2 配置HMS Core SDK的Maven倉地址,並完成本服務的SDK整合。
(1)開啟Android Studio專案級“build.gradle”檔案。
(2)新增HUAWEI agcp外掛以及Maven程式碼庫。
- 在“allprojects > repositories”中配置HMS Core SDK的Maven倉地址。
- 在“buildscript > repositories”中配置HMS Core SDK的Maven倉地址。
- 如果App中添加了“agconnect-services.json”檔案則需要在“buildscript > dependencies”中增加agcp配置。
buildscript {
repositories {
google()
jcenter()
maven {url 'https://developer.huawei.com/repo/'}
}
dependencies {
...
classpath 'com.huawei.agconnect:agcp:1.4.1.300'
}
}
allprojects {
repositories {
google()
jcenter()
maven {url 'https://developer.huawei.com/repo/'}
}
}
2 開發程式碼
靜態圖片檢測
2.1 建立場景識別檢測器例項。
// 方式1:使用預設的引數配置。
MLSceneDetectionAnalyzer analyzer = MLSceneDetectionAnalyzerFactory.getInstance().getSceneDetectionAnalyzer();
// 方式2:按自定義配置建立場景識別分析器例項。
MLSceneDetectionAnalyzerSetting setting = new MLSceneDetectionAnalyzerSetting.Factory()
// 設定場景識別可信度閾值。
.setConfidence(confidence)
.create();
MLSceneDetectionAnalyzer analyzer = MLSceneDetectionAnalyzerFactory.getInstance().getSceneDetectionAnalyzer(setting);
2.2 通過android.graphics.Bitmap構造MLFrame,支援的圖片格式包括:jpg/jpeg/png/bmp。
MLFrame frame = new MLFrame.Creator().setBitmap(bitmap).create();
2.3 進行場景識別。
// 方式1:同步識別。
SparseArray<MLSceneDetection> results = analyzer.analyseFrame(frame);
// 方式2:非同步識別。
Task<List<MLSceneDetection>> task = analyzer.asyncAnalyseFrame(frame);
task.addOnSuccessListener(new OnSuccessListener<List<MLSceneDetection>>() {
public void onSuccess(List<MLSceneDetection> result) {
// 場景識別成功的處理邏輯。
}})
.addOnFailureListener(new OnFailureListener() {
public void onFailure(Exception e) {
// 場景識別識別失敗的處理邏輯。
// failure.
if (e instanceof MLException) {
MLException mlException = (MLException)e;
// 獲取錯誤碼,開發者可以對錯誤碼進行處理,根據錯誤碼進行差異化的頁面提示。
int errorCode = mlException.getErrCode();
// 獲取報錯資訊,開發者可以結合錯誤碼,快速定位問題。
String errorMessage = mlException.getMessage();
} else {
// 其他異常。
}
}
});
2.4 檢測完成,停止分析器,釋放檢測資源。
if (analyzer != null) {
analyzer.stop();
}
視訊流檢測
開發者可以自行處理視訊流,將視訊流轉化為MLFrame物件,再按靜態影象檢測的方法進行場景識別。
如果開發者呼叫的是同步檢測介面,也可以使用SDK內建的LensEngine類實現視訊流場景識別。示例程式碼如下:
3.1 建立場景識別分析器,只支援建立端側場景識別分析器。
MLSceneDetectionAnalyzer analyzer = MLSceneDetectionAnalyzerFactory.getInstance().getSceneDetectionAnalyzer();
3.2 開發者建立識別結果處理類“SceneDetectionAnalyzerTransactor”,該類實現MLAnalyzer.MLTransactor介面,使用該介面中的transactResult方法獲取檢測結果並實現具體業務。
public class SceneDetectionAnalyzerTransactor implements MLAnalyzer.MLTransactor<MLSceneDetection> {
@Override
public void transactResult(MLAnalyzer.Result<MLSceneDetection> results) {
SparseArray<MLSceneDetection> items = results.getAnalyseList();
// 開發者根據需要處理識別結果,需要注意,這裡只對檢測結果進行處理。
// 不可呼叫ML Kit提供的其他檢測相關介面。
}
@Override
public void destroy() {
// 檢測結束回撥方法,用於釋放資源等。
}
}
3.3 設定識別結果處理器,實現分析器與結果處理器的繫結。
analyzer.setTransactor(new SceneDetectionAnalyzerTransactor());
// 建立LensEngine,該類由ML Kit SDK提供,用於捕捉相機動態視訊流並傳入分析器。
Context context = this.getApplicationContext();
LensEngine lensEngine = new LensEngine.Creator(context, this.analyzer)
.setLensType(LensEngine.BACK_LENS)
.applyDisplayDimension(1440, 1080)
.applyFps(30.0f)
.enableAutomaticFocus(true)
.create();
3.4 呼叫run方法,啟動相機,讀取視訊流,進行識別。
// 請自行實現SurfaceView控制元件的其他邏輯。
SurfaceView mSurfaceView = findViewById(R.id.surface_view);
try {
lensEngine.run(mSurfaceView.getHolder());
} catch (IOException e) {
// 異常處理邏輯。
}
3.5 檢測完成,停止分析器,釋放檢測資源。
if (analyzer != null) {
analyzer.stop();
}
if (lensEngine != null) {
lensEngine.release();
}
DEMO展示
原文連結:https://developer.huawei.com/consumer/cn/forum/topic/0201404868263200225?fid=18
原作者:say hi