ニューラルネットワークを用いた構内画像の位置識別器の作成

ネットワークシステム研究室
指導教員:坂本 直志
14EC072 竹本 雅崇

目次

1 序論
1.1 研究背景
1.2 本論文の構成
2 事前知識
2.1 ニューラルネットワーク
2.2 畳み込みニューラルネットワーク
2.3 畳み込み層
2.4 プーリング層
2.5 ソフトマックス層
2.6 ReLU関数
2.7 Chainer
2.8 前処理
3 実験概要
3.1 実験1
3.2 実験2
3.3 実験3
3.4 実験4
4 考察
5 謝辞
6 参考文献
付録:ソースコード

1 序論

1.1 研究背景

高層ビルでは各階の構造が似てしまうので,自分が今何階にいるかは重要な情報である.近年,大学などでは各フロアにそれぞれ別組織が異なる運用をするようなビルの運用がされることがある.大学に通っている学生ならばその大学の構造については次第に慣れていくと考えられるが,オープンキャンパスや学園祭などで初めて大学に足を踏み入れる受験生やその保護者といった学外からの来場者はそうではない.構内の各フロアでは目印になるものも無いために迷い,目当ての部屋に行けなかったなどといったことがあると悪印象を持たれてしまうことも考えられる.そこで,多くの人が持っている携帯電話やスマートフォンを用いて,手軽に自分が今建物の何階にいるのかを判別できるシステムを作成し,学外からの来場者への手助けなどに活用することを考える.判別するためのシステムとしてはニューラルネットワークによる学習済みモデルによる判別を使用する.近年,ニューラルネットワークによる画像分類は著しい進歩を遂げており,人間やその他の動物の顔分類で多大な成果を挙げているため,法則性の無い建物内の画像に対しても,一定の成果を上げられるのではないかと考えた.

本研究では,東京電機大学 1号館の14階建てのビルの構内の画像をニューラルネットワークを用いて学習したモデルを作成し,そのモデルを用いた階数の識別を行う.

1.2 本論文の構成

本論文の構成は以下のとおりである.

2章では本論文で用いる用語や技術についての説明,その定義について述べる.

3章では行った実験の手法と結果について述べる.

4章では実験全体の考察について述べる.

5章では本研究を行うにあたって助力を頂いた方々への謝辞を述べる.

6賞では本論文を執筆するにあたり参考にした参考文献について述べる.

付録では本実験に使用したプログラムのソースコードを記載する.

2 事前知識

2.1 ニューラルネットワーク

ニューラルネットワーク
図1 ニューラルネットワークの概略図

上の図1において,左の層から入力層,中間層,出力層と呼ばれる.これら3種類の層はそれぞれユニット間で結合しており,それぞれのユニットは重みやバイアスといった,各入力に対応したパラメータを持っている.学習を行うとその結果から出力層からの出力と実際の正解ラベルデータとの誤差によって各層のユニットが持つ重みやバイアスが更新され,よりモデルの精度が高くなる.ニューラルネットワークを用いた機械学習では,学習データを用いた学習を複数回行うことでモデルの精度を上げ,学習に使用していない未知の入力データに対しても正しい出力を行えるようにすることを目標とする.

今回の研究で使用するニューラルネットワークでは入力層の次元数は9248次元,中間層の次元数は2000次元で構築している.また,出力層は1階から14階までの識別結果となるので14次元で構成している.

2.2 畳み込みニューラルネットワーク

畳み込みニューラルネットワーク
図2 畳み込みニューラルネットワークの構造

畳み込みニューラルネットワーク(CNN:Convolutional Neural Network)は,上の図2のように入力層から受けとったデータに対し畳み込み層とプーリング層という2種類の層で計算を交互に複数回行い,最終的に計算結果を全結合層で集計し,出力層に出力を渡すニューラルネットワークである.また,今回は多クラス分類を行うため,出力層にはソフトマックス層を使用する.多層の畳み込み層とプーリング層の働きにより,畳み込みニューラルネットワークは特徴抽出,特に画像認識の分野で目覚ましい成果をあげている.本論文で行う実験でも畳み込みニューラルネットワークを使用する.

畳み込み層,プーリング層,ソフトマックス層について説明を記述する.

2.3 畳み込み層

