aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/examples/android/src/org/tensorflow/demo/ClassifierActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'tensorflow/examples/android/src/org/tensorflow/demo/ClassifierActivity.java')
-rw-r--r--tensorflow/examples/android/src/org/tensorflow/demo/ClassifierActivity.java100
1 files changed, 20 insertions, 80 deletions
diff --git a/tensorflow/examples/android/src/org/tensorflow/demo/ClassifierActivity.java b/tensorflow/examples/android/src/org/tensorflow/demo/ClassifierActivity.java
index bc39126925..ab48e2265b 100644
--- a/tensorflow/examples/android/src/org/tensorflow/demo/ClassifierActivity.java
+++ b/tensorflow/examples/android/src/org/tensorflow/demo/ClassifierActivity.java
@@ -22,21 +22,21 @@ import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Typeface;
-import android.media.Image;
-import android.media.Image.Plane;
-import android.media.ImageReader;
+
import android.media.ImageReader.OnImageAvailableListener;
import android.os.SystemClock;
-import android.os.Trace;
import android.util.Size;
import android.util.TypedValue;
import android.view.Display;
+
import java.util.List;
import java.util.Vector;
import org.tensorflow.demo.OverlayView.DrawCallback;
import org.tensorflow.demo.env.BorderedText;
import org.tensorflow.demo.env.ImageUtils;
import org.tensorflow.demo.env.Logger;
+
+// Explicit import needed for internal Google builds.
import org.tensorflow.demo.R;
public class ClassifierActivity extends CameraActivity implements OnImageAvailableListener {
@@ -64,39 +64,25 @@ public class ClassifierActivity extends CameraActivity implements OnImageAvailab
private static final String INPUT_NAME = "input";
private static final String OUTPUT_NAME = "output";
+
private static final String MODEL_FILE = "file:///android_asset/tensorflow_inception_graph.pb";
private static final String LABEL_FILE =
"file:///android_asset/imagenet_comp_graph_label_strings.txt";
- private static final boolean SAVE_PREVIEW_BITMAP = false;
private static final boolean MAINTAIN_ASPECT = true;
private static final Size DESIRED_PREVIEW_SIZE = new Size(640, 480);
- private Classifier classifier;
private Integer sensorOrientation;
-
- private int previewWidth = 0;
- private int previewHeight = 0;
- private byte[][] yuvBytes;
- private int[] rgbBytes = null;
- private Bitmap rgbFrameBitmap = null;
- private Bitmap croppedBitmap = null;
-
- private Bitmap cropCopyBitmap;
-
- private boolean computing = false;
-
+ private Classifier classifier;
private Matrix frameToCropTransform;
private Matrix cropToFrameTransform;
- private ResultsView resultsView;
private BorderedText borderedText;
- private long lastProcessingTimeMs;
@Override
protected int getLayoutId() {
@@ -112,9 +98,8 @@ public class ClassifierActivity extends CameraActivity implements OnImageAvailab
@Override
public void onPreviewSizeChosen(final Size size, final int rotation) {
- final float textSizePx =
- TypedValue.applyDimension(
- TypedValue.COMPLEX_UNIT_DIP, TEXT_SIZE_DIP, getResources().getDisplayMetrics());
+ final float textSizePx = TypedValue.applyDimension(
+ TypedValue.COMPLEX_UNIT_DIP, TEXT_SIZE_DIP, getResources().getDisplayMetrics());
borderedText = new BorderedText(textSizePx);
borderedText.setTypeface(Typeface.MONOSPACE);
@@ -129,7 +114,6 @@ public class ClassifierActivity extends CameraActivity implements OnImageAvailab
INPUT_NAME,
OUTPUT_NAME);
- resultsView = (ResultsView) findViewById(R.id.results);
previewWidth = size.getWidth();
previewHeight = size.getHeight();
@@ -141,15 +125,13 @@ public class ClassifierActivity extends CameraActivity implements OnImageAvailab
sensorOrientation = rotation + screenOrientation;
LOGGER.i("Initializing at size %dx%d", previewWidth, previewHeight);
- rgbBytes = new int[previewWidth * previewHeight];
rgbFrameBitmap = Bitmap.createBitmap(previewWidth, previewHeight, Config.ARGB_8888);
croppedBitmap = Bitmap.createBitmap(INPUT_SIZE, INPUT_SIZE, Config.ARGB_8888);
- frameToCropTransform =
- ImageUtils.getTransformationMatrix(
- previewWidth, previewHeight,
- INPUT_SIZE, INPUT_SIZE,
- sensorOrientation, MAINTAIN_ASPECT);
+ frameToCropTransform = ImageUtils.getTransformationMatrix(
+ previewWidth, previewHeight,
+ INPUT_SIZE, INPUT_SIZE,
+ sensorOrientation, MAINTAIN_ASPECT);
cropToFrameTransform = new Matrix();
frameToCropTransform.invert(cropToFrameTransform);
@@ -165,52 +147,7 @@ public class ClassifierActivity extends CameraActivity implements OnImageAvailab
});
}
- @Override
- public void onImageAvailable(final ImageReader reader) {
- Image image = null;
-
- try {
- image = reader.acquireLatestImage();
-
- if (image == null) {
- return;
- }
-
- if (computing) {
- image.close();
- return;
- }
- computing = true;
-
- Trace.beginSection("imageAvailable");
-
- final Plane[] planes = image.getPlanes();
- fillBytes(planes, yuvBytes);
-
- final int yRowStride = planes[0].getRowStride();
- final int uvRowStride = planes[1].getRowStride();
- final int uvPixelStride = planes[1].getPixelStride();
- ImageUtils.convertYUV420ToARGB8888(
- yuvBytes[0],
- yuvBytes[1],
- yuvBytes[2],
- previewWidth,
- previewHeight,
- yRowStride,
- uvRowStride,
- uvPixelStride,
- rgbBytes);
-
- image.close();
- } catch (final Exception e) {
- if (image != null) {
- image.close();
- }
- LOGGER.e(e, "Exception!");
- Trace.endSection();
- return;
- }
-
+ protected void processImageRGBbytes(int[] rgbBytes ) {
rgbFrameBitmap.setPixels(rgbBytes, 0, previewWidth, 0, 0, previewWidth, previewHeight);
final Canvas canvas = new Canvas(croppedBitmap);
canvas.drawBitmap(rgbFrameBitmap, frameToCropTransform, null);
@@ -219,7 +156,6 @@ public class ClassifierActivity extends CameraActivity implements OnImageAvailab
if (SAVE_PREVIEW_BITMAP) {
ImageUtils.saveBitmap(croppedBitmap);
}
-
runInBackground(
new Runnable() {
@Override
@@ -227,15 +163,19 @@ public class ClassifierActivity extends CameraActivity implements OnImageAvailab
final long startTime = SystemClock.uptimeMillis();
final List<Classifier.Recognition> results = classifier.recognizeImage(croppedBitmap);
lastProcessingTimeMs = SystemClock.uptimeMillis() - startTime;
-
+ LOGGER.i("Detect: %s", results);
cropCopyBitmap = Bitmap.createBitmap(croppedBitmap);
+ if (resultsView==null) {
+ resultsView = (ResultsView) findViewById(R.id.results);
+ }
resultsView.setResults(results);
requestRender();
computing = false;
+ if (postInferenceCallback != null) {
+ postInferenceCallback.run();
+ }
}
});
-
- Trace.endSection();
}
@Override