基本的な使用方法

メモ

デバイスのカメラからのビデオストリームのリアルタイム認識の完全なサンプルについて は、「アプリの例」を参照してください。

続行する前 に、「 SDK の追加」および「アプリケーションの認証」で説明されている手順に従っていることを確認してください。

Live Sense SDK の最も基本的な用途は、静止画での車、歩行者、標識、その他の支援対象物の検出です。 各モデルで検出できる内容の詳細について は、「モデル」を参照してください。

Live Sense SDK では、次の手順に従って、複数のモデルおよび単一のモデルを実行できます。

  1. Applicationクラスを作成し 、内部でLiveSenseEngine初期化します。

     LiveSenseEngine liveSenseEngine = LiveSenseEngine.getInstance();
     //Initialize the LiveSenseEngine instance.
     liveSenseEngine.initialize(this.getApplicationContext());
    
  2. Activityクラスで、エンドユーザーに承諾を依頼します。 これは、セルフサービス以外のユーザーにのみ必要です。

     // Full Activity details omitted for brevity
     public class CameraActivity extends Activity {
         private LSModelManagerParallel modelManager;
         private ManagerListener recognitionListener;
         private LSTrackerManagerImpl trackerManager;
         @Override
         protected void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             LiveSenseEngine liveSenseEngine;
             liveSenseEngine = LiveSenseEngine.getInstance();
             //Ask User for consent.
             liveSenseEngine.requestConsent(this, new LiveSenseEngine.LSDConsentCallback() {
                 @Override
                 public void onAccept() {
                     // Save the response for future actions based on this
                     // Init Models
                     initModels();
                 }
    
                 @Override
                 public void onRefuse() {
                     // Save the response for future actions based on this
                     // Init Models
                     initModels();
                 }
             });
         }
     }
    
  3. 承諾の応答を受信したら、モデル管理者と LSModelManagerParallel トラッカー管理者を初期化 LSTrackerManagerImplします。

    LSModelManagerParallel は、必要なすべてのモデルを並行して実行します。 LSTrackerManagerImpl は、認識を追跡するために必要です。

    メモ

    • 実装する必要がある Model Manager クラスの独自の実装を記述することも LSModelManagerできます。
    • また、を実装する必要があるトラッカー管理者クラスの独自の実装を記述することもでき LSTrackerManagerます。
     public void initModels() {
    
         // Detector model
         modelManager = new LSModelManagerParallel(recognitionListener);
    
         // setting tracker manager
         trackerManager = new LSTrackerManagerImpl();
         modelManager.setTrackerManager(trackerManager);           
         // Initialize desired model class
         int roadBasicsModelId = modelManager.addModel(LiveSenseModel.ROAD_BASICS, new RoadBasicsModel.Options(), 0.6f);
         // Add Classwise Confidence for desired class.
         modelManager.addClassMinConfidence(LSClassLabel.PEDESTRIAN, 0.40f);
    
         // Add Classifier model
         RoadBasicsModel.Options rbOptions = new RoadBasicsModel.Options();
         rbOptions.setEnableTrafficLightStatus(true);
         modelManager.reloadModel(roadBasicsModelId, rbOptions);
    
         // Listener for manager events
         recognitionListener = new ManagerListener() {
             @Override
             public void onError(int modelId, Throwable throwable) {
                LOGGER.e("Error in inference with modelId: " +i+". \n"+ throwable.getMessage());
             }
    
             @Override
             public void onRecognitions(int modelId, int imageId, List<Recognition> list, long runTime) {
                 List<Recognition> recognitions = list;
                 // Process recognitions/classifications (filtering, tracking, etc.)
                 String tag = "";
                 if (modelId == roadBasicsModelId) {
                    tag = "RoadBasics";
                 }
                 for (Recognition recognition : recognitions) {
                    Log.d(tag, recognition.getTitle() + " at "
                            + recognition.getLocation() + " with confidence " + recognition.getConfidence());
                 }
    
                 // If you have initialized trackerManager, you can get list of tracked recognitions for further processing/display
                 List<TrackedRecognition> trackedRecognitions = trackerManager.getTrackedObjects();
    
             }
         };
     }
    
  4. 必要なモデルをに追加 modelManager し、 Live Sense SDK に認識するために渡されるデータを準備します。

     /**
     * Class to encapsulate recognition on images from LSDCamera2Controller.
     * Assumes ImageReader format is YUV_420_888.
     */
     public class CameraActivity extends Activity {
         private volatile boolean isModelLoaded = false;
         private int sensorOrientation;
         private int rotation;
         private LSModelManager modelManager;
         private ManagerListener recognitionListener;
         private LSTrackerManager trackerManager;
         private int roadBasicsModelId;
         private static final String TAG = "CameraActivity";
    
         @Override
         protected void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             // Layout containing LSDCamera2Preview
             setContentView(R.layout.activity_camera);
             initModels();
         }
    
         public void initModels() {
    
             // Detector model
             modelManager = new LSModelManagerParallel(recognitionListener);
    
             // setting tracker manager
             trackerManager = new LSTrackerManagerImpl();
             modelManager.setTrackerManager(trackerManager);           
             // Initialize desired model class
             roadBasicsModelId = modelManager.addModel(LiveSenseModel.ROAD_BASICS, new RoadBasicsModel.Options(), 0.6f);
             // Add Classwise Confidence for desired class.
             modelManager.addClassMinConfidence(LSClassLabel.PEDESTRIAN, 0.40f);
    
             // Add Classifier model
             RoadBasicsModel.Options rbOptions = new RoadBasicsModel.Options();
             rbOptions.setEnableTrafficLightStatus(true);
             modelManager.reloadModel(roadBasicsModelId, rbOptions);
    
             isModelLoaded = true;
         }
    
         public void close() {
             if (modelManager != null) {
                 modelManager.close();
                 modelManager = null;
             }
             if (trackerManager != null) {
                 trackerManager.close();
                 trackerManager = null;
             }
             isModelLoaded = false;
         }
    
         /**
          * @param deviceRotation Device rotation from natural orientation as multiple of 90 degrees
          */
         public void setDeviceRotation(int deviceRotation) {
             // Assumes back facing camera
             this.rotation = (this.sensorOrientation - deviceRotation + 360) % 360;
         }
    
         // Listener for manager events
         private LSModelManager.ManagerListener recognitionListener = new LSModelManager.ManagerListener() {
             @Override
             public void onError(int modelId, Throwable throwable) {
                 Log.e(TAG, "Error in inference with modelId: " + modelId +". \n"+ throwable.getMessage());
             }
    
             @Override
             public void onRecognitions(int modelId, int imageId, List<Recognition> list, long runTime) {
                 List<Recognition> recognitions = list;
                 // Process recognitions/classifications (filtering, tracking, etc.)
                 String tag = "";
                 if (modelId == roadBasicsModelId) {
                     tag = "RoadBasics";
                 }
                 for (Recognition recognition : recognitions) {
                     Log.d(tag, recognition.getTitle() + " at "
                             + recognition.getLocation() + " with confidence " + recognition.getConfidence());
                 }
    
                 // If you have initialized trackerManager, you can get list of tracked recognitions for further processing/display
                 List<TrackedRecognition> trackedRecognitions = trackerManager.getTrackedObjects();
    
             }
         };
    
         private final LSDCamera2ImageListener imageAvailableCallback = (Image image) -> {
             if (image == null || !isModelLoaded) {
                 Log.w(TAG, "Manager not initialized.");
                 return;
             }
             if (image.getFormat() != ImageFormat.YUV_420_888) {
                 Log.w(TAG, "Unsupported image format.");
                 image.close();
                 return;
             }
             // Run recognition.
             modelManager.offerImage(image, rotation);
         };
     }
    
  5. アプリケーションをビルドするには、カメラまたはその他のリアルタイムイメージストリームデバイスを使用します。 静的リソースの使用は避けてください。

    LSDCamera2Controller カメラ 2 API 経由でのデバイスのカメラの設定およびオープンをカプセル化します。LSDCamera2Preview また、カメラのプレビューを表示することもできます。

    メモ

    アプリケーションは、を使用する前 LSDCamera2Controllerにカメラランタイム権限が付与されていることを確認する責任があります。

    5.1. LSDCamera2Controller およびの基本設定 LSDCamera2Preview:

     class CameraActivity : AppCompatActivity() {
    
         private lateinit var cameraController: LSDCamera2Controller
    
         private val imageListener = object : LSDCamera2ImageListener {
             override fun onImageAvailable(image: Image?) {
                 // TODO: Use image, auto-closed by controller
             }
         }
    
         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate(savedInstanceState)
             // Layout containing LSDCamera2Preview
             setContentView(R.layout.activity_camera)
    
             // TODO: Ensure permissions have been granted!
    
             // Initialize the camera controller
             cameraController = LSDCamera2Controller(applicationContext)
             cameraController.initialize(LSDCamera2Config().apply {
                 this.targetStreamResolution = Size(1280, 960)
             })
             cameraController.setImageListener(WeakReference(imageListener))
    
             // Initialize preview
             val preview = findViewById<LSDCamera2Preview>(R.id.camera_preview)
             preview.initialize(cameraController)
         }
    
         override fun onResume() {
             super.onResume()
             // Open camera to begin receiving frames
             if (checkSelfPermission(Manifest.permission.CAMERA) == PERMISSION_GRANTED) {
                 cameraController.start()
             }
         }
    
         override fun onPause() {
             super.onPause()
             // Release camera on pause
             cameraController.stop()
         }
     }
    

    5.2. レイアウト CameraActivity:

     <?xml version="1.0" encoding="utf-8"?>
     <FrameLayout 
         xmlns:android="http://schemas.android.com/apk/res/android"
         android:layout_width="match_parent"
         android:layout_height="match_parent">
    
         <com.here.see.livesense.ar_lib.camera2.LSDCamera2Preview
             android:id="@+id/camera_preview"
             android:layout_width="match_parent"
             android:layout_height="match_parent" />
     </FrameLayout>
    
  6. 生データをビットマップに変換するヘルパーメソッド。

     // Create a Bitmap from ARGB pixel values.
     ImageUtils.argb8888ToBitmap(int[] argb, int width, int height);
    
     // [Optimized/Recommended] Populate a pre-allocated Bitmap from ARGB pixel values.
     ImageUtils.argb8888ToBitmap(int[] argb, int width, int height, Bitmap output);
    
     // Create a Bitmap from an ARGB byte[]   
     ImageUtils.argb8888ToBitmap(byte[] argb, int width, int height);
    
     // [Optimized/Recommended] Populate a pre-allocated Bitmap from an ARGB byte[].
     ImageUtils.argb8888ToBitmap(byte[] argb, Bitmap output);
    
     // Converts YUV420 semi-planar data to ARGB 8888 data using the supplied width and height
     ImageUtils.convertYUV420ToARGB8888(
             byte[] yData,
             byte[] uData,
             byte[] vData,
             int width,
             int height,
             int yRowStride,
             int uvRowStride,
             int uvPixelStride,
             int[] out)
    
     // Converts YUV420 semi-planar data to ARGB 8888 data using the supplied width and height.
     ImageUtils.convertYUV420SPToARGB8888(
             byte[] input,
             int width,
             int height,
             int[] output)
    
  7. 静的イメージを使用して、検出コールをテストします。

     public void runDetection() {
         // Retrieve RGB bitmap for image in app resources (or from some stream)
         BitmapFactory.Options options = new BitmapFactory.Options();
         options.inScaled = false;
         Bitmap image = BitmapFactory.decodeResource(this.getResources(), R.drawable.test_image, options);
         // Run recognition on nonrotated image
         modelManager.offerImage(image, 0);
    
         // Return current list of tracked recognitions for further processing/displaying
         List<TrackedRecognition> trackedRecognitions = trackerManager.getTrackedObjects();
         // Process/display recognitions inside `recognitionListener` callback
     }
    
  8. アプリケーションアクティビティのライフサイクルから、次の SDK ライフサイクルメソッドを呼び出すことをお勧めします。

    • LiveSenseEngine.getInstance().onResume()
    • LiveSenseEngine.getInstance().onPause()

      デバイスのメモリとバッテリーの使用量を節約する SDK リソースの管理に役立ちます。

      @Override
      protected void onPause() {
        super.onPause();
        LiveSenseEngine.getInstance().onPause();
      }
      
      @Override
      protected void onResume() {
        super.onResume();
        LiveSenseEngine.getInstance().onResume();
      }
      
  9. アプリケーション終了時にリソースを解放します。

     @Override
     protected void onDestroy() {
         super.onDestroy();
         // Release model resources when done
         modelManager.close();
         modelManager = null;
     }
    

アプリケーションでの SDK の使用に関する推奨事項については 、「推奨事項」を参照してください

Live Sense コアを基盤とするその他の機能については 、「ユーティリティライブラリ」を参照してください

」に一致する結果は 件です

    」に一致する結果はありません