【发布时间】:2020-07-06 07:42:51
【问题描述】:
我正在尝试检测在demo from github 之后在Android 应用程序中使用tensorflow segmentation 的人。演示包含如何检测相机中的分割,但它只有特定的大小!我的要求是使用静态图像而不是实时预览。所以,我使用了特定的图像并尝试从中生成输出。
MainActivity.kt:
class MainActivity : AppCompatActivity() {
private lateinit var mBinding: ActivityMainBinding
private lateinit var mContext: Activity
private val scope = CoroutineScope(Dispatchers.IO)
private var bitmap: Bitmap? = null
private val TAG = "ImageDetect>>>"
private lateinit var imageSegmentationModel: ImageSegmentationModelExecutor
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(mBinding.root)
mContext = this
imageSegmentationModel = ImageSegmentationModelExecutor(this, true)
Glide.with(this)
.load(R.drawable.sample)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.listener(object : RequestListener<Drawable> {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {
setLoading(false)
return false
}
override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
bitmap = (resource as BitmapDrawable).bitmap
setLoading(false)
return false
}
})
.into(mBinding.ivSample)
mBinding.btnDetect.setOnClickListener {
bitmap?.let {
setLoading(true)
try {
val bm = ImageUtils.scaleBitmapAndKeepRatio(it, 257, 257)
scope.launch {
val resultBitmap = imageSegmentationModel.execute(bm)
withContext(Dispatchers.Main) {
mBinding.ivSample.setImageBitmap(resultBitmap.bitmapMaskOnly)
setLoading(false)
}
}
} catch (exc: Exception) {
setLoading(false)
Log.e(TAG, Log.getStackTraceString(exc))
}
}
}
}
private fun setLoading(isShow: Boolean) {
if (isShow) mBinding.pbLoading.visibility = View.VISIBLE
else mBinding.pbLoading.visibility = View.GONE
}
}
ImageSegmentationModelExecutor.kt、ImageUtils.kt 和 ModelExecutionResult.kt 是按照 github 代码,没有变化。之后我正在执行代码它抛出错误并在ImageSegmentationModelExecutor.kt 类中捕获出了点问题:y 必须是 ImageSegmentationModelExecutor 正在尝试从原始代码生成 scaledBitmap 并尝试从 ByteBuffer 生成掩码。因此,错误必须仅在这两个函数中。我也明白Tensorflow 只使用特定大小的输入来分析图像(这里他们指定了 257)所以,我也已经将我原来的bitmap 转换为 257 大小。但仍然为位图抛出错误!对于这些大小不同的静态图像有什么解决方案吗?
【问题讨论】:
-
我有同样的问题,在 ImageSegmentationModelExecutor 类中需要很多修复。但有一件事是你不能改变输入大小超过 257!即使使用interpreter.resizeInput()。
标签: android tensorflow