顔認識に基づく「マスク付き」システムの完全な実装-python

目次

0まえがき

1設計目的

2タスクと要件

3設計原理

3.1顔検出と顔認識の概要

3.2顔の特徴の検出(顔の感覚の位置)

3.3dlibライブラリの概要

3.4Tkinterの紹介

4システムの確立

4.1インターフェース設計

4.2顔認識

5システム運用結果

5.1マスクの概略図

5.2システム結果の表示

6つの提案

7参考文献

付録

五感ポジショニングコード

システムビルドコード


0まえがき

新しいタイプのコロナウイルスは、グローバル化と普及の傾向を示しており、感染症の予防と管理は、今後も長い間、病気の予防と管理の焦点であり続けることを思い出させてくれます。したがって、マスクを着用することは日常生活の必要な部分です。他人の安全と自分の安全のために、誰もがマスクを着用する必要があります。このコースデザインの目標は、顔認識に基づく人間の顔の「マスキング」作業を実現することです。

  • 1.指定された画像で顔とマスクのテストを完了します。
  • 2.設計されたモデルに従って、対応する提案を行います。
  • 3.シミュレーションプロセスと結果を提供します。

この記事のソースコードダウンロードリンク:https//download.csdn.net/download/weixin_43442778/12503099

1設計目的

新しいタイプのコロナウイルスは、グローバル化と普及の傾向を示しており、感染症の予防と管理は、今後も長い間、病気の予防と管理の焦点であり続けることを思い出させてくれます。したがって、マスクを着用することは日常生活の必要な部分です。他人の安全と自分の安全のために、誰もがマスクを着用する必要があります。このコースデザインの目標は、顔認識に基づく人間の顔の「マスキング」作業を実現することです。

2タスクと要件

1.指定された画像で顔とマスクのテストを完了します。

2.設計されたモデルに従って、対応する提案を行います。

3.シミュレーションプロセスと結果を提供します。

3つの設計原則

このシステムの実現原理は、Dlibモジュールのランドマーク顔検出ライブラリを使用して顔の特徴データを識別し、これらのデータに従って、検出された口に従って唇の位置データ(48ポイントから67ポイント)を決定することです。マスクのサイズと方向は、PLLモジュールを使用して調整し、画像内のマスクの適切な位置を実現できます。

3.1顔検出と顔認識の概要

顔検出は、主に実際の顔認識の前処理、つまり画像内の顔の位置とサイズを正確に調整するために使用されます。顔画像に含まれるパターンの特徴は、ヒストグラムの特徴、色の特徴、テンプレートの特徴、構造の特徴、ハールの特徴など、非常に豊富です。顔の画像前処理は、顔検出の結果[2]に基づいており、画像が処理され、最終的に特徴抽出のプロセスに使用されます。顔検出とは、有用な情報を抽出し、これらの機能を利用して顔検出を実現することです。

顔認識[1]は、人間の顔の特徴情報に基づく一種の生体認証技術です。得られた顔特徴テンプレートと認識対象の顔特徴を比較し、類似度により顔の識別情報を判断する。顔認識システムで使用できる機能は、通常、視覚的機能、ピクセル統計的機能、顔画像変換係数機能、顔画像代数機能などに分けられます。カメラまたはカメラを使用して人間の顔を含む画像またはビデオストリームを収集し、画像内の人間の顔を自動的に検出および追跡し、検出された顔に対して顔認識を実行する一連の関連テクノロジー。通常、顔認識および顔認識とも呼ばれます。 。顔認識システムは、主に、顔画像の取得と検出、顔画像の前処理、顔画像の特徴抽出、マッチングと認識の4つのコンポーネントで構成されています。

3.2顔の特徴の検出(顔の感覚の位置)

一般に、顔アプリケーションは、顔パンチ、自動顔モザイク、顔ロック解除、その他のアプリケーションなど、「顔検出」と「顔比較」の2つのテクノロジーを使用します。ただし、この実験は複雑であるため、顔の検出と比較だけでは不十分です。したがって、顔の位置(長方形のボックス)を判断するだけでなく、眉の形、目の領域、鼻の位置、位置などの顔の特徴の位置を検出する必要があります。顔の特徴の位置データを取得した後、これらのデータに基づくことができます。これらのデータはこの実験で使用されます。次の図は、顔の特性検出の結果を示しています。

図3.1顔の特徴の検出図

上の図は、機械学習で表された顔の68点を示しています。顔の部分と対応する点は、次の表に示されています。

3.1顔特性検出の対応表

