Python × MediaPipeで映像のプライバシー対策:顔検出&モザイク処理の実践

Python × MediaPipeで映像のプライバシー対策:顔検出&モザイク処理の実践

近年、個人情報やプライバシーの保護が強く求められるようになりました。とりわけ防犯カメラやドローン、業務記録用の映像データにおいて「人の顔」がそのまま映り込むことは、個人識別につながるリスクがあります。

このページでは、Google の MediaPipe を使って「動画内の顔を自動的に検出し、モザイク処理をかける」Pythonスクリプトの仕組みを、プログラミング学習者向けに丁寧に解説します。


1. このスクリプトの目的

本スクリプトの目的は、動画ファイルに含まれる人物の顔を自動的に検出し、モザイク加工を施すことで個人の特定を防ぐことにあります。

  • 入力:映像ファイル(mp4, avi, mov, mkv)
  • 処理:MediaPipeで顔検出 → 検出範囲をモザイク化
  • 出力:顔にモザイクがかかった再生可能な動画

この処理は、映像の第三者提供・共有・公開を行う際のプライバシー対策として非常に有効です。


2. 使用ライブラリ

Pythonと以下のライブラリを使用します。

  • opencv-python:映像の読み書き・画像処理
  • mediapipe:顔検出(AIモデル内蔵)
  • os:フォルダ操作
pip install opencv-python mediapipe

3. ソースコード構成

本スクリプトの全体構造は以下のようになっています。

├─ input_videos/        ← 入力動画フォルダ
├─ output_videos/       ← 処理済み動画の出力先
├─ script.py            ← 本体スクリプト

4. プログラム解説(重要関数)

4.1 顔検出関数 detect_faces_mp

MediaPipeを用いて、1枚のフレーム内から顔の位置を検出する関数です。

def detect_faces_mp(frame):
    h, w = frame.shape[:2]
    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    results = face_detector.process(rgb)

MediaPipeでは顔の位置を「相対座標(0.0~1.0)」で返すため、ピクセル単位に変換します。


    x1 = int(bbox.xmin * w)
    y1 = int(bbox.ymin * h)
    bw = int(bbox.width * w)
    bh = int(bbox.height * h)

また、顔検出がフレーム外にはみ出さないようクリップしています。


4.2 モザイク処理 apply_mosaic

検出された顔の領域に「ピクセル縮小 → 拡大」によるモザイクをかけます。

def apply_mosaic(face_roi, mosaic_rate=0.02):
    small = cv2.resize(face_roi, (small_w, small_h), interpolation=cv2.INTER_NEAREST)
    return cv2.resize(small, (w, h), interpolation=cv2.INTER_NEAREST)

mosaic_rate を小さくするほど、モザイクが粗くなります(プライバシー強度UP)。


4.3 メイン処理 loop(process_video)

動画ファイルを1フレームずつ読み込み、顔検出→モザイク→書き出しを繰り返します。


while True:
    ret, frame = cap.read()
    if not ret:
        break
    faces = detect_faces_mp(frame)
    for (x, y, w, h) in faces:
        roi = frame[y:y+h, x:x+w]
        frame[y:y+h, x:x+w] = apply_mosaic(roi)
    out.write(frame)

処理進捗がわかるように、50フレームごとにログ表示もしています。


4.4 フォルダ一括処理(main)

input_videosフォルダ内の動画ファイルを一括で処理して、出力をoutput_videosフォルダに保存します。


for fname in os.listdir(input_folder):
    if ext.lower() in {\".mp4\", \".avi\", \".mov\", \".mkv\"}:
        process_video(in_path, out_path)

5. モデル選択と検出性能の調整

model_selection には以下の2種類があります:

  • 0: 高精度(マスク顔にもやや強い)
  • 1: 高速(処理が軽いが精度はやや落ちる)

現実的な運用では model_selection=1 をベースにしつつ、精度が必要な環境では 0 に切り替えてください。

また、小さな顔が検出されないときは、フレームを拡大して検出する「マルチスケール検出」などのテクニックも有効です(処理時間は増えます)。


6. 応用と今後の展望

このスクリプトは基本的なモザイク処理を行いますが、以下のような応用が可能です:

  • 音声付き動画の処理(音声はそのまま)
  • トラッキングで検出漏れ補完(追跡アルゴリズム併用)
  • 静止画への応用(サムネイル自動モザイク)
  • マスク顔にも強い顔検出(RetinaFace, MTCNNなどへの切り替え)

倫理的な観点でも、「AIを使って何を守るか」という視点は非常に重要です。安易に顔を残すのではなく、意識的に保護する文化の一端として、こうした技術を活用していきましょう。


7. おわりに

本記事では Python と MediaPipe を使って、動画中の顔にモザイクをかけることでプライバシー保護を図る実用的なスクリプトを解説しました。

企業の映像管理、学校行事の記録、映像制作の素材整備など、あらゆる現場でこのような自動処理が求められています。技術を正しく使って、守るべきものを守れるよう、ぜひこのスクリプトを活用してください。© 株式会社ビー・ナレッジ・デザイン

コメントを残す

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

CAPTCHA