MATLABによる画像処理・コンピュータービジョン評価キットを使ってみる

# 目次へのリンク
[MATLABによる画像処理・コンピュータービジョン入門目次](https://qiita.com/tohruk/items/e5f7939b622bcf2e3c4c)
# MATLAB 画像処理・コンピュータービジョン評価キットとは？


Image Processing Toolbox&trade;やComputer Vision Toolbox&trade;の機能を網羅した例題集です。画像処理やコンピュータービジョンをこれからはじめる方が逆引き的に使用することができます。
下記のようなものが入っています。

   -  MATLAB&reg;/Simulink&reg;による画像の取り扱い(DICOM) 
   -  各種画像処理例(各種画像データ読み込み/2値化/幾何学変換/位置合わせ/フィルタ/モルフォロジー処理/セグメンテーション) 
   -  マルチコア/GPUコード生成/FPGA連携機能例/深層強化学習 
   -  コンピュータービジョン処理例(特徴点マッチング/動体検出/トラッキング/ステレオビジョン/LiDAR点群処理) 
   -  画像の機械学習処理例(SVM/線形判別) 
   -  ディープラーニング処理例(CNN/転移学習/Faster R-CNN/YOLO v2/SegNet/FCN/U-Net/3D CNN) 

# 必要な構成

   -  [MATLAB](https://jp.mathworks.com/products/matlab.html) R2019b以降 (必須) 
   -  [Image Processing Toolbox](https://jp.mathworks.com/products/image.html) (必須) 
   -  [Computer Vision Toolbox](https://jp.mathworks.com/products/computer-vision.html) (必須) 
   -  [Deep Learning Toolbox](https://jp.mathworks.com/products/deep-learning.html) (ディープラーニング系に必要) 
   -  [Parallel Computing Toolbox](https://jp.mathworks.com/products/parallel-computing.html) (GPU実行に必要) 
   -  [Statistics and Machine Learning Toolbox](https://jp.mathworks.com/products/statistics.html) (機械学習系に必要) 

# 評価キットを入手


まずは下記のコマンドで[GitHub](https://github.com/mathworks/MATLAB-IPCV-Eval-Kit-JP)からファイルをダウンロードします。verMatlabはバージョンに合わせて変えてくださいね。Gitに詳しい人はcloneしていただいてもOKです。


```matlab
verMatlab = "R2019b";
folderName = "MATLAB-IPCV-Eval-Kit-JP-"+verMatlab;
zipFileName = folderName+".zip";
if ~exist(zipFileName,"file")
websave(zipFileName,...
    "https://github.com/mathworks/MATLAB-IPCV-Eval-Kit-JP/archive/"+verMatlab+".zip");
end
```
# 解凍する


早速解凍してみましょう。


```matlab
if ~exist(folderName,"dir")
    unzip(zipFileName)
end
```
# MATLABプロジェクトを開く


プロジェクトファイルを開いてデモファイルのフォルダにパスを通します。


```matlab
open(fullfile(folderName,"IPCV_Eval_Kit.prj"));
```
# どんな機能があるか資料を見てみる


各機能を紹介するPDFが入っているのでざっと目を通してみましょう。気に入った例題があったら実行してみます。


```matlab
open("IPCV_Eval_kit.pdf");
```
# いくつか例題を動かしてみる


では例題を動かして動作を確認してみましょう。解説はなしでひたすら実行してみます。どんなデモがあるか見てもらえたらと思います。


## 歯車の欠けを検出

```matlab
I2_01_3_myGear_7g_J_short
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/6e440c13-b3eb-aac7-f62d-e3ff356c1737.png" alt="attach:cat" title="attach:cat" width=500px>

## ワッシャーを種類ごとに数える

```matlab
I2_09_0_myWashers7s_long
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/c215ada4-3c5c-8985-23a5-d5a42d824484.png" alt="attach:cat" title="attach:cat" width=500px>

## 特徴点マッチングによる物体検出

```matlab
I4_02_1_featureMatching_BRISK
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/8edc2073-23c8-c8a6-23ad-e985529a3d84.png" alt="attach:cat" title="attach:cat" width=500px>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/c4a4b740-a72d-d8c9-1ee7-138bcaa04e86.png" alt="attach:cat" title="attach:cat" width=500px>

## ポイントトラッカーによる顔の追尾

```matlab
I4_08_4_myFaceTrackingKLT
```

![figure_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/d5d83084-c1b1-8384-eaaf-d8195af7c82f.png)
![figure_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/3618119a-9005-6e75-64c8-a4851a6b6541.png)

## ステレオカメラのキャリブレーションと距離推定


```matlab
I4_09_2_myStereoCalibAndSceneReconst
```
![figure_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/ca09ac1b-7ba7-b5fd-e6a4-d553a20476fa.png =250x)
![figure_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/4c44ae70-dd92-4452-38ee-b34ed8e7d207.png)
![figure_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/6e417b40-d908-08c3-cff7-28306e0ab665.png)
![figure_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/55b05067-bea7-cc01-4f39-fe9195dba099.png)
![figure_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/295330e0-49ac-2d67-2bb1-dc43259b7d0c.png)
![figure_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/6852b19e-a82b-705c-a092-d5d94dba6146.png)


## 3次元点群の表示、セグメンテーション、レジストレーション

```matlab
I4_10_2_myPointCloudsExample
```

![figure_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/600152b9-b5de-0798-28e4-5c845f5e88e4.png)
![figure_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/33af07b8-d6c5-cfd4-aceb-66bfb3f37300.png)
![figure_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/94e74a65-4e23-c144-e036-9980cd1fb141.png)
![figure_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/b907ce18-7c03-413e-6dd4-8139c126a6b0.png)


## ディープラーニング(YOLO v2)による車両検出


※GPUなしだとかなり時間かかります

```matlab
I5_06_2_6_trainYOLOv2ObjectDetector
```
```
*************************************************************************
次のオブジェクト クラスに対する YOLO v2 オブジェクト検出器の学習:

* vehicle

学習データをチェック中...完了。
単一の CPU で学習中。
入力データの正規化を初期化しています。
｜＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝｜
｜　　エポック　　｜　　反復　　｜　　　　　経過時間　　　　　｜　　ミニバッチ　ＲＭＳＥ　　｜　　ミニバッチ損失　　｜　　基本学習率　　｜
｜　　　　　　　　｜　　　　　　｜　　（ｈｈ：ｍｍ：ｓｓ）　　｜　　　　　　　　　　　　　　｜　　　　　　　　　　　｜　　　　　　　　　｜
｜＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝｜
｜　　　　　　１　｜　　　　１　｜　　　　　００：００：１０　｜　　　　　　　　　３．８７　｜　　　　　　１５．０　｜　　０．００１０　｜
｜　　　　　　２　｜　　　３０　｜　　　　　００：０２：５３　｜　　　　　　　　　０．７８　｜　　　　　　　０．６　｜　　０．００１０　｜
｜　　　　　　４　｜　　　６０　｜　　　　　００：０５：４０　｜　　　　　　　　　０．６０　｜　　　　　　　０．４　｜　　０．００１０　｜
｜　　　　　　５　｜　　　９０　｜　　　　　００：０８：１８　｜　　　　　　　　　０．４１　｜　　　　　　　０．２　｜　　０．００１０　｜
｜　　　　　　７　｜　　１２０　｜　　　　　００：１０：５７　｜　　　　　　　　　０．４４　｜　　　　　　　０．２　｜　　０．００１０　｜
｜　　　　　　９　｜　　１５０　｜　　　　　００：１３：２９　｜　　　　　　　　　０．３３　｜　　　　　　　０．１　｜　　０．００１０　｜
｜　　　　　１０　｜　　１８０　｜　　　　　００：１６：０１　｜　　　　　　　　　０．３３　｜　　　　　　　０．１　｜　　０．００１０　｜
｜　　　　　１２　｜　　２１０　｜　　　　　００：１８：４７　｜　　　　　　　　　０．３２　｜　　　９．９ｅ－０２　｜　　０．００１０　｜
｜　　　　　１４　｜　　２４０　｜　　　　　００：２１：１９　｜　　　　　　　　　０．２９　｜　　　８．６ｅ－０２　｜　　０．００１０　｜
｜　　　　　１５　｜　　２７０　｜　　　　　００：２３：４８　｜　　　　　　　　　０．２７　｜　　　７．４ｅ－０２　｜　　０．００１０　｜
｜　　　　　１７　｜　　３００　｜　　　　　００：２６：２１　｜　　　　　　　　　０．２７　｜　　　７．１ｅ－０２　｜　　０．００１０　｜
｜　　　　　１９　｜　　３３０　｜　　　　　００：２８：５８　｜　　　　　　　　　０．２２　｜　　　５．０ｅ－０２　｜　　０．００１０　｜
｜　　　　　２０　｜　　３６０　｜　　　　　００：３１：２７　｜　　　　　　　　　０．２９　｜　　　８．４ｅ－０２　｜　　０．００１０　｜
｜　　　　　２２　｜　　３９０　｜　　　　　００：３４：００　｜　　　　　　　　　０．２４　｜　　　５．６ｅ－０２　｜　　０．００１０　｜
｜　　　　　２４　｜　　４２０　｜　　　　　００：３６：３３　｜　　　　　　　　　０．２０　｜　　　４．０ｅ－０２　｜　　０．００１０　｜
｜　　　　　２５　｜　　４５０　｜　　　　　００：３９：０２　｜　　　　　　　　　０．２２　｜　　　４．９ｅ－０２　｜　　０．００１０　｜
｜　　　　　２７　｜　　４８０　｜　　　　　００：４１：３４　｜　　　　　　　　　０．１８　｜　　　３．１ｅ－０２　｜　　０．００１０　｜
｜　　　　　２９　｜　　５１０　｜　　　　　００：４４：０５　｜　　　　　　　　　０．２３　｜　　　５．３ｅ－０２　｜　　０．００１０　｜
｜　　　　　３０　｜　　５４０　｜　　　　　００：４６：３５　｜　　　　　　　　　０．２５　｜　　　６．１ｅ－０２　｜　　０．００１０　｜
｜＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝｜
検出器の学習が完了しました。
*************************************************************************
```

![figure_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/d7ac8d78-2333-c588-a976-5aaca5740c23.png)
![figure_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/4eb4505b-f1dc-4f95-19ec-2b711f6184f3.png)


# まとめ


以上が[MATLAB 画像処理・コンピュータービジョン評価キット](https://github.com/mathworks/MATLAB-IPCV-Eval-Kit-JP)の使い方です。
どんなコードか気になった方はぜひダウンロードして試してみてくださいね。
何か面白いデモを見つけたり、作ったりしたらぜひコメントで教えてください。

# 謝辞

本記事は@eigsさんの[livescript2markdown](https://github.com/minoue-xx/livescript2markdown)を使わせていただいてます。