[JAVA] Exécutez Tensorflow avec THETA V

introduction

Tensorflow a un exemple qui s'exécute sur Android, et est également présenté sur les sites suivants. https://qiita.com/icchi_h/items/a1df9f27569714edfc5e Ici, Tensorflow fonctionne avec la caméra all-sky THETA V équipée d'Android.

(2018/8/18: Ajouté en intégrant les articles qui ont été divisés en première et deuxième parties. Ici Aller au 20/10/2018 Il y a un matériel de commentaire (PPT) à l'événement qui a eu lieu.)

Environnement de développement

procédure

Acquisition de code source (Tensorflow, Plugin SDK)

Obtenez tensorflow depuis github et préparez le code source. ici, La version fourchue de https://github.com/tensorflow/tensorflow (engagement: 26353f9b51091312e7097143aee9c2d05e2011fd) a été placée sur https://github.com/mktshhr/tensorflow-theta et mise à jour pour THETA V. La balise "Qiita20180818" est le code source correspondant à cet article. Parmi eux, https://github.com/mktshhr/tensorflow-theta/tree/Qiita20180818/tensorflow/examples/android est la portée du changement. Après avoir obtenu le code source, vous pouvez l'essayer en ouvrant / tensorflow-theta / examples / android dans Android Studio. Les modifications décrites ci-dessous ont déjà été appliquées.

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

Ouvrir dans Android Studio

Ouvrez le dossier Android dans Android Studio. Suivez l'écran en cliquant sur "Ajouter le référentiel Google Maven et synchroniser le projet". Réécrivez la ligne 45 de build.gradle de "bazel" à "none".

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

De même, réécrivez la ligne 194 de build.gradle de "compile" à "implementation".

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

Mettre à jour avec "Sync Now".

Exécuter sur un smartphone Android

Avec les changements jusqu'à présent, il fonctionne sur les smartphones Android (Moto G5 Plus, Android 7.0). Vous pouvez sélectionner "Exécuter" - "Debug'TensorflowAndroid '" pour le construire et l'exécuter sur votre smartphone Android. (Dans le cas de THETA V, la caméra s'arrête.)

TensorFlow Demo se compose de quatre activités (applications): TF Classify, TF Detect, TF Stylize et TF Speech.

Changements pour THETA V

Parties communes de la caméra fixe (TF Classify, TF Detect, TF Stylize)

Changé pour diffuser "com.theta360.plugin.ACTION_MAIN_CAMERA_CLOSE" dans onCreate de la classe CameraActivity. Libérez les ressources de la caméra THETA afin qu'elles puissent être utilisées dans l'application Tensorflow.

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

Afin de construire, ajoutez ce qui suit au début du fichier CameraActivity.java.

import android.content.Intent;

Correction de l'argument onPreviewSizeChosen près de la ligne 124. Pas de rotation.

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

Changé autour de la ligne 99 comme suit. Ici, RicMoviePreview1024 est défini, mais des paramètres tels que RicMoviePreview3840 sont également possibles.

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

Modification de la ligne 109 comme suit. Permutez la largeur et la hauteur.

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

Avec les changements ci-dessus, nous avons pu confirmer le fonctionnement de TF Classify et TF Detect sur Vysor. Je l'ai corrigé parce que l'écran devenait une image portrait, mais alors que la nouvelle API Camera2 était disponible sur le smartphone Android (Moto G5 Plus), le fonctionnement était différent entre le smartphone et THETA car THETA utilise l'ancienne API Camera. C'est possible.

Par défaut, TF Detect utilise TF_OD_API (Tensorflow Object Detection API) pour la détection d'objets.

Correction de TF Stylize

Une fois l'image convertie en image carrée 1: 1 et le style appliqué, elle est modifiée pour revenir à une image cylindrique à distance régulière 2: 1.

Définissez processImage () près de la ligne 495 de StylizeActivity.java afin que le rapport hauteur / largeur ne soit pas enregistré lors de la création d'une matrice de transformation frameToCropTransform. Vous avez maintenant une image 2: 1-> 1: 1 pour la conversion de style.

  @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);

Dans Runnable () près de la ligne 520 de StylizeActivity.java, redimensionnez à l'aide de Canvas et changez le style de l'image croppedBitmap de 1: 1 à 2: 1 avec stylizeImage (). Crée une image textureCopyBitmap 2: 1 stylisée.

    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();
          }
        });

À ce stade, TF Stylize fonctionnera.

Correction de la parole TF

  @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);

Ajout de l'autorisation android.permission.MODIFY_AUDIO_SETTINGS dans AndroidManifest.xml (ci-dessous se trouve près de la ligne 26). Le taux d'échantillonnage par défaut pour TF Speech était de 16 kHz et celui par défaut pour THETA était de 44,1 kHz. Il semble que le filtre TF Speech ne fonctionne pas bien à 44,1 kHz, je l'ai donc utilisé à 16 kHz, mais il semble qu'il était nécessaire d'ajouter une autorité pour fonctionner avec ce paramètre.

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

Avec les changements ci-dessus, il est désormais possible de reconnaître la voix autant qu'un smartphone.

Résumé

L'exemple Android de Tensorflow a été exécuté sur THETA pour effectuer la reconnaissance d'image et la reconnaissance vocale. TF Classify est un classificateur d'objet, mais il est facile de mal juger un objet car il a un super grand angle dans une image tout-ciel. TF Detect est un détecteur d'objets qui recherche des objets dans une image. TF Stylize ne pouvait pas bien appliquer le style à l'image 2: 1, donc je l'ai évité en appliquant le style à l'image 1: 1 une fois. TF Speech peut être utilisé en ajoutant la permission MODIFY_AUDIO_SETTINGS. On pense qu'il y a encore beaucoup de place pour l'ingéniosité, comme l'amélioration de la précision de reconnaissance pour tout le ciel. La classe clé TensorFlowInferenceInterface utilise des modèles entraînés (fichiers au format Protocol Buffers (.pb)) sous les actifs en tant que paramètres. Vous pouvez essayer différents modèles d'apprentissage en organisant et en lisant de la même manière.

référence

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

Exécutez Tensorflow avec THETA V
Exécutez Payara avec Docker
Exécuter un lot avec docker-compose avec Java batch
Exécutez TAO Core avec Docker
Exécutez LIFF avec Spring Boot
Exécuter des rails à chaque fois dans le docker
Exécuter Java VM avec Web Assembly
Exécutez Nginx + Express avec Fargate 4 Core
Faites fonctionner Jupyter Lab n'importe où avec Docker
Exécuter des applications écrites en Java8 en Java6