目的
画像認識の機械学習の教師データ(Webからのスクレイピングで集めたデータ)のうち教師データとして不適切なものを削除するために用いる。
基本手作業で行うのでデータが多いほど効率は悪いからこれ以外の解決法がない場合にのみ使うことを推奨する。
集め方についてはここから↓
環境
- python=3.6.13
- opencv=3.4.2
- pyautogui=0.9.53
コード
import cv2
import os
from tkinter import messagebox
import pyautogui as pag
#自分が使っているモニターの高さを取得
monitor_height = pag.size().height
def img_select(car_path):
car_img_list = os.listdir(car_path)
for car_img in car_img_list:
img = cv2.imread(car_path+'/'+car_img)
img_height = img.shape[0]
#画像の高さがモニターの高さの半分よりも大きかったらモニターの半分の大きさにリサイズ
if img_height>monitor_height*0.5:
img = cv2.resize(img, dsize=None, fx=float(monitor_height*0.5/img_height), fy=float(monitor_height*0.5/img_height))
cv2.imshow("image", img)
k = cv2.waitKey(0)
if k==ord('s'):
os.remove(car_path+'/'+car_img)
print(car_path+'/'+car_img+"を削除しました")
elif k == ord("q"):
ret = messagebox.askyesno('確認', 'このフォルダの処理をスキップしますか?')
if ret==True:
print("処理をスキップしました")
return
cv2.destroyWindow("img")
cv2.waitKey(1)
if __name__=='__main__':
print("Sキーで削除、Qキーで処理を終わる、それ以外のキーは次の画像に移る")
folder_path = input("フォルダのパスを入力してください")
cars_list = os.listdir(folder_path)
for car in cars_list:
car_path = folder_path+'/'+car
img_select(car_path)
ret = messagebox.askyesno('確認', '処理を終わりますか?')
if ret==True:
break
print('処理を終了しました')
入力フォルダ構造
入力フォルダの構造はこんな感じ
root/
├img1_folder/
│ ├img1.png
│ ├img2.png
│ └img3.png
├img2_folder/
│ ├img1.png
│ ├img2.png
│ └img3.png
:
:
├imgn_folder/
│ ├img1.png
│ ├img2.png
│ └img3.png
操作方法
- 実行したら
フォルダのパスを入力してください
と指示されるので上記のディレクトリ構造のroot
のパスを入力する。- Google-images-downloderを使っていたら実行したときに作成される
downloads
のフォルダのパスを入力
- Google-images-downloderを使っていたら実行したときに作成される
-
root
ディレクトリ内のフォルダが上から順にそのディレクトリ内の画像が新しいウィンドウに表示される。 -
S
を押すと表示されている画像が削除される。 -
Q
を押すと今いるディレクトリの処理をスキップする。- 次の画像ディレクトリに移動する。
- それ以外のキーを押すと画像が切り替わる
- 画像がまとまっているディレクトリ(imgn_folder)の中の画像すべて見終わったらプログラムを終了するかを確認するウィンドウが表示される。
-
はい
を押したらプログラムが終了する。いいえ
を押したら次の画像フォルダに移動する。
-