0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

手軽に始める!画像認識AIで猫と犬を分類するアプリ

Last updated at Posted at 2025-08-20

みなさんこんにちは。本日もブログの記事をせっせと書いております。
気が付くともう8月…(めっちゃ外暑い) 社会人になってもう4ヶ月目です。
エンジニアとしてそろそろAIについて学んでみようと思いましたので、今回は画像認識AIを作ってみようと思います。

「AI」と聞くと難しそうに感じるかもしれませんが、実は身近な技術です。
この記事では、Google Colab(無料のブラウザで動くPythonエディタ)を使って、猫と犬の画像を自動で分類するAIを一緒に作っていきましょう!


1. AIプログラミングを始める準備(Google Colabの起動)

AIを動かすには、通常、ライブラリといった便利ツールをインストールしなければいけません。
Google Colabでは、AIライブラリ(scikit-learn, TensorFlowなど)がインストールされている状態のため、今回はこちらのエディタを使用してコードを書いていきます。

Google Colabにアクセスする

  1. Googleアカウントでログインします。
  2. Google Colabのサイトにアクセスします。
  3. 「新しいノートブック」をクリックして、新しい作業画面を開きます。

これで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つに分けるのが一般的です。例えるなら、学校のテストと同じです。

  1. 訓練データ(Training set):**「教科書」**です。AIは、このデータを使って猫と犬の特徴を必死に勉強します。学習するすべての画像がこのデータに含まれます。
  2. 検証データ(Validation set):**「練習問題」**です。AIの先生(つまり私たち)は、AIが教科書で勉強した後に、この練習問題を解かせてみて、どれくらい賢くなったかをチェックします。
  3. テストデータ(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が画像認識を行う基本的な流れを体験しました。

  1. データセットの準備: AIに何を学習させるかを決めます。
  2. 前処理: AIが理解できる数値データに画像を変換します。
  3. 学習: データを使ってAIモデルにパターンを学習させます。
  4. 予測: 学習済みのモデルで、新しいデータを分類します。

これらのステップは、AIを使った様々なタスクで共通する考え方です。

4.2. さらにクオリティを上げるなら?

今回のモデルは、計20枚の画像しか学習していません。
もしこのアプリのクオリティをもっと上げたいなら、以下のことに挑戦してみましょう。

  • データ数を増やす: より多くの犬と猫の画像で学習させると、AIはより賢くなります。
  • モデルを変える: 今回はSVCというモデルを使いましたが、AIには他にもたくさんの種類があります。
  • 深層学習(ディープラーニング)に挑戦: 画像認識の分野では、TensorFlow/Kerasを使った「深層学習」という、より高度な技術が主流です。次回はこれに挑戦してみるのも面白いかもしれません。
おまけ

くすりの窓口にてインターン募集中!! 8.9.10月開催
https://internshipguide.jp/interns/internDetail/17895

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?