1

フラッター、特にAndroid側で同じことを行うために、ネイティブのswiftとandroid/javaの両方で正常に推論できるモデルを使用しようとしています。

この場合、私が受け取っている値はかなりずれています。

私がこれまでに行ったこと:

  1. https://github.com/tensorflow/examples/tree/master/lite/examples/image_classification/androidの tensorflowlite android サンプル github リポジトリを使用したところ、FloatEfficientNet オプションがモデルの値を正確に示していることがわかりました。

  2. flutter_tflite ライブラリを使用して、Android コードの推論セクションが上記の tensorflow の例と一致するように変更しました: https://github.com/shaqian/flutter_tflite

  3. このチュートリアルを使用し、上記のライブラリを使用してプラットフォーム チャネル経由でテンソルフローを推論するレポを含めました: https://github.com/flutter-devs/tensorflow_lite_flutter

フラッター チュートリアルを介して、カメラのライブ フィードから CameraImage オブジェクトをストリーミングできるカメラ プラグインを使用します。それを、プラットフォーム チャネルを使用して画像を A​​ndroid レイヤーに渡す変更されたフラッター tensorflow ライブラリに渡します。これは、バイト配列のリストとして行います。(3 プレーン、YuvImage)。作業中の floatefficientnet コードを含む tensorflow android example(1) は、ビットマップの例です。だから私はこの方法を使って変換しています:

    public Bitmap imageToBitmap(List<byte[]> planes, float rotationDegrees, int width, int height) {

        // NV21 is a plane of 8 bit Y values followed by interleaved  Cb Cr
        ByteBuffer ib = ByteBuffer.allocate(width * height * 2);

        ByteBuffer y = ByteBuffer.wrap(planes.get(0));
        ByteBuffer cr = ByteBuffer.wrap(planes.get(1));
        ByteBuffer cb = ByteBuffer.wrap(planes.get(2));
        ib.put(y);
        ib.put(cb);
        ib.put(cr);

        YuvImage yuvImage = new YuvImage(ib.array(),
                ImageFormat.NV21, width, height, null);

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        yuvImage.compressToJpeg(new Rect(0, 0, width, height), 50, out);
        byte[] imageBytes = out.toByteArray();
        Bitmap bm = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
        Bitmap bitmap = bm;

        // On android the camera rotation and the screen rotation
        // are off by 90 degrees, so if you are capturing an image
        // in "portrait" orientation, you'll need to rotate the image.
        if (rotationDegrees != 0) {
            Matrix matrix = new Matrix();
            matrix.postRotate(rotationDegrees);
            Bitmap scaledBitmap = Bitmap.createScaledBitmap(bm,
                    bm.getWidth(), bm.getHeight(), true);
            bitmap = Bitmap.createBitmap(scaledBitmap, 0, 0,
                    scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix, true);
        }
        return bitmap;
    }

推論は成功しました。値をフラッターに戻して結果を表示することはできますが、かなり外れています。同じ Android フォンを使用しても、結果はまったく異なり、まったく異なります。

この欠陥は、CameraImage データ形式のビットマップへの変換に関連していると思われます。これは、チェーン全体の中で私が個別にテストできない唯一の部分であるためです。同様の問題に直面したことがある人が助けてくれるとしたら、私はかなり困惑しています。

4

1 に答える 1