Одинаковое значение метки для всех цифр при распознавании рукописных цифр по фотографии (без рисунка) на андроиде с использованием кераса, тензор потока - PullRequest
0 голосов
/ 22 октября 2018

Я работаю над приложением для Android, которое распознает рукописную бенгальскую цифру как на фотографии, так и на холсте.Я обучил набор данных в Python, используя керас и тензорный поток в качестве бэкэнда.Приложение работает с цифрами, нарисованными на холсте, и отлично распознает все 10 цифр.Для фотографии, выбранной из галереи, я следовал тому же самому файлу .pb и коду для обнаружения по фотографиям, содержащим цифры (написанные на белой бумаге с черным маркером).Я взял значение растрового изображения MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(),uri) и масштабировал его до 32 * 32 (размер ввода).Затем получил значения пикселей и преобразовал цвет для использования в тензорном потоке.Когда я запускаю приложение, оно обнаруживает 5 для всех цифр с низкой достоверностью.Я думаю, что с обученной моделью все в порядке, поскольку она дает точный ответ, когда я рисую любую цифру на холсте.Пожалуйста, помогите выяснить, почему это происходит :( TIA.

private void onRecognize() {

    Bitmap scaledImage = Bitmap.createScaledBitmap(bitmap, 32, 32, false);
    image.setImageBitmap(scaledImage);

    int pixels[] = new int[height*width];
    scaledImage.getPixels(pixels,0,height, 0,0,width,height);
    float[] normalizedPixels = normalizePixels(pixels);

    int[] previewPixels = pixelsForPreview(pixels, normalizedPixels);

    Bitmap preview = Bitmap.createBitmap(previewPixels, width, height, Bitmap.Config.ARGB_8888);
    image.setImageBitmap(preview);

    classify(normalizedPixels);
}

private void classify(float[] normalizedPixels) {
    DigitClassification dc = digitClassifier.recognize(normalizedPixels);
    String result = String.format("Digit %s with confidence: %f",dc.getLabel(),dc.getConfidence());
    Toast.makeText(this, result, Toast.LENGTH_SHORT).show();
}

public DigitClassification recognize(float[] pixels){

    tf.feed(input_name, pixels, 1, input_size, input_size, 1);
    tf.run(output_names);
    tf.fetch(output_name,output);

    DigitClassification digit = new DigitClassification();

    for(int i=0;i<output.length;i++){
        Log.d(TAG, String.format("Class: %s Confidence: %f", labels.get(i), output[i]));
        if (output[i] > threshold && output[i] > digit.getConfidence()) {
            digit.update(labels.get(i),output[i]);
        }
    }

    return digit;
}
...