Numerical image recognition in Android, Kotlin\Java

У меня есть нейронная сеть, которая принимает такие входные данные (Kotlin) -

    val inputFeature0 = TensorBuffer.createFixedSize(intArrayOf(1, 28, 28, 1), DataType.FLOAT32)
    inputFeature0.loadBuffer(byteBuffer)

Нейронная сеть умеет распознавать множество символов (написанных отдельно) Мне нужно хотя бы приблизительное знание того, как реализовать алгоритм сегментации фото.

Допустим есть такое фото - введите сюда описание изображения

И нужно получить что то вроде этого - [ введите сюда описание изображения,введите сюда описание изображения,введите сюда описание изображения,введите сюда описание изображения ]

Похожий вопрос который не помог - https://stackoverflow.com/questions/31132746/numerical-image-recognition-in-java


Ответы (2 шт):

Автор решения: Alex Kart

Уверен, есть множество способов решить эту задачу, в том числе, алгоритмически. Но, раз уж в вашем проекте применены ИНС, то можно использовать их и для этого. RCNN могут находить и обозначать области, в которых виден похожий объект. Так можно подготовить компактную и быструю нейросеть, которая не сможет распознать символы, но найдёт на картинке "объект, похожий на символ" с 99,99%-ной уверенностью. Далее, обозначенный регион можно вырезать и скормить основной ИНС для точной классификации. rcnn region detection

→ Ссылка
Автор решения: Tikhon Lyamin

Я нашел ответ на свой вопрос, но этот код работает для белых цифр и черного фона(мне так надо было) Код - Kotlin

    val bitmapArray = ArrayList<Bitmap>()
    //bitmapArray.add(bitmap) добавить битмап в массив 
    //bitmapArray[0] извлечь
    val crop:Button = findViewById(R.id.croping)
    // по нажатии на на кнопку картинка разрезается на несколько и добавляется в массив 
    crop.setOnClickListener{  
        val width = bitmap.width
        val height = bitmap.height

        val image: Bitmap = bitmap
        var startPos = 0
        var lastValue = 0
        val colours: MutableSet<Int> = HashSet()
        for (x in 0 until image.width) {
            var histValue = 0
            for (y in 0 until image.height) {
                colours.add(image.getPixel(x, y))
                if (image.getPixel(x, y) == -0x1) {
                    histValue++
                }
            }
            if (histValue == 0 && lastValue == 0) {
                startPos = x
            } else if (histValue == 0 && lastValue != 0) {
                val segment: Bitmap = Bitmap.createBitmap(bitmap,startPos, 0, x - startPos, image.height)
                bitmapArray.add(segment)

            }
            lastValue = histValue
        }
        if (lastValue != 0) {
            val segment: Bitmap = Bitmap.createBitmap(bitmap,startPos, 0, image.width - startPos, image.height)
            bitmapArray.add(segment)
        }
    }
→ Ссылка