Я работаю над приложением для 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;
}