当前位置:网站首页>【Android,Kotlin,TFLite】移动设备集成深度学习轻模型TFlite(物体检测篇)
【Android,Kotlin,TFLite】移动设备集成深度学习轻模型TFlite(物体检测篇)
2022-06-30 22:10:00 【mozhimen】
深度学习.Tensorflow.TFLite.移动设备集成深度学习轻模型TFlite.图像分类篇
Why i create it?
为了创建一个易用且易于集成的TFlite加载库, 所以TFLiteLoader应运而生
- 开源Github项目地址 TFLiteLoader

集成 ObjectDetector
依赖
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.mozhimen.TFLiteLoader:objectdetector:1.0.2'
}
接入
- 全局声明
private lateinit var _tfLiteObjectDetector: TFLiteObjectDetector
- 在onCreate中进行初始化
_tfLiteObjectDetector = TFLiteObjectDetector.create("efficientdet-lite0.tflite", listener = _objectDetectorListener)
- 异步声明_objectDetectorListener
private val _objectDetectorListener: IObjectDetectorListener = object : IObjectDetectorListener {
override fun onError(error: String) {
runOnUiThread {
error.showToast()
}
}
override fun onResults(imageWidth: Int, imageHeight: Int, inferenceTime: Long, results: MutableList<Detection>?) {
runOnUiThread {
results?.let {
vb.objectDetectionOverlay.setObjectRect(imageWidth, imageHeight, results)
}
}
}
}
- 物体检测
_tfLiteObjectDetector.detect({你的Bitmap}, 0)
- 对返回数据的处理示例, 可以pull代码参考demo, 这是回调中的处理
override fun onResults(imageWidth: Int, imageHeight: Int, inferenceTime: Long, results: MutableList<Detection>?) {
runOnUiThread {
results?.let {
vb.objectDetectionOverlay.setObjectRect(imageWidth, imageHeight, results)
}
}
}
- 结果

对于返回值的说明
- MutableList{Detection}
@AutoValue
@UsedByReflection("object_detection_jni.cc")
public abstract class Detection {
public Detection() {
}
@UsedByReflection("object_detection_jni.cc")
public static Detection create(RectF boundingBox, List<Category> categories) {
return new AutoValue_Detection(new RectF(boundingBox), Collections.unmodifiableList(new ArrayList(categories)));
}
//检测物体在画面的位置信息
public abstract RectF getBoundingBox();
//类别集合
public abstract List<Category> getCategories();
}
完整demo代码
@PermissionKAnnor(permissions = [Manifest.permission.CAMERA])
class ObjectDetectionActivity : BaseKActivity<ActivityObjectDetectionBinding, BaseKViewModel>(R.layout.activity_object_detection) {
private lateinit var _tfLiteObjectDetector: TFLiteObjectDetector
private val _objectDetectorListener: IObjectDetectorListener = object : IObjectDetectorListener {
override fun onError(error: String) {
runOnUiThread {
error.showToast()
}
}
override fun onResults(imageWidth: Int, imageHeight: Int, inferenceTime: Long, results: MutableList<Detection>?) {
runOnUiThread {
results?.let {
vb.objectDetectionOverlay.setObjectRect(imageWidth, imageHeight, results)
}
}
}
}
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() {
_tfLiteObjectDetector = TFLiteObjectDetector.create("efficientdet-lite0.tflite", listener = _objectDetectorListener)
// _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.objectDetectionPreview.initCamera(this, CameraSelector.DEFAULT_BACK_CAMERA)
vb.objectDetectionPreview.setImageAnalyzer(_frameAnalyzer)
vb.objectDetectionPreview.startCamera()
}
private val _frameAnalyzer: ImageAnalysis.Analyzer by lazy {
object : ImageAnalysis.Analyzer {
private val _reentrantLock = ReentrantLock()
@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)
_tfLiteObjectDetector.detect(rotateBitmap, 0)
} 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'
综上所述: 集成是不是很简单, 那赶快试试吧
边栏推荐
- Analysis of PostgreSQL storage structure
- Introduce an online platform for multi omics integration and network visual analysis
- 《安富莱嵌入式周报》第271期:2022.06.20--2022.06.26
- Develop technology - get time 10 minutes ago
- Apache server OpenSSL upgrade
- 公有云市场迈入深水区,冷静的亚马逊云还坐得住吗?
- What if the taskbar is blank after win11 update? Solution to blank and stuck taskbar after win11 update
- Pytorch quantitative perception training (qat) steps
- Online education program user login and registration
- Pytorch quantitative practice (1)
猜你喜欢

机器学习工作要求研究生吗?

《安富莱嵌入式周报》第271期:2022.06.20--2022.06.26

Look at the top 10 capabilities of alicloud cipu

与AI结对编程式是什么体验 Copilot vs AlphaCode, Codex, GPT-3

机器学习中如何使用数据集?
![Flip the linked list ii[three ways to flip the linked list +dummyhead/ head insertion / tail insertion]](/img/a8/6472e2051a295f5e42a88d64199517.png)
Flip the linked list ii[three ways to flip the linked list +dummyhead/ head insertion / tail insertion]

Web APIs comprehensive case -tab column switching - dark horse programmer

Study summary of dynamic routing between capsules

Alibaba Kube eventer MySQL sink simple usage record

Stinky tofu made by Grandma
随机推荐
Uniapp rich text editor
公有云市场迈入深水区,冷静的亚马逊云还坐得住吗?
HDFS centralized cache management
与AI结对编程式是什么体验 Copilot vs AlphaCode, Codex, GPT-3
[career planning for Digital IC graduates] Chap.1 overview of IC industry chain and summary of representative enterprises
将Nagios监控信息存入MySQL
腾讯3年,功能测试进阶自动化测试,送给在手工测试中迷茫的你
Turn: win others' follow with practical actions
Is it difficult to get a certified equipment supervisor? What is the relationship with the supervising engineer?
vncserver: Failed command ‘/etc/X11/Xvnc-session‘: 256!
Is Wu Enda's machine learning suitable for entry?
Is the stock account opened in qiniu safe? How to apply for a low commission stock account?
Analysis of doctor Aifen's incident
ML&DL:机器学习和深度学习中超参数优化的简介、评估指标、过拟合现象、常用的调参优化方法之详细攻略
What is the experience of pairing with AI? Pilot vs alphacode, Codex, gpt-3
Femas: cloud native multi runtime microservice framework
软件确认测试的内容和流程有哪些?确认测试报告需要多少钱?
国产数据库乱象
Anti leakage family photo in attack and defense drill
Stimulate new kinetic energy to develop digital economy in multiple places