diff options
Diffstat (limited to 'tensorflow/examples/android/src/org/tensorflow/demo/ClassifierActivity.java')
-rw-r--r-- | tensorflow/examples/android/src/org/tensorflow/demo/ClassifierActivity.java | 100 |
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 |