A simple demo app using ThunkableX Cloud Variables

Out of the few existing App Inventors, ThunkableX has its own distinctive features. Apart from being able to create a common source program (block) for Android and iOS, I have focused on the newly introduced Cloud Variables. They extend the scope of traditional variables to cloud space based on the real-time database Firebase. Normally, Firebase is created with a user-specific id, but if you know its url, you can access its cloud variables. If someone authorized updates the value of the variable, the event would be immediately received by other apps. This enables efficient development of database applications and the like.

An example of initializing cloud variables is shown in Fig. 1. You will see that Firebase tags can be mapped to cloud variables. Hierarchical tags can also be cloud variables, for example, “fireLoc/lat”.

After initializing these cloud variables, they can be referenced in several ways. Fig.2 shows five access blocks for the cloud variable Betty. In particular, I would like to focus on the block called “when cloud Betty initialize or changes”Using this block makes it possible to know the update of the cloud variable in real time, and to easily configure the application logic based thereon.

Gram app[2] is a well-known example of using  cloud variables. This is a very nice app, but for general programmers it is somewhat complicated. So, I created a simpler demo app. Fig.3 illustrates that. Jack would like to know the current location of his daughter Betty in real time. However, Betty allows the location information to be transmitted only when she presses the button of her smartphone.

The complete block diagram of ThunkableX that realizes this is shown in Fig.4. Fig. 4 (a) is for the sender Betty, and Fig. 4 (b) is for the receiver Jack. This figure shows that using cloud variables makes programming very easy. In fact, you can access the contents of the database without using any Firebase blocks (registering listeners, storing values ​​in the database, etc.) at all. In the Fig.4(a), location information is obtained by GetCurrentLocation, and is stored in the cloud variable Betty. Also, in Fig.4(b), since the update of the cloud variable Betty is automatically detected, the result would be reflected immediately on the map.

[1] thunkable cloud variables, https://docs.thunkable.com/variables
[2] the Gram app, https://x.thunkable.com/projectPage/5bbff7e035aa10fd7702f479


Firebase GPS demo made with ThunkableX (common to Android & iOS)

ThunkableX [1] is a kind of software system of App Inventor, which makes it possible to create a common source program for Android and iOS. Some of its functions have not yet been realized, but it is a wonderful system that continues to progress. Here, we created a simple GPS demo program using ThunkbleX.

Suppose Jack and Betty want to show each other the current location on the smartphone in real time. In fact, the MIT App Inventor program that realizes it is shown in the literature [2]. It uses the real-time database Firebase, but it is assumed that both have Android devices. By contrast, this article assumes Jack has an Android device and Betty has an iPhone.

I created a ThunkableX app like Fig.1 below. The source list (block configuration) of the app used here is common to Jack and Betty. Through Firebase, the current positions of each other are displayed in real time. When you press the send button, your location information will be stored in Firebase. Fig.2 shows the contents of Firebase. If there is a change in the Firebase, the opponent's smartphone immediately updates the map display by seeing the change event in real time.

The whole block of ThunkableX which realizes this is shown in Fig.3. In the case of reference [2], registration of the listener for change event as shown in Fig. 3 (1) was unnecessary. On the other hand, the reason ThunkableX needs it is probably because of the commonality with iOS. When you use Firebase, you do not need to make any settings if it is a temporary test program. However, if you use it in a full-fledged app, you will need to set up your own Firebse Database URL and API Key. Otherwise, security issues may occur.

