Pythonで映像の顔に自動モザイク処理:MediaPipe vs DNN(ResNet SSD)+GPU高速化 part2
映像データから人物の顔を検出してモザイクをかける技術は、監視・業務記録・教育現場などでプライバシー保護のために非常に重要です。本記事では、
- 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
特徴
- モデルを手動でダウンロード(
prototxt
とcaffemodel
) - 小さい顔や斜め顔に強い
- 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. 処理速度・精度の比較
項目 | MediaPipe | OpenCV DNN(CPU) | OpenCV DNN(GPU) |
---|---|---|---|
速度 | ◎(高速) | △(やや遅い) | ◎(高速) |
精度 | ○ | ◎(マスク・小顔対応) | ◎ |
小さい顔 | △ | ○~◎(マルチスケールで強化) | ◎ |
導入難易度 | ◎(pipのみ) | ○(モデルDL必要) | △(CUDAビルドが必要) |
5. まとめ
映像のプライバシー対策としての顔モザイク処理は、シーンに応じて適切な顔検出器の選択が重要です:
- リアルタイム・軽量な処理 → MediaPipe
- 小顔や高精度が必要 → OpenCV DNN(マルチスケール)
- 重い処理を高速化 → CUDAでGPU推論
Python+OpenCV+MediaPipeは、あらゆるプラットフォームで動作する強力な選択肢です。目的に応じて最適な構成を選び、安心・安全な映像処理を実現しましょう。