Результат, полученный от экспортированной модели TensorFlow из Azure CustomVision на Android, неверный, одно и то же изображение, протестированное на CustomVision.ai и на Android, отличается. Я думаю, что это проблема масштабирования и изменения размера растрового изображения на растровом изображении, которую я хотел отправить для распознавания изображения. Кто-нибудь может сказать мне, что является стандартным размером масштабирования изображения, который действителен для классификации изображения?
Это важный код:
//tensorflow setting
private Vector<String> labels = new Vector<String>();
public static int INPUT_SIZE;
public static final int IMAGE_MEAN = 128;
public static final float IMAGE_STD = 128.0f;
public static final String INPUT_NAME = "Placeholder";
public static final String OUTPUT_NAME = "loss";
public static final String MODEL_FILE = "file:///android_asset/model.pb";
public static final String LABEL_FILE = "file:///android_asset/labels.txt";
private static final String[] DATA_NORM_LAYER_PREFIX = {"data_bn", "BatchNorm1"};
private static final int RESIZE_SIZE = 256;
private boolean hasNormalizationLayer = false;
private Camera.PictureCallback mPicture = new Camera.PictureCallback(){
@Override
public void onPictureTaken(final byte[] data, Camera camera){
byte[] data1 = data;
if(data1!=null){
int screenWidth = getResources().getDisplayMetrics().widthPixels;
int screenHeight = getResources().getDisplayMetrics().heightPixels;
bMap = BitmapFactory.decodeByteArray(data,0,(data != null) ? data.length : 0);
if(getResources().getConfiguration().orientation== Configuration.ORIENTATION_PORTRAIT){
Bitmap scaled = Bitmap.createScaledBitmap(bMap, screenHeight, screenWidth, true);
int w = scaled.getWidth();
int h = scaled.getHeight();
// Setting post rotate to 90
Matrix mtx = new Matrix();
mtx.postRotate(90);
// Rotating Bitmap
bMap = Bitmap.createBitmap(scaled, 0, 0, w, h, mtx, true);
}
else{
Bitmap scaled = Bitmap.createScaledBitmap(bMap, screenWidth,screenHeight , false);
bMap=scaled;
}
imageTaken.setImageBitmap(bMap);
}
mCamera.stopPreview();
frameLayout.removeView(mPreview);
imageTaken.setVisibility(View.VISIBLE);
captureBtn.setVisibility(View.GONE);
retakeBtn.setVisibility(View.VISIBLE);
analyzeBtn.setVisibility(View.VISIBLE);
}
};
public void analyzePosture() {
if (bMap != null) {
File file = new File(Environment.getExternalStorageDirectory() + "/dirr");
if (!file.isDirectory()) {
file.mkdir();
}
file = new File(Environment.getExternalStorageDirectory() + "/dirr", System.currentTimeMillis() + ".jpg");
try {
FileOutputStream fileOutputStream = new FileOutputStream(file);
bMap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
fileOutputStream.flush();
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception exception) {
exception.printStackTrace();
}
}
List<Classifier.Recognition> results = analyze(bMap);
}
public List<Classifier.Recognition> analyze(Bitmap bitmap)
{
bitmap = Bitmap.createScaledBitmap(bitmap,INPUT_SIZE,INPUT_SIZE,false);
List<Classifier.Recognition> results = classifier.recognizeImage(bitmap);
return results;
}