[1] https://thunkable.com/#/
[2] USING FIREBASE IN A REAL APP – “HERE I AM!” GPS DEMO APP (https://appinventor.pevest.com/2016/09/13/using-firebase-in-a-real-app-here-i-am-gps-demo-app/)


Using MIT App Inventor AWS AI Services Extension

Modern AI image recognition allows us to recognize not only objects, but also the accompanying text (strings). Here we will try it using Amazon AWS Rekognition. Using the APIs provided there, we can create a variety of applications on our PC, but for more convenient use, the applications on our smartphone will be preferable.

Recently, I focused on the AWS AI Services Extension developed by Ceyhun Özgün. This is an Extension that allows MIT App Inventor applications to easily take advantage of such recognition features. References [1] and [2] provide descriptions and demo programs. I've created a simple smartphone application like Fig.1 below, using this useful information as a reference.

(Please click to enlarge)

Let me illustrate the recognition results in this diagram. Fig.1 (a) is an image of the US $2 bill. Immediately, “Money, Person, Dollar” was recognized. In addition, the text in the image was also recognized. In particular, the number “J045... 5A”, which is the id of the banknote, is also recognized precisely. Fig.1 (b), on the other hand, is an image of a notebook and books. It is recognized as “Book”, and the text of the titles of the books (although handwriting is also included) is almost accurate. I think it's great. These smartphone apps are fun to use wherever you take them!

The design part of this app is shown in Fig.2. Here, I used AppyBuilder. You can choose to take a picture now or use an image that you already have in your library. After that, recognition is performed automatically and the results of recognition of objects and text are displayed.

Next Fig.3 is the complete blocks of this app. Thanks to the Extension mentioned above, you will find that it has become a very concise program. In order to use this Extension, you need to set up an AWS account. In particular, be aware that you will give your AWS Services credentials on the first run. Details of this are also described in the literature [1]. Thanks to Ceyhun Özgün!

[1] https://hackernoon.com/your-kid-can-code-a-fruit-detector-with-this-mit-app-inventor-aws-ai-services-extension-231665c8bcdc
[2] https://github.com/ceyhunozgun/awsAIServicesAppInventorExtension/wiki




 では、現在のAIによる画像認識技術で、記番号抽出は可能なのでしょうか。それを少しだけですが、確かめてみました。調査対象も少なく、説得力に欠けますが、実験結果として以下に記しておきます。ここでは、AIによる画像認識技術で最強の部類に入ると思われる、IBM Watson Visual RecognitionAmazon AWS Rekognition(イメージ内テキスト)を使いました。特に自分でプログラミングしなくても、この程度のことであれば、簡単に使えるのは有り難いです。生徒の理科の実験やレポート作成にも使えるくらいです。

 まず、このWatson Visual Recognitionは、文字認識のための専用OCRソフトではありません。画像に何が写っているか分からないなかで、人の顔や動物、植物、日用品等々を認識するものであり、その一部として、文字列(テキスト)らしきものがあればそれも識別する、というものです。これに対して、Amazon AWS Rekognitionには、「イメージ内テキスト」検出というという専用オプションがあります。両者のコンセプトには違いがあるようです。ですから、一概にどちらが優れているなどという判断はしない方が良いでしょう。これを踏まえたうえで、以下の実験結果を示します。

 最初に、Watson Visual Recognitionを使います。対象画像の中に、辞書に載っている単語など、意味のある綴りがあれば、それは認識しやすいようです。実際、図1はそのことを示しています。この画像は過去のJava Oneというコンファレンスの際にもらった布製のバックパックです。それに、刺繍で幾つかの文字が縫われています。歪んだりしているのに、「java」や「diamond」「fuji」などが、見事に抽出されています。素晴らしい!

 次に、本題の紙幣の記番号の抽出を試行しますが、事前検討の結果から、こんどはAmazon AWS Rekognitionを使うことにしました。図2は米5ドル紙幣、図3は壱万円札、図4は10ユーロ紙幣です。結論から言いますと、いずれの記番号も完璧に認識(抽出)しているではありませんか!紙幣の場合は、記番号の背景に、微細で複雑な模様があるので、自動車のナンバープレートの識別などよりも難しいのではないかと思いましたが、難なく認識してしまいました。


 なお、紙幣の記番読取りは、すでに実用化されているという情報をいただきましたので、主な参考資料を追記しておきます。Deep Learningによる技術かどうかなどは不明ですが。
  • 現金管理の効率化と厳格化を実現するSmart Cash Stream ソリューション、日立評論2015-03, pp.38-42
  • 紙幣記番号読取装置および紙幣記番号読取方法、グローリー株式会社、特許公開番号2004-213560




「もう一歩進める:MIT App Inventorで人工知能体験」

 手持ちの(過去の海外出張で持ち帰った)コインなど、5種類の識別を、やはりML4K(Machine Learning for Kids)で行いました。その記事の最後に、「Scratchとも連携できます」と書いたのですが、今回はそれを実際にやってみます。図1は、コインの画像の学習が済んだ状態です。引き続き、図2の状態になりますので、ここで、Scratchとの連携に向かいます。






 室内の種々のアラーム音を識別する学習モデルとその利用システムが、文献[1]に示されています。入力アラーム音を、パワースペクトルとMFCCに変換し、2つの中間層(ドロップアウトを含む)を持つニューラルネットワークへ与えます。これによる学習結果を使って、未知の音に対して、Raspberry Piでその音源をリアルタイムに識別し、その結果をスマホへ表示します。聴覚障がい者むけの実用性をめざしたものと思われます。認識結果の詳細な分析を含む完成度の高い論文となっており、注目されます。

 この論文に触発されて、そこまで本格的にはできませんが、多くの人が、このようなシステムの基本部分の作成を体験することは、意義があると考えました。子供向けと言われる2つのソフトウェアシステムML4K(Machine Learning for Kids)[2]とScratch3 [3]がそれを可能にします。これらは、学生や教員にとっても、大いに有用と考えられます。それを実証する意味もあり、実用性はありませんが、以下のことを1日程度の作業で実現してみました。

  1. ユーザは、入力となる音をそのまま録音。(スペクトル解析などはやらないで。)
  2. ニューラルネットワークの概念は必要だが、詳細な構造や動作は知らなくてよい。
  3. それでも、5種類の音源の音を自分で多数収集し、ラベルを付けて学習させる。
  4. その学習結果を使って、入力された未知の音の音源をリアルタイムに識別する。

 上で述べたML4Kのプロジェクトを作ります。プロジェクト名を指定して、識別したいタイプを選択します。画像、数、テキスト、音の4つから選べます。ここでは、「音」を選択します。すると、音源を示すラベルの指定と、それに属する音の収集が求められます。音源ラベルとして、図1の各ハサミに対応した"Sci_A"〜"Sci_E"を与えます。そして、それぞれに、チョキチョキ音を16個づつ与えます。その結果が図2です。与えた音は、自動的に周波数解析されて表示されています。なお、これとは別に、識別を助けるため、周りの雑音も"background noise"として、16個与えます。

 その後、「学習」のボタンを押すと、ニューラルネットワークでの学習が開始されます。ただし、それ以前に、(簡単ですが)IBM Cloud IDの設定が必要です。IBM Watsonで学習させるためです。一定の条件下でそれは無料で使えます。もしも、ある人が教師として登録すれば、その配下の生徒は30人までは、何ら設定無しにこのようなプロジェクトを作成できます。通常、数分以内に学習は完了します。引き続き、この学習結果のテストを行えます。そこでは、識別したいどれかのハサミの"チョキチョキ音"を、マイクに入力するだけです。図3は、ハサミDの"チョキチョキ音"がリアルタイムに、正しく認識された例です。



 図を良くみると、”when I hear Sci_A"〜”when I hear Sci_E"までの5つのブロックの周辺が黄色で縁取りされています。これは、識別結果を待っている状態を示しているようです。すなわち、テストのために与えたチョキチョキ音の音源判定結果のSoftmax(ニューラルネットワークの最終出力)の値によって、いずれかの"when I hear ... "が呼び出されます。


[1] 門倉丈、渡辺滉平、柳谷吉風、須藤康裕、田中博:ニューラルネットワークを用いた室内アラーム音の識別とその報知システムの基本検討、電気学会研究会資料 IS-19-18、pp.91-96、2019年3月
[2] https://machinelearningforkids.co.uk/#!/about
[3] https://scratch.mit.edu


TensorFlow 2.0 Alphaに注目

 2019年3月7日開催の「TensorFlow Developer Summit」において、TensorFlow 2.0 のアルファ版が公開されました。ディープラーニングの有力な開発環境、フレームワークとしては、他にも、Sony Neural Network Console、MatLab、等々、幾つかあります。しかし、今回のTensorFlowの改訂は、Python - TensorFlow - Kerasという路線の浸透具合に鑑み、見逃せないのではないでしょうか。Kerasも、今回版に含まれるようになっています。以下に、その概要を記した日本語版もあります。


 この中には、定番の手書き数字認識のためのMNISTや、Fashion MNIST(衣類や装身具の識別用)を使った丁寧な解説もあります。何よりも素晴らしいのは、それらのTensorFlow 2.0のコードが、Jupyter Notebookの形式で提供され、直ちにGoogle Colabで動かすことができる点です。Colabは、多くの大学等でのAI関連のセミナーや卒研などでも利用されていると思います。

■ Fashion MNISTを使ったTensorFlow 2.0のコードの解説(Colabで動かす)
 - オリジナル版(英語版)
 - 日本語版(早くも日本語解説が作られています!)

 ご存じと思いますが、Colabは、Google アカウントを持っていれば、Python関連の環境設定が不要で、すぐに(一定の条件のもとで)無料で使えます。しかも、CPUだけでなく、GPUまで指定して使えますので、とても魅力的です。上記には、わかりやすい解説文があるうえに、「Run in Google Colab」というタグをクリックするだけで、Colabでのコード編集と実行ができ、以下のように、テストデータがどのように分類されたかも分かりやすく図示されます。

Fashion MNITのテスト画像の認識結果の一例(下記で提供されているTensorFlow 2.0コードの実行結果)

 この解説は、まずColabで実行させてみて、学習状況、途中結果や認識結果を観察し、さらに、解説文を読んで理解を深めましょうというスタンスのようです。Deep Learningに関する一定の基礎知識を持っていれば、これは、とても有用であり、次は、なんとか自分の問題に適用していこうという気にさせてくれます。

 しかしながら、この「Deep Learningに関する一定の基礎知識」が非常に重要であります。それを持っていないと、先へ進むことはできないでしょう。基礎知識をつけるための書籍などは、近年、非常に多く出版されていますので、どれにするか迷ってしまいますね。敢えて、どれか一冊と言われれば、私が推奨する(私自身も一応全部読んだ)書籍は、以下のものです。ご参考までに。

斉藤康毅著「ゼロから作るDeep Learning」、オライリージャパン、2016年9月出版
(フレームワークを使わず、Pythonのみで、かなり高いレベルまで行きます。最初の方はゆっくりで、後半はかなりスピードアップとなりますが、Deep Learningの基本が身につくと思います。)

Deep Learning関連話題
 今回のTensorFlow 2.0と直接は関係ないかも知れませんが、多層になった各層で何をやっているのか人間には分からないところも問題のようです。これに関して、最近、Activation Atlas(以前からあったLucidがベース)という手法の可視化の記事が以下にありました。かなり難しそうなので、今後調べて行きたいです。


An example of anonymous procedure (lambda expression) in NetLogo (2)

In the last article, I took an example using NetLogo's anonymous procedure (Lambda expressions). This time, as a continuation, I show another simple example. The problem is to find out pairs of right parenthesis and left parenthesis in multiple parentheses structures, as shown in Fig.1. The parentheses structure is given in a text format to the variable paren as shown in (a). The actual structure is as shown in (b). The result of detection of the pairs of left and right parenthesis is illustrated in (c).

This problem can be easily solved using a stack, as is well known. Here, referring to the documents [1] and [2], as shown in Fig. 2, the stack is represented by a list, and the operations of push and pop for it are given by lambda expressions (line 4-line 5). In pop, use the procedure getLast to get (and then to remove) the top element from the list. So far, it is still in preparation.

The actual parentheses check is performed by the foreach in line 5. First, please pay attention to "runresult paren". The variable paren is given the text as described above, but this input form has the ability to create this into a lambda expression for converting text to list. Therefore, runresult is applied. As a result, this part becomes a list. Foreach works on each element of this list, that is, on "(" or on ")". The variable "n" in the lambda expression in line 5 corresponds to one element of the list.

In the procedure "tinit", if the list element is "(", the value obtained by counting up the variable lpc is given to it as a label, and that element is pushed to the stack. On the other hand, if the list element is ")", get the label attached to the "(" at the top of the stack, and then set that label to the ")". This process determines the pair of parentheses. Since push is a lambda expression that does not return a value, it is evaluated by run, whereras,  pop is a lambda expression that returns a value, so it is evaluated by runresult.

Well, "(" and ")" are both turtle agents. In order to display it in an easy-to-understand manner, the shape was defined independently. NetLogo provides a shape editor that allows users to freely define necessary shapes as shown in Fig.3.

[1] Alan G. Isaac, https://subversion.american.edu/aisaac/notes/netlogo-intro.xhtml#tasks-vs-procedures
[2] NetLogo Dictionary, https://ccl.northwestern.edu/netlogo/docs/


An example of anonymous procedure (lambda expression) in NetLogo (1)

Let's take advantage of the anonymous procedure in NetLogo programming. This anonymous procedure is called lambda expression in other languages ​​such as Java. An example is shown in Fig.1. Thirty turtles are randomly arranged. Their types are red, pink and white. The problem is to connect the same colored turtles with a line, under the condition that only turtles of the same color in the range of radius 3 are targeted. The result is shown in the figure on the right.

There should be various NetLogo code to achieve this solution. Here, I created a source program like Fig.2.  I added sight as a new property of turtle (Line 1). This is to give turtles the ability to detect the existence of other turtles around them. This sight is given detection capabilities by calling procedure "getSight 3" (line 9). Here, "3" means to detect within the range of radius 3. This sight is quite different from other properties, such as color. The value of color is a constant like "red + 2", but the value of sight is an anonymous procedure (or lambda expression) as shown in line 14.

That is, in the setup procedure below, the value of sight is not determined, but instead a method is given to determine it. The specific value of sight is determined in the go procedure. The command "runresult sight" (line 18) evaluates the lambda expression sight here. The result should be a set of turtles of the same color, within a radius of 3. Then they are connected in a straight line by the command "create-links-with".

Find out all the properties that turtles have. For example, Fig. 3 shows properties for the turtle whose id (who) is 8. As mentioned above, you can confirm that a "procedure (reporter)" is set to sight (at the last row) unlike other properties. In this way, you can handle the procedure as if it were a value, enabling flexible processing in various situations.


Neural Networkでエージェントの頭脳を作る(agent-based modeling)


 Agent-Basedモデリングの有名な例のひとつにWolf-Sheep Predatorがあります。ここではNetLogoによるモデリングを扱います。これによって、下記のような動作をする3者の個体数がどのように推移するかを観測できます。
  1. 地面(茶色)には、所々にgrass(草、緑色)が生えている。
  2. grassは、sheep(羊、白色)に食べられるが、一定時間後には再生する。
  3. sheepはgrassを食べてエネルギーを得る。
  4. wolf(狼、黒色)はsheepを食べてエネルギーを得る。
  5. sheepとwolfは、動くたびに一定のエネルギーを消費する。
  6. sheepとwolfは、エネルギーがゼロになると死滅する。
  7. sheepとwolfは、一定の確率で子を産む。
 従来のモデルでは、多数のwolfとsheepがそれぞれランダムに(緩やかにある方向へ)移動していました。しかし、下記の論文[1]には、wolfとsheepに頭脳(Neural Network)を持たせて、周りの状況に応じた適切な方向へ移動させる改良がなされています。Neural Network自体は、Wolf-Sheep Predatorとは独立した別モデルとして作られています。両者を連携させるために、NetLogo6以降で導入されたLevelSpaceという拡張機能[2]を使っています。

 各個体のNeural Networkは、Fig.1に示すように、9ノードからなる入力層、9ノードからなる中間層、3ノードからなる出力層で構成されます。この論文と共に、NetLogoのソースプログラムも公開されているのです。しかし、コメントがなく、ラムダ式をふんだんに使っており、ちょっと難解でした。本稿では、当方でそれを解読した結果に基づいて述べます。

 もう少し詳しくみてみましょう。Fig.2はあるsheep(sheep #3)のある時点での頭脳を示しています。入力層で"1"となってノードは(横に赤字項目がある)、周囲からそこへ刺激があったことを意味します。すなわち、以下の3項目です。
  • 左方向(一定範囲のcone vision内)にgrassを見た。
  • 右方向(一定範囲のcone vision内)にgrassを見た。
  • 正面方向(一定範囲のcone vision内)にwolfを見た。
 最終段の出力層は、softmaxによる出力です。「左へ向かう」、「直進する」、「右へ向かう」のうち、最も強い「右へ向かう go right」という判断がなされました。このsheepにとっては、左右方向に草があり、正面方向にwolfを見たのですから、これは確かに、妥当な判断と言えます。

 ここまでは、少ない個体数で想定しましたが、次に、sheepが100匹、wolfが50匹という少し大きな世界をモデリングします。この場合は、150個の独立したニューラルネットワークが同時に動きます。(途中で生死により増減します。)それらすべてを表示するのは現実的はありませんので、Neural Networkの表示を消してシミュレーションを実行しました。その様子をFig.3に示します。図の中のグラフから分かるように、この世界では、周期的に変化はしますが、wolf、sheep、grassの個体数のバランスが長期的に保たれているように見えます。



[1] Bryan Head, Arthur Hjorth, Corey Brady, and Uri Wilensky, "EVOLVING AGENT COGNITION WITH NETLOGO LEVELSPACE", Proceedings of the 2015 Winter Simulation Conference, pp.3122 - 3123.
[2] Extensions LevelSpace, https://ccl.northwestern.edu/netlogo/docs/