Проблема изменения размера и масштабирования в экспортированной модели Azure CustomVision Tensorflow на Android - PullRequest
0 голосов
/ 20 октября 2019

Результат, полученный от экспортированной модели 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;
        }
...