我正在开发一个Android应用程序,该程序可以从照片和画布上识别手写的孟加拉数字。我已经使用keras和tensorflow作为后端在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;
}