MATLAB Workshop ~ライントレースのシミュレーション~ イベントレポート

https://qiita.com/advent-calendar/2023/matlab

[MATLAB/Simulink Advent Calendar 2023](https://qiita.com/advent-calendar/2023/matlab)（シリーズ1）10日目の記事です. この記事では, 2023年に筑波大学と電気通信大学で行われた, MATLAB Student AmbassadorによるMATLAB Workshopのイベント内容を紹介します.

![line_follower_video2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/688dbc79-90d8-43ac-4dab-1b1a7fe1754f.gif)


## イベントで使用したファイルと実行環境について
[**イベントで使用したファイルはこちら（GitHub）**](https://github.com/HibiyaHaraki/ai-robotics-workshop)

https://github.com/HibiyaHaraki/ai-robotics-workshop

本コンテンツは, 以下の環境で実行できることを確認しています.

* MATLAB R2021a以降（**R2021a~R2023b**, 2023年11月27日現在）

また, 以下のToolbox及びSupport Packageが必要になります.

* [Simulink](https://jp.mathworks.com/products/simulink.html)
* [Image Processing Toolbox](https://jp.mathworks.com/products/image.html)
* [Computer Vision Toolbox](https://jp.mathworks.com/products/computer-vision.html)
* [Deep Learning Toolobx](https://jp.mathworks.com/products/deep-learning.html)
* [Robotics System Toolbox](https://jp.mathworks.com/products/robotics.html)
* [Simulink 3D Animation](https://jp.mathworks.com/products/3d-animation.html)
* [Deep Learning Toolbox Model for ResNet-18 Network](https://jp.mathworks.com/matlabcentral/fileexchange/68261-deep-learning-toolbox-model-for-resnet-18-network)
* (Optional) [MATLAB Report Generator](https://jp.mathworks.com/products/matlab-report-generator.html)
* (Optional) [Parallel Computing Toolbox](https://jp.mathworks.com/products/parallel-computing.html)

[本コンテンツ](https://github.com/HibiyaHaraki/ai-robotics-workshop)は日本語と英語に対応しています. 
[This content](https://github.com/HibiyaHaraki/ai-robotics-workshop) supports English and Japanese.

## MATLAB AI Robotics Workshopとの出会い
本記事を読んでくださっている皆様, こんにちは！私はMATLAB Student Ambassadorとして活動させていただいている電気通信大学大学院修士課程2年生です. 私は, 電気通信大学内外にてMATLABを普及するための活動を2年程してきました. そして, 3年目に突入した2023年4月, MATLAB EXPO 2023にてMATLAB Student Ambassadorsがブース展示のお手伝いをするために準備をしている際のことでした. MathWorks Japanのエンジニアの方から, こんなお言葉を頂きました.

> プログラミング初心者向けにMATLAB入門イベントを行うのもだいぶ慣れてきたみたいだし, 今度はMATLAB経験者向けに発展的なコンテンツを扱うイベントをやってみたら？

そして, 紹介していただいたコンテンツが[MATLAB AI Robotics Workshop](https://jp.mathworks.com/matlabcentral/fileexchange/91980-matlab-ai-robotics-workshop?s_tid=FX_rc3_behav)でした. これは, Deep Learningやロボットのシミュレーションといった興味深い内容をMATLABの様々な機能を使って行っていくコンテンツです. 他大学で既に利用された実績があり, 紹介していただいた時には, コンテンツとしてほぼ完成していました.

https://jp.mathworks.com/matlabcentral/fileexchange/91980-matlab-ai-robotics-workshop?s_tid=FX_rc3_behav

そこで, MATLAB Student AmbassadorのMATLAB普及活動の一環として, [MATLAB AI Robotics Workshop](https://jp.mathworks.com/matlabcentral/fileexchange/91980-matlab-ai-robotics-workshop?s_tid=FX_rc3_behav)を使ったイベントを行うことにしました.

## MATLAB AI Robotics Workshopの内容
MATLAB AI Robotics Workshopは, **ロボットのライントレースのシミュレーションを行う**コンテンツとなっています. しかし, 普通のライントレースと違う点が一点あります. それは, **ロボットに搭載されているカメラによって得られる前方の画像から, 転移学習により作成される回帰ネットワークによって制御を行う**という点です. これを行うために, 以下のような作業をMATLAB&Simulinkで行っていきます.

### 1. 学習用の動画を作成
まずは, [Simulink 3D Animation](https://jp.mathworks.com/products/3d-animation.html)で再現された仮想のコースにロボットがいると仮定して, 学習を行うための画像を取得します. 取得された画像はビデオとして1つのファイルにまとめて保存しておきます.
![genCourseTraj.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/8f96a138-fe0f-0da0-bae2-99d90446b9c0.png)

### 2. 動画のラベリング
次に, MATLABの[Video Labeler](https://jp.mathworks.com/help/vision/ref/videolabeler-app.html)アプリを用いて, 学習用のデータセットを作成していきます. 学習用に作成した動画の各フレームが入力された際に, ロボットが向かうべき方向を指定していきます.
![annotateVideo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/ed4c10fc-412f-e8ec-cf4e-6145f6deb815.png)

### 3. 回帰ネットワークの構築と学習
作成した学習用のデータセットを用いて転移学習を行い, ライントレースにおいてロボットが向かうべき方向を推定する回帰ネットワークを作成します. まず, 学習を行うためにデータセットの水増し(Augmentation)を行います. その後, 事前学習済ネットワークである[ResNet-18](https://jp.mathworks.com/help/deeplearning/ref/resnet18.html)の入出力に対して, [ディープネットワークデザイナー](https://jp.mathworks.com/help/deeplearning/ref/deepnetworkdesigner-app.html)を用いて変更を加えて, 回帰ネットワークにします. このネットワークと作成した学習用のデータセットを用いて転移学習を行います.
![trainWhiteLine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/107ecabf-d9e2-0146-cb79-0dd76619ca08.png)
私自身がMATLABでのDeep Learningに関する知識を多く有しているわけではなかったので, [ディープラーニング入門](https://matlabacademy.mathworks.com/jp/details/deep-learning-onramp/deeplearning)や[MATLABによるディープラーニング](https://matlabacademy.mathworks.com/jp/details/deep-learning-with-matlab/mldl)に取り組みました. そして, [datastore](https://jp.mathworks.com/help/matlab/datastore.html)等, コンテンツを理解するのに必要な知識を勉強しました.

### 4. システムシミュレーション
最後に, 作成した回帰ネットワークを制御器として組み込んで, Simulinkでシミュレーションを行います. このシミュレーションは転移学習により作成された回帰ネットワークが制御器に組み込まれることで, 自分で作った学習用のデータセットに基づいて走るロボットがどの程度正確に白線をたどるかを確認します.
![line_follwer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/9f56d920-1831-9e41-ebab-f752fec55566.png)

これらのコンテンツが[MATLABのプロジェクト](https://jp.mathworks.com/help/matlab/matlab_prog/create-projects.html)としてまとめられており, 必要なToolboxのインストール等を行えば, 各ファイルのPATHを気にすることなく, すぐに実行することが可能です.

## MATLAB AI Robotics Workshopへのコンテンツの追加
ここまで紹介した通り, MATLAB AI Robotics Workshopは, MathWorksのエンジニアの方によって, コンテンツとして既に完成されていました. しかし, MATLAB Student Ambassadorがこのコンテンツを用いてイベントを行うためには, もう少し工夫をする必要がありました.

### 事前準備の案内
本コンテンツはMATLABの様々な機能を使うため, 必要なToolboxの数も多くなっています.

* [Simulink](https://jp.mathworks.com/products/simulink.html)
* [Image Processing Toolbox](https://jp.mathworks.com/products/image.html)
* [Computer Vision Toolbox](https://jp.mathworks.com/products/computer-vision.html)
* [Deep Learning Toolobx](https://jp.mathworks.com/products/deep-learning.html)
* [Robotics System Toolbox](https://jp.mathworks.com/products/robotics.html)
* [Simulink 3D Animation](https://jp.mathworks.com/products/3d-animation.html)
* [Deep Learning Toolbox Model for ResNet-18 Network](https://jp.mathworks.com/matlabcentral/fileexchange/68261-deep-learning-toolbox-model-for-resnet-18-network)
* (Optional) [Parallel Computing Toolbox](https://jp.mathworks.com/products/parallel-computing.html)

このToolboxやSupport Packageのインストール方法を参加者全員に説明するのは, 週5時間勤務のStudent Ambassadorにとっては非常に多くの労力を割かなければならない作業です. そこで, 参加者の事前準備作業をお手伝いするスクリプトを組み込みました. これにより, 参加者は自分のMATLAB環境でワークショップが行えるかを確認できます. また, もしワークショップに必要なアドオン製品のインストールが出来ていない場合, どの製品をインストールする必要があるのかを知ることもできます.

<details>
<summary>参加者の事前準備作業をお手伝いするスクリプト</summary>

ここに記載するスクリプトはこちらの[check_addons_jp.mlx](https://github.com/HibiyaHaraki/ai-robotics-workshop/blob/main/src/000_help/check_addons_jp.mlx)にあります.

* **MATLABのバージョン確認**

```matlab:src/000_help/check_addons_jp.mlx
MATLAB_VER_FLAG = false;
matlab_ver = ['R' version('-release')];
if (isMATLABReleaseOlderThan("R2021a"))
    fprintf("MATLAB version: %s\n",matlab_ver);
    warning("このMATLABはワークショップで行う作業に対応していません.");
else
    MATLAB_VER_FLAG = true;
    fprintf("MATLAB version: %s\n",matlab_ver);
    disp("このMATLABはワークショップの作業に対応しています.");
end
```

* **Toolboxの確認**

```matlab:src/000_help/check_addons_jp.mlx
TOOLBOX_FLAG = false;
necessary_toolbox_list = [
    "Simulink";
    "Image Processing Toolbox";
    "Computer Vision Toolbox";
    "Deep Learning Toolbox";
    "Robotics System Toolbox";
    "Simulink 3D Animation"
    ];

% Create Installed toolbox list
toolboxes = ver;
installed_toolbox_list = string(zeros(length(toolboxes),1));
for ii = 1:length(toolboxes)
    installed_toolbox_list(ii) = string(toolboxes(ii).Name);
end

% Check
check_result = false(length(necessary_toolbox_list),1);
for ii = 1:length(necessary_toolbox_list)
    check_result(ii) = any( ...
        installed_toolbox_list == necessary_toolbox_list(ii) ...
    );
end

% Show result
if (all(check_result))
    TOOLBOX_FLAG = true;
    fprintf("ワークショップに必要なToolboxは既にインストール済みです.\n");
else
    warning("以下のToolboxがインストールされていません.\n")
    for ii = 1:length(check_result)
        if (~check_result(ii))
            fprintf("* %s\n",necessary_toolbox_list(ii));
        end
    end
end
```

* **サポートパッケージの確認**

```matlab:src/000_help/check_addons_jp.mlx
try
    net = resnet18;
    fprintf("ResNet18は既にインストールされています.");
    SUPPORT_PACKAGE_FLAG = true;
catch
    warning("Deep Learning Toolbox Model for ResNet-18 Networkのインストールが必要です!!");
    SUPPORT_PACKAGE_FLAG = false;
end
```

* **事前準備の確認**
最後に, ここまでの確認の結果, 対応が必要な事項をリストアップします.

```matlab:src/000_help/check_addons_jp.mlx
READY = true;
if (~MATLAB_VER_FLAG)
    READY = false;
    fprintf("MATLAB version: %s\n",matlab_ver);
    warning("MATLABのバージョンについて確認が必要です.");
end
if (~TOOLBOX_FLAG)
    READY = false;
    warning("まだインストールされていないToolboxがあります.");
    for ii = 1:length(check_result)
        if (~check_result(ii))
            fprintf("* %s\n",necessary_toolbox_list(ii));
        end
    end
end
if (~SUPPORT_PACKAGE_FLAG)
    READY = false;
    warning("Deep Learning Toolbox Model for ResNet-18 Networkのインストールが必要です!!");
end
if (READY)
    fprintf("おめでとうございます!\n");
    fprintf("事前準備は完了です!\n");
    spy
else
    fprintf("まだ, 事前準備が完了していません.\n");
end
```
</details>

### コンテンツ理解の促進のためのセクション実行時の補足説明の表示
本コンテンツは, MathWorksエンジニアによって既に必要なスクリプトが記載されたライブスクリプトを配布します. そして, 参加者がライブスクリプトのセクションを順番に実行していくことでシミュレーションを行っていきます. もちろん, ライブスクリプトにはシミュレーションや転移学習に必要な知識を示すための説明があります. しかし, 参加者にとってはセクションを実行していくだけの作業になりかねません. せっかく貴重な時間を割いてワークショップに参加して頂くのに, ただMATLABスクリプトを実行するだけで終わってしまったらもったいない... 

そこで, **各セクションを実行した後に, そのセクションのスクリプトで何をしているのかを説明するテキストを表示させる**ようにしました. これはRPGから着想を得たもので, 自分が行動を起こした後にその説明を読むことで, スクリプトで行っている作業内容の理解を促すことを目的としています.
![output_message_video2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/ca6455f7-a5d8-740e-23d9-ed9d47ba88f9.gif)

こちらは, MathWorksの方に

> 自分が何をしているのか俯瞰できていいと思う

というお言葉をもらうことができたこともあり, ワークショップのコンテンツとして採用しました.

### MATLAB経験によるコンテンツを進める速度の違いへの対策
発展的なコンテンツを用いたイベントを行う際に気を付けなければならないのが, 参加者ごとにコンテンツを進める速度に違いがあることです. 参加者の中には, MATLABを研究で毎日使用している方もいれば, つい最近MATLABを使い始めた方もいらっしゃいます. 当然, MATLABを普段から使いこなしている方は本コンテンツも素早く理解して進めていくことができます. 反対に, MATLABを最近使い始めた方にとっては, ライブスクリプトを見るのも初めてかもしれません.

そこで, できるだけ多くの参加者に満足していただくために, いくつかの追加コンテンツを用意しました. 

* **MATLAB初心者向けコンテンツ**
    * MATLABにおけるToolboxのインストール方法を説明したライブスクリプト
    * MATLABライブスクリプトの実行方法を説明したライブスクリプト
![how_to_use_livescript.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/6724892f-4d39-2154-7ed5-39a534643612.png)
    * MATLABにおいてアニメーションを作成する方法を説明したライブスクリプト
* **MATLAB経験者向けコンテンツ**
    * シミュレーション結果からアニメーションを作成するライブスクリプト
![evaluate_result_video.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/be848f0c-83c6-5645-eee5-6bda2b7b945c.gif)
    * 転移学習で作成したネットワークに対して[Grad-CAMを用いた予測の理解](https://jp.mathworks.com/help/deeplearning/ug/gradcam-explains-why.html)を行うライブスクリプト
![check_annotation_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/5a9ffd6e-efd4-963b-cfa8-cce38b6dd6cf.png)
    * [MATLAB Report Generator](https://jp.mathworks.com/products/matlab-report-generator.html)を用いて, シミュレーション結果に関するレポートの自動作成を行うライブスクリプト
![generate_report.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/7193c738-3962-204b-02fe-29a5137389a7.png)

### 英語対応
もちろん参加者の中には留学生の方もいらっしゃいました. また, MathWorksエンジニアが作成されたMATLAB AI Robotics Workshopも英語対応がされていたことから, 私がオリジナルで追加したファイルについても, できる限り, 英語対応を行いました.

## MATLAB Workshopの開催
MathWorksの方に協力していただき, 2023年12月1日に電通大にてMATLAB Workshopを開催しました. また, MathWorksの方からお誘いを受け, 2023年11月30日に行った筑波大でのMATLAB Workshopにおいても同じイベントに講師として参加しました.

### 2023/12/1 AI+Simulation Workshop @ 電気通信大学
電気通信大学のイベントでは「普段使っているMATLABが社会ではどのように使われるのかについて, その一端を体験してみよう！」ということで, MATLAB&Simulinkでのシミュレーションを行うことを目的としたイベントを行いました. 

最初にMathWorksのエンジニアの方に「これまでのキャリアの中でどのようにMATLABを使用してきたか」についてご講演をしていただきました. その後, Workshopのコンテンツに取り組んでいきました.


<details>
<summary>電気通信大学でのイベントの詳細</summary>

**電気通信大学でのイベントのポスター**
![Dec2023_SimulationWorkshop_poster_latest_SNS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/e172f13c-2d44-bcb4-bd82-ca5200a248a0.jpeg)

**電気通信大学でのイベントのアジェンダ**
担当: MATLAB Student Ambassador 1名
| 時間 | コンテンツ |
|:-:|---|
| 16:30~16:35 | 事前準備（MATLABやToolboxのインストール）の確認  |
| 16:35~17:00 | MathWorksエンジニアによる「MATLAB×キャリア」オンライン講演 |
| 17:00~17:15 | ワークショップ内容の解説 |
| 17:15~18:50 | ワークショップ |
| 18:50~19:00 | 振り返り, アンケート, ギフト配布 |

**電気通信大学でのイベントで生じたトラブル**

* [Video Labeler](https://jp.mathworks.com/help/vision/ref/videolabeler-app.html)や[ディープネットワークデザイナー](https://jp.mathworks.com/help/deeplearning/ref/deepnetworkdesigner-app.html)といったアプリがフリーズしてしまう.
 → MATLABを再起動して作業を再開.
* 画像へのPATHの作成に不具合が生じてしまい, 正しく画像を抽出することができなくなってしまった.
→ 代替PCを用いて作業を続行
* Simulinkを開くのに長大な時間を要してしまう
→ 他の参加者にお願いをして, 2人で1台のPCを使用していただいた.
* ai_robotics_workshop.prjを実行してもメニューが現れない.
→ ファイル破損が原因と推測したため, 新しくワークショップに必要なファイルをダウンロードしていただき再開

</details>

### 2023/11/30 AI+Robotics Workshop @ 筑波大学
筑波大学でのイベントでは「AIや画像処理といった最新技術をMATLABを用いて経験していく」ことを目的として, MATLABによる深層学習を組み込んだワークショップイベントの講師を務めさせていただきました. 

筑波大学は電気通信大学とは異なり, 学生数が多い総合大学であることから, ワークショップの前日に筑波大学のMATLAB Student AmbassadorによるMATLAB入門イベントを開催していただきました. そして, ワークショップ当日は, MathWorksエンジニアによるロボットのライントレースのデモを行っていただいた後にワークショップを行っていきました.

![IMG_3374.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/78033583-cef2-35bd-f75a-2eaca1dbae37.jpeg)

<details>
<summary>筑波大学でのイベントの詳細</summary>

**筑波大学でのイベントのポスター**
![F9avXxmbYAAiRkL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/a420557d-6387-2bf9-699d-6285f454e862.jpeg)
筑波大学のMATLAB Student Ambassadorがポスターを作成されました. 電気通信大学でのイベントのポスターはこちらのデザインを真似して作らせていただきました.

**筑波大学でのイベントのアジェンダ**
担当: MATLAB Student Ambassador 2名, MathWorks Japan エンジニア 2名
| 時間 | コンテンツ |
|:-:|---|
| 14:00~14:15 | MathWorksエンジニアによるロボットのライントレースのデモ |
| 14:15~14:30 | ワークショップ内容の解説 |
| 14:30~16:50 | ワークショップ |
| 16:50~17:00 | 振り返り, アンケート, ギフト配布 |

**筑波大学でのイベントで生じたトラブル**

* [Video Labeler](https://jp.mathworks.com/help/vision/ref/videolabeler-app.html)や[ディープネットワークデザイナー](https://jp.mathworks.com/help/deeplearning/ref/deepnetworkdesigner-app.html)といったアプリがフリーズしてしまう.
 → MATLABを再起動して作業を再開.
* Add-on explorerが開かず, インストールが行えない
→ 用意していた代替PCにより作業を開始
* ラベリングしたデータ（exportedLabels.mat）をMATLABで読み込めない
→ [Video Labeler](https://jp.mathworks.com/help/vision/ref/videolabeler-app.html)を使った作業の最後に「保存」ではなく「エクスポート」をしていただくことで解決
</details>

## まとめ
今回は, 2023年に筑波大学と電気通信大学で開催したMATLAB Workshopについて紹介しました. 

ワークショップではMathWorksのエンジニアの方が作成された[MATLAB AI Robotics Workshop](https://jp.mathworks.com/matlabcentral/fileexchange/91980-matlab-ai-robotics-workshop?s_tid=FX_rc3_behav)をMATLAB Student Ambassadorが開催するイベント用に変更したファイルを用いて, Deep Learningにより作成された制御器によるロボットのライントレースのシミュレーションを実施しました.

両方のイベントにおいて, 全ての参加者がSimulinkでシミュレーションを実行できました. 中には, 用意されたSimulinkのブロックをいじって, 高速な走行でも正確に白線をたどるシステムを作成されている方もいらっしゃいました. イベントを開催する側の一員として, 参加者の皆さんが思い思いに楽しんでいただけているようでほっとしました！ 

課題としては, 社会人を経験していない学生が本イベントを行うと, [Interface2023年8月号](https://interface.cqpub.co.jp/magazine/202308/)やMATLAB EXPOで仕入れたMBD等の知識はあっても「**シミュレーションがどれだけ重要な技術であるか**」に関する説得力のある説明を行うのは難しいと感じました. もし次回があれば, どんどんMathWorksのエンジニアを頼っていこうと考えています.