前回に引き続き、ながら運転を検知するコードを書いていきたいと思います。
前回はダウンロードしたファイルの中身を確認してラベルと画像枚数を確認しました。
この記事ではもう少しデータセットに関する情報を調べていきたいと思います。
目次
ディレクトリ内にあるファイル名を取得する(walk)
画像を読み込む必要があります。
画像を読み込むには画像の置かれているディレクトリ名+ファイル名を取得します。
ディレクトリ内のファイルを全て取得するには、walkを使うと便利です。
walkを使うと、ディレクトリ、サブディレクトリ、ファイル名を一括で取得する事ができます。
今回は、ファイル名だけでなくディレクトリ名も取得したいので、`os.path.join`を使って、ファイル名とディレクトリ名を連結させています。
image_pathという名前のリストにファイル名を追加していきます。
import os from os import walk mypath = "./train" image_path = [] for (dirpath, dirnames, filenames) in walk(mypath): image_path.extend(os.path.join(dirpath, filename) for filename in filenames)
これで2万枚のファイル名がリストで取得できました。
['./train/c4/img_5747.jpg', './train/c4/img_16123.jpg', ・・・
1種類ずつファイル名を取得する
全ての画像のファイル名が取得できましたが、全ての画像をjupyter上に表示するわけにはいきません。
枚数が多すぎますからね。
そこで各ラベルごとに1枚ずつ表示するようにします。
先ほどのリストの中身から、ラベル名を抜き出して、ラベル名とファイル名をセットで辞書に登録します。
ここで、辞書の機能であるsetdefaultを使うと、カテゴリごとに1枚ずつ取得できます。
sefdefaultは辞書のキー(今回はカテゴリ)が登録されていなかったら登録するものです。
each_image_path = {} for i in image_path: category = i.split("/")[2] each_image_path.setdefault(category,i) each_image_path
{'c4': './train/c4/img_5747.jpg', 'c0': './train/c0/img_67027.jpg', 'c6': './train/c6/img_69390.jpg', 'c8': './train/c8/img_5003.jpg', 'c1': './train/c1/img_97001.jpg', 'c9': './train/c9/img_54420.jpg', 'c7': './train/c7/img_95208.jpg', 'c3': './train/c3/img_76902.jpg', 'c5': './train/c5/img_91231.jpg', 'c2': './train/c2/img_22091.jpg'}
10種類のカテゴリのファイル名が1枚ずつゲットできました。
画像を表示する
準備ができたので、jupyter上に画像を表示してみます。
10枚なので、plt.subplotで十分割、5行*2列になるように設定します。
plt.figureで設定する図のサイズは割と適当です。
figsize=(横サイズ、縦サイズ)で設定できますが、画像を表示してみて、見にくかったら大きくしたり小さくしたりを繰り返すと良いと思います。
plt.titleでラベル名を画像の上に表示するようにします。
%matplotlib inline import matplotlib.pyplot as plt import matplotlib.image as mpimg plt.figure(figsize=(10,16)) for i,d in enumerate(each_image_path.items()): plt.subplot(5,2,i+1) plt.title(d[0]) plt.imshow(mpimg.imread(d[1]))

c0が正常な運転で、それ以外は「ながら運転」です。
c6は右手で飲み物を飲みながら、c1は右手でスマホをいじりながら、c9はよそ見をしながら、c8は髪をいじりながら運転している画像です。

c7の片手運転やc5のナビを設定しながらの運転もありました。
すいません、タイトルにディープラーニングと書いていながらなかなかその内容には入っていけません。
次は、これらの画像からディープラーニングでカテゴリ分類できるかをやってみたいと思います。
おわり。