QR Code Scanner with TensorFlow Lite

QR Code Scanner with TensorFlow Lite と言うのがあったので、試してみる。

正確には、Android 版だが、
Android QR Code Detection with TensorFlow Lite

modelの作成は、下記、model_maker を参考にしているみたい。
Object Detection with TensorFlow Lite Model Maker

最終的には、Raspi 3b+ で試してみようと思います。
注) Raspi 3b+ に、Coral USB TPU を使っても効果は無いみたい。もっとパワーが必要じゃ。

Raspi TensorFlow Lite Object detection は、
examples/lite/examples/object_detection /raspberry_pi
を参考にします。

1. 開発環境
開発は、PC 上で行います。
PC Ubuntu Mate 22.04
Intel Core i-5 4570 3.2GHz x 4 with 12G Memory
Python 3.9
tflite-model-maker 0.4.2

1.1 Python3.9 を別途インストールします。
Python の Dual インストールは、下記を参照しました。

Install Python 3.9 or 3.8 on Ubuntu 22.04 LTS Jammy JellyFish

1.2 virtualenv で、python3.9 用を作成します。

$ python3 -m virtualenv -p python3.9 kivy_env3.9
$ source ~/kivy_env3.9/bin/activate

1.3 tflite-model-maker 0.4.2 と関連パッケージにインストール

(kivy_env3.9)$ python -m pip install tflite-model-maker==0.4.2
(kivy_env3.9)$ python -m pip install numpy==1.23.4
(kivy_env3.9)$ python -m pip install pycocotool
(kivy_env3.9)$ python -m pip install Pillow==9.5.0
(kivy_env3.9)$ python -m pip install opencv-python

2. model の作成

後は、Android QR Code Detection with TensorFlow Lite に従ってモデルを作成します。
2.1 git download

(kivy_env3.9)$ git clone https://github.com/yushulx/barcode-qrcode-images.git
(kivy_env3.9)$ cd barcode-qrcode-images/tensorflow-lite
(kivy_env3.9)$ python partition_dataset.py -x -i ../images -r 0.1 -o ./

2.2 train.py を実行して、モデルを作成する。

(kivy_env3.9)$ python train.py

2.3 test.py でチェック。
(kivy_env3.9)$ python test.py

3. test.py を流用して、PC 上で、カメラから取り込んで実行できるようにする。

4. 上の 3. の前に、Android 版を試した方がよいかも。
TensorFlow Lite Object Detection Andorid Demo

Android Studio で、できる様です。
上記ページの "Build the Demo using Android Studio" を参考に、Android Studio で作ってみます。

4.1 先ず、オリジナルの Andorid 版 Object Detection を動かしてみます。
$ git clone https://github.com/tensorflow/examples.git

後は、
Building
 1) Open Android Studio. From the Welcome screen, select Open an existing Android Studio project.
 2) From the Open File or Project window that appears, navigate to and select the tensorflow-lite/examples/object_detection/android directory. Click OK.
 3) If it asks you to do a Gradle Sync, click OK.
 4) With your Android device connected to your computer and developer mode enabled, click on the green Run arrow in Android Studio.

の手順ですが、おんちゃんは、
1) examples/lite/examples/object_detection フォルダーを、~/AndroidStudioProjects へコピー
2) Andoroid Studio のウエルカムページで、 Open する。
~/AndroidStudioProjects/object_detection/android <-- これを、オープンする。
後は、Gradle Synck -> OK
そうすると、エラーが出た。

i) error 1
Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.

下記対応をする。
File > Project Structure
 Project
  Android Gradle Plugin Version: 7.1.2 -> 8.0.2
  Android Gradle Version:8.4 -> 8.0


ii) error 2
Namespace not specified. Please specify a namespace in the module's build.gradle file like so:

android {
namespace 'com.example.namespace'
}

下記、対応をする。
android/app/src/build.grade
へ、上記を追記。
android{
   .....
   namespace 'org.tensorflow.lite.examples.objectdetection'
}

