AI・機械学習

PythonとOpenCVで画像認識アプリを30分で作る!AI入門の実践チュートリアル

画像認識ってAIの中でも特に難しそう…」そんな印象を持っていませんか?

実は、PythonとOpenCVを組み合わせれば、プログラミング初心者でも30分ほどで動く画像認識アプリが作れます。今回は「むずかしそう」を「できそう」に変えるべく、ゼロから一緒に手を動かしてみましょう! 🚀

この記事の対象者・難易度

computer vision camera
computer vision camera / Photo by Vladimír Stránský via Pexels
  • ✅ Pythonの基本文法(if文・関数)がなんとなくわかる方
  • ✅ 「機械学習」や「AI」に興味はあるけど、何から始めればいいか迷っている方
  • ✅ ライブラリのインストール経験がある方(pip使ったことがあればOK)

難易度:初〜中級者向け ⭐⭐☆☆☆

OpenCVと機械学習、ざっくり何ができるの?

OpenCV(Open Source Computer Vision Library)は、画像や動画を扱うための定番ライブラリです。イメージとしては、「カメラや写真の情報をPythonで自由に操作できるツールボックス」です。

そこに機械学習の力を組み合わせると、こんなことが実現できます。

  • 📷 写真の中から顔を自動検出する
  • 🚗 動画から車や人を認識する
  • 🔍 物体が「何であるか」を分類・判定する

今回作るのは「カメラ映像からリアルタイムで顔を検出するアプリ」です。OpenCVにはあらかじめ学習済みのモデル(Haar Cascadeと呼ばれるもの)が同梱されているので、自分でデータを集めてトレーニングする必要がありません。これが初心者にとって最高の入り口なんですよね。

STEP 1:環境を整えよう

まず必要なライブラリをインストールします。ターミナル(またはコマンドプロンプト)で以下を実行してください。

pip install opencv-python

インストールが完了したら、Pythonで読み込めるか確認しておきましょう。

import cv2
print(cv2.__version__)

バージョン番号が表示されればOKです! 🎉
ここでエラーが出る場合は、pipが正しいPython環境を向いているか確認してみてください。

STEP 2:画像から顔を検出してみよう

最初のサンプルは「静止画像から顔を検出して枠を描く」コードです。カメラ不要で試せるので、まずここからスタートしましょう。

import cv2

# OpenCVに同梱されている学習済みモデルを読み込む
# 「顔検出」に特化したHaar Cascade分類器を使用
face_cascade = cv2.CascadeClassifier(
    cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
)

# 画像を読み込む(同じフォルダにtest.jpgを置いてください)
img = cv2.imread('test.jpg')

# グレースケールに変換(顔検出はグレー画像で行うのが基本)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 顔を検出する
# scaleFactor: 画像を縮小しながら探す倍率
# minNeighbors: 検出の厳しさ(大きいほど誤検知が減る)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)

# 検出された顔の数だけ四角形を描く
for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

print(f'{len(faces)}個の顔を検出しました')

