マスク未着用検知iOSアプリをVisionフレームワークで実装する


iPadやiPhoneのカメラ・フレームを分析して、マスクを着用していない人を検知できるアプリをかんたんにつくることができます。

GitHubでアプリ公開しています。
https://github.com/john-rocky/MaskPlease
お店の入り口などに置いてください。

マスク着用の判定方法

マスクを着用していない人がいるかを特定するためには、鼻や口がうつっているかどうかをたしかめればいいです。

Visionフレームワークの顔検出機能は、マスクを着用していると検知できません。
ゆえに、Visionで顔を検出できるということは、その顔はマスクをつけていないといえます。

VNDetectFaceRectanglesRequestにカメラの映像を1フレームずつ渡します。

let detectFaceRequest = VNDetectFaceRectanglesRequest(completionHandler:self.processVisionRequestResults)
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
                 return
             }
    let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: exifOrientation, options: [:])
         do {
             try imageRequestHandler.perform(self.requests)
         } catch {
             print(error)
         }
}

顔がうつっていればアラートを出す

VNFaceObservationのresultがあれば、顔がうつっているので、「マスクをつけてください」というアラートをだします。

guard let observation = results.first as? VNFaceObservation else {
          //顔の結果なし
          imageView.image = UIImage(name:"thanksForWearing")
          }
//顔の結果あり      
imageView.image = UIImage(name:"pleaseWearing")

AVSpeechSynthesizerを使うと、音声で呼びかけてくれます。

ViewController.swift
let talker = AVSpeechSynthesizer()
let utterance = AVSpeechUtterance(string: NSLocalizedString("Please wear a mask.", comment: "") )
utterance.voice = AVSpeechSynthesisVoice(language: NSLocalizedString("en-US", comment: ""))
talker.speak(utterance)

VNDetectFaceObservationは顔を囲む四角形の座標もくれます。
カメラ画像に「マスク未着用」の四角警告をオーバーラップさせると、アプリがより監視してるテイストになります。

機械学習系の情報を発信しています。
https://twitter.com/JackdeS11

[email protected]