Pythonで映像の顔に自動モザイク処理:MediaPipe vs DNN(ResNet SSD)+GPU高速化 part2

Pythonで映像から顔を検出しモザイク処理:MediaPipe版とDNN(CUDA)高速化の比較

映像データから人物の顔を検出してモザイクをかける技術は、監視・業務記録・教育現場などでプライバシー保護のために非常に重要です。本記事では、

  • MediaPipeを使った軽量・高速な顔検出
  • OpenCV DNN(ResNet SSD)を使った高精度な検出
  • GPU高速化(CUDA)による処理時間短縮

という3つの観点で、Pythonによる実装コードとともに詳しく解説します。


1. MediaPipeを用いたリアルタイム顔検出+モザイク処理

MediaPipeはGoogleが提供する軽量なマルチプラットフォームAIライブラリです。Python用にも最適化されており、簡単にリアルタイム顔検出が可能です。

ソースコード(主要部)

import mediapipe as mp
mp_fd = mp.solutions.face_detection
face_detector = mp_fd.FaceDetection(model_selection=1, min_detection_confidence=0.6)

def detect_faces_mediapipe(frame):
    h, w = frame.shape[:2]
    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    results = face_detector.process(rgb)
    faces = []
    if results.detections:
        for det in results.detections:
            box = det.location_data.relative_bounding_box
            x = int(box.xmin * w)
            y = int(box.ymin * h)
            bw = int(box.width * w)
            bh = int(box.height * h)
            faces.append((x, y, bw, bh))
    return faces

特徴

  • インストールが簡単(pip install mediapipe
  • 軽量かつクロスプラットフォーム
  • マスク顔や横顔への対応はやや弱め

2. OpenCV DNN(ResNet SSD)を使った高精度検出

OpenCVには cv2.dnn モジュールがあり、学習済みの Caffe モデル(ResNet SSD)を使って顔検出が可能です。こちらは精度が高く、小さな顔も拾いやすいです。

ソースコード(マルチスケール対応)

net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "res10_300x300_ssd_iter_140000.caffemodel")
# GPU利用設定(後述)
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)

def detect_faces_dnn_multiscale(frame, conf_threshold=0.4, scale_factors=[1.0, 1.5]):
    h0, w0 = frame.shape[:2]
    faces = []
    for scale in scale_factors:
        resized = cv2.resize(frame, (0, 0), fx=scale, fy=scale)
        blob = cv2.dnn.blobFromImage(resized, 1.0, (300, 300),
                                     (104.0, 177.0, 123.0), swapRB=False, crop=False)
        net.setInput(blob)
        dets = net.forward()
        for i in range(dets.shape[2]):
            conf = dets[0, 0, i, 2]
            if conf < conf_threshold: continue
            x1 = int(dets[0,0,i,3] * resized.shape[1] / scale)
            y1 = int(dets[0,0,i,4] * resized.shape[0] / scale)
            x2 = int(dets[0,0,i,5] * resized.shape[1] / scale)
            y2 = int(dets[0,0,i,6] * resized.shape[0] / scale)
            faces.append((x1, y1, x2 - x1, y2 - y1))
    return faces

特徴

  • モデルを手動でダウンロード(prototxtcaffemodel
  • 小さい顔や斜め顔に強い
  • MediaPipeよりやや重め(GPUがあれば快適)

3. GPUを使った高速化(OpenCV DNN × CUDA)

OpenCVはCUDA対応ビルドであれば、cv2.dnn モジュールをGPUで動かすことが可能です。

設定コード

# GPU使用の指定(CUDAビルドが必要)
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)

効果

  • 処理速度:CPUの数倍以上(特に高解像度映像で差が大)
  • 顔検出やマルチスケール処理が現実的な速度に

注意点

  • OpenCVは通常のpip install opencv-pythonではCUDA未対応
  • CUDA対応OpenCVを自力ビルド or .whl導入が必要
  • Windowsでは Huihut氏のビルド などが使える

4. 処理速度・精度の比較

項目MediaPipeOpenCV DNN(CPU)OpenCV DNN(GPU)
速度◎(高速)△(やや遅い)◎(高速)
精度◎(マスク・小顔対応)
小さい顔○~◎(マルチスケールで強化)
導入難易度◎(pipのみ)○(モデルDL必要)△(CUDAビルドが必要)

5. まとめ

映像のプライバシー対策としての顔モザイク処理は、シーンに応じて適切な顔検出器の選択が重要です:

  • リアルタイム・軽量な処理 → MediaPipe
  • 小顔や高精度が必要 → OpenCV DNN(マルチスケール)
  • 重い処理を高速化 → CUDAでGPU推論

Python+OpenCV+MediaPipeは、あらゆるプラットフォームで動作する強力な選択肢です。目的に応じて最適な構成を選び、安心・安全な映像処理を実現しましょう。

コメントを残す

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

CAPTCHA