2019年9月17日火曜日

Speedway ConnectをRevolutionにセットアップしてみた

据置リーダを使う場合、たいてい隣にパソコンだったり、Raspberry Piだったりの制御用のコンピュータを置いて使うことが多いと思います。Impinj社のSpeedway Connectはリーダ単体で読取して、外部に通知することができるそうなので、セットアップして試してみました。

今回使ったもの


セットアップ


こちらの手順通りなのですが、一つつまずいたので(No. 1の項目)、記載します。
  1. Speedway Revolutionのファームウェアをアップグレード
    • もともとのバージョンが4.12.0.240だったのを6.2.0.240にアップグレードしました
  2. Speedway Connectのダウンロード
    • ここからLatest Releaseをダウンロードしました
  3. 管理画面をウェブブラウザで開く
    • Speedway RevolutionのIPアドレスをブラウザで開きました
  4. ログイン
    • デフォルトのままなら、root/impinjでログイン可能です
  5. ファイル選択
    • Select Upgrade Fileのファイルを選択ボタンをクリックして、ダウンロードしたupgファイルを開きます
  6. アップグレード
    • Upgradeボタンをクリックすると、ファイルがアップロードされます
  7. 再起動
    • アップグレード完了後に、Rebootボタンをクリックすると、リーダが再起動されアップグレードが完了します
  8. リーダのIPアドレスにHTTPSで接続
    • 証明書のエラーが表示されるので、回避してください
  9. ログイン
    • root/impinjでログイン可能です
  10. 設定画面
    • うまく行けば、こんな感じで設定画面が表示されると思います

設定

いくつか設定項目はあるのですが、最低限の設定を行って動かしてみました。今回は読取内容をWebサーバにPOSTしようと思います。その場合はHTTP POSTにチェックを入れて、サーバのURLを入力すればOKです。


Webサーバ側でログを見てみると、JSON形式で送られて来ているのが分かります。
(実は今回一番苦労したのがこのサーバ側の準備でした。動画の通り、Pythonでやるのがスムーズと思います)


まとめとこれから

今回はSpeedway ConnectをRevolutionにセットアップして、Webサーバにタグ読取結果をPOSTできることを確認しました。さて、以前こんな記事を書きました。そのとき課題として挙げたのが、HTTPSが使えないことと認証ができないことでした。Speedway Connectの場合、どちらも解決できそうなので、その辺をおいおい調べてまた記事にまとめたいと思います。

追記(2019/10/02)

Speedway Connectが起動状態だと、ExcelToolに接続できないことに気が付きました。他のツールと連動して使いたい場合は、Speedway Connectの左上にあるStatusのアイコンをクリックし赤くした上で、Applyボタンを押してください。他のツールと連動できるようになると思います。



2019年9月12日木曜日

第21回自動認識総合展

今年も出展しています。


 KCKCさんとのコラボ製品も展示しています。 


もちろん光るタグの試作機も展示してますよ。


 遊びにきてくださいねー。

2019年9月9日月曜日

RFIDの読取結果を機械学習でクラス分類してみた

前回に引き続き、今回はRFIDの読取結果を機械学習クラス分類してみようと思います。クラス分類にはk近傍法を利用します。では、さっそく始めます。

今回使ったもの(前回同様)


ICタグの読取手順(前回同様)

まず、ICタグを5枚ずつ、数十㎝離して4箇所に配置しました。読取は各箇所の上空にRF Blasterを順番にかざすような感じで読み取りました。(なんだか恣意的ですが)各箇所には上位ビットが同じで下位のシリアルが1~5となっているものをひとまとめにして置いてあります。

Microsoft Azure Notebooks

前回同様Microsoft Azure Notebooksを使用しました。使ったプロジェクトはこちらです。CSVファイルは同じものを使いました。使ったNotebookはこちらです。初めに、pandas, numpyをimportしています。次にDataFrameにデータを取込んで加工しています。今回は前回一番よかった秒単位の読取回数を使ってクラス分類してみようと思います。

