【问题标题】:android tensorflow static image segmentation problems with diff size images带有不同尺寸图像的android tensorflow静态图像分割问题
【发布时间】: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.ktImageUtils.ktModelExecutionResult.kt 是按照 github 代码,没有变化。之后我正在执行代码它抛出错误并在ImageSegmentationModelExecutor.kt 类中捕获出了点问题:y 必须是 。因此,如果我们查看代码,那么 ImageSegmentationModelExecutor 正在尝试从原始代码生成 scaledBitmap 并尝试从 ByteBuffer 生成掩码。因此,错误必须仅在这两个函数中。我也明白Tensorflow 只使用特定大小的输入来分析图像(这里他们指定了 257)所以,我也已经将我原来的bitmap 转换为 257 大小。但仍然为位图抛出错误!对于这些大小不同的静态图像有什么解决方案吗?

【问题讨论】:

  • 我有同样的问题,在 ImageSegmentationModelExecutor 类中需要很多修复。但有一件事是你不能改变输入大小超过 257!即使使用interpreter.resizeInput()。

标签: android tensorflow


【解决方案1】:

你可以试试Imgproc.resize(matSegment, matSegment, new Size(257,257));生成比例位图

【讨论】:

猜你喜欢
  • 2012-06-17
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-26
  • 2012-03-19
  • 1970-01-01
相关资源
最近更新 更多