畳み込み層は畳み込みニューラルネットワークにおいて,入力データに対して畳み込み計算を行うニューロン層である.主にエッジ検出といった特徴抽出の役割を持つ.

畳み込み計算とは入力画像にフィルタを重ね合わせ,フィルタと入力画像の重なり合う画素同士の積を求め,画像全体でその積の和を求める計算である.

畳み込み計算の具体的な手順を示す.

畳み込み計算
図3 畳み込み計算の例

入力画像の赤枠部分に対し,重みフィルタを重ね合わせると

         1×1 + 3×0 + 1×1 + 0×1 + 3×0 + 2×1 + 1×0 + 0×0 + 1×0 = 4

となり,入力画像の赤枠部分は出力画像の赤枠部分の4となる. 赤枠部分の計算が終わると今度は重みフィルタを右にずらして青枠部分の計算を行う.青枠部分の計算も終わると,重みフィルタを青枠部分の1段右へずらして計算を行う.右端までの計算が終わると重みフィルタを赤枠部分から1段下の場所へ移動し,また同様の計算を行う.

一連の畳み込み計算が終わると,図3のように,8×8の入力画像が重みフィルタによって特徴抽出された6×6の画像に調整されて出力される.

畳み込み層で用いられる重みフィルタは学習の結果に応じて更新され,識別器の精度が向上する.

2.4 プーリング層

プーリング層は畳みこみニューラルネットワークにおいて,入力画像データに対してプーリング処理を行うニューロン層である.畳み込み層での畳み込み計算に用いるフィルタは学習の結果に応じて更新されるが,プーリング層では常に同一のフィルタを用いてプーリング処理を行う.主に入力画像データに対し解像度を下げるともに,局所的な違いに左右されないような普遍的特徴を抽出する役割を持つ.画像認識の分野においては最大プーリングという手法で畳み込み計算を行うことが一般的であり,本研究でも最大プーリングを使用する.

最大プーリングの具体的な手順を次の図4に示す.

最大プーリング
図4 最大プーリングの例

図4では,4×4の画像に対し2×2をプーリング領域とした最大プーリングを行っている.この処理では2×2の範囲内の各要素の中で最大値を選択して出力値とし,2×2の画像へと変換している.最大プーリングの他に,範囲内の各要素の平均値を出力値とする平均プーリングという手法も存在する.

2.5 ソフトマックス層

ソフトマックス層は,畳みこみニューラルネットワークにて他クラス分類をする際に出力層として用いられる層である.ソフトマックス層では活性化関数としてソフトマックス関数が使用される.ソフトマックス関数は以下の式で表される.

softmax

このときy_kは0から1の値を取り,全ての次元で和を取ると1になる.つまり各ラベルのスコアを各ラベルの確率へと変換でき,y_kは入力データがクラスkに属する確率となる.これは他クラス分類をする際には非常に有用であり,本実験でも出力層として使用している.

2.6 ReLU関数

ReLU関数は,ニューラルネットワークで用いられる活性化関数の一つである.数式で表すと以下の式となる.

                  f(x) = max(0,x)

0未満の出力値を全て0にする関数であり,非常に簡単かつ単純で計算量が少ないため,シグモイド関数やステップ関数といった他の活性化関数よりも早く学習を行える. 本研究でも活性化関数として使用している.

2.7 Chainer

Chainerは,Preferred Networksが開発を進めている,深層学習用のフレームワークである.ニューラルネットワークをPythonで柔軟に記述し,学習させることができる.また,CUDAをサポートしており,GPUを利用した高速な計算が可能であるほか,その柔軟さゆえに畳み込みニューラルネットワークなどの様々なニューラルネットワークをPythonのプログラムとして記述することができる.

2.8 前処理

ニューラルネットワークにデータを読み込ませる際には,そのニューラルネットワークが効率よく学習を行えるように,そして学習に十分な量のデータを用意するために予めデータセットに処理を加える必要がある.この処理のことを前処理と呼ぶ.今回の実験で読み込ませるデータセットは画像であるためPythonの画像ライブラリであるOpenCVを用いて処理を行った.今回の実験で行った処理を以下に記す.

・リサイズ