pvCountT = df.reset_index().pivot_table(index=[pd.Grouper(freq='1s', key='DateTime')], columns=["TagID"], values="RSSI", aggfunc=np.count_nonzero).fillna(0).T

TagIDの上位7文字をlocationとして設定します。

pvCountT['location']=pvCountT.index.str.replace('[0-9]{9}$','')

各ロケーションに置かれたタグのうち、タグIDの末尾が'0001', '0002', '0003'のものを教師データとします。

train_data=pvCountT.iloc[pvCountT.index.str.endswith(('0001','0002','0003')),:]

同様に末尾が'0004', '0005'をテストデータとします。

test_data=pvCountT.iloc[pvCountT.index.str.endswith(('0004','0005')),:]

kの値を3としたときのk近傍法の結果です。

knn = KNN(n_neighbors=3, n_jobs=-1)
knn.fit(
    X = train_data.iloc[:,use_column].values, 
    y = train_data["location"].values,
)
pred_target =knn.predict(
    X = test_data.iloc[:,use_column].values, 
)
print(sum(test_data['location']==pred_target)/len(pred_target))
0.875

結果は87.5%の正答率でした。まずまずでしょうか。次にkの値を5としたときのk近傍法の結果です。

knn5 = KNN(n_neighbors=5, n_jobs=-1)
knn5.fit(
    X = train_data.iloc[:,use_column].values, 
    y = train_data["location"].values,
)
pred_target5 =knn5.predict(
    X = test_data.iloc[:,use_column].values, 
)
print(sum(test_data['location']==pred_target5)/len(pred_target5))
1.0

今度は100%の正答率が得られました。各位置ごとに3つの教師データがあるので、近傍の5個のデータを見ると、位置が正確に分かるということでしょうか。 最後にkの値を7としたときの結果です。

knn7 = KNN(n_neighbors=7, n_jobs=-1)
knn7.fit(
    X = train_data.iloc[:,use_column].values, 
    y = train_data["location"].values,
)
pred_target7 =knn7.predict(
    X = test_data.iloc[:,use_column].values, 
)
print(sum(test_data['location']==pred_target7)/len(pred_target7))
0.5

今度は正答率が50%まで下がってしまいました。教師データが3つしかないのに、近傍7個のデータを見に行って下がってしまったということでしょうか。

まとめとこれから


今回はRFID読取結果を機械学習のk近傍法を使ってクラス分類してみました。結果に対する考察と背景の勉強はまだまだ行っていく必要がありますが、クラスタリング同様RFIDの読取結果に対して分析することができました。

応用としては、前回記載した通り、RFIDを使った棚卸で位置の決まったタグの読取結果を教師データとして、その他の物品の位置を推定するのに使えるかもしれません。ただ、一般には位置タグの数<<<物品タグの数なので、その辺がどうなるのかもう少し大きなデータセットで試してみたいと思います。


2019年9月6日金曜日

RFIDの読取結果を機械学習でクラスタリングしてみた

RFIDタグを読むといったら、多くの場合、その場にあるモノを自動で識別することを指していると思います。一方で、UHF帯のRFIDを使って、移動の向きであったり、モノの位置であったりを検出するハードウェアや、ソフトウェア的に高精度に向きや位置を検出する技術(RFLocus, Impinj ItemSense)が出てきています。

このように今後はUHF帯RFIDを使って、移動の向きや位置を検出するといった用途が増えていくのではと思われます。そこで、おおざっぱにでも近くに置かれたタグ同士を判別できないかを、読み取ったICタグの時系列データを使って、KMeansでクラスタリングして試してみました。
(いろいろ書いてますが、初心者がPythonの機械学習に触れてみた的な記事です)

今回使ったもの

(*) 結果的にはMANICAコレクタでよかったかも。

ICタグの読取手順

