画像解析をCNNで行う場合で,画像を畳み込む時に用いるフィルターの決め方について3点ご教授ください.
フィルターの種類には,エッジ抽出,コーナー抽出,ぼかし(平滑化)等,いろいろなものがあると思います.
<1点目の質問>
どのフィルターを用いるのかは,画像の特徴を考慮して,分析者(つまり,人間)が経験的に決めるのでしょうか.また,その場合には,いろいろなフィルターを単独,もしくは組み合わせで試してみて,最も良さそうなものを分析者が採用するのでしょうか.
<2点目の質問>
1点目の質問に関係しますが,畳み込むフィルターは単独で用いるのか,複数を組み合わせて用いるのか,事前に決める方法はあるのでしょうか.もしくは,いろいろ試してみて経験的に決めるのでしょうか.
<3点目の質問>
CNNの専門書を読むと,近年ではフィルター自体を機械学習して自動的に決定する,という記述があるのですが,そこで決定されたフィルターとは,どのような特徴を抽出しているのでしょうか.前述したエッジ抽出やコーナー抽出等とは,概念的に全く異なるフィルターとなるのでしょうか.
論点が抽象的で申し訳ないですが,詳しい方,ご教授いただけると幸いです.
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
どのフィルターを用いるのかは,画像の特徴を考慮して,分析者(つまり,人間)が経験的に決めるのでしょうか.また,その場合には,いろいろなフィルターを単独,もしくは組み合わせで試してみて,最も良さそうなものを分析者が採用するのでしょうか.
損失関数の最小化のために重みを調整する過程で、フィルターの値は自動で決まります。
画像を正しく認識するためには、画像からエッジや色といった特徴を適切に抽出できるフィルターが必要であるため、結果として、人が設計した微分フィルタ や ガボールフィルタ に似たフィルタも見られます。
<2点目の質問>
1点目の質問に関係しますが,畳み込むフィルターは単独で用いるのか,複数を組み合わせて用いるのか,事前に決める方法はあるのでしょうか.もしくは,いろいろ試してみて経験的に決めるのでしょうか.
各レイヤーで何種類のフィルタを使用するかはハイパーパラメータであり、人が決めます。
畳み込み層の出力数がそのパラメータに該当します。
CNNの専門書を読むと,近年ではフィルター自体を機械学習して自動的に決定する,という記述があるのですが,そこで決定されたフィルターとは,どのような特徴を抽出しているのでしょうか.前述したエッジ抽出やコーナー抽出等とは,概念的に全く異なるフィルターとなるのでしょうか.
畳み込みで出力を計算するという点は、ガウシアンフィルタ、微分フィルタといった画像処理のフィルタリングと同じです。
人手でフィルターを設計する場合、どのようなフィルターを使うのがよいかを考えるのは難しいと思いますが、そのフィルターを学習で自動で設計できるというのが CNN の特徴です。
参考 Pytorch でフィルターを可視化する例
VGG16 の第1層目の64枚のフィルタ及び出力を可視化する例です
python
1import matplotlib.pyplot as plt 2import numpy as np 3import torch 4import torchvision 5from PIL import Image 6from torchvision import transforms 7 8# デバイスを選択する。 9device = torch.device("cuda") 10 11# モデルを作成する 12model = torchvision.models.vgg16(pretrained=True).to(device) 13target_layer = model.features[0] 14 15# Transforms を作成する 16transform = transforms.Compose( 17 [ 18 transforms.Resize(256), 19 transforms.CenterCrop(224), 20 transforms.ToTensor(), 21 transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), 22 ] 23) 24 25# 画像を読み込む 26img = Image.open("sample.jpg") 27inputs = transform(img) 28inputs = inputs.unsqueeze(0).to(device) 29 30# hook を登録 31def hook(module, inputs, outputs): 32 global conv1_outputs 33 conv1_outputs = outputs 34 35 36target_layer.register_forward_hook(hook) 37 38# 推論する 39model.eval() 40model(inputs) 41 42 43def tensor_to_image(x): 44 # Convert a Tensor to a ndarray. 45 x = x.cpu().detach().numpy() 46 # Transpose axis from (C, H, W) to (H, W, C) 47 x = x.transpose(1, 2, 0) 48 # Convert a range of values to [0, 1]. 49 x = (x - x.min()) / (x.max() - x.min()) 50 # Convert a range of values from [0, 1] to [0, 255]. 51 x = np.uint8(x * 255) 52 53 if x.shape[2] == 1: 54 # Convert shape from (H, W, 1) to (H, W). 55 x = x.squeeze(2) 56 57 return x 58 59 60# フィルターと特徴量を画像化する。 61weight_imgs, feature_imgs = [], [] 62for weight, feature in zip(model.features[0].weight, conv1_outputs[0]): 63 weight_imgs.append(tensor_to_image(weight)) 64 feature_imgs.append(tensor_to_image(feature.unsqueeze(0))) 65 66# 描画する。 67cols = 4 68rows = round(len(imgs) / 4) 69 70fig = plt.figure(figsize=(10, 3 * rows)) 71for i in range(len(weight_imgs)): 72 ax1 = fig.add_subplot(rows, cols, i * 2 + 1) 73 ax1.imshow(weight_imgs[i]) 74 ax1.set_axis_off() 75 76 ax2 = fig.add_subplot(rows, cols, i * 2 + 2) 77 ax2.imshow(feature_imgs[i], cmap="gray") 78 ax2.set_axis_off()
微分フィルタだったり、目の部分だけ抽出するフィルタだったり、多様なフィルタがあって見ていて興味深いです。
投稿2020/07/04 04:06
総合スコア21956
0
<1>
どれも違います
<2>
たくさんのフィルタが組み合わされます
<3>と「フィルターの種類には,エッジ抽出,コーナー抽出,ぼかし(平滑化)等,いろいろなものがあると思います」
どれもパラメータだけが違う同じ計算で実装されていますね。
CNNの学習の過程で問題をうまく解けるようにフィルタのパラメータが学習されていきます。
そのフィルタがどんな特徴を抽出してるかは人間の解釈です。
投稿2020/07/04 03:49
編集2020/07/04 03:51総合スコア11235
0
1点目の質問について
これはCNNではなく一般的な画像処理に対する質問と認識しました。どのフィルタを用いるかは適用する分野によって各々ノウハウがあります。その意味では分析者が試行錯誤の上、経験的に決めていたと言っても良いでしょう。
2点目の質問について
フィルタは単独でも用いますが、複数組み合わせて使うことも多いです。事前に決めらるれかについては、フィルタの中でも較正に使われるもの(輝度補正・幾何学補正)は使用するセンサーに依存しますので自由度はほとんどありませんので事前に決められる種類のフィルタです。その先のエッジ抽出やボカシなど見た目の特徴を変化させるフィルタ、何か特徴的なものを抽出するためのフィルタは、これこそが門外不出の組み合わせであったので、事前に決まらないものだと思います。
3点目の質問について
CNNが作り出すフィルタは、学習用に用意した画像から逆伝搬によって生み出されたものです。そのため出力層に近いほど複雑な形(出力層に近い形)をしており、伝言ゲームの末にたどり着いた入力層付近では曖昧なものとなっています。実際にフィルタ画像を見ると、エッジ抽出やコーナー抽出に近いフィルタは入力層付近にあります。何をもって概念的に同じフィルタなのかというのが難しいですが、ある特徴を強調するという意味では同じフィルタですが、アルゴリズム的な裏付けから作られたフィルタではないという意味では全く異なる概念です。
参考URL
投稿2020/07/04 04:17
総合スコア1615
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/05 00:13
2020/07/05 04:44 編集
2020/07/05 05:21