元画像の画像サイズを変更する.ニューラルネットワークは入力数の変化に柔軟に対応できないため,使用するニューラルネットワークに適した画像サイズに変更する必要がある.

・グレースケール化

元画像を単色化する.カラー画像に比べると格段に情報量が減るが,輪郭や濃淡は強調されるため,画像認識においてはより高速な処理を行うことが出来るようになる.

・二値化

グレースケール化された画像に対し,指定した閾値を基準に,元画像を白と黒の二色に分ける処理である.グレースケール化された画像の輪郭が更に協調されるため,輪郭処理などに有用である.

・ガンマ補正

入力された画像データに対し,γ値によって輝度値を変換する非線形濃度処理である.

入力画像の画素値をY,画素値の最大値をY_max,出力画像の画素値をY’,ガンマ値をγとすると,ガンマ補正の式は以下の計算式で表される.

gamma

・平行移動

入力された画像データに対し,X,Y方向に指定した座標分だけ位置座標を移動させ、出力を行う.

・回転

入力された画像データに対し,指定した角度で回転を行う.

3 実験概要

3.1 実験1

まず初めに,判別に用いるために,判別モデルに読み込ませる画像を用意する.

構内画像1
図5 画像例(1)
構内画像2
図6 画像例(2)
構内画像3
図7 画像例(3)

今回の実験で使用する画像として,上の図5,図6,図7のような東京電機大学 東京千住キャンパス 1号館の1階から14階の各階で撮影した画像を使用する.1階当たり100枚,計1400枚の画像を用意した.これらの画像はスマートフォンを用いて撮影した画像であり,1084×1920ピクセルと画像サイズが大きいため,64×64ピクセルの画像へと変換する.その後,画像に1階から14階までの正解ラベルを割り振り,データセットとする.

撮影した画像に下処理とラベル付けを行ってデータセットとし,学習させるまでの流れは以下の図8の通りとなる.

実験の概略図
図8 データセット作成と学習の概略図

次に畳み込みニューラルネットワークをChainerを用いてPythonのプログラムで実装する.モデルのプログラムとして「modeling2.py」を,学習用のプログラムとして「train.py」を作成した.「train.py」を実行し,学習を行う.出力される1epochごとの学習データとテストデータに対するloss値とaccuracy値をまとめた学習結果は次の表1の通りとなる.また,表1の結果を図9,図10にグラフ化する.

表1 実験1の学習結果
epochtrain losstest losstrain accuracy test accuracy
13.1162.6210.0880.007
22.5482.5880.0990.119
32.5192.5610.1240.127
42.4882.5340.1190.124
52.4392.4990.1640.127
62.4192.5170.1720.173
72.3742.5090.1720.172
82.3302.5420.1850.172
92.3212.5540.2180.157
102.2512.5640.2230.164
112.1972.5300.2450.165
122.1572.5300.2350.172
132.0862.5840.2540.157
142.0602.5310.2620.157
151.9912.5570.3040.187
161.9562/5380.3210.181
171.8602.6120.3250.134
181.8182.5960.3570.172
191.7452.6520.3600.187
201.6062.5720.3800.172
211.5602.6150.4190.172
221.5322.6660.4210.157
231.4322.6420.4490.157
241.2832.6540.4870.189
251.2152.7070.4900.164
261.1392.7150.4990.149
271.0222.7730.5240.149
280.9492.7540.5420.179
290.9072.9220.5560.149
300.7962.8000.5960.164
310.7243.0250.6030.142
320.6572.9220.6140.172
330.5862.9230.6530.149
340.5513.0190.6460.172
350.5333.1880.6550.127
360.4793.1870.6400.164
370.4673.1820.6730.134
380.4133.2430.7200.134
390.4093.5070.7090.172
400.3253.4310.7250.164
410.3043.4320.7480.149
420.2603.4090.7460.164
430.2323.5220.7590.172
440.2303.5100.7630.149
450.1973.5020.7760.149
460.1963.6700.7620.127
470.2103.6500.7920.179
480.1393.7010.7980.179
490.1293.8760.8040.164
500.1223.7990.9760.172
実験1のloss
図9 表1の学習時とテスト時のloss値
実験1のaccuracy
図10 表1の学習時とテスト時のaccuracy値

