ETLデータベースの画像をラベルデータと画像データに分けて保存

f:id:hanamichi_sukusuku:20210213121038p:plain

実行結果

f:id:hanamichi_sukusuku:20210213121112p:plain

f:id:hanamichi_sukusuku:20210213121135p:plain

 

hanamichi-sukusuku.hatenablog.com

このプログラムでは上記でETL1のデータベースから読み込んだカタカナ手書き文字のデータをラベルデータと画像データに分けて保存していく。

 

保存先や画像サイズの指定

out_dir = "./png-etl1" # 画像データがあるディレクト
im_size = 25 # 画像サイズ
save_file = out_dir + "/katakana.pickle" # 保存先
plt.figure(figsize=(9, 17)) # 出力画像を大きくする

 

im_sizeで25にしているのは必要最低限のサイズに縮小してからモデルに学習させるため。

save_fileには保存先のパスを格納。

plt.figure()では画像の描画領域を指定している。引数のfigsize=(width, height)のように指定していて単位はインチ。

 

カタカナの画像が入っているディレクトリから画像を取得

kanadir = list(range(177, 220+1))
kanadir.append(166) # ヲ
kanadir.append(221) # ン
result = []
for i, code in enumerate(kanadir):
  img_dir = out_dir + "/" + str(code)
  fs = glob.glob(img_dir + "/*")
  print("dir=", img_dir)
 # 画像を読み込んでグレイスケールに変換しリサイズする --- (*3)
  for j, f in enumerate(fs):
    img = cv2.imread(f)
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    img = cv2.resize(img_gray, (im_size, im_size))
    result.append([i, img])
   # Jupyter Notebookで画像を出力
    if j == 3:
    plt.subplot(11, 5, i + 1)
    plt.axis("off")
    plt.title(str(i))
    plt.imshow(img, cmap='gray')

変数kanadirには166,177~221までのディレクトリにア~ンまでのカタカナのデータが入っているのでそのディレクトリ名が入ったリストを作成。

resultは最終的に保存するラベルデータと画像データのリストを定義。

fs=glob.glob(img_dir+"/*")で各ディレクトリの入ったファイル名(画像データ名)を全て取得。

fsに格納されたファイル名をfor文で回し、それぞれの画像をcv2.imread()で読み込む。

グレースケールに変換。

cv2.resize()でサイズ変換。

resultにfor文でenumerate()を使用しているのでiにkanadir(166,177~221のディレクトリ名のリスト)のインデックス番号が入っているのでそれをラベルにした画像データを追加。

plt.subplot()で複数の画像を一つのプロットに描く。

グレースケールの画像データに変換しているのでplt.imshow()でcmap='gray'を指定。

 

ラベルと画像データの保存

pickle.dump(result, open(save_file, "wb"))
plt.show()
print("ok")

 

resultにはラベル、それに対応した画像データが格納されているので、pickle.dump()でresultと保存先のファイルを開き保存。