iii) error 3
The Android Gradle plugin supports only Navigation Safe Args Gradle plugin version 2.5.0 and higher.
The following dependencies do not satisfy the required version:
root project 'android' -> androidx.navigation:navigation-safe-args-gradle-plugin:2.4.1

下記対応をする。
Gradle Scripts/build.gradle(Project:android)
....
   dependencies {
     ....
     classpath 'androidx.navigation:navigation-safe-args-gradle-plugin:2.4.1' -> 2.5.0


iv) error 5
Duplicate class androidx.lifecycle.ViewModelLazy found in modules jetified-lifecycle-viewmodel-ktx-2.2.0-runtime (androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0) and lifecycle-viewmodel-2.4.0-runtime (androidx.lifecycle:lifecycle-viewmodel:2.4.0)
Duplicate class androidx.lifecycle.ViewModelProviderKt found in modules jetified-lifecycle-viewmodel-ktx-2.2.0-runtime (androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0) and lifecycle-viewmodel-2.4.0-runtime (androidx.lifecycle:lifecycle-viewmodel:2.4.0)

下記ページに回答があった。
【Android】[エラー]Duplicate class androidx.lifecycle.ViewModelLazy found in mod....
はじめてのAndroidプログラミング③

Gradle Scripts/build.gradle(Module:app)
dependencies {
   ...
   implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1' -> 2.5.1

これで、build OK となった。後は、Android スマホで試してみる。
OK でした。
by nishi 2023.11.11

残念ながら、Kotlin でした。

仕方がないので、
Android QR Code Detection with TensorFlow Lite を読み解いてみる。
1) QR code の場所の特定 -- Object Detection
2) QR code の部分画像(Bitmap)を、Dynamsoft Barcode Reader API に渡して、QR コードを解析する。
残念ながら、Dynamsoft Barcode Reader API は、有料みたい。
ここを、他のフリーの ライブラリーを使えば、OK みたいぞね。

Quirc は、使えるのだろうか?
python-quirc もあるみたい。

ちなみに、最近の、TensorFlow Lite Python object detection example with Raspberry Pi は、随分性能が良いみたいぞね。
これなら、十分実用に耐えうるかも。

5. QR Code Scanner の製作
後は、test.py をベースに、camera 入力と、python-quirc を使った、QR code の解析を組込んで、
QR Code Scanner を作ってみるだけじゃ。
python-quirc は、
python3.9 では、今は無理みたいじゃ!!。
It works under the CPython 2.5, 2.6, 2.7 and PyPy. Python 3k support is planned.

ならば、deqr は、どうか?
ドキュメントが、deqr 0.2.2 ある。

(kivy_env3.9) $ python -m pip install deqr
(kivy_env3.9) $ python
>>> import deqr
>>> decoder = deqr.QRdecDecoder()
OK でした

5.1 改造の要点。
1) オリジナルの、test.pyに、OpenCV のカメラキャプションと、deqr を使った、QR-code の解析を組み込みます。
2) tensorflow に替えて、tflite_runtime の方を使います。
Raspberry pi 3b+ に、tensorflow は不要です。

3) deqr の使い方は、
opencv-qrdec.py が参考になりました。

5.2 一応できました。
最初に、静止画版の
test_cv.py
を作って、その後、動画版を作りました。
qr_cam.py

あまり近い(QR code が大きい)と、deqr.QRdecDecoder() が解析できないみたい。
ある程度、距離があると、うまく解析できました。
640 x 480 のカメラ画像サイズで、
img_qr.shape (270, 260, 3) 位から、小さいサイズが良いみたいぞね。
距離がマッチすると、ごんごん認識します。

Object Detection 自体は、距離に関係なく認識できます。が、qr code の解析は、適正の距離が必要です。

後日、github にでも、公開します。 by nishi 2023.11.21
Ubuntu Mate 22.04 PC で、6.7 fps 位です。