元の入力画像の顔表現の実際の位置(ピクセル単位)を表す下付き文字(スライスはPythonで使用できます)を使用して、対応する座標点をすばやく取得できます。

3.3dlibライブラリの概要

Dlibは、実用的な問題を解決するためにC ++で複雑なソフトウェアを作成するための機械学習アルゴリズムとツールを含む最新のC ++ツールボックスです。ロボット工学、組み込み機器、携帯電話、大規模な高性能コンピューティング環境など、産業界や学界で広く使用されています。この実験では、dlibに付属の顔特徴抽出器を使用します。これは非常に便利です。

3.4Tkinterの紹介

Tkinter [3]は、Pythonを使用したウィンドウデザイン用のモジュールです。Tkinterモジュール(「Tkインターフェース」)は、Pythonの標準TkGUIツールキットへのインターフェースです。Python専用のGUIインターフェースとして画像ウィンドウです。TkinterはPythonに付属して編集可能なGUIインターフェースです。GUIを使用して多くの直感的な機能を実現できます。

PythonのTkinterインターフェースライブラリは非常にシンプルです。Python用のGUIライブラリはたくさんあります。Tkinterを選択してください。1つは最も簡単で、もう1つは独自のライブラリであり、ダウンロードしてインストールする必要はありません。いつでも使用でき、3つ目は需要から始めることです。スクリプト言語であるPythonは、柔軟なツールとして使用できます。この要求の下で、Tkinterはそれを実行できます。

Tkinterプログラミングの場合、次の2つの側面から始めることができます。

最初のペイントはtkinterプログラミングに対応します。表示画面はサポートされているイーゼルです。ルートウィンドウは製図板です。tkinterではトップレベルです。キャンバスはtkinterのコンテナ(フレーム)です。多くのキャンバスは次のことができます。製図板(Convas)に配置すると、tkinterのコンテナにも多くのコンテナを含めることができます。絵の構成レイアウトはtkinterのレイアウトマネージャー(ジオメトリマネージャー)です。絵の内容はtkinterの小さなコンポーネントです。多くの要素が構成され、GUIインターフェイスはウィジェットである個々のコンポーネントで構成されます。

第二に、tkinterのコンポーネントもビルディングブロックとして見ることができます。形状は異なる場合がありますが、本質は同じです。ビルディングブロックです。どのように見えても、常にビルディングブロックです。これらの小さなコンポーネントには多くの共通点がありますが、その中で最も重要なのはレイアウトマネージャーの使用です。

4システムの確立

この部分には、インターフェース設計と臓器認識の合計2つの部分が含まれます。

4.1インターフェースデザイン

GUIデザインを実装するtkinterモジュールに基づいて、キャラクター画像をロードし、4種類のマスクを選択し(ここのマスクは処理された写真です)、マスクを着用した効果を示し、操作が完了した後にシステムを終了することができます。次の図に示されています。特定のコードの付録を参照してください。

図4.1インターフェース設計

4.2顔認識

ページ機能が実現された後は、Dlibライブラリを使用して、顔の器官の要点の認識を実現し、口の位置とサイズを分析し、キャラクターの顔の要点を表示します。

図4.2顔の特徴認識の比較

ランドマークパーソンDlibモジュールの顔68キーポイント検出ライブラリは、PLLモジュールを使用して、顔の特徴データを識別し、位置データ(唇の部分48時から67)、口のサイズと方向の検出を決定します。マスクを調整しますサイズと方向により、マスクを画像の適切な位置に配置できます。

図4.3マスク部分

5システム運用結果

5.1マスクの概略図

下の写真は、私たちが着用できるマスクを示しています。マスクの白い背景は白ではなく、透明な白で塗りつぶされていることに注意してください(PSソフトウェアは特定の処理に使用できます)。

図5.1マスクスタイル

5.2システム結果の表示

与えられた3つの写真でテストしたところ、すべて良好な結果が得られました。図5.2、5.3、5.4を参照してください。

図5.2テスト1の画像レンダリング

図5.3テスト2の画像レンダリング

図5.4テスト3の画像レンダリング

6つの推奨事項

マスクを着用することは、科学的に新しい冠状動脈性肺炎やインフルエンザなどの呼吸器感染症の予防効果があり、身を守るだけでなく、公衆衛生にも役立ちます。現在、新たなクラウン肺炎の流行との闘いにおいて、中国国民は科学的にマスクを着用し、流行を効果的に防止および制御できるようにしています。この対策は、他の国、特に米国から学ぶ価値があります。

