" />

総合

【2024年】PythonでYouTube動画からフレーム抽出と顔認識をする方法

準備するもの

  1. Python: バージョン3.7以上(今回は3.11.5を使用)
    検索欄に”cmd”と入力して以下入力でダウンロード可能
    pip install opencv-python face-recognition pillow
    次に以下の文でダウンロードできたか確認できます。※Pythonのversionが確認できれば成功。
    python --version
  2. ライブラリ:
    • OpenCV: 動画を処理するため。
    • dlib: 顔検出を行うため。
    • その他: 必要に応じてface_recognitionビルド環境のセットアップWindows環境でdlibをビルドするには、C++コンパイラと開発ツールが必要です。

      a. Visual Studio Build Toolsをインストール

      1. Microsoft Visual Studio Build Toolsにアクセス。
      2. 「Build Tools for Visual Studio」をダウンロード。
      3. インストール中に次のワークロードを選択:
        • C++ build tools
        • 必要に応じて「Windows 10 SDK」を追加。
          cl

          2. dlibのインストール

          1. 再度dlibをインストールします

          pip install dlib

      b. PATHを確認

      Visual Studio Build Toolsが正しくインストールされると、cl.exe(C++コンパイラ)がPATHに追加されます。 次のコマンドを実行して確認します:

これらは事前にインストールしておきます。

ライブラリのインストール

以下のコマンドを実行して、必要なライブラリをインストールします。

pip install opencv-python dlib face-recognition
//できない場合は以下を試してください
python -m ensurepip --upgrade
python -m pip install --upgrade pip
pip --version

手順

1. 動画をフレームに分割する

まず、動画を一定間隔でフレームに分割します。以下のコードを使います。

コード

python
import cv2
import os
def extract_frames(video_path, output_dir, frame_rate=1):
"""
動画をフレームに分割する
:param video_path: 動画ファイルのパス
:param output_dir: フレームを保存するフォルダ
:param frame_rate: フレーム抽出の間隔 (秒)
"""

if not os.path.exists(output_dir):
os.makedirs(output_dir)cap = cv2.VideoCapture(video_path)if not cap.isOpened():
print(f"動画ファイル {video_path} を開けませんでした。パスを確認してください。")
returnfps = int(cap.get(cv2.CAP_PROP_FPS))
interval = int(fps * frame_rate)
frame_count = 0while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
if frame_count % interval == 0:
frame_path = os.path.join(output_dir, f"frame_{frame_count}.jpg")
cv2.imwrite(frame_path, frame)
frame_count += 1cap.release()
print(f"フレーム抽出が完了しました。{output_dir} に保存されました。")# 動画パスと出力フォルダを指定
video_path = "C:\\Users\\owner\\Downloads\\動画名.mp4"
output_dir = "C:\\Users\\owner\\Downloads\\frames"
extract_frames(video_path, output_dir)

説明

  • 動画ファイル (ファイル名.mp4) を1秒ごとに分割してフレームを保存。
  • 抽出されたフレームは指定フォルダ (frames) に保存されます。
  • 動画名は自身の動画ファイルの名前を記入してください

実行方法

  1. 上記コードを extract_frames.py として保存します。
  2. コマンドプロンプトで以下を実行:
    python extract_frames.py

2. 抽出したフレームから顔を検出する

次に、抽出したフレームから顔を検出し、個別の画像として保存します。

コード

python
import dlib
import cv2
import os
def detect_faces(frame_dir, output_dir):
"""
各フレームから顔を検出して保存する
:param frame_dir: フレーム画像のフォルダ
:param output_dir: 顔画像を保存するフォルダ
"""

if not os.path.exists(output_dir):
os.makedirs(output_dir)detector = dlib.get_frontal_face_detector()for frame_file in os.listdir(frame_dir):
frame_path = os.path.join(frame_dir, frame_file)
img = cv2.imread(frame_path)
if img is None:
continuefaces = detector(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY))
for i, face in enumerate(faces):
x, y, w, h = face.left(), face.top(), face.width(), face.height()
face_img = img[y:y+h, x:x+w]
face_path = os.path.join(output_dir, f"{frame_file.split('.')[0]}_face_{i}.jpg")
cv2.imwrite(face_path, face_img)print(f"顔検出が完了しました。{output_dir} に保存されました。")# フレームフォルダと出力フォルダを指定
frame_dir = "C:\\Users\\owner\\Downloads\\frames"
output_dir = "C:\\Users\\owner\\Downloads\\faces"
detect_faces(frame_dir, output_dir)

説明

  • frames フォルダ内の各画像を処理。
  • 検出した顔を切り出して faces フォルダに保存。

実行方法

  1. このコードを detect_faces.py として保存します。
  2. コマンドプロンプトで以下を実行:
    python detect_faces.py

3. 結果の確認

  • frames フォルダには抽出したフレーム画像が保存されています。
  • faces フォルダには各フレームから検出された顔画像が保存されています。

補足

注意点

  • 検出精度:
    • 顔の向きや画像の解像度によって検出精度が変わることがあります。
    • 必要に応じて、解像度を調整したり、高度なモデルを利用してください。
  • ライブラリの互換性:
    • Python 3.7~3.10 が推奨されます。
    • Python 3.11 以降の場合、一部のライブラリで互換性問題が発生する可能性があります。

これで、YouTuberの動画からフレーム抽出と顔認識ができますので、参考になれば嬉しいです。
最悪上記コピペしてChatGPT丸投げでエラー出てもデバッグしてくれます✨️(ほんと助かる)

-総合