raspberry pi 3b+ だと、2 fps くらいかな?
まだ、raspi 3b+ では、試していないが。
実測 1.6 fps でした。
USB2.0 では、Coral Edge TPU は、効果はでないか?

5.3 Coral Edge TPU 対応にしてみました。
1) Edge TPU Compiler を使って、model.ttlite を model_edgetpu.tflite に変換します。
Edge TPU Compiler に、インストールの説明があります。

$ edgetpu_compiler model.tflite -o ./tpu

tpu/model_edgetpu.tflite が作成される。
注) ./tpu ディレクトリーは、予め作成しておきます。

2) test_cv.py をベースに、test_cv_tpu.py に、tpu 処理を組み込みます。

ここで、tflite 版と、tpu版の違いが出てきました。
tflite モデルでは、signature が組み込まれていて、

実行結果の出力を簡単に取りだせたのだが、TPU 版にすると、signature が無くなってしまいました。
ここは、実行結果の出力の取り出し方を変更しないと、いけない。

そこで、examples/detect_image.py を見ていたら、
objs = detect.get_objects(interpreter, args.threshold, scale) のコール先の中に、
参考になるコードがありました。

pycoral/adapters/detect.py の get_objects() にあります。

上記コードに変えたら、うまく動きました。


その後、qr_cam.py をベースに、TPU版対応にしました。
やれやれ、ぞね!!

(kivy_env3.9) $ python qr_cam_tup.py

Ubuntu Mate 22.04 PC で、
28 - 29 fps 位になりました。
かなり、効果がありました。

raspi 3b+ では、多分、効果は無いと思うので、試していません。 by nishi 2023.11.22
USB 3.0 対応でないと、速度は上がらないと思う。
raspi 4 か、raspi 5 あたりでないと無理か?
orange pi5 + armbian(Ubuntu Jammy) 、 Jetson Nano 2G + armbian(Ubuntu Jammy) 辺りか。

だが、試しに、raspi 3b+ で試してみました。
tpu 無しで、
1.7 - 1.8 fps
tpu 有りで、
5.1 - 5.4 fps でした。少しは効果があるのかも。by nishi 2023.11.24

以上で、終わりぞね!!
by nishi 2023.11.23

5.4 Jetson Nano 2G で、試してみました。
Jetson Nano 2G に Armbian Jammy(ubuntu 22.04) XFCE Desktop 版をインストールして、同じく、Coral Edge TPU で、試してみました。
USB カメラ使用時。
non TPU : 3.6 FPS
TPU: 15.5 - 16.0 FPS
でした。 by nishi 2023.11.27

6. 補足
1) github に公開しました。
tosa-no-onchan/barcode-qrcode-images-non

2) jetson Nano 2G が、Armbian で動くみたい。

3) PC では、Loigcool の USB Camera C270 を使って、テストをしましたが、どうもピントがあっていないようです。
ピントを、QR Code に合わせるとかなり改善します。
Logicool WEBカメラ C270のピントを調節する方法
上を参考に、ピント調整したら、かなり良くなりました。
試してみるべきぞね!!

この後で、C++ で同じプログラムを作ってみました。
この場合は、quirc を使う事になりましたが、同じく C270のピントを、手で調整したら、QR Code の Decode が結構よくなりました。
カメラのピントが合えば、C++ tensorflow lite OR Code(object) detection with quirc の方も、よく、QR Code を拾うようです。

QRコード作成サイト/無料版 で、QR Code を作成して、チェックしましたが、結構良いぞね!!。
deqr の方が幾分、性能がよいかも。
スマフォで、性能が良いのは、カメラのピント、明るさが自動で調整されるからかも知れない。

このブログ記事について

このページは、おんちゃんが2023年11月 5日 18:06に書いたブログ記事です。

ひとつ前のブログ記事は「高知県土佐市の防災、緊急放送の迷惑さ。」です。

次のブログ記事は「Jetson Nano 2G Armbian 22.04(Jammy) Cuda Installing.」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

カテゴリ

ウェブページ

サイトナビ