猫ドアを制御して、白黒斑ネコの侵入を阻止したい
- リタルタイムで画像識別
- 2匹の子猫
- 猫ドア
- 子猫に生傷
- そういえば Jeston
- ラズパイ
- 夜間の侵入撮影成功
- 転移学習
- 猫ドア稼働状況
- サーボモーターでドアロック
- Jetson Nanoで転移学習
- ラズパイとJetson Nanoの比較
- DL Framework,Task,Model
リタルタイムで画像識別
リアルタイムでいろいろなものが、かなりの精度で認識できる。
2匹の子猫
置いていかれた「茶トラ」と「黒」の子猫は順調に育っていった。
ちなみに猫は一緒に生まれた兄弟でも、父親が違う、というのが「あり」らしい。
猫ドア
冬になり、さすがに外は寒いので、倉庫に出入りできるようにドアをつくった。
311の地震のときに割れたガラスの代わりに板で塞いでいたので、ドアが作れてちょうどよかった。
左に写っているのが、後で説明する、今回設置した USBカメラ。
子猫に生傷
あるとき、時々、2匹ともに生傷ができているのを見つける。
どうやら白黒斑ネコにやられているようだ。餌を食べに倉庫にも侵入してきているようだ。
餌はまあいいが、「茶トラ」と「黒」が「白黒斑」に怯えて倉庫の天井の方にいるようなので、どうしたものかと考える。
そういえば Jeston
そういえば、Jetson で画像識別できた。
Jetson Nano 2G という、低価格版がリリースされだした。
Raspberry Pi とどうしようかと迷ったが Raspberry Pi の場合、USB タイプの GPU が必要になりそうな気もしたので、 Jeston Nano 2G にすることにした。
モバイルバッテリーを使って実際にJetson一式外に持ち出して、はじめて「cat」を検出して自動撮影に成功したときは、結構うれしかった。
style="border: 1px solid black;"
詳細はJeston Nano 2G で猫を識別して自動撮影するまで
ラズパイ
新しいラズパイが入手できたので、ラズパイでも試してみることにした。
ラズパイでは Tensorflow は動かないようなので、 Jetson Nano 同様に Pytorch を使って「物体認識」を動かすことはできた。うごくには動いたが、とても遅い。
よく調べたら、ラズパイ用には Tensorflow Lite なるものが用意されていた。
これを使うと、ラズパイでもそれなりの速度で動いた。
夜間の侵入撮影成功
夜間の侵入なので、最初、センサーライトを考えたが、
赤外線LEDとIRカット赤外線USBカメラ(3.6mmレンズ)でうまくいった。
buchi
ラズパイ+赤外線USBカメラで白黒まだらの「外部の猫」の夜間侵入を確認 |
転移学習
kuro
tora
「画像分類」であれば、画像データを手作業でフォルダに分類するだけので、まあ簡単に学習用データを作成できる。
ということで「画像分類」でいくことにした。
画像分類は 1,000くらい分類できるが 「person」 は、ないので人間はとらえられない。
物体検出は 100種類程度、認識できて「person」を含む。捉えた人数もカウントできる。
TensorFlowLiteモデルメーカーによる画像分類
Tensflow Lite の場合、分類した画像を zip して GoogleColab に upload して処理した学習結果を(それなりの大量データでなければ費用はかからない)ダウンロードすることでラズパイで利用することができる。
今回は background, buchi, kuro, tora の4つのフォルダにそれぞれ50枚程度の画像ファイルを設定しTensorFlowLiteモデルメーカーを使ってみたが、80%程度の精度は期待できそうだ。
TensorFlowLiteモデルメーカーが画像ファイルのエラーで動かない。
エラーとなる画像ファイルを検出する
プログラムを Python で書いて GoogleColab 上で動かしても、壊れたファイルは見つからず、かなり時間を費やした。
原因は Mac の場合、各フォルダに .DS_Store ファイルが作成されていて、これが壊れたイメージファイルとして
認識されていたことにあった。
サーボモーターでドアロック
猫の分類に目処が立ったので、サーボモーターを使って、猫ドアをロックする仕組みを作った。
実際に倉庫に設置した様子。
猫ドア稼働状況
kuro, tora, buchi のいづれかを検出したら撮影して、15秒待つようにしてある。
下の写真では 7月17日 00:49 から 00:51 くらいまで「buchi」が2分以上、猫ドアで入ろうとしていて 8枚目の写真で「kuro」と間違って判定されたため、ロックが解除され中に入ることができて、次に餌を食べ終わって出てくるところが撮影されている。
「kuro」と判定されたフォルダの中に「buchi」が混ざっていた。
これまで転移学習をデータを追加しながら7、8回繰り返してきたが、すでにかなりの識別精度はでてきているようだ。
現在「kuro」か「tora」と判定した場合、即ロックを解除しているが、ひとつ前の判定が「buchi」であった場合、すぐに解除しないで、もう一度「kuro」か「tora」を連続して認識した場合、解除するようなプログラム側での対応が現実的かな。
と、考えていたら、「buchi」が出現しなくなっている様子なので、しばらく対応もお休み。
「buchi」が出てくるところに「tora」が遭遇している(?) ような現場も撮影されていた。もう、仲良しとはいえないまでも、慣れてしまって争いはしていないような雰囲気。 |
Jetson Nanoで転移学習
これまでラズパイではTensorFlowLiteモデルメーカーによる画像分類を利用してきた。
TensorFlowLiteモデルメーカー[TensorFlowLite作業メモ(pdf)]
現在、画像分類用の事前トレーニング済みモデルとして、EfficientNet-Lite *モデル、MobileNetV2、ResNet50などのいくつかのモデルをサポートしています。
デフォルトのモデルはEfficientNet-Lite0です。
Jetson Nano は自身に搭載した GPU を使って転移学習を実行することができる。
学習用(train)とテスト(test)と検証(val)用にそれぞれの画像データを分けて保存する。
8:1:1 くらいの割合。
フォルダ名(class)をリストした labels.txt を用意する。
(TensorFlowLiteモデルメーカーはこのあたりの作業も勝手にやってくれている)
train.py は最初に resnet18 の学習済みモデルをダウンロードしてきて、これを元に与えらたデータを
使って、転移学習を実行していく。データは少ないが35回( epochs=35 )繰り返すので処理には数時間かかる。
出来上がったもの(Pytorch用 .pth)を onnx_export.py で onnx (Open Neural Network Exchang)形式のデータに export する。
# cats_photos ディレクトリ以下の構成
$ tree | grep -v jpg
├── labels.txt
├── test
│ ├── background
│ ├── buchi
│ ├── kuro
│ └── tora
├── train
│ ├── background
│ ├── buchi
│ ├── kuro
│ └── tora
└── val
├── background
├── buchi
├── kuro
└── tora
$ cat labels.txt
background
buchi
kuro
tora
#データ数はこの程度
$ ./count.sh
cats_photos/test/background, 9
cats_photos/test/buchi, 6
cats_photos/test/kuro, 11
cats_photos/test/tora, 9
cats_photos/train/background, 89
cats_photos/train/buchi, 54
cats_photos/train/kuro, 167
cats_photos/train/tora, 165
cats_photos/val/background, 3
cats_photos/val/buchi, 9
cats_photos/val/kuro, 33
cats_photos/val/tora, 3
# メモリが足りないのでデスクトップは止めておく
$ sudo systemctl set-default multi-user.target # disable desktop on boot
$ python3 train.py --model-dir=models/cats_photos \
data/cats_photos --batch-size=4 \
--workers=1 --epochs=35
...
$ python3 onnx_export.py --model-dir=models/cats_photos
...
model exported to: models/cats_photos/resnet18.onnx
できあがってモデル resnet18.onnx を使ってテストデータの分類をしてみる。
Jetson SDK の imagenet.py は指定したディレクトリ(/jetson-inference/data/kt/cats_photos/test/buchi)の画像を一括処理する機能がある。
$ imagenet.py --model=models/cats_photos/resnet18.onnx \
--input_blob=input_0 --output_blob=output_0 \
--labels=/jetson-inference/data/kt/cats_photos/labels.txt \
/jetson-inference/data/kt/cats_photos/test/buchi \
/jetson-inference/data/kt/test/buchi
ラズパイで使ったのTonsorflow Lite の方のPythonプログラムにはこうした機能は標準では実装されていないので、画面にテストデータ(猫の写真)を 映しておいて、それを USBカメラで映してテストした。
かなりの buchi が background として分類されてしてしまっている。
(/jetson-inference/data/kt/test/buchi)
epochs の回数を大きくした程度では大して変わらないようなので、ベースとなる
学習済みモデルを変えてみることにした。
$ python3 train.py -a googlenet \
--model-dir=models/g_cats_photos data/cats_photos \
--batch-size=4 --workers=1 --epochs=32
alexnet なども試したが、googlenet にしたところ少し精度が良くなった。
学習用のデータ量を増やしていけば精度も向上していくのかもしれないが、TensorFlowLiteモデルメーカーでは、この程度のデータで90%近い精度がでていた。
どうやら、これはTensorFlowLiteモデルメーカーがデフォルトで使用しているEfficientNet-Lite0という新しい画像認識モデルが優秀であるからのようだ。
(EfficientNet-Lite による高精度視覚モデル )
最新の画像認識モデル EfficientNetV2 というのが最強らしい。
TensorFlowLiteで作成したモデルをコンバートして、 Jetson で使えないものかと調べてみた。コンバートツールがいつくかあったが、動かなかったり、コンバートできても使えなかったりだった。
いっそのこと、 Jetson Nano に Tensorflow Lite を入れて、ラズパイと同様の環境を構築するのが、現実的かもしれない。
まあ、でも1年もしないうちに、いろいろと変わってくるかもしれない。
現在使っているJetPack SDKのバージョンは 4.5 だが、既に 4.6 がリリースされている。
(EfficientNetV2 はまだサポートしていないと思われる)
ラズパイとJetson Nanoの比較
デスクトップ
今回の場合、ssh でログインした作業だけでなく、 画像を扱う関係でデスクトップでの画像確認が必要となる。 Jetson Nano 2G はメモリ少ないので、デスクトップのスクリーンサイズを最小限にしても重い。 ラズパイ4G はメモリもあるのでデスクトップでの作業もしやすい。
USBケーブル接続
Jetson Nano は標準で(特になにもしなくても) Micro USB Type-B の口に Mac/PC から USBケーブルで接続すれば 192.168.55.1 という
固定の IP Address でアクセスできる。
ラズパイでも設定すれば、Mac/PC から USB-Cケーブルで接続し raspberrypi.local でアクセスできる。
Mac用のX Window SystemであるXQuartzをインストールしてあれば
Jetson Nano
$ ssh -XY xx@192.168.55.1
$ lxsession
ラズパイ
$ ssh -XY xx@raspberrypi.local
$ x-session-manager
DL Framework,Task,Model
Deep Learning用 フレームワーク Framework | タスク Task | モデル Model | クラス Class |
---|---|---|---|
Pytorch |
画像分類 Classification/Recognition |
GoogleNet |
tabby cat tiger cat Persian cat Siamese cat Siamese Egyptian cat cougar ... ilsvrc12_synset_words.txt |
EfficientNet-Lite0 | |||
EfficientNetV2 | |||
ResNet18 | |||
ResNet50 Microsoft | |||
MobileNetV2 | |||
Alexnet | |||
物体検出 Object Detection | SSD (Single Shot Detector) |
unlabeled,person,cat, dog ... ssd_coco_labels.txt | |
YOLO (You only Look Once) | |||
R-CNN 領域ベースの畳み込みニューラルネットワーク (Region Based Convolutional Neural Network) | |||
Tensorflow (TensorflowLite) |
画像分類 Classification/Recognition |
GoogleNet |
tabby cat tiger cat Persian cat Siamese cat Siamese Egyptian cat cougar ... ilsvrc12_synset_words.txt |
EfficientNet-Lite0 | |||
EfficientNetV2 | |||
ResNet18 | |||
ResNet50 | |||
MobileNetV2 | |||
Alexnet | |||
物体検出 Object Detection | SSD |
unlabeled,person,cat, dog ... ssd_coco_labels.txt | |
YOLO | |||
R-CNN | |||
Chainer | 日本製フレームワーク。株式会社Preferred Networks(PFN)からリリースされている。2019年12月5日、開発元のPFNは今後はChainerから、Facebookが主導して開発しているPyTorchに順次移行すると発表した。 |
TensorRT
NVIDIAの Deep Learing用の SDK
NVIDIA® TensorRT™ is an SDK for high-performance deep learning inference.
It includes a deep learning inference optimizer and runtime that delivers low latency
and high throughput for deep learning inference applications.
WordNet
英単語データベース化プロジェクト
意味が限定された単語から広域のものへと段階に並べられている。さらに同義語がグループ化されている。
心理学、言語学、AIによる自然言語処理など幅広く活用されている。
ImageNet
20カテゴリーで物体認識のコンテストを行っていたら、この20以外の物体の認識精度が上がっていかないのでカテゴリーを
増やすことにした。WordNet にある名詞にあう画像をネットで検索し、登録することにしたが、とても手間がかかることが判明。
このペースでは90年くらいかかりそうだとわかる。
Amazon の Mechanical Turk サービス
(人間にリクエストすることによって、サービス依頼者に、疑似人工知能を直接依頼者のアプリケーションに統合するサービスを提供)
を活用することで、この問題をクリアした。
2年で300万の画像にラベル付けができた。
『最近ではAI関連の学術研究のための助成金申請書の項目に「Mechanical Turk 人件費」が盛り込まれることが一般的になっている。 [教養としてのAI講義 P126]』
Mechanical Turk
アラブ世界がギリシャを継承。先進の機械技術はイスラム圏にあり。
アラビア語からの翻訳でアリストテレスの知識が西洋に蘇るも、異端審問の壁。
「機械仕掛けのトルコ人」は18世紀はハンガリー(オスマントルコはウィーンは陥落させられなかたが、手前までは征服)の発明家が開発したチェスをプレイする自動機械(中にチェスの達人が隠れていた)
ILSVRC(ImageNet Large Scale Visual Recognition Challenge )
ImageNetのデータを使った大規模画像認識の競技会
2010年から2017年まで毎年開催され、画像認識におけるディープラーニングの発展に寄与した。
Object Detection
コンピュータは写真のどこの部分をみてたとえば「ネコ」であると判断したのか?
こうした問題を明らかにするために判定対象を四角で囲む、新たなコンテスト部門(位置特定)
が作られた。[参考 教養としてのAI講義 P140]
Object Detection は自動運転を意識したものかと思っていた。
AlexNet
2012年、ジェフリー・ヒントン(指導教官)と二人の大学院生 イリヤ・サツケバー、アレク・クルゼフスキーが論文「アレクネット」発表し、ILSVRCに参加させた。
これがぶっちぎりのスコアで優勝し、関係者は、ど肝を抜かれた。
AlexNetは GPU 上で動作するように CUDA で書かれている。
これがAI冬の時代(このあたりについては「アレクサvシリ 第5章 ルールの破壊者」が面白い)を終わらせ、第3次AIブームを起動したのである。
CUDA (Compute Unified Architecture:クーダ)
NVIDIA社が開発・提供しているGPU向けの汎用並列コンピューティング プラットフォーム
CNN (Convolutional Neural Network)
AlexNetというCNN(畳み込みニューラルネットワーク)モデルが登場し、ディープラーニングが注目され第3次AIブームとなった。
「1990年代には行き詰まっていたいたように見えた CNN が突如として ImageNet の競技会で上位を独占 ...
深層学習研究の近年の大躍進は、AI研究における新たな飛躍的進歩よりも、膨大なデータが入手しやすくなったことと、
コンピューターのハードウェアによる並列処理が非常に高速化したおかげであるほうが大きい。[教養としてのAI講義 P135]」
AI冬の時代この同じ時期に CNN に取り組んでいてた松尾氏は
「考え方は間違っていなかった。ただ、やり方が違ったのだ。 ...
一見すると逆説的だが、入力信号に「ノイズ」を加えるのだ。ノイズを加えても加えてもでてくる「概念」は、ちょっとやそっとのことでは
ぐらつかない。[人工知能は人間を超えるか P168]」
と悔しそうに語っている。
「ヤン・ルカン氏自身も、自ら開発したCNNを取り巻く状況が好転した速さに驚いていた。
『20年や25年も前からある技術が、しかもほとんど変化していないにもかかわらず、
実は今日において最も優れていたという事例は極めて稀です。
CNNがある時点から広まった速さは、もはや信じられないほどです。
こんな例はほかにまったく思い当たりません。』[教養としてのAI講義 P135]」
ヤン・アンドレ・ルカン(Yann André LeCun)
2018年度には、ジェフリー・ヒントン氏らとともに「コンピュータ科学分野のノーベル賞」と称されるチューリング賞を受賞
畳み込みニューラルネットワーク(CNN)の主要な創始者の一人
ニューヨーク大学クーラント数理科学研究所のシルバー教授、facebook社のVP兼チーフAIサイエンティスト
Home
コメント
コメントを投稿