栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Android,Kotlin,TFLite】移动设备集成深度学习轻模型TFlite(图像分类篇)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Android,Kotlin,TFLite】移动设备集成深度学习轻模型TFlite(图像分类篇)

深度学习.Tensorflow.TFLite.移动设备集成深度学习轻模型TFlite.图像分类篇

Why i create it?

为了创建一个易用且易于集成的TFlite加载库, 所以TFLiteLoader应运而生

  • 开源Github项目地址 TFLiteLoader

集成 ImageClassifier

依赖

allprojects {
	repositories {
		...
		maven { url 'https://jitpack.io' }
	}
}
dependencies {
	implementation 'com.github.mozhimen.TFLiteLoader:imageclassifier:1.0.2'
}

接入

  1. 全局声明
private lateinit var _tFLiteImageClassifier: TFLiteImageClassifier
  1. 在onCreate中进行初始化
_tFLiteImageClassifier = TFLiteImageClassifier.create("health_model.tflite", resultSize = 3)
  1. 分类图片
val objList = _tFLiteImageClassifier.classify([你的bitmap], 0)
  • 对返回数据的处理示例, 可以pull代码参考demo
val objList = _tFLiteImageClassifier.classify(rotateBitmap, 0)
Log.d(TAG, "analyze: $objList")
runOnUiThread {
	if (objList.isEmpty()) return@runOnUiThread
	objList.forEachIndexed { index, _ ->
    	_stringBuilder.append("${objList[index].title}: ${objList[index].confidence}").append(" ")
	}
	vb.imageClassifierRes.text = _stringBuilder.toString()
	_stringBuilder.clear()
}

对于返回值的说明

  • List{Recognition}
data class Recognition(
    
    val id: String?,
    
    val title: String?,
    
    val confidence: Float?,
    
    private var location: RectF?
) {

    fun getLocation(): RectF {
        return RectF(location)
    }

    fun setLocation(location: RectF?) {
        this.location = location
    }

    override fun toString(): String {
        var resultString = ""
        if (id != null) {
            resultString += "[$id] "
        }
        if (title != null) {
            resultString += "$title "
        }
        if (confidence != null) {
            resultString += String.format("(%.1f%%) ", confidence * 100.0f)
        }
        if (location != null) {
            resultString += location.toString() + " "
        }
        return resultString.trim { it <= ' ' }
    }
}

完整demo代码

@PermissionKAnnor(permissions = [Manifest.permission.CAMERA])
class ImageClassifierActivity : BaseKActivity(R.layout.activity_image_classifier) {
    private lateinit var _tFLiteImageClassifier: TFLiteImageClassifier
//    private lateinit var _tFLiteLabelImageClassifier: TFLiteLabelImageClassifier
//    private lateinit var _tFImageClassifier: TFImageClassifier

    override fun initData(savedInstanceState: Bundle?) {
        PermissionK.initPermissions(this) {
            if (it) {
                initView(savedInstanceState)
            } else {
                PermissionK.applySetting(this)
            }
        }
    }

    override fun initView(savedInstanceState: Bundle?) {
        initLiteLoader()
        initCamera()
    }

    private fun initLiteLoader() {
        _tFLiteImageClassifier = TFLiteImageClassifier.create("health_model.tflite", resultSize = 3)
//        _tFLiteLabelImageClassifier = TFLiteLabelImageClassifier.create("?", "labels.txt", modelType = ModelType.QUANTIZED_EFFICIENTNET)
//        _tFImageClassifier = TFImageClassifier.create("output_graph.pb", "output_labels.txt", "input", 299, "output", 128f, 128f, 0.1f, 1)
    }

    private fun initCamera() {
        vb.imageClassifierPreview.initCamera(this, CameraSelector.DEFAULT_BACK_CAMERA)
        vb.imageClassifierPreview.setImageAnalyzer(_frameAnalyzer)
        vb.imageClassifierPreview.startCamera()
    }

    private val _frameAnalyzer: ImageAnalysis.Analyzer by lazy {
        object : ImageAnalysis.Analyzer {
            private val _reentrantLock = ReentrantLock()
            private val _stringBuilder = StringBuilder()

            @SuppressLint("UnsafeOptInUsageError", "SetTextI18n")
            override fun analyze(image: ImageProxy) {
                try {
                    _reentrantLock.lock()
                    val bitmap: Bitmap = if (image.format == ImageFormat.YUV_420_888) {
                        ImageConverter.yuv2Bitmap(image)!!
                    } else {
                        ImageConverter.jpeg2Bitmap(image)
                    }
                    val rotateBitmap = UtilKBitmap.rotateBitmap(bitmap, 90)

                    val objList = _tFLiteImageClassifier.classify(rotateBitmap, 0)
                    Log.d(TAG, "analyze: $objList")
                    runOnUiThread {
                        if (objList.isEmpty()) return@runOnUiThread
                        objList.forEachIndexed { index, _ ->
                            _stringBuilder.append("${objList[index].title}: ${objList[index].confidence}").append(" ")
                        }
                        vb.imageClassifierRes.text = _stringBuilder.toString()
                        _stringBuilder.clear()
                    }
                } finally {
                    _reentrantLock.unlock()
                }

                image.close()
            }
        }
    }
}

关于这里的框架代码, 可以参考我另一个开源框架库: SwiftKit ,不过因为还未完成, 没有完整的wiki, 过段时间推出

  • 本示例代码所持引用:
implementation 'com.github.mozhimen.SwiftKit:basick:1.1.1'
implementation('com.github.mozhimen.SwiftKit:abilityk:1.1.1') {
	exclude group: 'com.mozhimen.abilityk.scank'
    exclude group: 'com.huawei.hms'
}
implementation 'com.github.mozhimen.SwiftKit:componentk:1.1.1'

综上所述: 集成是不是很简单, 那赶快试试吧

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/999145.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号