Android TensorFlow - предотвратить изменение размера изображения - PullRequest
0 голосов
/ 01 мая 2018

Я работаю над стилизацией изображения TensorFlow. Но проблема, с которой я сталкиваюсь, заключается в том, что она меняет мой фактический образ. Я хочу применить стиль к самому изображению. Например, если мое разрешение изображения 1280x960, оно должно быть таким же после того, как я применил к нему стиль.

Я не использую значение по умолчанию INPUT_SIZE 256. Использование значения по умолчанию работает нормально. Вот мой код, который я использую для предотвращения изменения размера изображения.

private TensorFlowInferenceInterface inferenceInterface;
private void applyStyle(){
    inferenceInterface = new TensorFlowInferenceInterface(mActivity.getAssets(), "bossK_float.pb");
    Bitmap bitmap = getBitmapFromPath();
    bitmap=Bitmap.createBitmap(bitmap,0,bitmap.getWidth(),bitmap.getHeight(), matrix, true);
    INPUT_SIZE_WIDTH = bitmap.getWidth();
    INPUT_SIZE_HEIGHT = bitmap.getHeight();
    mStyledBitmap = stylizeImage(bitmap);
}

private Bitmap stylizeImage(Bitmap bitmap) {
            Bitmap scaledBitmap = scaleBitmap(bitmap, INPUT_SIZE_WIDTH, INPUT_SIZE_HEIGHT);

            intValues = new int[INPUT_SIZE_WIDTH * INPUT_SIZE_HEIGHT];
            floatValues = new float[INPUT_SIZE_WIDTH * INPUT_SIZE_HEIGHT * 3];

            scaledBitmap.getPixels(intValues, 0, scaledBitmap.getWidth(), 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight());
            scaledBitmap = scaledBitmap.copy(Bitmap.Config.ARGB_8888, true);



            for (int i = 0; i < intValues.length; ++i) {
                final int val = intValues[i];
                floatValues[i * 3 + 0] = ((val >> 16) & 0xFF) * 1.0f;
                floatValues[i * 3 + 1] = ((val >> 8) & 0xFF) * 1.0f;
                floatValues[i * 3 + 2] = (val & 0xFF) * 1.0f;
            }
            Trace.beginSection("feed");
            inferenceInterface.feed(INPUT_NAME, floatValues, INPUT_SIZE_WIDTH, INPUT_SIZE_HEIGHT, 3);
            Trace.endSection();

            Trace.beginSection("run");
            inferenceInterface.run(new String[]{OUTPUT_NAME});
            Trace.endSection();

            Trace.beginSection("fetch");
            inferenceInterface.fetch(OUTPUT_NAME, floatValues);
            Trace.endSection();

            for (int i = 0; i < intValues.length; ++i) {
                intValues[i] =
                        0xFF000000
                                | (((int) (floatValues[i * 3 + 0])) << 16)
                                | (((int) (floatValues[i * 3 + 1])) << 8)
                                | ((int) (floatValues[i * 3 + 2]));
            }
            scaledBitmap.setPixels(intValues, 0, scaledBitmap.getWidth(), 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight());

            return scaledBitmap;
        }

    private Bitmap scaleBitmap(Bitmap origin, int newWidth, int newHeight) {
        if (origin == null) {
            return null;
        }
        int height = origin.getHeight();
        int width = origin.getWidth();
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;

        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);
        Bitmap newBitmap = Bitmap.createBitmap(origin, 0, 0, width, height, matrix, false);
        return newBitmap;
    }

Когда я изменяю свои значения INPUT_SIZE на INPUT_SIZE_WIDTH и INPUT_SIZE_HEIGHT, мое приложение останавливается без сообщения об ошибке. Я отлаживаю этот код, но он застревает на этом куске кода и останавливаю мое приложение:

Trace.beginSection("run");
inferenceInterface.run(new String[]{OUTPUT_NAME});
Trace.endSection();

Пожалуйста, дайте мне знать, как я могу оформить изображение целиком с помощью TensorFlow.

Спасибо!

1 Ответ

0 голосов
/ 26 ноября 2018

Ваш код останавливается там из-за различий в размере. Возможно, вы получаете исключение ArrayOutOfBound.

Модель должна быть обучена принимать изображения определенного размера. Таким образом, всякий раз, когда вы классифицируете, изображение должно быть уменьшено до этого конкретного размера.

Даже ваши тренировочные данные, которые при создании файла pb / lite / tflite будут конвертированы, чтобы принимать изображения того же размера, которые вы указали при создании модели. Результаты не повлияют на большее исчезновение. Вы можете попробовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...