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つに別れており、

  1. Introduction Computer Vision
  2. Advanced Computer Vision & Deep Learning
  3. Object Tracking and Localization

の3つからなり、それぞれ最後にプロジェクトをこなす形で進めて行きます。プロジェクトは、Udacity のスタッフによりチェックされ、クリアするまで何回も提出する事になります。

1. Introduction Computer Vision

画像認識についてのイントロで、OpenCV や PyTorch を使ってフィルターやエッジ検出、特徴量の抽出、Convolutional Neural Network なんかを学んで行きます。最後の課題は、Facial Keypoint Detection で、PyTorch を使って自分でネットワークを組み、用意されたデータを使って学習を行います。

下の図はそのプロジェクトの一部(まだまだ精度がイマイチ)。

Screen Shot 2018-08-04 at 17.33.37.png

2. Advanced Computer Vision & Deep Learning

前章で学んだ事を発展させる形で、YOLO や Attention Mechanism なんかを勉強して行きます。最後の課題は、Microsoft Common Objects in Context を使った Image Captioning で、これまた自分で CNN-RNN のネットワークを組み、学習を行います。このプロジェクトについては、50時間分の GPU が個別に用意されています。

下の図はプロジェクトの一部。この例では、それなりのキャプションを画像から生成できています。

Screen Shot 2018-08-04 at 17.26.27.png

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 に置き換えました。結果、こんな感じで、やりたかったことを実現できています。

IMG_0333.JPG

文字認識は、引き続き、CoreML を使っています(実装自体は、Swift -> ObjectiveC++ になっていますが)。文字認識の精度がまだまだイマイチで、「1」と「7」、「5」と「6」あたりがうまく認識できていません。今後の課題です。

アプリ自体はこちらで公開しています。

https://itunes.apple.com/jp/app/su-toku/id1387290583


comments powered by Disqus