みなさんこんにちは。本日もブログの記事をせっせと書いております。
気が付くともう8月…(めっちゃ外暑い) 社会人になってもう4ヶ月目です。
エンジニアとしてそろそろAIについて学んでみようと思いましたので、今回は画像認識AIを作ってみようと思います。
「AI」と聞くと難しそうに感じるかもしれませんが、実は身近な技術です。
この記事では、Google Colab(無料のブラウザで動くPythonエディタ)を使って、猫と犬の画像を自動で分類するAIを一緒に作っていきましょう!
1. AIプログラミングを始める準備(Google Colabの起動)
AIを動かすには、通常、ライブラリといった便利ツールをインストールしなければいけません。
Google Colabでは、AIライブラリ(scikit-learn, TensorFlowなど)がインストールされている状態のため、今回はこちらのエディタを使用してコードを書いていきます。
Google Colabにアクセスする
- Googleアカウントでログインします。
- Google Colabのサイトにアクセスします。
- 「新しいノートブック」をクリックして、新しい作業画面を開きます。
これでAIを動かす準備は完了です。早速コードを書いていきましょう!
2. AIモデルを作成しよう!
2.1. データセットの準備
AIに「猫」と「犬」を判別してもらうには、まずAIに学習させる必要があります。
実際に犬と猫の画像をいくつか用意して、これは猫、これは犬、とひたすら教えてあげる作業ことで、AIが学習し判別できるようになります。
まずは、学習のための犬と猫の画像を用意します。以下のコードを実行してください。
今回は、AIの画像認識分野で有名な「Kaggle Dogs vs. Cats」データセットのサンプルを利用します。
【使用するモジュールについて】
-
urllib.request
: URLを開くための関数とクラスを定義している。インターネット上にあるデータをダウンロードするためのモジュールです。今回はデータセットのZIPファイルをダウンロードするために使います。 -
os
: オペレーティングシステム(OS)と連携するための機能を提供する組み込みモジュールです。今回はファイルやフォルダを操作するため使用します。 -
zipfile
: ZIPファイルを作成、読み書き、追記などするためのモジュールです。ダウンロードした圧縮ファイルを展開するために使います。 -
shutil
: ファイルやフォルダをコピーしたり移動させたりするためのモジュールです。解凍した画像の中から、必要なものをコピーするために使います。
# 必要なライブラリをインストール
!pip install scikit-learn numpy matplotlib Pillow
# Kaggle Dogs vs. Cats データセットをダウンロードする
import urllib.request
import os
import zipfile
# ダウンロードURL
url = "https://download.microsoft.com/download/3/E/1/3E1C3F21-ECDB-4869-8368-6DEBA77B919F/kagglecatsanddogs_5340.zip"
zip_path = "kagglecatsanddogs_5340.zip"
print("データセットをダウンロードしています...")
urllib.request.urlretrieve(url, zip_path)
print("ダウンロードが完了しました!")
# ZIPファイルを解凍
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
zip_ref.extractall()
# データセットの構造が少し複雑なので、学習しやすいようにフォルダを整理します
os.makedirs("dataset/cat", exist_ok=True)
os.makedirs("dataset/dog", exist_ok=True)
# 訓練用の画像をコピーする
import shutil
files = os.listdir("PetImages/Cat")
for f in files[:10]: # サンプルとして10枚だけ使う
if f.endswith('.jpg'):
try:
shutil.copy(f"PetImages/Cat/{f}", "dataset/cat")
except:
# 破損したファイルをスキップ
continue
files = os.listdir("PetImages/Dog")
for f in files[:10]: # サンプルとして10枚だけ使う
if f.endswith('.jpg'):
try:
shutil.copy(f"PetImages/Dog/{f}", "dataset/dog")
except:
# 破損したファイルをスキップ
continue
print("データセットの準備が完了しました!")
print("dataset/cat には", len(os.listdir("dataset/cat")), "枚の猫の画像が、")
print("dataset/dog には", len(os.listdir("dataset/dog")), "枚の犬の画像が用意されました。")
これでdatasetフォルダの中に猫と犬の画像がそれぞれ10枚ずつ用意されます。
【ポイント】
-
なぜわざわざダウンロードするの?: AIの学習にはたくさんの画像が必要です。一つずつ手で集めるのは大変なので、今回はデータセットと呼ばれる、目的別に画像がまとめられたものを利用しました。
-
AIの「カンニング」を防ぐための3つのデータセット
AIを賢くするためには、データセットを3つに分けるのが一般的です。例えるなら、学校のテストと同じです。
- 訓練データ(Training set):**「教科書」**です。AIは、このデータを使って猫と犬の特徴を必死に勉強します。学習するすべての画像がこのデータに含まれます。
- 検証データ(Validation set):**「練習問題」**です。AIの先生(つまり私たち)は、AIが教科書で勉強した後に、この練習問題を解かせてみて、どれくらい賢くなったかをチェックします。
- テストデータ(Test set):**「本番のテスト」**です。これは、AIが絶対に見たことのないデータです。練習問題で十分勉強したAIが、最終的にどれくらいの点数を取れるかを測るために使います。
この3つに分けることで、AIが本当に「猫と犬を区別する」というスキルを身につけたのか、それともただ「画像を丸暗記しただけ」なのかを正確に判断できるようになります。
2.2. 画像データをAIが理解できる形に変換
AIは、私たち人間のように画像を見て「かわいい猫だな」と感じることはできません。AIにとって画像は、ただの数字の羅列です。
このステップでは、画像をAIが理解できる数値データ(配列)に変換する作業をします。
写真を白黒の点(ピクセル)に分解し、それぞれの点の明るさを数字で記録するイメージです。今回は、画像をAIが扱いやすいように、サイズを100x100ピクセルに統一してから変換します。
【使用するモジュールについて】
-
PIL
(Pillow): 画像を読み込んだり、サイズを変更したりするためのモジュールです。AIに画像を学習させるには、画像のサイズを統一する必要があるため、このモジュールを使います。 -
numpy
: 数値計算を高速に行うためのモジュールです。AIは画像を数値の配列として扱うため、画像データをnumpy
の配列に変換するために使います。 -
glob
: 指定したパターンに一致するファイルを探し出すためのモジュールです。今回は、「dataset/cat
フォルダの中にある全ての.jpg
ファイル」を簡単に見つけ出すために使います。
from PIL import Image
import numpy as np
import glob
# 画像のサイズを統一
# AIが画像を扱うとき、同じサイズに揃えるのがお約束です
IMG_SIZE = (100, 100)
# 画像データを格納する「箱」(リスト)
X = []
# 画像の正解ラベル(猫なら0、犬なら1)を格納する「箱」(リスト)
Y = []
# 猫の画像を読み込む
# glob.globは、指定したフォルダの中にあるファイルを全部探し出してくれます
for file in glob.glob("dataset/cat/*.jpg"):
# PIL.Image.open()で画像を開き、resize()でサイズを統一します
img = Image.open(file).resize(IMG_SIZE)
# np.array()で画像を数値の配列に変換します
X.append(np.array(img))
Y.append(0) # 猫はラベル0と決めました
# 犬の画像を読み込む
for file in glob.glob("dataset/dog/*.jpg"):
# こちらも同じように処理
img = Image.open(file).resize(IMG_SIZE)
X.append(np.array(img))
Y.append(1) # 犬はラベル1と決めました
# 最後に、リストをNumpy配列に変換します
X = np.array(X)
Y = np.array(Y)
print("画像の数値データへの変換が完了しました!")
print("データ形状:", X.shape)
print("ラベル形状:", Y.shape)
【ポイント】
-
X.shape
って何?: 実行結果でX.shape
が(20, 100, 100, 3)
と表示されたと思います。「この数字は何だ!?」と戸惑った人もいると思うので解説です。-
20
: 画像が全部で20枚あること(猫10枚 + 犬10枚) -
100, 100
: 画像のサイズが100x100ピクセルであること -
3
: 色の要素(赤、緑、青のRGB)があること
を意味しています。
-
-
ラベルって何?: ラベル(
Y
)は、「この画像が正解は猫だよ(0だよ)」とAIに教えるための「答え」です。これがなければ、AIは何を学習すればいいか分かりません。
2.3. モデルの構築と学習
先ほどのステップで、画像の処理とラベルの作成を行ったため、次は実際にAIに学習させるステップです。
【使用するモジュールについて】
-
sklearn.svm
: **scikit-learn
という、AIや機械学習のツールボックスのようなモジュール群の中の一つです。今回は、画像分類を行うためのSVC
(サポートベクターマシン)**というAIモデルを使うために、ここからインポートします。 -
sklearn.model_selection
:scikit-learn
の中にある、データを「訓練用」と「テスト用」に分けるための機能がまとまったモジュールです。AIの学習と評価を正しく行うために、**train_test_split
**という機能を使います。
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
# データを訓練用とテスト用に分割
# AIは学習していない画像でテストすることで、本当に賢くなったかを確認します
# 今回は80%を学習用(訓練)、20%をテスト用に分けます
X_train, X_test, Y_train, Y_test = train_test_split(X.reshape(len(X), -1), Y, test_size=0.2, random_state=42)
# AIモデル(SVC)を作成
# AIモデルとは、簡単に言えば「どういう基準で判別するか」を考える頭脳のようなものです
model = SVC()
# モデルにデータを学習させる
# fit()という命令で、AIモデルがデータを勉強します
model.fit(X_train, Y_train)
print("AIモデルの学習が完了しました!")
# モデルの精度を評価
# 学習したAIモデルが、テスト用の画像でどれだけ正解できるかを見てみます
accuracy = model.score(X_test, Y_test)
print(f"モデルの予測精度: {accuracy * 100:.2f}%")
【ポイント】
-
train_test_split
って何?: AIは、カンニング(学習した画像でテストすること)を防ぐために、学習用と検証用に画像を分けておくのが鉄則です。train_test_split
は、この分け作業を自動でやってくれます。 - 予測精度ってどれくらいがいいの?: 予測精度が100%になることもありますが、それはAIがまだ十分に賢くなっていないことが多いです。今回はサンプル数が少ないため、精度が低くても問題ありません。重要なのは、AIが学習して予測できるという体験をすることです。
3. 実際に画像を判定してみよう!
3.1. 判定用の画像を準備
いよいよ、実際に「猫」か「犬」かAIに判定させてみましょう!
まず、AIが学習に使っていない新しい犬の画像を、データセットの中から用意します。
import os
import shutil
from PIL import Image
# ダウンロードしたデータセットの中から、AIがまだ見ていない画像を用意します
test_image_dir = "PetImages/Dog"
# 学習に使用した画像以外から1枚選ぶ
# 今回は単純にフォルダの最初の画像をテスト画像として使います
test_image_path = os.path.join(test_image_dir, os.listdir(test_image_dir)[15])
# テスト用の画像をプロジェクトのルートディレクトリにコピーします
shutil.copy(test_image_path, "test_dog.jpg")
print(f"判定用画像の準備が完了しました!ファイル名: test_dog.jpg")
3.2. AIに画像を判定させる
さあ、AIの判定結果を見てみましょう。本当に犬だと判断してくれるのでしょうか…?
# 判定用画像を読み込んで数値データに変換
# 学習のときと同じように、画像をAIが理解できる数値の形に変換します
test_img = Image.open("test_dog.jpg").resize(IMG_SIZE)
test_data = np.array(test_img).reshape(1, -1)
# AIモデルで予測
# model.predict()という命令で、AIが「これは猫か?犬か?」を予測してくれます
prediction = model.predict(test_data)
# 予測結果を表示
# prediction[0]が0なら猫、1なら犬と判定したことになります
if prediction[0] == 0:
print("AIは、この画像を「猫」だと判断しました!")
else:
print("AIは、この画像を「犬」だと判断しました!")
どうですか?「AIは、この画像を『犬』だと判断しました!」と表示されたら成功です!
4. まとめと次のステップ
4.1. 今回学んだことのおさらい
AIが画像認識を行う基本的な流れを体験しました。
- データセットの準備: AIに何を学習させるかを決めます。
- 前処理: AIが理解できる数値データに画像を変換します。
- 学習: データを使ってAIモデルにパターンを学習させます。
- 予測: 学習済みのモデルで、新しいデータを分類します。
これらのステップは、AIを使った様々なタスクで共通する考え方です。
4.2. さらにクオリティを上げるなら?
今回のモデルは、計20枚の画像しか学習していません。
もしこのアプリのクオリティをもっと上げたいなら、以下のことに挑戦してみましょう。
- データ数を増やす: より多くの犬と猫の画像で学習させると、AIはより賢くなります。
- モデルを変える: 今回はSVCというモデルを使いましたが、AIには他にもたくさんの種類があります。
- 深層学習(ディープラーニング)に挑戦: 画像認識の分野では、TensorFlow/Kerasを使った「深層学習」という、より高度な技術が主流です。次回はこれに挑戦してみるのも面白いかもしれません。
おまけ
くすりの窓口にてインターン募集中!! 8.9.10月開催
https://internshipguide.jp/interns/internDetail/17895