手習ひデジタル信号処理(174) Scilab、{IPCV}、Lenetの特徴マップ表示

Joseph Halfmoon

ScilabのIPCVツールボックス関数を練習中。前回はDeep Learningの学習済パラメータを周波数領域で表示する関数2種を使用。しかし空間領域の表示関数はHelp例通りなのに動作せず。どゆこと?今回は特徴マップの表示を行ってみます。今回「も」専用関数不調。仕方がないので、他の表示関数でお茶を濁しました。

※「手習ひデジタル信号処理」投稿順 Indexはこちら

※Windows11上の    Scilab2024.0.0およびScilab上のScilab IPCVツールボックスを使用させていただいております。

特徴マップの表示

特徴マップ(フィーチャーマップ)は、前回のパラメータ共を「フィルタ」とみなせば、入力画像をそれらフィルタに通過させた結果に当たる中間データです。例えば今回処理例で練習しているLenetの場合、コンボリューションレイヤは2層しかなく、その1層目には6種類の「フィルタ」が学習されてます。その学習済のパラメータを前回はdnn_getparam関数にてとりだし、dnn_showparamf2d関数で周波数ドメインで表示してみたわけです。ただし、パラメータを空間領域表示できる筈のdnn_showparam関数は動作せずでした。ううむ。

今回は、学習済のパラメータではなく、そのパラメータを使って入力画像にフィルタした結果である特徴マップの方を取り出して眺めてみたいと思います。フィーチャーマップそのものは、dnn_forward関数に適切なレイヤの値を与えれば数値(テンソル)として取り出すことができます。しかし、表示を行うためのdnn_showfeature関数も不調っす。表示できまっせん。

まあ数値そのものは取り出せるので、他の関数、ここでは行列をプロットするためのMatplot関数でプロットしてお茶を濁したい、と思います。なお、

    1. Matplot関数は2次元の行列用のプロット関数であり、dnn_forward関数が返してくる3次元、4次元などのテンソル的なものはプロットできないのでイチイチ2次元行列に切り出してから渡さないとならない。
    2. Matplot関数はカラーマップに設定されている範囲の値に対して色づけ表示する。範囲を超えたら(上でも下でも)白く抜けてしまう。dnn_forward関数が返してくる数値はそこそこダイナミックレンジの広い浮動小数点数なので表示カラーマップを適宜調整する必要がある。また、カラーマップは0から正の値に対して働くので、負の数を含むフィーチャーには「ゲタを履かせる」ような操作も必要。

という制約があります。そこでダラダラと上記の対策を盛り込んだ表示例生成コードを書きました。内容的には、Lenetに手書き文字「3」と手書き文字「4」の画像を食わせたときの第1のコンボリューションレイヤの出力するフィーチャーマップを表示する例デス。

dnn_unloadallmodels
dnn_path = fullfile(getIPCVpath(),'images','dnn');
net = dnn_readmodel(fullfile(dnn_path,'lenet5.pb'),'','tensorflow');
S3 = imread(fullfile(dnn_path,'3.jpg'));
out3 = dnn_forward(net,~S3,[28,28],"conv2d/Conv2D");
orgmax3=ceil(max(out3));
orgmin3=floor(min(out3));
siz3=size(out3);
smx=abs(orgmin3)*ones(siz3(1), siz3(2));
clf(1);
f3=scf(1);
f3.color_map=jetcolormap(orgmax3-orgmin3);
subplot(231);Matplot(out3(:,:,1)+smx);
subplot(232);Matplot(out3(:,:,2)+smx);
subplot(233);Matplot(out3(:,:,3)+smx);
subplot(234);Matplot(out3(:,:,4)+smx);
subplot(235);Matplot(out3(:,:,5)+smx);
subplot(236);Matplot(out3(:,:,6)+smx);
S4 = imread(fullfile(dnn_path,'4.jpg'));
out4 = dnn_forward(net,~S4,[28,28],"conv2d/Conv2D");
orgmax4=ceil(max(out4));
orgmin4=floor(min(out4));
siz4=size(out4);
smx=abs(orgmin4)*ones(siz4(1), siz4(2));
clf(2);
f4=scf(2);
f4.color_map=jetcolormap(orgmax4-orgmin4);
subplot(231);Matplot(out4(:,:,1)+smx);
subplot(232);Matplot(out4(:,:,2)+smx);
subplot(233);Matplot(out4(:,:,3)+smx);
subplot(234);Matplot(out4(:,:,4)+smx);
subplot(235);Matplot(out4(:,:,5)+smx);
subplot(236);Matplot(out4(:,:,6)+smx);
dnn_unloadallmodels();
Feature Map例

まずは、手書き文字「3」を食わせた場合がこちら。FeatureMap3

もっと何だか分からん図形を期待してしまっていたのだけれども、最初の層は結構、入力画像そのままかもしれない。ちなみに入力画像が以下に。input3

上下、左右、表裏の違いは有れどコンボリューションレイヤ第1層はフツーにフィルタっぽい挙動。

手書き文字4を食わせてみた結果が以下に。FeatureMap4

これまた「4」の面影ある。漫然と特徴マップを眺めていてもなんのこっちゃなんだが、動かなかった関数の代わりになった?

手習ひデジタル信号処理(173) Scilab、{IPCV}、Lenetのパラメータの表示 へ戻る

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です