質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

7706閲覧

畳み込みニューラルネットワーク(CNN)におけるフィルターの決め方

jonaromu

総合スコア7

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

2クリップ

投稿2020/07/04 02:31

画像解析をCNNで行う場合で,画像を畳み込む時に用いるフィルターの決め方について3点ご教授ください.
フィルターの種類には,エッジ抽出,コーナー抽出,ぼかし(平滑化)等,いろいろなものがあると思います.
<1点目の質問>
どのフィルターを用いるのかは,画像の特徴を考慮して,分析者(つまり,人間)が経験的に決めるのでしょうか.また,その場合には,いろいろなフィルターを単独,もしくは組み合わせで試してみて,最も良さそうなものを分析者が採用するのでしょうか.

<2点目の質問>
1点目の質問に関係しますが,畳み込むフィルターは単独で用いるのか,複数を組み合わせて用いるのか,事前に決める方法はあるのでしょうか.もしくは,いろいろ試してみて経験的に決めるのでしょうか.

<3点目の質問>
CNNの専門書を読むと,近年ではフィルター自体を機械学習して自動的に決定する,という記述があるのですが,そこで決定されたフィルターとは,どのような特徴を抽出しているのでしょうか.前述したエッジ抽出やコーナー抽出等とは,概念的に全く異なるフィルターとなるのでしょうか.

論点が抽象的で申し訳ないですが,詳しい方,ご教授いただけると幸いです.

fana👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jonaromu

2020/07/05 00:13

tiitoi様 いつもご回答いただき,また今回は事例まで添付していただき,ありがとうございます. 添付いただいた事例について,さらに1点,質問させてください. 猫の入力画像1枚に対して,16種類(or 32種類?)の処理画像がありますが,これは16種類(or 32種類?)のフィルターを用いているということでしょうか. また,これらのフィルターは分析者が用意(設計)したのか,もしくは,CNNで自動的に機械学習した結果のフィルターなのでしょうか. CNNの根本を分かっておらず,論点がずれていたら恐縮ですが,宜しくお願いします.
tiitoi

2020/07/05 04:44 編集

> 16種類(or 32種類?)の処理画像がありますが,これは16種類(or 32種類?)のフィルターを用いているということでしょうか. VGG16 の一番入力層に近い畳み込み層にはサイズが (3, 3) のフィルタが64種類あり、図はフィルタを値に応じて可視化したもの (左, 1列目、3列目) と入力に対して、フィルタを適用した結果を可視化もの (右, 2列目, 4列目) になります。「猫の入力画像に対して、CNN が設計したフィルタ (左) を適用したら、右の出力が出てきた」という図です。フィルタ64種類全部は多いのでそのうち、16種類だけアップしました。 > これらのフィルターは分析者が用意(設計)したのか,もしくは,CNNで自動的に機械学習した結果のフィルターなのでしょうか. CNN の学習によって、自動的に設計されたフィルタです。 人がフィルタのサイズと種類だけ指定しておくと、学習によって自動的にフィルタが設計されます。 各フィルタがどのようなものになるかについて、人手は介在しません。
jonaromu

2020/07/05 05:21

なるほどです. とても分かりやすく,かなりクリアになりました. フィルター自体を機械学習で決めるという発想がすごいと思いました. 今後とも,宜しくお願いします.
guest

0

<1>
どれも違います

<2>
たくさんのフィルタが組み合わされます

<3>と「フィルターの種類には,エッジ抽出,コーナー抽出,ぼかし(平滑化)等,いろいろなものがあると思います」

どれもパラメータだけが違う同じ計算で実装されていますね。
CNNの学習の過程で問題をうまく解けるようにフィルタのパラメータが学習されていきます。
そのフィルタがどんな特徴を抽出してるかは人間の解釈です。

投稿2020/07/04 03:49

編集2020/07/04 03:51
quickquip

総合スコア11235

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jonaromu

2020/07/05 00:46

quiqui様 単独のフィルターでは特徴を抽出しきれない,と解釈しました. ご回答,ありがとうございました.
quickquip

2020/07/05 01:53

一番入力に近い方のフィルタ群の中には、エッジを抽出してる(と人間が見たらそう解釈できる)フィルタとかが学習されていたりすると思いますよ。
guest

0

1点目の質問について
これはCNNではなく一般的な画像処理に対する質問と認識しました。どのフィルタを用いるかは適用する分野によって各々ノウハウがあります。その意味では分析者が試行錯誤の上、経験的に決めていたと言っても良いでしょう。

2点目の質問について
フィルタは単独でも用いますが、複数組み合わせて使うことも多いです。事前に決めらるれかについては、フィルタの中でも較正に使われるもの(輝度補正・幾何学補正)は使用するセンサーに依存しますので自由度はほとんどありませんので事前に決められる種類のフィルタです。その先のエッジ抽出やボカシなど見た目の特徴を変化させるフィルタ、何か特徴的なものを抽出するためのフィルタは、これこそが門外不出の組み合わせであったので、事前に決まらないものだと思います。

3点目の質問について
CNNが作り出すフィルタは、学習用に用意した画像から逆伝搬によって生み出されたものです。そのため出力層に近いほど複雑な形(出力層に近い形)をしており、伝言ゲームの末にたどり着いた入力層付近では曖昧なものとなっています。実際にフィルタ画像を見ると、エッジ抽出やコーナー抽出に近いフィルタは入力層付近にあります。何をもって概念的に同じフィルタなのかというのが難しいですが、ある特徴を強調するという意味では同じフィルタですが、アルゴリズム的な裏付けから作られたフィルタではないという意味では全く異なる概念です。

参考URL

投稿2020/07/04 04:17

yymmt

総合スコア1615

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jonaromu

2020/07/04 23:36

yymmt様 分かりやすいご回答,ありがとうございます. やはり,フィルターの選択には分析者の経験値や,門外不出の技術があるのですね. 画像解析やCNNについて全くの初級者なのですが,試行錯誤で経験を重ねる必要がありそうですね. ありがとうございました. 今後も,宜しくお願いします.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問