公共の場における感染症対策の一環として、非接触かつ効率的な視覚認識技術が注目されています。特に、マスクの着用有無をリアルタイムで判断するシステムは、交通機関や商業施設などで重要な役割を果たしています。
技術選定と実装プロセス
本記事では、PyTorch環境においてオープンソースの多モーダルモデルを利用して、マスク着用状況の自動判別システムを構築する方法について説明します。このアプローチでは、画像とテキストの意味的結びつきを利用し、従来の物体検出+分類方式に比べてより柔軟な判定が可能です。
# 必要なライブラリのインポート
import torch
from PIL import Image
from clip_model import load_clip_model, preprocess_image
# CLIPベースのモデルをロード
model = load_clip_model('ViT-L/14', pretrained='imagenet21k')
# 画像ファイルの読み込みと前処理
img_path = "/data/sample_image.png"
image = Image.open(img_path).convert("RGB")
processed_img = preprocess_image(image).unsqueeze(0)
# テキストクエリの設定
queries = [
"マスクをしている人",
"マスクをしていない人",
"一人だけいる",
"複数の人々がいる",
"子供",
"大人"
]
text_features = model.encode_text(queries)
# 推論実行
with torch.no_grad():
img_features = model.encode_image(processed_img)
similarity_scores = model.calculate_similarity(img_features, text_features)
results = similarity_scores.softmax(dim=-1).cpu().numpy()
# 結果表示
for query, score in zip(queries, results[0]):
print(f"{query}: {score:.3f}")
応用事例と改善策
多人数の画像に対する個別の判定精度向上には、軽量な顔検出器を導入することで解決できます。また、異なる種類のマスク(例えばN95や透明フェイスシールド)を区別するために、さらに詳細なテキストラベルを追加することも有効です。
# 軽量顔検出器を使用した個別推論
from face_detector import FaceDetector
detector = FaceDetector()
faces = detector.detect_faces(image)
individual_results = []
for face in faces:
face_img = crop_face(face, image)
prob = infer_mask_status(face_img)
individual_results.append(f"人物{len(individual_results)}: {'マスクあり' if prob > 0.5 else 'マスクなし'}")
性能最適化
計算リソースの制約に対応するため、GPU利用やフレームサンプリングなどの手法を取り入れることで、実時間処理能力を向上させることができます。