-
Application
クラスを作成し 、内部でLiveSenseEngine
初期化します。
LiveSenseEngine liveSenseEngine = LiveSenseEngine.getInstance();
liveSenseEngine.initialize(this.getApplicationContext());
-
Activity
クラスで、エンドユーザーに承諾を依頼します。 これは、セルフサービス以外のユーザーにのみ必要です。
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();
liveSenseEngine.requestConsent(this, new LiveSenseEngine.LSDConsentCallback() {
@Override
public void onAccept() {
initModels();
}
@Override
public void onRefuse() {
initModels();
}
});
}
}
-
承諾の応答を受信したら、モデル管理者と LSModelManagerParallel
トラッカー管理者を初期化 LSTrackerManagerImpl
します。
LSModelManagerParallel
は、必要なすべてのモデルを並行して実行します。 LSTrackerManagerImpl
は、認識を追跡するために必要です。
メモ
- 実装する必要がある Model Manager クラスの独自の実装を記述することも
LSModelManager
できます。 - また、を実装する必要があるトラッカー管理者クラスの独自の実装を記述することもでき
LSTrackerManager
ます。
public void initModels() {
modelManager = new LSModelManagerParallel(recognitionListener);
trackerManager = new LSTrackerManagerImpl();
modelManager.setTrackerManager(trackerManager);
int roadBasicsModelId = modelManager.addModel(LiveSenseModel.ROAD_BASICS, new RoadBasicsModel.Options(), 0.6f);
modelManager.addClassMinConfidence(LSClassLabel.PEDESTRIAN, 0.40f);
RoadBasicsModel.Options rbOptions = new RoadBasicsModel.Options();
rbOptions.setEnableTrafficLightStatus(true);
modelManager.reloadModel(roadBasicsModelId, rbOptions);
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;
String tag = "";
if (modelId == roadBasicsModelId) {
tag = "RoadBasics";
}
for (Recognition recognition : recognitions) {
Log.d(tag, recognition.getTitle() + " at "
+ recognition.getLocation() + " with confidence " + recognition.getConfidence());
}
List<TrackedRecognition> trackedRecognitions = trackerManager.getTrackedObjects();
}
};
}
-
必要なモデルをに追加 modelManager
し、 Live Sense SDK に認識するために渡されるデータを準備します。
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);
setContentView(R.layout.activity_camera);
initModels();
}
public void initModels() {
modelManager = new LSModelManagerParallel(recognitionListener);
trackerManager = new LSTrackerManagerImpl();
modelManager.setTrackerManager(trackerManager);
roadBasicsModelId = modelManager.addModel(LiveSenseModel.ROAD_BASICS, new RoadBasicsModel.Options(), 0.6f);
modelManager.addClassMinConfidence(LSClassLabel.PEDESTRIAN, 0.40f);
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;
}
public void setDeviceRotation(int deviceRotation) {
this.rotation = (this.sensorOrientation - deviceRotation + 360) % 360;
}
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;
String tag = "";
if (modelId == roadBasicsModelId) {
tag = "RoadBasics";
}
for (Recognition recognition : recognitions) {
Log.d(tag, recognition.getTitle() + " at "
+ recognition.getLocation() + " with confidence " + recognition.getConfidence());
}
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;
}
modelManager.offerImage(image, rotation);
};
}
-
アプリケーションをビルドするには、カメラまたはその他のリアルタイムイメージストリームデバイスを使用します。 静的リソースの使用は避けてください。
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?) {
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_camera)
cameraController = LSDCamera2Controller(applicationContext)
cameraController.initialize(LSDCamera2Config().apply {
this.targetStreamResolution = Size(1280, 960)
})
cameraController.setImageListener(WeakReference(imageListener))
val preview = findViewById<LSDCamera2Preview>(R.id.camera_preview)
preview.initialize(cameraController)
}
override fun onResume() {
super.onResume()
if (checkSelfPermission(Manifest.permission.CAMERA) == PERMISSION_GRANTED) {
cameraController.start()
}
}
override fun onPause() {
super.onPause()
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>
-
生データをビットマップに変換するヘルパーメソッド。
ImageUtils.argb8888ToBitmap(int[] argb, int width, int height);
ImageUtils.argb8888ToBitmap(int[] argb, int width, int height, Bitmap output);
ImageUtils.argb8888ToBitmap(byte[] argb, int width, int height);
ImageUtils.argb8888ToBitmap(byte[] argb, Bitmap output);
ImageUtils.convertYUV420ToARGB8888(
byte[] yData,
byte[] uData,
byte[] vData,
int width,
int height,
int yRowStride,
int uvRowStride,
int uvPixelStride,
int[] out)
ImageUtils.convertYUV420SPToARGB8888(
byte[] input,
int width,
int height,
int[] output)
-
静的イメージを使用して、検出コールをテストします。
public void runDetection() {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;
Bitmap image = BitmapFactory.decodeResource(this.getResources(), R.drawable.test_image, options);
modelManager.offerImage(image, 0);
List<TrackedRecognition> trackedRecognitions = trackerManager.getTrackedObjects();
}
-
アプリケーションアクティビティのライフサイクルから、次の 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();
}
-
アプリケーション終了時にリソースを解放します。
@Override
protected void onDestroy() {
super.onDestroy();
modelManager.close();
modelManager = null;
}