図9を見ると,学習データでのloss値はepoch数が進んでいくごとに減少していっている.一方,テストデータでのloss値はepoch数が進んでも上昇していく一方である.

図10を見ると,学習データでのaccuracy値はepoch数が進んでいくごとに上昇している.一方,テストデータでのaccuracy値はepoch数が進んでもそれほど上昇が無く,安定せずまばらになっていることが確認できる.

ここで

     「画像内の情報や特徴ではなく,画像の明るさを読み込んで結果を予測しているのではないか?」

という仮説が立ったので,今度はデータセット内の画像の明るさを変更して実験を行う.

今後の実験では,学習を行う際のepoch数は50に固定する.

3.2 実験2

今回は学習を行う前に,データセット内の画像に以下の処理を行った.なお,これらの処理にはPythonの画像ライブラリであるOpenCVを使用した.

          ・二値化(閾値= 50,75,100,128,150,200)

          ・ガンマ補正(γ値= 0.50,0.75,1.25,1.50,2.00)

データセット内の画像にこれらの処理を行った後,実験1と同様の手順で新たに学習を行い,epoch = 50におけるテストデータへのaccuracy値の比較を行う.

以下の図11が二値化を行ったときのaccuracy値,図12がガンマ補正を行ったときのaccuracy値の比較である.

二値化
図11 二値化を行ったときのaccuracy値の比較
ガンマ補正
図12 ガンマ補正を行ったときのaccuracy値の比較

二値化とガンマ補正によって画像の明るさを一定に保った結果,多くの処理でテストデータのaccuracy値は低下したものの,ランダムに階を選ぶ確率である1/14 = 0.0714...の値より大きい値は保っている.また,読み込ませる画像に対して処理を加えることでaccuracy値が変化していることから,作成したモデルによって画像の学習自体は行えていると考えられる.

今度はデータセットの画像の総量を増やし,学習精度を向上させることを考える.

3.3 実験3

実験1で使用したデータセットに対して以下の前処理を行い,画像枚数の拡張を図る.なお,これらの処理にはPython内のライブラリであるOpenCVを使用した.

          ・グレースケール化

          ・元画像を20×20ピクセルずつ左上,右上,左下,右下へと平行移動

          ・元画像を左右に45°,90°ずつ回転させる

これらの前処理により,データセットは1階当たり1000枚になり,総枚数は14000枚となった.

データセット内の画像にこれらの処理を行った後,実験1と同様の手順で新たに学習を行い,epoch = 50までの1epochごとのloss値とaccuracy値をまとめる.

学習結果は次の表2の通りとなる.また,表2の結果を図13,図14にグラフ化する.また,図15では実験1と実験3のloss値の比較を,図16ではaccuracy値の比較を行う.

表2 実験3の学習結果
epochtrain losstest losstrain accuracy test accuracy
12.8152.5780.1090.113
22.4822.5050.1510.145
32.4242.4180.1710.183
42.3592.3960.1930.163
52.3152.3300.2120.194
62.2422.2640.2420.234
72.1662.1990.2680.267
82.1032.1770.2890.275
92.0102.1170.3240.291
101.9322.0710.3420.312
111.8121.9940.3950.342
121.6811.8880.4390.382
131.5581.8350.4810.398
141.4261.6870.5280.459
151.2971.6330.5740.472
161.1781.5010.6190.542
171.0521.4120.6620.569
180.9391.2790.7030.613
190.8181.2000.7390.642
200.7251.1320.7700.672
210.6391.0860.7980.706
220.5941.0130.8100.721
230.5290.9020.8360.753
240.4510.8130.8620.806
250.3770.8160.8850.794
260.3670.7600.8840.818
270.3130.7070.9080.836
280.2830.7230.9140.852
290.2590.6340.9230.871
300.2230.6280.9320.880
310.2080.6770.9410.860
320.2020.5700.9390.901
330.1750.5800.9490.904
340.1640.6010.9520.898
350.1580.5260.9560.909
360.1390.5660.9600.908
370.1510.5560.9570.907
380.1320.5230.9650.917
390.1290.5240.9640.921
400.1410.5600.9570.915
410.1190.5670.9660.920
420.0950.5170.9740.926
430.1090.5880.9680.922
440.1210.6120.9630.917
450.0950.5470.9710.922
460.0840.5320.9750.922
470.0970.5430.9690.923
480.1020.5350.9690.926
490.0950.6110.9710.923
500.0820.6510.9750.917
実験3のloss値
図13 実験3の学習時とテスト時のloss値
実験3のaccuracy値
図14 実験3の学習時とテスト時のaccuracy値
実験1と3のloss値
図15 実験1と実験3のloss値の比較
実験1と3のaccuracy値
図16 実験3のaccuracy値