まず、ICタグを5枚ずつ、数十㎝離して4箇所に配置しました。読取は各箇所の上空にRF Blasterを順番にかざすような感じで読み取りました。(なんだか恣意的ですが)各箇所には上位ビットが同じで下位のシリアルが1~5となっているものをひとまとめにして置いてあります。

Microsoft Azure Notebooks

今回機械学習でクラスタリングしてみるのに、Microsoft Azure Notebooksを使いました。使ったプロジェクトはこちらです。RF Blasterを使って読み取った結果がこちらのCSVファイルになります。読取時刻にタグIDとRSSI, Phaseの値が並んでいる形になります。

こちらが使ったNotebookになります。初めに、pandas, numpy, KMeansをimportしています。次にDataFrameにデータを取込んで加工しています。そのあと、下記コードで時系列データを毎秒のRSSI値の平均をとり、タグID単位に集計しています。表示されるタグIDは上から順に5枚ずつ同じ箇所に置いてあります。

pvT = df.reset_index().pivot_table(index=[pd.Grouper(freq='1s', key='DateTime')], columns=["TagID"], values="RSSI", aggfunc=np.mean).fillna(0).T

集計したデータをKMeansでクラスタリングしてみたのが下記のコードになります。

pred = KMeans(n_clusters=4).fit_predict(pvT.values)

結果を見てみると、

print(pred)
[2 2 2 2 2 3 1 1 3 3 1 1 1 3 1 0 2 0 0 2]

先頭から5個ずつ順に同じ箇所にタグを置いたので、同じ数字が5個ずつ並んでほしいところですが、そうなっていません。
同じように、Phase値の平均をとってクラスタリングした結果を見てみます。

pvPhaseT = df.reset_index().pivot_table(index=[pd.Grouper(freq='1s', key='DateTime')], columns=["TagID"], values="Phase", aggfunc=np.mean).fillna(0).T
predPhase=KMeans(n_clusters=4).fit_predict(pvPhaseT.values)
print(predPhase)
[3 3 3 3 3 0 2 2 0 0 2 2 2 0 2 1 1 1 1 3]

こちらも残念ながらうまく並んでいません。そもそも秒単位に平均をとることに意味があるのかわからなくなってしまったので、箱ひげ図を出力してみました。
(データの加工はもうちょっとやり方ありそうですが、思いつかなかったので、適当です)



重なっていてよく分かりませんが、秒単位で集計してもわりと振れ幅があって、平均取ることに意味がなさそうです。同じくPhaseだとこんな感じです。そもそもどういう意味がある数値なのかすら分かってないですが、これも平均取ることの意味がないのかもしれません。


平均ではうまくいかなかったので、もっと単純に秒単位の読取回数でクラスタリングしてみました。

pvCountT = df.reset_index().pivot_table(index=[pd.Grouper(freq='1s', key='DateTime')], columns=["TagID"], values="RSSI", aggfunc=np.count_nonzero).fillna(0).T
predCount = KMeans(n_clusters=4).fit_predict(pvCountT.values)
print(predCount)
[0 0 0 0 0 2 2 2 2 2 1 1 1 1 1 3 3 3 3 3]

これだと、きれいに5個ずつ同じクラスタと判定されました。初期値を変えて、何回かやってみましたが、いずれもうまく判定されました。

まとめとこれから


とりあえず、少数のタグを使ったきれいなデータであれば、うまいこと判別できることが分かりました。次はもう少し実際に近い(いくつかの箱にもっと多くのタグが入っている)イメージで試してみたいと思います。あとは、あらかじめ位置の決まったタグ(いわゆる位置タグ)を教師として、クラス分類してみても面白いかもしれません。

最終的にはUHF帯RFIDを使った棚卸の場面で、庫内のどこかで読んだのだけれど、特定のタグIDの商品がどこにあるか分からないという場面でモノ探しに役立てるようにしたいです。