PaddlePaddleでマスク着用を判定してみた

COVID-19

最近会社によく届く広告

緊急事態宣言は解除されましたが、コロナウイルスのワクチンや治療薬が出来た訳ではないので、コロナ対策の商材案内を割と頻繫に目にします。

少し前まではアルコール消毒液やアクリルのパーティションが多かったのですが、最近は非接触の体温計やサーマルカメラを利用した発熱感知器(と言うのかな?)の売り込みが多い印象です。

そんな中「マスク着用検知機」的なものの案内があり、見てみると「導線上に設置されたカメラに撮影された人がマスクを着用していないとき、マスク非着用であることをモニタでお知らせする」というものでした。

こういうのって推論が生きる場所だよな・・・と思い、何気なく「マスク 検出 OpenCV」あたりで検索したところ、大体は「顔を検知しマスキングする」という内容だったのですが、「人がマスク着用していることを検出する」というビンゴな内容の記事を見つけました。

元ネタはこちらのようです。

そして、こちらを参考にさせて頂きながら挑戦してみました。貴重な情報を公開くださり有難うございます!

@SatoshiGachiFujimotoさま PaddlePaddleのマスク検出データセットを試す

@ebiflyyyyyyyyさま     Baiduが公開しているマスク検出を試してみた

テスト環境

今回テストした環境はWindows10 Pro 64bit バージョン2004、Pythonは3.6.1です。

下準備

pip install paddlepaddle
pip install paddlehub

gitから一式clone

こちらから取得します。

GitHub - PaddlePaddle/Paddle: PArallel Distributed Deep LEarning: Machine Learning Framework from Industrial Practice (『飞桨』核心框架,深度学习&机器学习高性能单机、分布式训练和跨平台部署)
PArallel Distributed Deep LEarning: Machine Learning Framework from Industrial Practice (『飞桨』核心框架,深度学习&机器学习高性能单机、分布式训练和跨平台部署) - GitHub - PaddlePaddle/Paddle...

Pythonのコード確認

PaddleHub-release-v1.7\demo\mask_detection\mask_detection.pyの中身を見てみます。コメントやコードの一部が普通に中国語で書かれていますが、ひるまないようにしましょう。

まず、Webカメラ内蔵PCに外付けカメラをつけている場合は要注意です。

43行目
capture = cv2.VideoCapture(0)

また、Zoomなどを起動しているとアプリケーションがWebカメラを握ったままになっていますので予め終了させておきましょう。

特に問題が無ければそのままで動くのですが、PaddleHub-release-v1.7\demo\mask_detection\resultの中にWebカメラでキャプチャした画像が山のように生成されますので、オリジナルのコードで動作確認が出来たら修正をお勧めします。