図15を見ると,実験3のテストデータに対するloss値はepoch数が進んでいくごとに低下しており,実験1のテストデータに対するloss値の推移とは真逆の推移を見せている.また,学習データに対するloss値も,実験1ではepoch = 48 になってようやくloss値が0.2以下になったのに対し,実験3ではepoch =33 の時点で0.2以下になっている.

図16を見ると,実験3のテストデータに対するaccuracy値は実験1の結果と違い,epoch数が進んでいくごとに大幅に上昇している.また,学習データに対するaccuracy値も,実験1ではepoch = 50になって0.8以上になったのに対し,実験3ではepoch = 21の時点で0.8以上に到達している.

学習効果,学習効率共に実験1の結果より大きく上昇していると考えられる.

今回の実験3で作成された学習済みモデルを用いて,学習に用いた画像データとは異なる画像データの識別を行う.

使用する学習済みモデルとして,テストデータへのaccuracy値が最も高かったepoch = 42のモデルを使用する.以後,この学習済みモデルを「model3_ep42」と呼称する.

3.4 実験4

実験3で新たに作成された学習済みモデルを使用し,学習に用いた画像データとは異なる画像データを用いて識別を行う.今回使用する学習済みモデルは,実験3で作成された学習済みモデル「model3_ep42」を使用する.

今回の識別に使用する画像として,今までの実験と同様に東京千住キャンパス 1号館の1階から14階の各階で撮影した画像を使用する.新たに1階当たり20枚,計280枚の画像を用意した.また,今回使用する画像群は現実に位置予測の機能として使用する場合のことを考え,以下の図17,図18のように,階ごとにほぼ同一の地点から撮影した20枚の画像を使用する.

構内画像4
図17 画像例(4)
構内画像5
図18 画像例(5)

「predict1.py」を実行し,学習を行う. 280枚の画像データを入力し,識別を行った結果が次の表3である.表3内の数値は入力画像データに対して出力された階の枚数である.

表3 「model3_ep42」を用いた識別結果
入力\出力1234567891011121314
152310001131201
205210002400303
300612003211400
451220221212000
513020006212201
611302300700102
721210301402202
810221006032300
931000203421301
1031000203340301
1101311000415400
1231001101220801
1300420005015102
1444020001510300

表3の結果に対し,

          ・A = n階のデータを入れて,「n階」と当てたデータ数

          ・B = n階のデータを入れて,「n階」と当てられなかったデータ数

          ・C = n階でないデータを入れて,「n階」と答えたデータ数

          ・D = n階でないデータを入れて,「n階でない」と答えたデータ数

として,True-Positive値とTrue-Negative値を

          True-Positive値:A/A+B

          True-Negative値:D/C+D

として計算する.

表3の結果から14階分のTrue-Positive値とTrue-Negative値を計算し,グラフ化したものが次の図19である.

実験3のモデルを用いたTrue-Positive値とTrue-Negative値
図19 「model3_ep42」のTrue-Positive値とTrue-Negative値

もしランダムに階数を選択するのであれば,True - Positive値は1/14=0.0714...となるはずであるが,どの階もその値ではない.また,True-Positive値が1/14よりも小さい階も存在するが,半数以上の階ではランダムに階数を選択する場合の値を上回っている.

True - Negative値に関してはどの階に対しても最低でも0.862以上の値があり,どちらの値から見ても一定以上の精度を持って判別を行えていることが確認できる.

また,実験1で作成された学習済みモデルに対しても同様に識別を行い,280枚の識別結果に対するTrue - Positive値とTrue - Negative値を測定する.使用する学習済みモデルとして,実験1でテストデータへのaccuracy値が最も高かったepoch = 24のモデルを使用する.以後,この学習済みモデルを「model1_ep24」と呼称する.

