NVIDIAのAI認定プログラム「Jetson AI Specialist」を取得しました

この度、NVIDIAのAI認定プログラム「Jetson AI Specialist」取得しましたので、取得までの過程を共有します。
今後、取得を目指す方の参考になれば幸いです。

![スクリーンショット 2021-08-22 222904.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363376/1cb232f5-b8e0-8b4c-9dce-87333b939ad7.png)


# Jetson AI Certificationとは？
Jetson AI Certificationとは、JetsonとAIに関する実践的な知識を証明する認定プログラムです。認定資格には、誰でも受けることのできる「Jetson AI Specialist」と教育者向けの「Jetson AI Ambassador」の二つがあります。今回、私は「Jetson AI Specialist」を取得しましたが、認定を受けるにはJetson AI Fundamentalsという講座を受け、Jetsonを活用したプロジェクトを申請する必要があります。Jetson AI Certificationの詳細については、下記リンクを参照してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363376/b2b61476-3d23-49a7-b25c-720ea0011fac.png)

[Jetson AI Certification](https://developer.nvidia.com/ja-jp/embedded/learn/jetson-ai-certification-programs)

# 準備
Jetson AI Specialistを取得するにあたって、Jetson Nanoをはじめとする機材が必要になりますので、私が使用した機材を紹介します。

 - [NVIDIA Jetson Nano 2GB 開発者キット](https://www.amazon.co.jp/NVIDIA-Jetson-Nano-2GB-%E9%96%8B%E7%99%BA%E8%80%85%E3%82%AD%E3%83%83%E3%83%88/dp/B08MZFQWDP/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3FPDM36RWX377&dchild=1&keywords=jetson+nano&qid=1629640833&s=computers&sprefix=jetson%2Ccomputers%2C269&sr=1-3)
 - [電源](https://www.amazon.co.jp/Raspberry-%E9%9B%BB%E6%BA%90%E3%80%81USB-C%EF%BC%88Type-C%EF%BC%89%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB-%E5%85%85%E9%9B%BB%E5%99%A8%E3%82%B3%E3%83%BC%E3%83%89%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E4%BB%98%E3%81%8D-AC%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%80%81%E4%BA%92%E6%8F%9B%E6%80%A7%E3%81%82%E3%82%8ARaspberry/dp/B087CF6127/ref=sr_1_12?dchild=1&keywords=Miuzei&qid=1629641179&sr=8-12)
 - [Raspberry Pi NoIR Camera V2](https://www.amazon.co.jp/Raspberry-%E3%82%AB%E3%83%A1%E3%83%A9%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-%E3%82%BD%E3%83%8B%E3%83%BCIMX219PQ-CMOS%E7%94%BB%E5%83%8F%E3%82%BB%E3%83%B3%E3%82%B5-%E3%80%813B%E3%80%812B%E3%81%AB%E5%AF%BE%E5%BF%9C%E5%8F%AF%E8%83%BD/dp/B098JYJK43/ref=sr_1_1_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=Raspberry+Pi+%E3%82%AB%E3%83%A1%E3%83%A9&qid=1629640790&s=computers&sr=1-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEyQkVMSUYwWjRaRUwxJmVuY3J5cHRlZElkPUEwMTUxMjc3UUE0SzhCV1FLUVpEJmVuY3J5cHRlZEFkSWQ9QUU4R1M5SFlMSVZHRiZ3aWRnZXROYW1lPXNwX2F0ZiZhY3Rpb249Y2xpY2tSZWRpcmVjdCZkb05vdExvZ0NsaWNrPXRydWU=)
 - [USBケーブル 0.9m (2.0タイプAオス - マイクロBケーブル)](https://www.amazon.co.jp/Amazon%E3%83%99%E3%83%BC%E3%82%B7%E3%83%83%E3%82%AF-USB2-0-%E3%82%AA%E3%82%B9-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%ADB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB-0-9m/dp/B0711PVX6Z/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=usb+%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB+0.9m+%282.0%E3%82%BF%E3%82%A4%E3%83%97a%E3%82%AA%E3%82%B9+-+%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%ADb%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%29&qid=1629640718&s=computers&sr=1-3)
 - [ケース、冷却ファン付き](https://www.amazon.co.jp/NVIDIA-Jetson-Nano%E3%82%B1%E3%83%BC%E3%82%B9%E3%80%81%E5%86%B7%E5%8D%B4%E3%83%95%E3%82%A1%E3%83%B3%E4%BB%98%E3%81%8DNVIDIA-Nano%E9%96%8B%E7%99%BA%E8%80%85%E3%82%AD%E3%83%83%E3%83%88%E7%94%A8%E3%82%A2%E3%82%AF%E3%83%AA%E3%83%AB%E3%82%B1%E3%83%BC%E3%82%B9%EF%BC%883-0-5-8V%EF%BC%89%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%A8%E3%83%B3%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC%E3%82%AF%E3%83%BC%E3%83%A9%E3%83%BC/dp/B07VLXHZLF/ref=sr_1_5?dchild=1&keywords=nvidia+jetson+nano+%E3%82%B1%E3%83%BC%E3%82%B9&qid=1629640689&sr=8-5)
 - LANケーブル
 - メモリーカード(64GB)
 - [ロジクール ウェブカメラ C920n](https://www.amazon.co.jp/%E3%83%AD%E3%82%B8%E3%82%AF%E3%83%BC%E3%83%AB-C920n-%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0-%E8%87%AA%E5%8B%95%E3%83%95%E3%82%A9%E3%83%BC%E3%82%AB%E3%82%B9-2%E5%B9%B4%E9%96%93%E3%83%A1%E3%83%BC%E3%82%AB%E3%83%BC%E4%BF%9D%E8%A8%BC/dp/B07QQR6G5N/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=c920&qid=1629640655&s=electronics&sr=1-3)

物品のほとんどは、会社から貸与してもらいましたが、途中でウェブカメラが必要になったため、追加で購入しました。
また、後ほど触れますが、GPUが使える環境があるとなお良いと思います。

# Jetson AI Fundamentalsを受講
準備が整ったら、[こちら](https://developer.nvidia.com/ja-jp/embedded/learn/jetson-ai-certification-programs#collapseTwo)のサイトに紹介されているJetson AI Fundamentalsを受講しました。
各コースを順に紹介します。

### NVIDIA Deep Learning Institute「Jetson Nano で AI を始める」(必須)
このコースでは、Jetsonのセットアップから簡単なリアルタイムの画像認識を体験することができます。機材が手元にあるものの、何から始めればよいかわからない初心者にとっては良きガイドとなるコースです。4つのハンズオンレッスンがあり、1レッスン当たり15分程度のビデオを見ながら、Jetsonの基本を学ぶことができます。このコースを終了すると終了証がもらえますが、これはJetson AI Specialistの認定を受けるために必須になりますので、必ず受講するようにしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363376/29b8b4c1-dfd4-8128-397b-960128838fce.png)

### JetBot(任意)
このコースでは、Jetsonを利用したAIロボットに関する知識を学ぶことができます。Jetsonにモーターを付け自立走行できるようにしたロボットにデータを学習させ、物体検出や衝突回避などの機能を実装させます。このコースは任意ですので、AIロボットの実装に興味がある方は参考にしてみると良いかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363376/3faa594c-ef06-a0af-f46a-effd6874008e.png)


### Hello AI World(任意)
このコースでは、リアルタイム画像分類、物体検出、セグメンテーションなどの実行方法を学ぶことができます。SSD-MobileNetなどの既存モデルを利用して、物体検出を体験することができます。また、独自のデータセットを作成してカスタムモデルを構築する方法についても学ぶことができます。このコースも任意ですので、必ず受講する必要はありませんが、私はこのコースで学んだ物体検出をベースにプロジェクトを作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363376/82e36b57-b9b1-ee53-fbb0-d0c140353544.png)


# 題材を決める
一通り、Jetsonの使い方について学びましたので、いよいよ自身のプロジェクトの作成に乗り出しました。しかし、実際にJetsonを活用したアプリケーションを作るとなると、どんなものを作ったらよいかということで悩みました。人間、基礎だけを学んでも、なかなかアイディアはわかないものです。そこで、何かしらのアイディアを獲得するために、Jetson Community Projectsを参考にしました。このページでは、Jetsonを活用した様々なプロジェクトを見ることができます。プロジェクトに関するGithubのソースやビデオが公開されており、インスピレーションを受けることがきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363376/7998322b-1022-36e1-4f3a-5e8d656ddd81.png)

[Jetson Community Projects](https://developer.nvidia.com/embedded/community/jetson-projects)

いろいろと参考した結果、私はダーツのスコアをAIで自動的に検出するアプリケーションを作ることにしました。プロジェクトの詳細については、下記リンクを参照してください。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363376/3f74f725-bf41-c0f2-805f-871605a571f1.png)

https://github.com/kawasaki-kento/darts-score-detection



# プロジェクト構築
### 構想
 題材が決まったので、実際にどうやってソリューションを構築したらよいかを考えました。例えば、「ダーツのスコアをAIで自動的に検出する」というのが、このプロジェクトのソリューションにあたるので、どういった技術が必要かやどんなデータが必要か、またどんな手順で作業を進めるべきかなどをすべて書き出しました。

### 試作・検証
 構想で検討した内容について、可能かどうかを実際に試して検証しました。具体的には、下記のようにプロジェクトを分解し、個別の要件について、想定通りの結果が得られるかどうかを確認しました。この段階で、不可能な事項があれば別の方法を検討しました。
 
 - 物体検出でできること、できないことの確認
 - 検出した物体の位置、バウンディングボックスの詳細な情報を取得することができるか
 - バウンディングボックスに表示させる情報を変えることができるか
 - 物体を検出するには質・量において、どのくらいのデータが必要か
 - アプリケーションとして十分な精度を出すためには、どのくらい学習させる必要があるか

この時点で、SSD-MobileNetから転移学習することで、ダーツボードの中心と矢を物体検出することに決めました。

### データを集める
 プロジェクトの見通しがついたので、モデルに学習させるデータを集めました。試作・検証によって、ダーツボードの中心とダーツボードに刺さる矢のデータが必要であることがわかっていたので、下記のようにダーツボードにランダムに矢を刺しデータを集めました。このデータ収集方法は「Hello AI World」で学びました。カメラでダーツボードを映した状態で、それぞれのラベルに対応したバウンディングボックスを重ね、アノテーションを行いました。この作業を約1,000回程度繰り返し、矢については計3,000件程度のデータを得ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363376/85c7c55a-f36c-88b3-7346-cd8d73f95567.png)


### 学習
 データが集まったので、SSD-MobileNetから転移学習を行いました。モデルの学習はJetsonでもできますが、パワーが小さいため、学習に時間がかかります。私はGPUマシンを持っていたので、データを移してデスクトップPCで学習しました。それでも半日くらいかかりました。ここでは、ダーツボードの中心とダーツボードに刺さった矢を検出するモデルを作成しました。
学習の詳細については[Github](https://github.com/kawasaki-kento/darts-score-detection)を参照してください。

```
   cd jetson-inference
   docker/run.sh
   cd python/training/detection/ssd
   python3 train_ssd.py
    --dataset-type=voc
    --data=data/darts_score_detection
    --model-dir=models/darts_score_detection
    --batch-size=16
    --workers=1
    --epochs=200
```

### 改善
 学習から得られたモデルで想定通りの物体検出ができました。しかし、モデルは物体検出はできても、その意味を理解することができません。このアプリケーションで言うと、ダーツボードに矢が刺さったことは検出できても、矢がどのスコアに刺さったのかは判定することができません。そこで、スコア判定には、この図のようにダーツボードの中心からの相対的な距離と角度を使うことにしました。

![how_it_works.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363376/90559301-a434-549c-feaa-49da5b54e842.png)


この方法でテストしたところ、ある程度スコアを正確に検出することができました。しかし、Single、Double、Tripleの判定では、誤検出が多く発生してしまいました。原因としては、DoubleとTripleのエリアが非常に小さいことと、DoubleのエリアがSingleに挟まれていることによるものだと考えられます。これを受けて、ダーツボードに刺さった矢の位置からSingle、Double、Tripleを推定するニューラルネットワークを別途構築しました。学習の詳細については[Github](https://github.com/kawasaki-kento/darts-score-detection)を参照してください。


### テスト
 最後にテストを実施し、アプリケーションとして機能するかどうかを確認しました。たまに矢を検出できなかったり、スコアの誤検出等もあったりしますが、Single、Double、Tripleの推定精度も改善しました。

 実際に動作する様子を下記のビデオで公開しています。
<iframe width="560" height="400" src="https://www.youtube.com/embed/-vZsrJF-Gak" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


### 資料作成
 Jetson AI Certificationに申請するにあたって、プロジェクトをドキュメントにまとめる必要があるため、Githubにまとめました。これについては、下記にリンクを載せていますので、実際に見てもらった方が早いかと思います。

https://github.com/kawasaki-kento/darts-score-detection/

資料のまとめ方については、題材を決める際に見た[Jetson Community Projects](https://developer.nvidia.com/embedded/community/jetson-projects)の例を参考にさせていただきました。

# 申請
プロジェクトが終わったころには、申請フォームがどこにあったか忘れてしまうかと思いますが、最初に紹介した[Jetson AI Certification](https://developer.nvidia.com/ja-jp/embedded/learn/jetson-ai-certification-programs)のページにあります。ここで、自身のプロジェクトを申請してください。
![スクリーンショット 2021-08-22 204306.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363376/5c2aaaf8-f2a9-1a2d-cc85-30513d0043b2.png)

Jetson AI Specialistの「プロジェクトを提出」をクリックすると必要情報を入力する欄が出てきますので、GithubやYouTube等のリンクをコピペしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363376/47c5b24d-04ca-9266-b6cc-a97b1cee211b.png)


また、[フォーラム](https://forums.developer.nvidia.com/)に投稿したリンクを入力する欄もありますので、あらかじめフォーラムに自分のプロジェクトを投稿しておくと良いかと思います。
申請後、私の場合は4日程度で、認定証が送られてきました。

# おわりに
以上、Jetson AI Specialistを取得するまでの過程を紹介してきましたが、最後にこのプロジェクトで苦戦した３つのことを紹介して、終わりたいと思います。

 - 題材を決めるのに時間がかかった
 - 十分な精度を得るだけのデータを集めるのが大変
 - PyTorchのモデルが動かないなど、Jetsonのメモリ不足問題に見舞われた

といった感じで、
Jetson AI Specialistは、入門者向けで親切なチュートリアルもあるのですが、その通りにやっていてもダメで、本格的にプロジェクトをやろうとすると応用力や発想力が必要になります。認定を受けるのに費用はかかりませんが、最後までやり抜く根気が求められますので、これから挑戦しようと思っている方は、ぜひ覚悟をもって臨んでください（特に初心者）。