この絵には何が書かれている?
Oregin
Tyanakaiさんが、データ内の画像重複に関するトピックを掲載くださいました。
https://prob.space/competitions/religious_art/discussions/Tyanakai-Post096f62edc542b4902976
このトピックに関連して、類似画像の抽出を簡易自動化したバージョンを掲載いたします。ご活用ください。GoogleGoogle Colaboratory にて実行できます。
# 画像の重複をチェックするライブラリのインストール(https://github.com/idealo/imagededup) !pip install imagededup
# 各ライブラリのインポート import warnings warnings.simplefilter('ignore') import numpy as np from PIL import Image from pathlib import Path from imagededup.methods import PHash from imagededup.utils import plot_duplicates
# 訓練データ、ラベルデータ、テストデータの保存されたパスを指定 # (環境に合わせて設定してください。) dataset_path = Path("/content/drive/MyDrive/data")
# 各データファイルのパスを指定 train_image_path = dataset_path / "christ-train-imgs.npz" train_label_path = dataset_path / "christ-train-labels.npz" test_image_path = dataset_path / "christ-test-imgs.npz"
# 各データの読み込み Y_train = np.load(train_label_path)["arr_0"].astype(np.int) X_train = np.load(train_image_path)["arr_0"].astype(np.float) test = np.load(test_image_path)["arr_0"].astype(np.float)
# 訓練画像、テスト画像を一時的に保存するディレクトリの作成 train_path = Path("train_images") test_path = Path("test_images") if not train_path.exists(): train_path.mkdir() if not test_path.exists(): test_path.mkdir()
# 分類するクラス数の設定 num_classes = 13
# 類似画像チェック用の画像ファイルの保存 for label in range(num_classes): label_index = np.where(Y_train == label)[0] for idx, data in enumerate(X_train[label_index]): image_path = f'./{train_path}/{label}_{idx}.gif' pil_img = Image.fromarray(np.uint8(data)) pil_img.save(image_path )
# PHashを用いてハッシュ値が類似している画像のチェック # デフォルトの設定で類似判定しているので、一部類似していない画像もありますが、幅広で抽出しています。 phasher = PHash() encodings = phasher.encode_images(image_dir=str(train_path)) duplicates = phasher.find_duplicates(encoding_map=encodings)
2021-07-14 05:04:59,967: INFO Start: Calculating hashes... 100%|██████████| 654/654 [00:01<00:00, 576.28it/s] 2021-07-14 05:05:01,197: INFO End: Calculating hashes! 2021-07-14 05:05:01,199: INFO Start: Evaluating hamming distances for getting duplicates 2021-07-14 05:05:01,203: INFO Start: Retrieving duplicates using Cython Brute force algorithm 100%|██████████| 654/654 [00:00<00:00, 72598.85it/s] 2021-07-14 05:05:01,333: INFO End: Retrieving duplicates using Cython Brute force algorithm 2021-07-14 05:05:01,335: INFO End: Evaluating hamming distances for getting duplicates
# PHashを用いたチェック結果の出力 # デフォルトの設定で類似判定しているので、一部類似していない画像もありますが、幅広で抽出しています。 for k, v in duplicates.items(): if v: print(k, v) plot_duplicates(image_dir=str(train_path), duplicate_map=duplicates, filename=k)
5_7.gif ['6_4.gif']
11_28.gif ['11_14.gif']
11_35.gif ['11_2.gif']
4_18.gif ['4_21.gif']
1_36.gif ['1_19.gif']
2_1.gif ['2_12.gif']
2_33.gif ['2_92.gif']
5_38.gif ['5_20.gif']
2_15.gif ['2_29.gif']
4_32.gif ['4_38.gif']
2_68.gif ['2_113.gif']
2_29.gif ['2_15.gif', '11_26.gif']
5_37.gif ['5_17.gif', '5_32.gif']
4_14.gif ['4_11.gif']
2_113.gif ['2_41.gif', '2_68.gif']
1_1.gif ['1_37.gif']
6_4.gif ['5_7.gif']
11_41.gif ['11_6.gif']
5_17.gif ['5_37.gif']
11_2.gif ['11_35.gif']
2_92.gif ['2_33.gif']
1_19.gif ['1_36.gif']
5_20.gif ['5_38.gif']
2_104.gif ['2_59.gif']
11_14.gif ['11_28.gif']
4_38.gif ['4_32.gif']
4_11.gif ['4_14.gif']
11_6.gif ['11_41.gif']
2_12.gif ['2_1.gif']
4_21.gif ['4_18.gif']
1_34.gif ['1_20.gif']
2_59.gif ['2_104.gif']
2_41.gif ['2_113.gif']
5_32.gif ['5_37.gif']
1_20.gif ['1_34.gif']
11_26.gif ['2_29.gif']
1_37.gif ['1_1.gif']
# 類似画像チェック用の画像ファイルの保存 for idx, data in enumerate(test): Image.fromarray(np.uint8(data)).save(test_path / "{}.gif".format(idx))
# PHashを用いてハッシュ値が類似している画像のチェック # デフォルトの設定で類似判定しているので、一部類似していない画像もありますが、幅広で抽出しています。 encodings = phasher.encode_images(image_dir=str(test_path)) duplicates = phasher.find_duplicates(encoding_map=encodings)
2021-07-14 05:05:22,394: INFO Start: Calculating hashes... 100%|██████████| 497/497 [00:00<00:00, 567.13it/s] 2021-07-14 05:05:23,324: INFO End: Calculating hashes! 2021-07-14 05:05:23,325: INFO Start: Evaluating hamming distances for getting duplicates 2021-07-14 05:05:23,326: INFO Start: Retrieving duplicates using Cython Brute force algorithm 100%|██████████| 497/497 [00:00<00:00, 327813.98it/s] 2021-07-14 05:05:23,457: INFO End: Retrieving duplicates using Cython Brute force algorithm 2021-07-14 05:05:23,458: INFO End: Evaluating hamming distances for getting duplicates
# PHashを用いたチェック結果の出力 # デフォルトの設定で類似判定しているので、一部類似していない画像もありますが、幅広で抽出しています。 for k, v in duplicates.items(): if v: print(k, v) plot_duplicates(image_dir=str(test_path), duplicate_map=duplicates, filename=k)
62.gif ['197.gif', '436.gif']
175.gif ['298.gif']
294.gif ['227.gif']
214.gif ['363.gif']
168.gif ['431.gif']
350.gif ['162.gif']
309.gif ['33.gif']
77.gif ['435.gif']
240.gif ['244.gif']
33.gif ['309.gif']
351.gif ['15.gif']
447.gif ['197.gif']
436.gif ['62.gif', '197.gif']
162.gif ['350.gif']
7.gif ['226.gif']
92.gif ['251.gif']
15.gif ['351.gif']
435.gif ['77.gif']
298.gif ['175.gif']
244.gif ['240.gif']
431.gif ['168.gif']
197.gif ['62.gif', '447.gif', '436.gif']
227.gif ['294.gif']
251.gif ['92.gif']
363.gif ['214.gif']
226.gif ['7.gif']
こんな便利なライブラリがあるんですね。勉強になりました。 共有下さりありがとうございます。