# 結果を保存して表示
cv2.imwrite('result.jpg', img)
cv2.imshow('Face Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

ポイントをまとめるとこんな感じです👇

  • CascadeClassifier:OpenCVが持つ学習済みモデル。自分でAIを訓練しなくていいのが嬉しいところ
  • グレースケール変換:顔検出のアルゴリズムはカラー情報を使わず、輝度(明暗)のパターンで顔を探します
  • detectMultiScale:画像のサイズを変えながら顔を探す関数。minNeighborsを調整すると精度が変わります

STEP 3:カメラ映像でリアルタイム検出に挑戦!


静止画で動いたら、いよいよ本番です。カメラ映像を使ったリアルタイム顔検出に進みましょう。これ、実際に動くと感動しますよ 😊

import cv2

# 学習済みモデルを読み込む
face_cascade = cv2.CascadeClassifier(
    cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
)

# PCのカメラを起動(0番が内蔵カメラ)
cap = cv2.VideoCapture(0)

if not cap.isOpened():
    print('カメラが見つかりませんでした')
    exit()

print('カメラ起動! Qキーで終了します')

# カメラ映像をフレームごとに処理するループ
while True:
    ret, frame = cap.read()  # 1フレーム取得

    if not ret:
        break

    # グレースケールに変換
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 顔を検出
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)

    # 検出された顔に枠を描画
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
        # 顔の上に「Face」とテキスト表示
        cv2.putText(frame, 'Face', (x, y - 10),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

    # 検出数を画面左上に表示
    cv2.putText(frame, f'Faces: {len(faces)}', (10, 30),
                cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)

    # フレームを表示
    cv2.imshow('Real-time Face Detection', frame)

    # Qキーで終了
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# リソースを解放
cap.release()
cv2.destroyAllWindows()
print('終了しました')

ここが重要です👇

  • VideoCapture(0):PCの内蔵カメラを取得します。外付けカメラがある場合は12を試してみてください
  • whileループ:毎フレームを取得→処理→表示という流れを繰り返しています。動画とはフレームの連続なんですよね
  • waitKey(1):1ミリ秒待ちつつキー入力を受け付けます。これがないとウィンドウが応答しなくなります
  • cap.release():終了時にカメラを解放するのを忘れずに!

精度を上げたいときのヒント 💡

実際に動かしてみると「少しズレて検出される」「誤検知が多い」と感じることもあります。そんなときは以下を調整してみてください。

  • scaleFactor を上げる(例:1.3)→処理は速くなるが精度が落ちやすい
  • minNeighbors を上げる(例:8)→誤検知が減るが見逃しも増える
  • minSize を指定する(例:minSize=(50, 50))→小さすぎる検出を無視できる

このへんのパラメータ調整、実は機械学習モデルを使いこなす上でとても大事な感覚なんです。ざっくりとした流れがつかめたら、次は数値をいろいろ変えて試してみるのがおすすめです。

次のステップ:scikit-learnと組み合わせるとさらに広がる

OpenCVの学習済みモデルに慣れてきたら、次はscikit-learnというライブラリと組み合わせてみましょう。

OpenCVで「画像から特徴を取り出す」→ scikit-learnで「その特徴を学習・分類する」という流れが、Python×機械学習の画像認識における王道パターンです。たとえば「りんご」か「みかん」かを判定するオリジナル分類器も作れるようになりますよ。

# scikit-learnを使った画像分類の基本的な流れ(イメージ)
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
import numpy as np

# 画像から特徴量を抽出したデータ(例)
# X: 特徴ベクトルの配列, y: ラベル(0=りんご, 1=みかんなど)
X = np.array([...])  # OpenCVで処理した画像データ
y = np.array([...])  # 正解ラベル

# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# SVMで学習
model = SVC(kernel='rbf')
model.fit(X_train, y_train)

# テストデータで精度を確認
print(f'精度: {model.score(X_test, y_test) * 100:.1f}%')

こちらはあくまでイメージですが、基本的な構造はこれだけです。「データを入れて→学習させて→精度を確認する」というサイクルです。

まとめ


今回は、PythonとOpenCVを使って画像認識アプリを作る方法をゼロから解説しました。

  • ✅ OpenCVのインストールと動作確認
  • ✅ 学習済みモデル(Haar Cascade)を使った顔検出
  • ✅ カメラ映像でのリアルタイム検出
  • ✅ 精度調整のポイント
  • ✅ scikit-learnとの組み合わせイメージ

「AI・機械学習は難しそう」と思っていたとしても、OpenCVという強力な土台があれば、最初の一歩はびっくりするくらい短いコードで踏み出せます。まずは今日のコードをそのままコピーして動かしてみてください。動いた瞬間の感動、きっとクセになりますよ 😄

次回は、ディープラーニングを使った物体検出(YOLOとPython)に挑戦する予定です。今回の内容をマスターしたら、ぜひそちらも一緒に学んでいきましょう!

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る

実践Claude Code入門―現場で活用するためのAIコーディングの思考法

もしも

実践Claude Code入門―現場で活用するためのAIコーディングの思考法

AIコーディングの現場活用法を学ぶ一冊

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です