280枚の識別結果は次の表4の通りとなる.

表4 「model1_ep24」を用いた識別結果
入力\出力1234567891011121314
130001301203304
213212501103100
322311202112102
400605111122100
533021206100002
640001211203204
710301003003207
810201103003207
920201109003101
1003111015062000
1120100201128201
1221013100405201
1301231104015101
1410011012541202

表4の結果から14階分のTrue-Positive値とTrue-Negative値を計算し,グラフ化したものが以下の図20である.

実験1のモデルを用いたTrue-Positive値とTrue-Negative値
図20 「model1_ep24」のTrue-Positive値とTrue-Negative値

図19と図20の結果を比較するとTrue - Negative値に関しては「model1_ep24」を用いた識別の最低値が0.865であるため,「model3_ep42」を用いた識別結果と大きな差は無い.True-Positive値に関しては,True - Positive値が1/14を超えている階の数は「model1_ep24」を用いた識別では8階であったのに対し,「model3_ep42」を用いた識別では10階に増加している.また,True-Positive値が0.2を超えている階の数は「model1_ep24」を用いた識別では2階であったのに対し,「model3_ep42」を用いた識別では6階に増加している.

図19,図20の比較結果と合わせて,実験3で作成された学習済みモデルは実験1で作成された学習済みモデルより性能が向上していると考えられる.

4 考察

本研究では,高層ビル内の各フロアの画像をニューラルネットワークを用いて学習したモデルを作成し,階数の識別を行った.ニューラルネットを作成しデータセットをそのまま読み込ませると,学習済みモデルの汎化性能が低くなってしまう.データセットを読み込ませる前に前処理を行ってデータセットの総量を増やし,かつニューラルネットが読み込みやすい形に処理することで学習速度と学習精度を向上させた.最終的にはフロアの50%程度の判別を行うことのできる判別器を作成することができた.

今回の実験での最終的な判別率は50%程度であり,作成された学習済みモデルを用いた識別器を実用的なシステムとするにはまだ精度が足りていない.しかしながら,正答率が半分程度の精度であれば判別が行えたことも事実であり,これを役立てられる可能性はあると考えられる.例えば,本研究の実験4で行ったように,同一地点で複数枚の画像を撮影して識別器に入力し,それらの結果を多数決方式でまとめることで判別を行うという方式であれば,正答率を向上させることが可能であるかもしれない.

実験3で行った学習ではテストデータのaccuracy値が90%を超えるほどに高くなったのに対し,実験4で実験3にて作成した学習済みモデル「model3_ep42」を用いて未知データの予測をした際にはそこまでの精度を発揮できなかった.これは実験1で撮影した写真と実験4で新たに撮影した写真の撮影状況が違うからであると考えられる.微細な明るさや撮影角度の違いなど,様々な要因が影響していると考えられ,データセットへの前処理が非常に重要であると推察される.

本研究では正答率は高くないが,単純な前処理を行うだけでも一定の精度の学習済みモデルを作成することができた.今後実験を行う際には,使用するニューラルネットワークの改良や,大元のデータセットの総量を増やしてそれに適した前処理を行うことで更に精度を上げることが可能であると考えられる.

5 謝辞

本研究を進めるにあたり,終始のご指導を頂いた坂本 直志教授に心より感謝をいたします.そして,ともに研究に励み,協力し合ってきたネットワークシステム研究室の皆様に深く御礼を申し上げます.

6 参考文献

  1. Chainer http://chainer.org/
  2. Chainerではじめるニューラルネットワーク https://qiita.com/icoxfog417/items/96ecaff323434c8d677b
  3. 【機械学習】ディープラーニング フレームワークChainerを試しながら解説してみる。 https://qiita.com/kenmatsu4/items/7b8d24d4c5144a686412
  4. 小高 知宏 , “自然言語処理と深層学習[C言語によるシミュレーション]” オーム社,2017年3月発行
  5. 島田 直希・大浦健志 , “Chainerで学ぶディープラーニング入門” 技術評論社, 2017年9月発行
  6. 齋藤 康毅 ,”ゼロから作るDeep Learning Pythonで学ぶディープラーニングの理論と実装 オライリー・ジャパン,2016年9月発行

付録 ソースコード