どうもニコイチです。第3回までの前回の記事では、画像の特徴理解に向けて各種画像加工(反転、コントラスト調整、ぼかし、エッジ検出)を実践しました。
今回の「4.集めたデータの確認」では、実際に用意された画像データ(鋳造画像データ)がどこにあり、どのような構成になっているのかを確認します。
特に、zip形式で配布されたデータの中身をチェックし、フォルダ構造やファイル数、重複の有無などを確認することは、今後のデータセット作成やモデル学習のために非常に重要です。
ファイル操作の基礎
まずは、Pythonの標準ライブラリであるosを使って、現在の作業ディレクトリにどのようなファイルがあるのかを確認します。
現在の作業ディレクトリのファイル一覧を確認
import os
# カレントディレクトリのファイル一覧を取得し、変数filesに代入
files = os.listdir("./")
print("現在の作業ディレクトリのファイル一覧:", files)
# 変数filesのデータ型を確認
print("filesのデータ型:", type(files))
上記を実行すると、例えば以下のような出力が得られます。
現在の作業ディレクトリのファイル一覧: ['image_data.zip']
filesのデータ型: <class 'list'>
これにより、image_data.zip
というファイルが存在していることが確認できます。
ファイルサイズの確認
zipファイルのサイズも確認しておきましょう。サイズはバイト数で出力されます。
size = os.path.getsize("./image_data.zip")
print("image_data.zipのサイズ(バイト):", size)
例えば、出力が「2061233」であれば、約2.1MBのファイルとなります。
zipファイルの解凍
zipファイルのままでは、プログラムから画像データを読み込むことはできません。
そこで、Pythonのzipfileライブラリを使って解凍を行います。
zipファイルの中身確認と解凍
まずは、zipファイルにどんなファイルが入っているか、先頭の数件だけ確認してみます。
import zipfile
with zipfile.ZipFile('./image_data.zip') as existing_zip:
print("zipファイル内のファイル一覧(一部):", existing_zip.namelist()[0:5])
例として、以下のような出力が得られるかもしれません。
['image_data/', 'image_data/train/', 'image_data/train/ng/', 'image_data/train/ng/cast_def_0_2529.jpeg', ...]
このように、フォルダ構造が確認できたら、次は全体を解凍してみましょう。
解凍用の関数定義
複数回解凍処理を行う際に備えて、関数としてまとめておくと便利です。
import zipfile
def unzip_dataset(INPATH, OUTPATH):
with zipfile.ZipFile(INPATH) as zf:
zf.extractall(OUTPATH)
# zipファイルをカレントディレクトリに解凍
unzip_dataset(INPATH='./image_data.zip', OUTPATH='./')
解凍が完了すると、カレントディレクトリにimage_data
というフォルダが生成されます。
解凍後のフォルダ構造確認
解凍された後、ファイルやフォルダの構成がどのようになっているか確認します。
# カレントディレクトリのファイル一覧を確認
print("カレントディレクトリのファイル一覧:", os.listdir('./'))
# image_dataフォルダの中身を確認
print("image_dataフォルダの中身:", os.listdir('./image_data'))
# trainフォルダ内の構成を確認(okとng)
print("trainフォルダ内の一覧:", os.listdir('./image_data/train'))
print("train/okフォルダの中身:", os.listdir('./image_data/train/ok'))
出力例:
カレントディレクトリのファイル一覧: ['image_data.zip', 'image_data']
image_dataフォルダの中身: ['train', 'val']
trainフォルダ内の一覧: ['ok', 'ng']
train/okフォルダの中身: ['cast_ok_0_2840.jpeg', 'cast_ok_0_1368.jpeg', ...]
このように、フォルダ構造は以下のようになっています。
└── image_data
├── train
│ ├── ng
│ │ ├── cast_def_0_XXXX.jpeg
│ └── ok
│ ├── cast_ok_0_XXXX.jpeg
└── val
├── ng
└── ok
集めた画像データの確認と重複チェック
次に、解凍された画像データの枚数や重複がないかを確認します。
重複があると、モデルの学習に偏りが生じる恐れがあるため、必ずチェックしておきましょう。
ファイル数の確認
import os
# trainフォルダ内のokとngの画像リストを取得
ok_image_list = os.listdir('./image_data/train/ok')
ng_image_list = os.listdir('./image_data/train/ng')
print("正常品(ok)の画像枚数:", len(ok_image_list))
print("欠陥品(ng)の画像枚数:", len(ng_image_list))
例えば、両方とも30枚なら、正常品と欠陥品の割合は等しいことが確認できます。
重複チェック
リスト内に同一のファイル名があるかどうかを、setを使って確認します。
print("okフォルダ内の重複を除いた画像枚数:", len(set(ok_image_list)))
print("ngフォルダ内の重複を除いた画像枚数:", len(set(ng_image_list)))
もし元のリストとsetに変換したリストの長さが同じであれば、重複はないと判断できます。
課題:データセットの確認
以下の課題に取り組んで、ソースコードを実行しながら結果を確認してください。
課題:
以下の条件の中から、誤っているものを1つ選んでください。
- 正常品と欠陥品の画像データの割合は等しい
- 重複したデータを持つものは存在しない
- 同じ画像データが複数あったとしても、画像モデルの精度は下がらない
- フォルダ「val」には、okの画像が20枚、ngの画像が20枚存在する
- 同じ画像データが複数あった場合、モデルがその画像に過剰に適応してしまう恐れがある
【正解】 3. 同じ画像データが複数あったとしても、画像モデルの精度は下がらない
【解説】
同じ画像データが重複していると、学習データが偏ってしまい、モデルがその画像に過剰に適応(オーバーフィッティング)してしまう恐れがあります。
そのため、重複がある場合は、適切な前処理や重複除去を検討する必要があります。
まとめ
今回の記事では、以下の内容を学びました。
- ファイル操作の基本
os.listdir()
でカレントディレクトリのファイル一覧を確認os.path.getsize()
でファイルサイズを確認
- zipファイルの解凍
zipfile.ZipFile
を使い、zipファイル内の構造を確認および全体を解凍- 解凍用の関数
unzip_dataset()
の定義と実行
- 解凍後のフォルダ構造の確認
- フォルダ内のファイル一覧を確認し、各ディレクトリ(train, val)の構成を把握
- データの重複チェック
os.listdir()
とset()
を使って、画像データの枚数と重複の有無を確認
これらのステップを通じて、集めた画像データの状態を正確に把握することができました。
次回は、この確認したデータを基に、実際に画像分類用のデータセットを作成する方法について解説します。
コメント