MATLAB×深層学習×顕微赤外分光法

# はじめに
・これは、分析装置の計測データ処理の話です。
・機器分析のデータ処理をされている方、これからする予定の方、分析業界とは無関係ながら興味を持ってくださった皆様へ、参考になればうれしいです。
・ここでの分析機器は「顕微赤外分光光度計(以下、顕微FTIR)」。この計測データをMATLABで深層学習してみたら、意外といい分類精度が出たという内容です。

(！) 題名にある「顕微赤外分光法」とは、この顕微FTIRを使った分析手法のことです(最後に補足あり）

# MATLAB環境
MATLAB R2018b　(開発当時。R2019aでも動作)
＋Deep Learning Toolbox
＋Statistics and Machine Learning Toolbox
(＋Parallel Computing Toolbox (あれば処理高速化)) 


# 取り組み
##考えたこと:「深層学習」と「顕微赤外分光法」の美味しいとこどり

　外見は似ているが全く異なるものを見分けるために「深層学習」と「顕微赤外分光法」を使えたらと思いました。そこで、まず、これらの長所・短所を表にまとめてみました。

<img width="544" alt="比較75perc.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473633/9f9f001b-85e0-3d85-ff81-e57832521764.png">


　すると、２者の関係は長所・短所を相互補完しているようにも見えてきます。。。
そこで双方の美味しいとこどりをして、**「RGB画像(＝可視領域のデータ)を深層学習させるように、赤外領域の顕微FTIRの計測データを深層学習」**できないかと考えました。

##具体的に試したこと
市販の板チョコ2種類の計測データを、深層学習で分類できるか試してみました。
<img width="166" alt="チョコ2個袋から8perc.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473633/f3249b0f-b9d3-42c5-0731-19fe9f6a7acf.png">
写真は装置に塗る前の板チョコ。

##ポイント
RGB画像はR,G,Bの**3**チャンネル。
今回は赤外の波長領域、**236**波数のデータ。これを**236**チャンネルのイメージデータと捉えて、深層学習へ。
実際には入口のサイズを**3**から**236**にしただけ(↓のコードの*********で挟んだ部分)。

#コード
```matlab:
%% イメージデータストアの読み込み
% 次の「参考にしたコード」URL参照
load imds

%% データ(ラベル)を分割
numTrainingFiles = 0.8;%学習用 
numTestFiles = 0.1;%検証用(学習時)
[imdsTrain,imdsTest,imdsValid] = splitEachLabel(imds,numTrainingFiles,numTestFiles,'randomize');

%% ネットワーク構造の設定
imageSize = [16 16]; % 学習イメージ

%****************************
% inputSize = [imageSize 3]; %RGBの3チャンネル
inputSize = [imageSize 236]; %今回は236チャンネル(赤外領域236波数)
%****************************

numClasses = 2;%チョコ2種類

%% ネットワーク構造の定義
filterSize = 2; %畳み込みの大きさ
numFilters = 6; %畳み込みの数

layers = [
imageInputLayer(inputSize);

%畳み込み・正規化・ReLU・最大プールを３セット：
convolution2dLayer(filterSize,numFilters,'Padding',1,'Stride',1);
batchNormalizationLayer()
reluLayer()
maxPooling2dLayer([2 2],'stride',2)

convolution2dLayer(filterSize,numFilters,'Padding',1,'Stride',1);
batchNormalizationLayer
reluLayer()
maxPooling2dLayer([2 2],'stride',2)

convolution2dLayer(filterSize,numFilters,'Padding',1,'Stride',1);
batchNormalizationLayer
reluLayer()
maxPooling2dLayer([2 2],'stride',2)

%最後の3層
fullyConnectedLayer(numClasses);
softmaxLayer()
classificationLayer()

];

%% 学習オプションの設定
opts = trainingOptions('adam', ... 
'InitialLearnRate',0.001, ...
'MaxEpochs',200, ...
'MiniBatchSize',24,... 
'Plots', 'training-progress',...
'Shuffle','every-epoch',...
'ValidationData',imdsValid);

%% 学習
net = trainNetwork(imdsTrain,layers,opts);

%% 精度確認
% 未使用データ(imdsValid)を用いてnetの精度を確認
YPred = classify(net,imdsValid);
YValid = imdsValid.Labels;

%精度
accuracy = sum(YPred == YValid)/numel(YValid);

figure
plotconfusion(YValid,YPred) %混合行列表示

%% 結果の保存
saveas(gcf,'result.fig')%混合行列
save ('choco2Net','net')% 学習済みネット
```

#参考にしたコード
MATLABのドキュメンテーションにあった、超お役立ちサンプルコード。ほどよい解説付き。
[分類用のシンプルな深層学習ネットワークの作成](https://jp.mathworks.com/help/deeplearning/examples/create-simple-deep-learning-network-for-classification.html)

#結果
20回やりました。90%かそれ以上という分類精度が出ました。


<img width="552" alt="サイズ変更混合行列チョコ差し替え200perc.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473633/9197216c-3012-20fa-1837-6e3ccaef4713.png">


#まとめ
　顕微FTIRの計測データをMATLABでサクッと深層学習できました。分類精度も無事に、90%出ました。
　今回は正体が分かっているチョコでしたが、これを応用して、なにやら分からないものが来ても「これは〇〇社の製品△△だ！」なんて特定できるようになればいいな、などと思ったりします。
　以上です。ここまで読んでくださり、ありがとうございました。

#(補足)顕微赤外分光法について
サンプル内の成分分布の評価等を目的に幅広い分野で応用されている。
(光学)顕微鏡で可視画像が得られるように、顕微FTIRでは赤外イメージを取得できる。
※赤外スペクトル等々の話はここでは自粛。

##赤外イメージ
同じ波数での強度分布。波数の数＝枚数(例、今回は236波数なので236枚ある)。
![サイズ変更赤外イメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473633/d69f7cd5-3ee0-bac6-da9e-5d7ee5b3f6b0.png)