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

  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

--

--

--

Manager of Dynamsoft Open Source Projects | Tech Lover

Love podcasts or audiobooks? Learn on the go with our new app.

Recommended from Medium

I never write nested ifs

Holding Deploys

Routing OSPF Configuration with Cisco Packet Tracer

Linux filesystem is not reflecting the change of a deleted file on disk?

The Tiny Owl Who Came to Visit the Big Apple Is ‘A Christmas Miracle’

Time Complexity O(Log(n))

How to build a Web Scraper for Linkedin using Selenium and BeautifulSoup.

Name : Akshay Mishra Institution: Dayananda Sagar College of Engineering, Bangalore.

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

More from Medium

Image classification app in Android using custom TFLite model

Object Detection with KotlinDL and Ktor

Image Classification Android Application using TensorFlow Lite

ML in Android -3 : Deploy Tflite on Android using Java