【AI/実践編】画像収集~画像前処理方法【衝撃簡単⑥】

Webスクレイピング+画像処理

対象読者

ここでは、機械学習における画像収集~前処理(サイズ変更・ファイル名変更・グレースケール化)を扱います。

このページで紹介する内容は機械学習のサブ的な技術なのでコードの細かな解説などは割愛させていただきます。あくまでも道具として使えれば、細かなところは理解してなくてもOKですもんね。

では、前置きはここまでにして早速やっていきましょう!

画像収集(Webスクレイピング)

Webスクレイピング

画像収集にはWebスクレイピングという技術を使います。これを使うことで、膨大な画像データを自動で収集できるようになります。

しかしこの技術の取り扱いは色々と複雑です。禁止されているサイトやページがあったり、個人情報の問題があったりします。なので以下に載せるコードはあくまでも参考としてのみ提供する形をとらせていただきます。

Python
import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse, parse_qs
import time

def is_valid_url(url):
    # URLが有効なHTTPまたはHTTPSスキームを持っているかどうかを確認する
    return url.startswith("http://") or url.startswith("https://")

def download_images(query, num_images):
    save_dir = './woman_images'#収集した画像の保存先ディレクトリ
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    
    headers = {'User-Agent': 'Mozilla/5.0'}
    downloaded = 0
    while downloaded < num_images:
        # キーワードを含むURLを構築
        url = f"https://www.google.com/search?q={query}&tbm=isch&start={downloaded}"
        # ヘッダーを設定してGoogleにリクエストを送信
        response = requests.get(url, headers=headers)
        # HTMLをパース
        soup = BeautifulSoup(response.text, 'html.parser')
        # 画像のURLを抽出
        image_urls = []
        for img in soup.find_all('img'):
            image_url = img.get('src')
            if image_url and is_valid_url(image_url):
                image_urls.append(image_url)
        # 画像をダウンロード
        for i, image_url in enumerate(image_urls):
            try:
                if downloaded >= num_images:
                    break
                image_data = requests.get(image_url).content
                with open(f'{save_dir}/{query}_{downloaded}.jpg', 'wb') as f:
                    f.write(image_data)
                print(f"Downloaded image {downloaded+1}/{num_images}")
                downloaded += 1
            except Exception as e:
                print(f"Error downloading image {downloaded+1}: {e}")
        time.sleep(1)  # Googleへの負荷を軽減するために1秒待つ

# 使用例
query = "ジヒョ 高画質"  # 検索キーワード
num_images = 100  # ダウンロードする画像の数
download_images(query, num_images)

12行目: 画像の保存先ディレクトリを指定

20行目: 参考用としてGoogleにしましたが、規約などを確認し自己責任で実行してください。

43行目: サーバーの負荷を考えるともっと大きな数字でもいいかも

46行目: 人名(スペース)高画質とする→不純な画像が入ることを極力減らせる

47行目: 自分が欲しい枚数を指定してください。

これらの行をカスタマイズしPythonファイルを実行すれば画像の自動収集ができます。しかし、実行する前には必ず以下の免責事項を一読してください。

免責事項

このブログ記事に記載されているプログラムコードは、あくまでも参考として提供されています。このプログラムコードを使用する場合は、自己責任でご利用ください。作者は、プログラムコードの使用によって発生したいかなる問題や損害に対しても一切の責任を負いません。また、このプログラムコードの使用に関して、Googleの規約や法律に違反しないよう十分に注意してください。利用者は、自らの責任においてプログラムコードを使用し、適切な規則や法律に従うことを義務付けられます。

画像のサイズ変更

画像変更

PythonのPILライブラリは画像の読み込み、変換、保存などのさまざまな操作を行うことができます。これを使うことで、画像のサイズ変更を自動化できるようになります。

Python
from PIL import Image
import os

def resize_images(input_folder, output_folder, target_size):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    for filename in os.listdir(input_folder):
        try:
            # 画像を開く
            img_path = os.path.join(input_folder, filename)
            img = Image.open(img_path)
            # 画像を指定されたサイズにリサイズする
            resized_img = img.resize(target_size)
            # リサイズした画像を保存する
            output_path = os.path.join(output_folder, filename)
            resized_img.save(output_path)
            print(f"Resized image: {output_path}")
        except Exception as e:
            print(f"Error resizing image {filename}: {e}")

# 使用例
input_folder = './woman_images'  # 元の画像が保存されているフォルダ
output_folder = './resized_images_144'    # リサイズされた画像を保存するフォルダ
target_size=(144,144)# 目標の画像サイズ (幅, 高さ)
resize_images(input_folder, output_folder, target_size)

23~26行目はご自分の環境に合わせてカスタマイズしてください。あとは、変更不要です。

ファイル名変更

ファイル名変更

これは、次のグレースケール化の前準備となります。cv2ライブラリを使うときに、ファイル名が日本語などの特殊文字だとエラーが起きます。それを防ぐためにファイル名をランダムな数字に変更していきます。

p.s.カラー画像で学習する場合には、このタスクと次のタスクは不要です。

Python
import os
import random
import string

# ディレクトリのパスを指定
directory = './resized_images_144'

# ディレクトリ内のファイルを取得
files = os.listdir(directory)

# ファイルごとにループ
for filename in files:
    # 拡張子を取得
    _, ext = os.path.splitext(filename)
    
    # 新しいファイル名を生成
    new_filename = ''.join(random.choices(string.digits, k=8)) + ext
    
    # 新しいファイル名のパスを作成
    new_filepath = os.path.join(directory, new_filename)
    
    # ファイル名を変更
    os.rename(os.path.join(directory, filename), new_filepath)

6行目を自分の環境にあうように変えてください。あとは変更不要です。

グレースケール化

グレースケール化

cv2にライブラリを使ってグレースケール化していきます。ただしファイル名が日本語などの特殊文字だとエラーが起きます。しっかりと、前のタスクでファイル名を適切な形にしておいてくださいっ。

Python
import cv2
import os

# 入力画像が保存されているフォルダパス
input_folder = 'resized_images_144'

# 出力フォルダパス
output_folder = 'gray_144_face'

# 入力フォルダ内のすべての画像ファイルを処理
for filename in os.listdir(input_folder):
    # 画像ファイルのパスを取得
    input_path = os.path.join(input_folder, filename)
    
    # 画像をグレースケールで読み込む
    img = cv2.imread(input_path)
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 出力ファイルのパスを指定
    output_path = os.path.join(output_folder, filename)
    
    # グレースケール画像を保存
    cv2.imwrite(output_path, gray_img)

print("変換が完了しました。")

5、8行目を自分用にカスタマイズすれば、他は変更不要です。

おわりに

今回は、画像収集と画像処理方法を紹介しました。これらの技術は当サイトのAI学習タスクで頻繁に使います。

これらの技術を用いた機械学習タスクの実践編を置いておく↓ので、実践を試したい方は自由に利用してください。(只今調整中)

タイトルとURLをコピーしました