7参考文献

  1. 顔認識:https //baike.baidu.com/item/%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB/4463435?fr = aladdin
  2. https://blog.csdn.net/weixin_42346564/article/details/82500454
  3. Tkinterの紹介:https://www.cnblogs.com/shwee/p/9427975.html#B
  4. Python dlibの正しいインストール:https://ai-word.blog.csdn.net/article/details/88713658
  5. Pythonパッケージをすばやくインストールします:https//blog.csdn.net/weixin_43442778/article/details/103095442
  6. フェイスアプリケーション:https//www.cnblogs.com/xiaozhi_5638/p/12697035.html
  7. 顔の特徴のキーポイント検出:https//blog.csdn.net/zhr1030635594/article/details/104411165
  8. Pythonに基づく自動フェイスマスク着用システム:https://handsome-man.blog.csdn.net/article/details/104174562

記録された付属書

直接実行できるソースコードのダウンロードリンク:https//download.csdn.net/download/weixin_43442778/12503099

五感ポジショニングコード

#coding = utf-8

#PictureDetection-Dlibバージョン

cv2をインポートする

dlibをインポートする

インポート時間

t = time.time()

パス= "./ pic / test1.jpeg"

img = cv2.imread(path)

灰色= cv2.cvtColor(img、cv2.COLOR_BGR2GRAY)

 

#顔分類子

検出器= dlib.get_frontal_face_detector()

#顔検出器を入手

予測子= dlib.shape_predictor(

    "./shape_predictor_68_face_landmarks.dat"

)。

 

dets =検出器(灰色、1)

デットの顔の場合:

    shape = prefixor(img、face)#顔の68個のキャリブレーションポイントを検索します

    #すべてのポイントをトラバースし、それらの座標を印刷して、それらを丸で囲みます

    shape.parts()のptの場合:

        pt_pos =(pt.x、pt.y)

        cv2.circle(img、pt_pos、1、(0、255、0)、2)

    cv2.imshow( "image"、img)

print( '使用時間は{)'。format(time.time()-t))

cv2.waitKey(0)

#cv2.destroyAllWindows()

time.sleep(5)

システムビルドコード

PILインポートイメージ、ImageTkから

tkinter.filedialogからインポートaskopenfilename

cv2をインポートする

tkinterをtkとしてインポートする

GDPを輸入する

dlibをインポートする

 

 

クラスAddMask(object):

    def __init __(self):

        self.root = tk.Tk()

        self.root.title( 'Pyhonベースの自動フェイスマスキングシステム')

        self.root.geometry( '1200x500')

 

        self.path1_ =なし

