スマホ写真を、用途別に振り分けるpythonコード

　スマホで保存されている写真を時間のあるときに、ドライブなどに保存することがあるかと思います。

　その時に私は、写真とスクショの振り分けを手作業で行っていたのですが、何百枚という大量の枚数の振り分けはとても時間のかかる作業で、これまで少しづつ学んだ機械学習で、サクッと振り分けできないかなぁと思い立ちました。


# 準備するもの
・Pythonのローカル環境
・フォルダ
・フォルダの中に
　　フォルダ１：スマホ全画像を入れる　
　　フォルダ２：スマホで撮影した写真用
　　フォルダ３：ネットで見つけたスクショ画像用
　　フォルダ４：判別不能だった画像用

を作成しておきます。フォルダの名前は各自好きな名前で作成しておきます。

そして、フォルダ１にある全画像のうち、フォルダ２に入れたい種類の写真の４，５枚を画像訓練用データとして入れておきます。（ここは手作業）

フォルダ3も、フォルダ2と同じように、振り分けしたいスクショ画像を訓練データとして４，５枚入れておきます。

# コード

```python
#インポートするライブラリ
import os
import cv2
import numpy as np
from sklearn.svm import SVC
```

pillowライブラリでもできますが、今回はOpenCVを使用しています。

```python
people_folder = r"C:\imagesort1\people" #フォルダの所は各自設定したフォルダのパスを入れる。
screenshots_folder = r"C:\imagesort1\screenshots"
unlabeled_folder = r"C:\imagesort1\unlabeled_folder"
moblephone = r"C:\imagesort1\moblephone"
image_size = (100, 100)

# サポートする画像ファイルの拡張子リスト
supported_extensions = ['.jpg', '.png', '.jpeg']

# モデルの準備
model = SVC(kernel='linear', C=1, random_state=42)
labels = []
data = []

# 人物画像の処理
for filename in os.listdir(people_folder):
    _, ext = os.path.splitext(filename)
    ext = ext.lower()

    if ext in supported_extensions:
        img = cv2.imread(os.path.join(people_folder, filename))
        img = cv2.resize(img, image_size)
        gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        labels.append(0)
        data.append(gray_img) # 2次元の画像データを追加

# スクリーンショット画像の処理
for filename in os.listdir(screenshots_folder):
    _, ext = os.path.splitext(filename)
    ext = ext.lower()

    if ext in supported_extensions:
        img = cv2.imread(os.path.join(screenshots_folder, filename))
        img = cv2.resize(img, image_size)
        gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        labels.append(1)
        data.append(gray_img) # 2次元の画像データを追加


# モデルの学習
data = np.array(data)
labels = np.array(labels)
model.fit(data.reshape(len(data), -1), labels) 

# 未分類の画像を振り分ける
for filename in os.listdir(moblephone):
    _, ext = os.path.splitext(filename)
    ext = ext.lower()

    if ext in supported_extensions:
        img = cv2.imread(os.path.join(moblephone, filename))
        img = cv2.resize(img, image_size)
        gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        predicted_label = model.predict(gray_img.flatten().reshape(1, -1))

        if predicted_label == 0:
            # 人物画像だと判定された場合
            destination_folder = people_folder
        else:
            # スクリーンショット画像だと判定された場合
            destination_folder = screenshots_folder

        # 画像を振り分ける
        destination_path = os.path.join(destination_folder, filename)
        os.rename(os.path.join(moblephone, filename), destination_path)

print("画像の自動振り分けが完了しました。")
```

実行が成功すると、下記のメッセージが表示されます。

![スクリーンショット 2023-08-18 094931.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743575/da2cdff5-037b-3ac7-90fe-3a7e69cd4575.png)

画像フォルダのところを見に行くと、振り分けが完了しています。

　私がスマホで撮影した画像とスクショ画像と振り分けしてみた時は、８割上手くいきました。上手くいかなかった２割は手作業で振り分けました。それでも最初から手作業で振り分けするよりも、大幅に時間短縮することができたので、とても満足しています。

　Googleフォトなどのクラウドサービスでも振り分け機能はありますが、今回ChatGPTに協力してもらいながら振り分け機能を作った事で、機械学習ってこうやって役に立つのかぁ！と自分自身、実感することができました。

　この振り分け方はあくまでも一例で、例えば人物と動物を振り分けたり、人物だけ用、風景用という分け方でも、対応できると思います。

　まだまだPython勉強中の身ですが、学んだことを日々の不便に感じていることに役立てることが少しづつできている実感があるので、とても楽しいです。

　また便利そうなコードを作れた時にはアップしたいと思います！