Computer Vision Nanodegree
Posted on Aug 4, 2018
iOS で画像認識をつかったアプリを作っている事もあり、レベルアップのために受講した、Udacity の Computer Vision Nanodegree について記録を残しておこうと思います。もし、当該コースの受講を検討されている方がいれば、参考にしていただければと思います。
Udacity とは?
Udacity は、オンラインでプログラミングやマーケティングなんかを学習できるサイトです。MIT Technology Review の 50 Smartest Companies なんかにも選ばれるような、成長著しい会社です。創業者の Sebastian Thurn の影響で、最近は自動運転関連のコースが多めです(個人的には、DevOps のコースを作って欲しい)。私はここで、iOS Programming や Full-Stack Web Development なんかを学びました。
Computer Vision Nanodegree とは?
最近始まった新しいコースです。ただ、中身自体は、Self-Driving Car Engineer Nanodegree や Robotics Nanodegree の一部を切り出した感じのコースだと思います。メインのカリキュラム自体は、大きく3つに別れており、
- Introduction Computer Vision
- Advanced Computer Vision & Deep Learning
- Object Tracking and Localization
の3つからなり、それぞれ最後にプロジェクトをこなす形で進めて行きます。プロジェクトは、Udacity のスタッフによりチェックされ、クリアするまで何回も提出する事になります。
1. Introduction Computer Vision
画像認識についてのイントロで、OpenCV や PyTorch を使ってフィルターやエッジ検出、特徴量の抽出、Convolutional Neural Network なんかを学んで行きます。最後の課題は、Facial Keypoint Detection で、PyTorch を使って自分でネットワークを組み、用意されたデータを使って学習を行います。
下の図はそのプロジェクトの一部(まだまだ精度がイマイチ)。
2. Advanced Computer Vision & Deep Learning
前章で学んだ事を発展させる形で、YOLO や Attention Mechanism なんかを勉強して行きます。最後の課題は、Microsoft Common Objects in Context を使った Image Captioning で、これまた自分で CNN-RNN のネットワークを組み、学習を行います。このプロジェクトについては、50時間分の GPU が個別に用意されています。
下の図はプロジェクトの一部。この例では、それなりのキャプションを画像から生成できています。
3. Object Tracing and Localization
この章は自動運転を意識した内容となっており、これまでの Deep Learning から一風変わって、Simultaneous Localization and Mapping (SLAM) について学びます。最後のプロジェクトも、SLAMについて。
#感想 最初の二つのカリキュラムは、想定していた感じの内容で、楽しめました。買ったけど理解できなかった 機械学習プロフェッショナルシリーズの 画像認識 を簡単かつ必要なところだけ説明してもらった形で、色々腑に落ちました。また、おかげさまで、何でもかんでも機械学習使えばいいってわけではない、って事に気づくことができました。今後、OpenCV を少し深掘りする予定です。
最後の、SLAM については、正直興味もなく、そのため、理解度も低いままです。今後、必要になった時に、もう一回勉強すればいいかな、って考えてます。
追記(2018-12-18)
その後、OpenCV を使って、数独アプリの画像認識アルゴリズムをブラッシュアップしました。
これまでは、「CoreMLの長方形認識機能で数独パズル切り取り -> 縦横 9 等分ずつにして、それぞれ画像認識(MNISTで学習したモデルを利用)」といった方法で実装していました。この場合の問題点は、縦横9等分にするため、それぞれの画像に縦線または横線が残ってしまい、その結果、文字認識の精度が格段に落ちる といったものでした。言い方を変えると、Swift の CIImage のフィルター機能では、十分な画像前処理ができない といったものです。また、リアルタイムで、画面上に読み取った結果を表示できないのも、UX的にイマイチでした。
そこで、画像認識部分を、まるっと OpenCV3 に置き換えました。結果、こんな感じで、やりたかったことを実現できています。
文字認識は、引き続き、CoreML を使っています(実装自体は、Swift -> ObjectiveC++ になっていますが)。文字認識の精度がまだまだイマイチで、「1」と「7」、「5」と「6」あたりがうまく認識できていません。今後の課題です。
アプリ自体はこちらで公開しています。
https://itunes.apple.com/jp/app/su-toku/id1387290583
comments powered by Disqus