基于Google ML模型開發(fā)Android物體檢測應(yīng)用
ML Kit
ML Kit是Google提供的機(jī)器學(xué)習(xí)SDK,包含了一系列預(yù)訓(xùn)練模型,可以在Android和iOS應(yīng)用中快速添加機(jī)器學(xué)習(xí)功能。ML Kit工具包將谷歌在機(jī)器學(xué)習(xí)方面的專業(yè)知識帶給了普通的移動應(yīng)用開發(fā)者,可以借助ML Kit在幾行代碼中實現(xiàn)所需的功能。
ML Kit的功能非常全面且易于使用,提供了基于API的現(xiàn)有解決方案,如文字識別、條碼識別、圖像標(biāo)簽、人臉檢測、對象檢測等。同時,還提供了便利的API,允許在移動應(yīng)用中使用自定義的TensorFlow Lite模型。
ML Kit針對移動設(shè)備進(jìn)行了優(yōu)化,使得機(jī)器學(xué)習(xí)套件的處理過程可以在設(shè)備上進(jìn)行,保證了快速性,并解鎖了處理相機(jī)輸入等實時用例的能力。即使在離線狀態(tài)下,也可以使用這項功能來處理需要保留在設(shè)備上的圖片和文本。
項目描述
ML Kit的默認(rèn)模型在物體檢測方面表現(xiàn)非常出色。當(dāng)你將圖像傳遞給物體檢測器時,它會返回一個物體列表,其中包含邊界框,這些邊界框可用于確定圖像中物體可能的位置。
本項目首先對圖像中的物體進(jìn)行分類檢測,獲取分類物體的位置區(qū)域,然后結(jié)合圖像標(biāo)記,逐個獲取單個物體的標(biāo)簽。
開發(fā)工具
- Android Studio Koala
- Kotlin
- Gradle 8.7
代碼設(shè)計
界面設(shè)計

界面上方是一個ImageView,用于呈現(xiàn)示例圖片;用戶點擊中間按鈕,調(diào)用物體檢測處理代碼;待處理完畢,將結(jié)果展示在下方的 TextView 中。
物體檢測處理
ML Kit物體檢測器提供多種物體檢測方法,這些方法由ObjectDetectorOptions對象控制。該檢測器是一個強(qiáng)大的API,不僅可以檢測物體,還能在視頻流中跟蹤它們,實現(xiàn)逐幀跟蹤功能。
創(chuàng)建物體檢測器,將Bitmap轉(zhuǎn)換為InputImage,并使用物體檢測器進(jìn)行處理。 這將在成功時返回檢測到的物體列表,或在失敗時返回異常物體。
val objectDetector = ObjectDetection.getClient(options)
var image = InputImage.fromBitmap(bitmap!!, 0)
txtOutput.text = ""
objectDetector.process(image)
.addOnSuccessListener { detectedObjects ->
// 任務(wù)執(zhí)行成功
getLabels(bitmap, detectedObjects, txtOutput)
bitmap?.apply{
img.setImageBitmap(drawWithRectangle(detectedObjects))
}
}
.addOnFailureListener { e ->
// 任務(wù)執(zhí)行失敗
Log.e("MainActivity", e.toString())
}用戶點擊按鈕后,調(diào)用物體檢測器以獲取圖像中物體的邊界框。然后,使用這些邊界框裁剪圖像,得到定義的子圖像,并將其傳遞給圖像標(biāo)記器。
標(biāo)記物體
使用已有的邊界框創(chuàng)建新的臨時圖像(croppedBitmap),將其傳遞給圖像標(biāo)記器,并返回結(jié)果。重復(fù)此操作以處理每個邊界框(即每個物體),以獲取每個檢測到物體的詳細(xì)標(biāo)簽!
val labeler =
ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
for(obj in objects) {
val bounds = obj.boundingBox
val croppedBitmap = Bitmap.createBitmap(
bitmap,
bounds.left,
bounds.top,
bounds.width(),
bounds.height()
)
var image = InputImage.fromBitmap(croppedBitmap!!, 0)
labeler.process(image)
.addOnSuccessListener { labels ->
// 任務(wù)執(zhí)行成功
var labelText = ""
if(labels.isNotEmpty()) {
labelText = txtOutput.text.toString()
for (thisLabel in labels){
labelText += thisLabel.text + " , "
}
labelText += "\n"
} else {
labelText = "Not found." + "\n"
}
txtOutput.text = labelText.toString()
}
}該代碼遍歷每個檢測到的物體,使用邊界框創(chuàng)建名為croppedBitmap的新位圖。接下來,它使用一個設(shè)置了默認(rèn)選項的圖像標(biāo)記器(稱為labeler)處理新圖像。處理成功后,從標(biāo)簽中獲取多個結(jié)果,并將這些標(biāo)簽寫入逗號分隔的字符串,最終呈現(xiàn)在TextView中。
項目演示

到此這篇關(guān)于基于Google ML模型開發(fā)Android物體檢測應(yīng)用的文章就介紹到這了,更多相關(guān)Android AI應(yīng)用開發(fā):物體檢測內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android studio 3.0 查看手機(jī)文件系統(tǒng)的方法(超簡單)
本文給大家分享Android studio更新到3.0版本之后,查看手機(jī)文件系統(tǒng)的方法,需要的朋友參考下吧2017-11-11
Android RecyclerView網(wǎng)格布局示例解析
這篇文章主要介紹了Android RecyclerView網(wǎng)格布局示例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-12-12
深入解讀Android的內(nèi)部進(jìn)程通信接口AIDL
這篇文章主要介紹了Android的內(nèi)部進(jìn)程通信接口AIDL,重點講解了進(jìn)程間的通信與AIDL內(nèi)存使用方面的parcelable接口的實現(xiàn),需要的朋友可以參考下2016-04-04
Android實現(xiàn)listview動態(tài)加載數(shù)據(jù)分頁的兩種方法
這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)listview動態(tài)加載的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-06-06
Retrofit2.0 實現(xiàn)圖文(參數(shù)+圖片)上傳方法總結(jié)
本篇文章主要介紹了Retrofit2.0 實現(xiàn)圖文(參數(shù)+圖片)上傳方法總結(jié),具有一定的參考價值,有興趣的可以了解一下2017-08-08