69行目
cv2.imwrite(path, image, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
↓
#cv2.imwrite(path, image, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])

mask_detection.pyを実行してみる

Webカメラが起動したら、カメラの前でマスクを付け外ししてみましょう!認識精度に思わず感激されたのではないでしょうか?白色の不繊布マスクであればかなりの確率でマスクの有無を見分けてくれるようです。逆にデザインの入ったマスク(たとえば都知事が付けているようなもの)は苦手なようです。ここは今後に期待ですね。

役立つかもしれない補足事項

91-92行目をコメントアウト、93-95行目のコメントを解除すると「MASK」「NO MASK」の文字列を85行目、88行目で任意の文字列に変更することができます。ただし、cv2.putTextではマルチバイトを扱えないため、94行目で12行目から始まるpaint_chineseを呼び出し文字列を画像化しています。

その際16行目でフォントを指定するのですが、OSが認識しているフォント名って皆さんご存じでしょうか?知らなかったのは私だけ・・・かもですが、これはレジストリを調べます。

コンピューター\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fon

ここの値を指定しましょう!

コメント

  1. hiroyuki より:

    興味深い記事ありがとうございます。

    pip install paddlepaddle
    が、以下のエラーで失敗してしまいますが、お心当たりはございますでしょうか?

    ERROR: Could not find a version that satisfies the requirement paddlepaddle (from versions: none)
    ERROR: No matching distribution found for paddlepaddle

    Win10 1909
    python-3.8.5

    python 2.7も同じPCに入れてて、
    py -2 -m pip install paddlepaddle
    だとinstall成功してるんですが、当方、数日前からpython始めたど素人で、2と3の違いもおぼつかず。。。

    • sandambara sandambara より:

      hiroyukiさん

      はじめまして。ちなみにこのサイトで初めて頂戴したコメントです。こちらこそ有難うございます!

      丁度手元のPCを初期化したばかりだったので自分の記事を見ながら環境構築しましたが、特にエラーは出ませんでした。

      PaddlePaddleインストールマニュアル
      https://www.paddlepaddle.org.cn/documentation/docs/en/install/index_en.html

      ざっとしか読んでいないのでハズしているかもですが、気になったのは下記3点です。

      ・Windowsのバージョン(64bit)
      ・Pythonのバージョン(3.5.1+/3.6/3.7)
      ・pipのバージョン(9.0.1+)

      可能であれば下記サイトからPython-3.7以下を入手して環境を作り直してみられてはいかがでしょうか?

      https://www.python.org/downloads/

      • Hiroyuki より:

        お返事ありがとうございます。
        Python3.7に入れなおす事で、
        pip install paddlepaddle
        は成功しました。

        うきうきしながら、mask_detection.pyを実行すると、
        以下のようなエラーになってしまいますが、これが、カメラデバイスが他のアプリに占有されている状態なんでしょうか。
        いろいろ試行錯誤してみます。

        PS C:\Users\XXX\PaddleHub-release-v1.8\demo\mask_detection> py .\mask_detection.py
        [2020-08-13 22:04:29,490] [ INFO] – Installing pyramidbox_lite_server_mask module
        [2020-08-13 22:04:29,600] [ INFO] – Module pyramidbox_lite_server_mask already installed in C:\Users\XXX\.paddlehub\modules\pyramidbox_lite_server_mask
        [2020-08-13 22:04:29,602] [ INFO] – Installing pyramidbox_lite_server module
        [2020-08-13 22:04:29,603] [ INFO] – Module pyramidbox_lite_server already installed in C:\Users\XXX\.paddlehub\modules\pyramidbox_lite_server
        [ WARN:0] global C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-xr4y3u3_\opencv\modules\videoio\src\cap_msmf.cpp (435) `anonymous-namespace’::SourceReaderCB::~SourceReaderCB terminating async callback

        • sandambara sandambara より:

          インストール成功して良かったですね。私が参考にさせて頂いた先人の記事にもありますが、環境によっては

          fourcc = cv2.VideoWriter_fourcc(*’vp90′)

          ここを

          fourcc = cv2.VideoWriter_fourcc(‘m’,’p’,’4′, ‘v’)

          このように変更が必要です。ご自身の環境により適宜修正してお試しください。あと、冒頭のimport直後の部分ですが

          module = hub.Module(name=”pyramidbox_lite_server_mask”)

          ここもversionを入れないといけないかもしれません。

          module = hub.Module(name=”pyramidbox_lite_server_mask”, version=’1.1.0′)

          2カ所同時に変更すると何かと切り分けしにくくなりますので、まずはコーデックを変えてみる、ダメならversionを明示するといった具合に作業されると良いと思います。

          これでもダメならimportしようとしているものがお手元の環境に正しくインストールされているか確認が必要かもしれません。あと一息だと思いますので、試行錯誤を楽しまれてくださいね。

          • Hiroyuki より:

            返信いただきありがとうございます。
            ご提示いただいた修正箇所2点で無事動作させる事が出来ました!
            ・codecの変更
            ・pyramidbox_lite_server_maskのversion指定

            いろいろいじって遊んでみます!

          • sandambara sandambara より:

            Hiroyukiさん
            正常動作、お知らせ頂き有難うございました。その後が気になっていたので安心致しました!私もPythonや画像認識は趣味程度にしか踏み込んでいないので、この先お答えできないこともあるかと思いますが、弊サイトを今後ともよろしくお願い致します。