[MediaPipe x ChatGPT] 速攻でオブジェクト認識を始める

# はじめに
気になっているライブラリを使ってみたい。新しい分野のサンプルコードを動かして開発に活用したい。このようなシチュエーションでは、プロンプトを工夫しなくても差し支えないと思います。

プロンプトを工夫してChatGPTの出力を制御する手法がありますが、私が普段ChatGPTとペアプログラミングする際には意識していません。思うがままに入力して、期待する出力が得られないのであれば、具体的に変更箇所を指示することで、不自由なく使えています。

# テーマ：MediaPipeを使った開発
ChatGPTとのペアプログラミングの例として、MediaPipeというGoogle社が開発した学習済みモデルを使用した画像処理アプリケーションを動かしてみます。

https://ai.google.dev/edge/mediapipe/solutions/guide?hl=ja

|種別|バージョン|
|----|----|
|モデル|ChatGPT-4|
|Python|3.11|
|conda|conda 22.9.0|
|開発環境|VSCode|

# 1ターン目

~~~:入力したプロンプト（1ターン目）
PythonでMediaPipeを使ったサンプルコードを提供してください。
始めて使用するので依存関係のインストール方法も提示してください。
~~~

## ChatGPTからの解答（1ターン目）
MediaPipeは、Googleによって開発されたマルチモーダル（音声、ビデオ、時間的メディアなど）での機械学習パイプラインを構築するためのフレームワークです。以下に、PythonでMediaPipeを使ってカメラの映像から顔を検出するサンプルコードとそのセットアップ方法を示します。


### 1. 依存関係のインストール

まず、MediaPipeを使用するにはPython環境にいくつかのライブラリをインストールする必要があります。以下のコマンドを使用してインストールできます。

```bash
pip install mediapipe opencv-python
```

### 2. サンプルコード

以下のサンプルコードは、ウェブカメラからの映像を取得し、リアルタイムで顔の検出を行います。

```python
import cv2
import mediapipe as mp

# MediaPipeの顔検出モデルを初期化
mp_face_detection = mp.solutions.face_detection
mp_drawing = mp.solutions.drawing_utils

# カメラの映像を取得
cap = cv2.VideoCapture(0)

with mp_face_detection.FaceDetection(
    model_selection=0, min_detection_confidence=0.5) as face_detection:

    while cap.isOpened():
        success, image = cap.read()
        if not success:
            continue

        # BGR画像をRGBに変換
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

        # 画像から顔を検出
        results = face_detection.process(image)

        # 画像をBGRに戻す
        image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)

        # 検出結果の描画
        if results.detections:
            for detection in results.detections:
                mp_drawing.draw_detection(image, detection)

        # 結果を画面に表示
        cv2.imshow('MediaPipe Face Detection', image)
        if cv2.waitKey(5) & 0xFF == 27:
            break

cap.release()
cv2.destroyAllWindows()
```

このコードでは、MediaPipeの顔検出機能を使って、リアルタイムでカメラ映像から顔を検出し、それを画面に表示します。ウィンドウを閉じるには、ESCキーを押してください。

これで基本的なセットアップとサンプルコードの説明は完了です。何か他に知りたいことがあれば、お知らせください。

# 動作確認（1ターン目）
VScodeにコピペして、Python仮想環境をMediaPipeとOpenCVをインストールした環境に切り替えることで、カメラが起動してフェイストラッキングしてくれることを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809508/fe0ef207-b227-e9ad-cfec-4e8451554d69.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809508/5dc4d427-6a94-24a8-978b-fc7328b801f7.png)


# 2ターン目
将来的に、ハンドジェスチャーでマウスをコントロール（Apple Vision Proみたいに)したいので、異なるサンプルコードを書いてもらうことにしました。

~~~:入力したプロンプト（2ターン目）
手を認識するサンプルコードはありますか？
~~~

## ChatGPTからの解答（2ターン目）

もちろんです。MediaPipeを使用して手の検出を行うサンプルコードを以下に示します。このコードはウェブカメラからの映像をリアルタイムで処理し、検出された手のランドマークを描画します。

### サンプルコード

```python
import cv2
import mediapipe as mp

# MediaPipeの手検出モデルを初期化
mp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils

# カメラの映像を取得
cap = cv2.VideoCapture(0)

with mp_hands.Hands(
    min_detection_confidence=0.5, min_tracking_confidence=0.5) as hands:

    while cap.isOpened():
        success, image = cap.read()
        if not success:
            continue

        # BGR画像をRGBに変換
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

        # MediaPipeによる処理
        image.flags.writeable = False
        results = hands.process(image)

        # 画像をBGRに戻す
        image.flags.writeable = True
        image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)

        # 検出した手の描画
        if results.multi_hand_landmarks:
            for hand_landmarks in results.multi_hand_landmarks:
                mp_drawing.draw_landmarks(
                    image, hand_landmarks, mp_hands.HAND_CONNECTIONS)

        # 結果を画面に表示
        cv2.imshow('MediaPipe Hands', image)
        if cv2.waitKey(5) & 0xFF == 27:
            break

cap.release()
cv2.destroyAllWindows()
```

このコードでは、`Hands` モデルを使って手の検出とランドマークの追跡を行います。検出された手のランドマークは、画面上にリアルタイムで描画されます。ウィンドウを閉じるには、ESCキーを押してください。

このコードを実行するためには、先ほどと同様に `mediapipe` と `opencv-python` ライブラリがインストールされている必要があります。もし他に質問があればお知らせください。

# 動作確認（２ターン目）
今回も要求通りに、ハンドトラッキングするコードを出力してくれました。
これで今後は任意のジェスチャーに対して、特定の機能を追加する見通しが立ちました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809508/7afae8f9-2870-de2f-bb2c-497e46ddd676.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809508/adc6b6c4-0287-55db-d23e-34a8f3f9947e.png)

# OpenCV-Python
OpenCVのインストールが進まないな。と思うときは以下の記事を参考にしてください。

https://qiita.com/yokyomitsu/items/7dd122576786e708676d