THETAV를 사용하여 Tensorflow 작업

16273 단어 AndroidTHETAPluginJava

개시하다


Tensorflow에는 안드로이드견본가 있고 아래 사이트에서도 소개되어 있다.
https://qiita.com/icchi_h/items/a1df9f27569714edfc5e
여기에는 안드로이드를 탑재한 온종일 카메라 THETAV로 텐소플로우 동작을 한다.
(2018/8/18: 앞뒤 문장을 합쳐서 보충한다.여기.에는 2018/10/20 활동의 해설자료(PPT)가 있다.)

개발 환경

  • RICOH THETA V, firmware ver.2.40.2 (Android 7.1.1)
  • Moto G5 Plus, Android 7.0
  • Android Studio 3.1.4
  • Build #AI-173.4907809, built on July 24, 2018
  • JRE: 1.8.0_152-release-1024-b01 x86_64
  • JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
  • Mac OS X 10.13.6
  • 절차.


    소스 코드 가져오기(Tensorflow, PluginsDK)


    github에서 tensorflow 원본 코드를 준비합니다.여기 있다
    https://github.com/tensorflow/tensorflow (제출:26353f9b5109122e 7097143aee 9c2d05e 2011 fd) 포크 후 파일 배치https://github.com/mktshhr/tensorflow-theta를THETAV에 업데이트합니다.태그 "Qita 20180818"은 본 기사에 해당하는 소스 코드입니다.여기서 https://github.com/mktshhr/tensorflow-theta/tree/Qiita20180818/tensorflow/examples/android는 변경 범위다.
    원본 코드를 가져오면 안드로이드 스튜디오에서 tensorflow-theta/examples/android를 열고 테스트할 수 있습니다.다음 설명의 변경 사항이 적용되었습니다.
    git clone https://github.com/mktshhr/tensorflow-theta.git 
    cd ./tensorflow-theta/examples/android
    

    Android Studio에서 열기


    안드로이드 폴더를 Android Studio로 엽니다.
    "Add Google Maven repository 및 and sync 프로젝트"를 클릭한 후 화면을 따라갑니다.
    build.gradle의 45줄을 "bazel"에서 "none"으로 고칩니다.
    // set to 'bazel', 'cmake', 'makefile', 'none'
    def nativeBuildSystem = 'none'
    
    같은build입니다.gradle의 194번째 줄을 "comple"에서 "implementation"으로 변경합니다.
    dependencies {
        if (nativeBuildSystem == 'cmake' || nativeBuildSystem == 'none') {
            implementation 'org.tensorflow:tensorflow-android:+'
        }
    }
    
    SyncNow로 업데이트됩니다.

    안드로이드 스마트폰으로 이동


    이때까지 변경된 사항은 안드로이드 스마트폰(Moto G5 Plus, 안드로이드 7.0)에서 실행된다.
    'Run'-'Debug'Tensorflow 안드로이드'를 선택해 구축하고 안드로이드 스마트폰으로 조작할 수 있다.(THETAV의 경우 카메라가 피피피피피피라고 불리며 꺼진다.)
    텐소플라우 데모는 TF 클래식, TF 디텍트, TF 스타일리즈, TF 스피치 4개 활동(적용)으로 구성됐다.
  • TF Classify:100 분류
  • TF Detect:YOLO 등의 물체 식별을 사용한다.
  • TF Stylize: 회화 풍격 등 풍격 전환.
  • TF Speech: 음성 인식.
  • THETAV용 변경 사항


    Camera 공통 섹션 수정(TF Classify, TF Detect, TF Stylize)

  • CameraActivity.자바 수정
  • Camera Activity 클래스의 onCreate에서 라디오'com.theta360.pluggin.ACTION MAIN CAMERA CLOSE'로 변경되었습니다.THETA의 카메라 리소스를 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);
    
    구축을 위해 아래도 Camera Activity입니다.자바 파일의 시작에 보충합니다.
    import android.content.Intent;
    
    124행 근처의 onPreviewSizeChosen 매개변수를 수정합니다.회전이 없습니다.
    onPreviewSizeChosen(new Size(previewSize.width, previewSize.height), 0);
    
  • LegacyCameraConnectionFragment.자바 수정
  • 제99행 부근은 다음과 같다.이곳은 릭 무비 프리미엄 1024이지만 릭 무비 프리미엄 3840 등도 설정할 수 있다.
                //camera.setDisplayOrientation(90);
                parameters.set("RIC_SHOOTING_MODE", "RicMoviePreview1024");
    
    109행은 다음과 같다.폭과 높이를 바꾸다.
              camera.addCallbackBuffer(new byte[ImageUtils.getYUVByteSize(s.width, s.height)]);
              textureView.setAspectRatio(s.width, s.height);
    
    이상의 변경을 통해 Vysor에서 TF Classify, TF Detect의 동작을 확인할 수 있습니다.
    세로 이미지로 표시돼 수정됐지만, 안드로이드 스마트폰(MotoG5 Plus)에서는 새로운 카메라2 API를, THETA에서는 전통적인 카메라API를 사용하기 때문에 스마트폰과 THETA에서는 동작이 다를 수 있다.
    TFT Detect 기본 오브젝트 감지OD_API(Tensorflow Object Detection API)가 사용됩니다.

    TF Stylize 수정


    이미지를 1:1 정사각형으로 설정하고 Style을 적용한 다음 2:1 정거리 원통 이미지로 수정합니다.
  • 스타일 변환을 위한 2:1->1:1 이미지 만들기
  • StylizeActivity.자바의 495행 근처 processImage()에서 프레임 ToCropTransform 변환 행렬을 만들 때 종횡비를 저장하지 않도록 설정합니다.이렇게 하면 스타일 변환에 사용할 2:1->1:1 이미지를 생성할 수 있습니다.
      @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);
    
  • 스타일 변환된 이미지를 1:1->2:1로 복원
  • StylizeActivity.자바의 520줄 근처에 있는 Runnable()에서Canvas를 사용하여 사이즈 조정을 하고stylizeImage()로 스타일 변경을 한 cropped Bitmap 이미지를 1:1에서 2:1로 변경합니다.스타일 변경 후 2:1 textureCopyBitmap 이미지를 사용할 수 있습니다.
        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();
              }
            });
    
    TF Stylize가 실행됩니다.

    TF 스피치 수정

  • SpeechActivity.Audio Manager 설정을 java에 추가합니다.
  •   @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);
    
  • MODIFY_AUDIO_SETTINGS 권한을 추가합니다.
  • AndroidManifest.xml,android.permission.MODIFY_AUDIO_SETTINGS 권한을 추가합니다(이하 26번째 줄 근처).TF Speech의 샘플링 비율은 16kHz, THETA는 44.1kHz로 기본 설정됩니다.44.1kHz에서는 TF 스피치의 필터가 제대로 작동하지 않아 16kHz로 동작했으나 이 설정에서 동작하기 위해서는 추가 권한이 필요하다.
        <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    
    이상의 변경으로 스마트폰처럼 소리를 인식할 수 있게 됐다.

    총결산


    Tensorflow의 안드로이드 샘플을 THETA에서 움직이게 하고 이미지 인식과 음성 인식을 했다.TF 클래시피는 물체의 식별기이지만 전천구 이미지에서 초광각이어서 물체를 오판하기 쉽다.TF Detect는 이미지 내 물체를 찾는 물체 탐지기다.TFStylize가 2:1 이미지 응용 스타일을 잘 적용하지 못하기 때문에 잠시 1:1 이미지 응용 스타일로 회피했습니다.TF Speech는 MODIFY입니다.AUDIO_SETTINGS 권한 등을 추가하여 작업할 수 있습니다.전천구를 향한 인식 정밀도 향상 등 방법의 여지는 아직 많다.
    키 Te n sorFlow Inference Interface 클래스는 assets에서 학습된 모델(Protocol Buffers(.pb) 형식의 파일)을 매개변수로 사용합니다.같은 설정과 읽기를 통해 다양한 학습 모델을 시도할 수 있다.

    참고 자료


    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

    좋은 웹페이지 즐겨찾기