本記事の概要
以下の記事で紹介している2クラス分類モデルをもとに、任意のフォルダからドキュメント画像を別のフォルダに移動するプログラムである。
2クラス分類:写真画像とドキュメント画像を分類するAIアプリ
風景や人物と言った一般的な写真画像と、スクリーンショットや文書等を撮影したドキュメント画像をCNN画像認識技術を用いて分類するモデル。
全体の概要説明については、以下の記事を参照のこと。
CNN画像解析:一般的な写真画像とドキュメント画像を分類するプログラムを作成
開発環境
Python3.11.5
Windows 11
動作イメージ
一般画像とドキュメント画像が保存された、任意のフォルダを、分類対象とする。
移動プログラムを実行すると、移動先フォルダ「img_doc」が作成される。ドキュメント画像が同フォルダに移動し、元のフォルダには一般画像ファイルが残る。
フォルダ「doc_img」の中身。ドキュメント画像が移動している。
真ん中行の左側、Francisco_Goya_143.jpgはドキュメント画像ではなく、アート画像なので、誤り。3クラス分類のモデルを使えば、こういう誤りは起こりにくくなると思われる。
使い方
①任意のフォルダに、学習モデルを保存したファイルmodel.h5と、プログラムファイルのapp_main3.pyを配置する。
任意のフォルダ/
├ model.h5
├ move_doc_img.py
model.h5は前述の2クラス分類の学習モデルを保存したファイルをあらかじめ用意すること。
②move_doc_img.pyのソース内で、以下の部分を書き換える。
dir_nameは、整理したいフォルダを絶対パスで記載する。バックスラッシュ(\)はスラッシュ(/)にする。
folder_nameにはドキュメント画像を移動するフォルダ名を記載する。
dir_name = 'C:/aidemy/test'
folder_name = "doc_img"
簡易的なプログラムで例外処理を入れていないので、分類対象フォルダの誤りや、移動先フォルダの重複に注意すること。
③コマンドプロンプトを起動し、プログラムファイルを配置したフォルダに移動し、move_doc_img.pyを実行する。
py move_doc_img.py もしくは python move_doc_img.py
プログラム内容
move_doc_img.py
import os
from werkzeug.utils import secure_filename
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing import image
import numpy as np
import shutil
image_size = 50
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif'])
#学習済みモデルをロード
model = load_model('./model.h5', compile=False)
dir_name = 'C:/aidemy/test'
folder_name = "doc_img"
# ファイルパス
path_org = os.listdir(dir_name)
#print(path_org)
if os.path.isdir(dir_name+"/"+folder_name) == False:
os.makedirs(dir_name+"/"+folder_name)
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
for i in range(len(path_org)):
filename = path_org[i]
if allowed_file(filename):
filepath = os.path.join(dir_name, filename)
#受け取った画像を読み込み、np形式に変換
org_img = image.load_img(filepath, target_size=(image_size,image_size))
img = image.img_to_array(org_img)
data = np.array([img])
#変換したデータをモデルに渡して予測する
result = model.predict(data)[0]
if(result[0] > 0.5):
print( "これは ドキュメント画像 です",filename)
# ドキュメント画像を指定フォルダに移動する
shutil.move(dir_name+"/"+path_org[i], dir_name+"/"+folder_name)