[JAVA] Führen Sie Tensorflow mit THETA V aus

Einführung

Tensorflow verfügt über ein Beispiel, das unter Android ausgeführt wird und auch auf den folgenden Websites vorgestellt wird. https://qiita.com/icchi_h/items/a1df9f27569714edfc5e Hier wird Tensorflow mit der All-Sky-Kamera THETA V betrieben, die mit Android ausgestattet ist.

(2018/8/18: Hinzugefügt durch Integration der Artikel, die in den ersten und zweiten Teil unterteilt wurden. Gehen Sie zu hier am 20.10.2018 Bei der Veranstaltung gibt es ein Kommentarmaterial (PPT).)

Entwicklungsumgebung

Verfahren

Quellcode-Erfassung (Tensorflow, Plugin SDK)

Holen Sie sich tensorflow von github und bereiten Sie den Quellcode vor. Hier, Die gegabelte Version von https://github.com/tensorflow/tensorflow (Verpflichtung: 26353f9b51091312e7097143aee9c2d05e2011fd) wurde unter https://github.com/mktshhr/tensorflow-theta platziert und für THETA V aktualisiert. Das Tag "Qiita20180818" ist der Quellcode, der diesem Artikel entspricht. Unter diesen ist https://github.com/mktshhr/tensorflow-theta/tree/Qiita20180818/tensorflow/examples/android der Umfang der Änderungen. Nachdem Sie den Quellcode erhalten haben, können Sie ihn ausprobieren, indem Sie / tensorflow-theta / examples / android in Android Studio öffnen. Die nachfolgend beschriebenen Änderungen wurden bereits übernommen.

git clone https://github.com/mktshhr/tensorflow-theta.git 
cd ./tensorflow-theta/examples/android

In Android Studio öffnen

Öffnen Sie den Android-Ordner in Android Studio. Folgen Sie dem Bildschirm, indem Sie auf "Google Maven-Repository hinzufügen und Projekt synchronisieren" klicken. Schreiben Sie die Zeile 45 von build.gradle von "bazel" in "none" um.

// set to 'bazel', 'cmake', 'makefile', 'none'
def nativeBuildSystem = 'none'

Schreiben Sie in ähnlicher Weise die Zeile 194 von build.gradle von "kompilieren" in "implementieren".

dependencies {
    if (nativeBuildSystem == 'cmake' || nativeBuildSystem == 'none') {
        implementation 'org.tensorflow:tensorflow-android:+'
    }
}

Update mit "Jetzt synchronisieren".

Auf Android-Smartphone ausführen

Mit den bisherigen Änderungen funktioniert es auf Android-Smartphones (Moto G5 Plus, Android 7.0). Sie können "Ausführen" - "Debug'TensorflowAndroid '" auswählen, um es auf Ihrem Android-Smartphone zu erstellen und auszuführen. (Bei THETA V schaltet sich die Kamera aus.)

Die TensorFlow-Demo besteht aus vier Aktivitäten (Apps): TF-Klassifizierung, TF-Erkennung, TF-Stilisierung und TF-Sprache.

Änderungen für THETA V.

Gemeinsame Teile der Kamera behoben (TF Classify, TF Detect, TF Stylize)

