Android QR Code Detection with TensorFlow Lite

Steps to Train QR Code Detection Model with TensorFlow Lite Model Maker

  1. Install TensorFlow Lite Model Maker:
pip install tflite-model-maker
git clone https://github.com/yushulx/barcode-qrcode-images.git
cd tensorflow-lite
python partition_dataset.py -x -i ../images -r 0.1 -o ./
from tflite_model_maker.config import QuantizationConfig
from tflite_model_maker.config import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import object_detector

import tensorflow as tf
assert tf.__version__.startswith('2')

tf.get_logger().setLevel('ERROR')
from absl import logging
logging.set_verbosity(logging.ERROR)

spec = model_spec.get('efficientdet_lite0')
train_data = object_detector.DataLoader.from_pascal_voc(images_dir="train", annotations_dir="train", label_map={1: "QR_CODE"} )
validation_data = object_detector.DataLoader.from_pascal_voc(images_dir="test", annotations_dir="test", label_map={1: "QR_CODE"} )
model = object_detector.create(train_data, model_spec=spec, batch_size=8, train_whole_model=True, validation_data=validation_data)
model.export(export_dir='.')
  1. Drag the model.tflite file to assets folder.
  2. Change TF_OD_API_MODEL_FILE to model.tflite in DetectorActivity.java:
private static final String TF_OD_API_MODEL_FILE = "model.tflite";
QR_CODE

QR Code Scanner with TensorFlow Lite

Now, let’s integrate TensorFlow Lite API into our Android QR Code Scanner.

  1. Copy model.tflite and labelmap.txt to assets folder.
  2. Add the TensorFlow Lite library to build.gradle:
// Import the Task Vision Library dependency (NNAPI is included)
implementation 'org.tensorflow:tensorflow-lite-task-vision:0.3.0'
private TFLiteObjectDetectionAPIModel(Context context, String modelFilename) throws IOException {
modelBuffer = FileUtil.loadMappedFile(context, modelFilename);
optionsBuilder = ObjectDetectorOptions.builder();
optionsBuilder.setBaseOptions(BaseOptions.builder().useNnapi().build());
objectDetector = ObjectDetector.createFromBufferAndOptions(modelBuffer, optionsBuilder.build());
}
// Configuration values for the prepackaged QR Code model.
private static final int TF_OD_API_INPUT_SIZE = 416;
private static final boolean TF_OD_API_IS_QUANTIZED = true;
private static final String TF_OD_API_MODEL_FILE = "model.tflite";
private static final String TF_OD_API_LABELS_FILE = "labelmap.txt";
// Minimum detection confidence to track a detection.
private static final float MINIMUM_CONFIDENCE_TF_OD_API = 0.5f;
private Detector detector;
int cropSize = TF_OD_API_INPUT_SIZE;

private void initTFDetector() {
try {
detector =
TFLiteObjectDetectionAPIModel.create(
this,
TF_OD_API_MODEL_FILE,
TF_OD_API_LABELS_FILE,
TF_OD_API_INPUT_SIZE,
TF_OD_API_IS_QUANTIZED);
cropSize = TF_OD_API_INPUT_SIZE;
} catch (final IOException e) {
e.printStackTrace();
Toast toast =
Toast.makeText(
getApplicationContext(), "Detector could not be initialized", Toast.LENGTH_SHORT);
toast.show();
finish();
}
}
analysisUseCase.setAnalyzer(cameraExecutor,
imageProxy -> {
Bitmap bitmap = ImageUtils.getBitmap(imageProxy);
imageProxy.close();
});
final List<Detector.Recognition> tfResults = detector.recognizeImage(bitmap);
if (tfResults.size() > 0) {
for (final Detector.Recognition tfResult : tfResults) {
final RectF location = tfResult.getLocation();
if (location != null && tfResult.getConfidence() >= MINIMUM_CONFIDENCE_TF_OD_API) {
overlay.add(new BarcodeGraphic(overlay, location, null, isPortrait));
}
}
}
TextResult[] results = null;
try {
PublicRuntimeSettings settings = reader.getRuntimeSettings();
settings.barcodeFormatIds = EnumBarcodeFormat.BF_QR_CODE;
settings.expectedBarcodesCount = tfResults.size();
reader.updateRuntimeSettings(settings);
} catch (BarcodeReaderException e) {
e.printStackTrace();
}

Source Code

yushulx/android-camera2-preview-qr-code-scanner (github.com)

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Xiao Ling

Xiao Ling

Manager of Dynamsoft Open Source Projects | Tech Lover