#self.path2_ =なし

        self.seg_img_path = None

        self.mask = None

        self.label_Img_seg = None

 

        decoration = PIL.Image.open('./pic/bg.png').resize((1200, 500))

        render = ImageTk.PhotoImage(decoration)

        img = tk.Label(image=render)

        img.image = render

        img.place(x=0, y=0)

 

        # 原图1的展示

        tk.Button(self.root, text="打开头像", command=self.show_original1_pic).place(x=50, y=120)

        tk.Button(self.root, text="退出软件", command=quit).place(x=900, y=40)

 

        tk.Label(self.root, text="头像", font=10).place(x=280, y=120)

        self.cv_orinial1 = tk.Canvas(self.root, bg='white', width=270, height=270)

        self.cv_orinial1.create_rectangle(8, 8, 260, 260, width=1, outline='red')

        self.cv_orinial1.place(x=180, y=150)

        self.label_Img_original1 = tk.Label(self.root)

        self.label_Img_original1.place(x=180, y=150)

 

        tk.Label(self.root,text="选择口罩",font=10).place(x=600,y=120)

 

        first_pic = Image.open("./pic/Mask1.png")

        first_pic = first_pic.resize((60, 60), Image.ANTIALIAS)

        first_pic = ImageTk.PhotoImage(first_pic)

        self.first = tk.Label(self.root, image=first_pic)

        self.first.place(x=600,y=160, width=60, height=60)

        self.first.bind("<Button-1>", self.mask1)

 

        second_pic = Image.open("./pic/Mask2.png")

        second_pic = second_pic.resize((60, 60), Image.ANTIALIAS)

        second_pic = ImageTk.PhotoImage(second_pic)

        self.second_pic = tk.Label(self.root, image=second_pic)

        self.second_pic.place(x=600, y=230, width=60, height=60)

        self.second_pic.bind("<Button-1>", self.mask2)

 

        third_pic = Image.open("./pic/Mask3.png")

        third_pic = third_pic.resize((60, 60), Image.ANTIALIAS)

        third_pic = ImageTk.PhotoImage(third_pic)

        self.third_pic = tk.Label(self.root, image=third_pic)

        self.third_pic.place(x=600, y=300, width=60, height=60)

        self.third_pic.bind("<Button-1>", self.mask3)

 

        forth_pic = Image.open("./pic/Mask4.png")

        forth_pic = forth_pic.resize((60, 60), Image.ANTIALIAS)

        forth_pic = ImageTk.PhotoImage(forth_pic)

        self.forth_pic = tk.Label(self.root, image=forth_pic)

        self.forth_pic.place(x=600, y=370, width=60, height=60)

        self.forth_pic.bind("<Button-1>", self.mask4)

 

        tk.Label(self.root, text="佩戴效果", font=10).place(x=920, y=120)

        self.cv_seg = tk.Canvas(self.root, bg='white', width=270, height=270)

        self.cv_seg.create_rectangle(8, 8, 260, 260, width=1, outline='red')

        self.cv_seg.place(x=820, y=150)

        self.label_Img_seg = tk.Label(self.root)

        self.label_Img_seg.place(x=820, y=150)

 

        self.root.mainloop()

 

    # 原图1展示

    def show_original1_pic(self):

        self.path1_ = askopenfilename(title='选择文件')

        print(self.path1_)

        self.Img = PIL.Image.open(r'{}'.format(self.path1_))

        Img = self.Img.resize((270,270),PIL.Image.ANTIALIAS)   # 调整图片大小至256x256

        img_png_original = ImageTk.PhotoImage(Img)

        self.label_Img_original1.config(image=img_png_original)

        self.label_Img_original1.image = img_png_original  # keep a reference

        self.cv_orinial1.create_image(5, 5,anchor='nw', image=img_png_original)

 

    # 人脸戴口罩效果展示

    def show_morpher_pic(self):

        img1 = cv2.imread(self.path1_)

        x_min, x_max, y_min, y_max, size = self.get_mouth(img1)

        adding = self.mask.resize(size)

        im = Image.fromarray(img1[:, :, ::-1])  # 切换RGB格式

        # 在合适位置添加头发图片

        im.paste(adding, (int(x_min), int(y_min)), adding)

        # im.show()

        save_path = self.path1_.split('.')[0]+'_result.jpg'

        im.save(save_path)

        Img = im.resize((270, 270), PIL.Image.ANTIALIAS)  # 调整图片大小至270x270

        img_png_seg = ImageTk.PhotoImage(Img)

        self.label_Img_seg.config(image=img_png_seg)

        self.label_Img_seg.image = img_png_seg  # keep a reference

 

    def mask1(self, event):

        self.mask = Image.open('pic/Mask1.png')

        self.show_morpher_pic()

 

    def mask2(self, event):

        self.mask = Image.open('pic/Mask2.png')

        self.show_morpher_pic()

 

    def mask3(self, event):

        self.mask = Image.open('pic/Mask3.png')

        self.show_morpher_pic()

 

    def mask4(self, event):

        self.mask = Image.open('pic/Mask4.png')

        self.show_morpher_pic()

 

    def get_mouth(self, img):

        img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#        img_gray = cv2.gray2bgr(img, cv2.COLOR_BGR2GRAY)

       

        detector = dlib.get_frontal_face_detector()

        predictor = dlib.shape_predictor('./shape_predictor_68_face_landmarks.dat')

        faces = detector(img_gray, 0)

        for k, d in enumerate(faces):

            x = []

            y = []

            # 人脸大小的高度

            height = d.bottom() - d.top()

            # 人脸大小的宽度

            width = d.right() - d.left()

            shape = predictor(img_gray, d)

            # 48-67 为嘴唇部分

            for i in range(48, 68):

                x.append(shape.part(i).x)

                y.append(shape.part(i).y)

            # 根据人脸的大小扩大嘴唇对应口罩的区域

            y_max = (int)(max(y) + height / 3)

            y_min = (int)(min(y) - height / 3)

            x_max = (int)(max(x) + width / 3)

            x_min = (int)(min(x) - width / 3)

            size = ((x_max - x_min), (y_max - y_min))

            return x_min, x_max, y_min, y_max, size

 

    def quit(self):

        self.root.destroy()

 

 

 

if __name__ == '__main__':

    AddMask()

 

おすすめ

転載: blog.csdn.net/weixin_43442778/article/details/114950169