Geändert, um "com.theta360.plugin.ACTION_MAIN_CAMERA_CLOSE" in der Klasse onCreate of CameraActivity zu senden. Geben Sie die Kameraressourcen von THETA frei und stellen Sie sie in der Tensorflow-App zur Verfügung.

  @Override
  protected void onCreate(final Bundle savedInstanceState) {
    LOGGER.d("onCreate " + this);
    sendBroadcast(new Intent("com.theta360.plugin.ACTION_MAIN_CAMERA_CLOSE"));
    super.onCreate(null);

Fügen Sie zum Erstellen Folgendes am Anfang der Datei CameraActivity.java hinzu.

import android.content.Intent;

Das Argument onPreviewSizeChosen in der Nähe von Zeile 124 wurde korrigiert. Keine Rotation.

onPreviewSizeChosen(new Size(previewSize.width, previewSize.height), 0);

Um Zeile 99 wie folgt geändert. Hier wird RicMoviePreview1024 eingestellt, aber auch Einstellungen wie RicMoviePreview3840 sind möglich.

            //camera.setDisplayOrientation(90);
            parameters.set("RIC_SHOOTING_MODE", "RicMoviePreview1024");

Zeile 109 wurde wie folgt geändert. Tauschen Sie die Breite und Höhe aus.

          camera.addCallbackBuffer(new byte[ImageUtils.getYUVByteSize(s.width, s.height)]);
          textureView.setAspectRatio(s.width, s.height);

Mit den oben genannten Änderungen konnten wir den Betrieb von TF Classify und TF Detect auf Vysor bestätigen. Ich habe es behoben, weil das Display ein Porträtbild wurde, aber während die neue Camera2-API auf dem Android-Smartphone (Moto G5 Plus) verfügbar war, war der Vorgang zwischen dem Smartphone und THETA unterschiedlich, da THETA die ältere Kamera-API verwendet. Es kann sein.

Standardmäßig verwendet TF Detect TF_OD_API (Tensorflow Object Detection API) zur Objekterkennung.

TF Stilisieren Fix

Sobald das Bild in ein 1: 1-Quadratbild konvertiert und der Stil angewendet wurde, wird es geändert, um zu einem zylindrischen 2: 1-Bild mit normalem Abstand zurückzukehren.

Setzen Sie processImage () in der Nähe der Zeile 495 von StylizeActivity.java, damit das Seitenverhältnis beim Erstellen einer FrameToCropTransform-Transformationsmatrix nicht gespeichert wird. Jetzt haben Sie ein 2: 1-> 1: 1-Bild für die Stilkonvertierung.

  @Override
  protected void processImage() {
    if (desiredSize != initializedSize) {
      LOGGER.i(
          "Initializing at size preview size %dx%d, stylize size %d",
          previewWidth, previewHeight, desiredSize);

      rgbFrameBitmap = Bitmap.createBitmap(previewWidth, previewHeight, Config.ARGB_8888);
      croppedBitmap = Bitmap.createBitmap(desiredSize, desiredSize, Config.ARGB_8888);
      frameToCropTransform = ImageUtils.getTransformationMatrix(
          previewWidth, previewHeight,
          desiredSize, desiredSize,
          sensorOrientation, false);

Ändern Sie in Runnable () in der Nähe der Zeile 520 von StylizeActivity.java die Größe mithilfe von Canvas und ändern Sie den Stil des CroppedBitmap-Bilds von 1: 1 auf 2: 1. Erstellt ein gestyltes 2: 1-TexturCopyBitmap-Bild.

    runInBackground(
        new Runnable() {
          @Override
          public void run() {
            cropCopyBitmap = Bitmap.createBitmap(croppedBitmap);
            final long startTime = SystemClock.uptimeMillis();
            stylizeImage(croppedBitmap);
            lastProcessingTimeMs = SystemClock.uptimeMillis() - startTime;
            textureCopyBitmap = Bitmap.createBitmap(previewWidth, previewHeight, Config.ARGB_8888);

            final Paint paint = new Paint();
            paint.setFilterBitmap(true);
            final Canvas canvas = new Canvas(textureCopyBitmap);
            canvas.drawBitmap(croppedBitmap, cropToFrameTransform, paint);

            if (SAVE_PREVIEW_BITMAP) {
              ImageUtils.saveBitmap(textureCopyBitmap, "stylizeImage.png ");
            }
            requestRender();
            readyForNextImage();
          }
        });

Zu diesem Zeitpunkt funktioniert TF Stylize.

TF Sprachkorrektur

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    // Set up the UI.
    super.onCreate(savedInstanceState);
    
    AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE); // for THETA
    am.setParameters("RicUseBFormat=false"); // for THETA
    
    setContentView(R.layout.activity_speech);

Android.permission.MODIFY_AUDIO_SETTINGS-Berechtigung in AndroidManifest.xml hinzugefügt (unter Zeile 26). Die Standardabtastrate für TF-Sprache betrug 16 kHz und die Standardabtastrate für THETA betrug 44,1 kHz. Es scheint, dass der TF-Sprachfilter bei 44,1 kHz nicht gut funktioniert, also habe ich ihn bei 16 kHz betrieben, aber es scheint notwendig zu sein, die Berechtigung hinzuzufügen, um mit dieser Einstellung zu arbeiten.

    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

Mit den oben genannten Änderungen ist es jetzt möglich, Sprache genauso zu erkennen wie ein Smartphone.

Zusammenfassung

Ein Android-Beispiel von Tensorflow wurde auf THETA ausgeführt, um die Bilderkennung und Spracherkennung durchzuführen. TF Classify ist ein Objektklassifizierer, aber es ist leicht, ein Objekt falsch zu identifizieren, da es in einem All-Sky-Bild einen Superweitwinkel aufweist. TF Detect ist ein Objektdetektor, der nach Objekten in einem Bild sucht. Da TF Stylize den Stil nicht gut auf das 2: 1-Bild anwenden konnte, habe ich ihn vermieden, indem ich den Stil einmal auf das 1: 1-Bild angewendet habe. TF Speech kann durch Hinzufügen der Berechtigung MODIFY_AUDIO_SETTINGS ausgeführt werden. Es wird angenommen, dass es noch viel Raum für Einfallsreichtum gibt, beispielsweise die Verbesserung der Erkennungsgenauigkeit für den gesamten Himmel. Die Schlüsselklasse TensorFlowInferenceInterface verwendet trainierte Modelle (.pb-Formatdateien (Protocol Buffers)) unter Assets als Parameter. Sie können verschiedene Lernmodelle ausprobieren, indem Sie sie auf dieselbe Weise anordnen und lesen.

Referenz

https://codelabs.developers.google.com/codelabs/tensorflow-style-transfer-android/index.html https://api.ricoh/docs/theta-plugin-reference/camera-api/ http://iti.hatenablog.jp/entry/2017/05/25/093328

Recommended Posts

Führen Sie Tensorflow mit THETA V aus
Führen Sie Payara mit Docker aus
Führen Sie Batch mit Docker-Compose mit Java-Batch aus
Führen Sie TAO Core mit Docker aus
Führen Sie LIFF mit Spring Boot aus
Führen Sie Rails immer im Docker aus
Führen Sie Java VM mit Web Assembly aus
Führen Sie nginx + express mit fargate 4 core aus
Lassen Sie Jupyter Lab überall mit Docker arbeiten
Führen Sie in Java8 geschriebene Anwendungen in Java6 aus