1 はじめに
顔認識の分野である程度の経験がある私は、過去のプロジェクトで多くの顔認識関連のタスクをカバーしてきました。いくつかのプロジェクトをまとめてきましたが、学術的な負担が大きいため、まとめるのが断続的になってしまいました。最近はメーデーの休日なので、この機会に表情認識について記事をまとめたいと思います。この技術は、喜び、悲しみなどの人間の基本的な感情を識別することができ、幅広い応用価値があります。
2.関連作品
私の限られた知識に基づくと、顔の表情に基づく感情認識には、通常、顔の検出と表情の分類という 2 つの主要なタスクが含まれます。顔検出とは、入力画像内の顔の位置とサイズを検出および特定し、その後の表情認識のための基礎データを提供することを指します。表情分類とは、入力顔画像を怒り、嫌悪感、恐怖、幸福、悲しみなどの複数の感情カテゴリに分類することを指します。 、サプライズ、ニュートラルなど。
現在、顔認識 (Facial Recognition、FR) の精度は人間の目の精度を上回っており、FR 技術の重要な部分として、表情認識はコンピュータ ビジョン、人間とコンピュータのインタラクション、感情コンピューティングなどの分野で幅広い研究の可能性を秘めています。人間とコンピュータのインタラクション、インタラクション、感情分析、インテリジェントセキュリティ、エンターテイメント、オンライン教育、インテリジェント医療など。表情認識の主な枠組みは、図に示すように、画像前処理、顔検出、表情分類の 3 つのステップに分かれています。
この記事では、35,887 個の顔画像で構成される Fer2013 データ セットを使用します。このデータ セットには、28,709 個のトレーニング サンプル、3,859 個の検証サンプル、および 3,859 個のテスト サンプルが含まれています。すべて 48×48 のグレースケール画像です。
3. プロジェクトの実施
3.1 OpenCVの顔検出
OpenCVに基づく顔検出アルゴリズムは現在非常に人気のある実装方法であり、カスケード分類器(Cascade Classifier)を使用して画像内の顔を検出します。以下は、Python に基づく顔検出コードの例です。
import cv2
# 加载级联分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 加载图像并进行灰度化处理
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 进行人脸检测
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
# 绘制矩形框标识人脸位置
for (x,y,w,h) in faces:
cv2.rectangle(img, (x,y), (x+w,y+h), (0,0,255), 2)
# 显示结果图像
cv2.imshow('result', img)
cv2.waitKey(0)
顔検出は、写真に顔があるかどうかを判断するために使用される操作です。写真内に顔があれば、写真内の顔の位置が特定され、写真内に顔がなければ、写真内に顔が存在しない旨のプロンプトメッセージが返される。顔検出は表情認識に不可欠な部分であり、その検出効果はシステム全体のパフォーマンスに直接影響します。図に示すように、青い長方形のボックスは、写真から検出された顔画像の位置を表します。
3.2Mini-Xception ネットワーク
この記事での式分類のネットワーク アーキテクチャは Mini-Xception 畳み込みニューラル ネットワークを採用しており、その構造を図に示します。これには 4 つの残りの深さ分離可能な畳み込みブロックが含まれており、各畳み込みの後、バッチ正規化 (BathNorm) 操作と ReLu 活性化関数が畳み込み層で実行されます。最後の層は、予測にグローバル平均プーリング層とソフトマックス アクティベーション関数を使用します。
構築された mini-Xception ネットワーク モデルの利点は、従来のニューラル ネットワークの完全接続層を削除し、深さ分離可能な畳み込みを使用して従来の畳み込み層を置き換えることです。これにより、トレーニング パラメーターの量が大幅に削減され、トレーニング時間が短縮されます。モデルの汎化能力を向上させます。Mini-Xception ネットワークの Python 実装は次のとおりで、具体的には Keras フレームワークを使用して実装されています。
from keras.layers import Input, Conv2D, BatchNormalization, Activation, SeparableConv2D
from keras.layers import MaxPooling2D, GlobalAveragePooling2D, Dense, Dropout
from keras.models import Model
def mini_Xception(input_shape, num_classes):
# 定义输入层
inputs = Input(shape=input_shape)
# 第一个卷积块
x = Conv2D(8, (3, 3), strides=(1, 1), padding='same')(inputs)
x = BatchNormalization()(x)
x = Activation('relu')(x)
# 第二个卷积块
x = SeparableConv2D(16, (3, 3), strides=(1, 1), padding='same')(x)
x = BatchNormalization()(x)
x = Activation('relu')(x)
x = SeparableConv2D(16, (3, 3), strides=(1, 1), padding='same')(x)
x = BatchNormalization()(x)
x = Activation('relu')(x)
# 第三个卷积块
x = SeparableConv2D(32, (3, 3), strides=(1, 1), padding='same')(x)
x = BatchNormalization()(x)
x = Activation('relu')(x)
x = SeparableConv2D(32, (3, 3), strides=(1, 1), padding='same')(x)
x = BatchNormalization()(x)
x = Activation('relu')(x)
# 第四个卷积块
x = MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='same')(x)
x = Dropout(0.5)(x)
x = SeparableConv2D(64, (3, 3), strides=(1, 1), padding='same')(x)
x = BatchNormalization()(x)
x = Activation('relu')(x)
x = SeparableConv2D(64, (3, 3), strides=(1, 1), padding='same')(x)
x = BatchNormalization()(x)
x = Activation('relu')(x)
# 第五个卷积块
x = MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='same')(x)
x = Dropout(0.5)(x)
x = SeparableConv2D(128, (3, 3), strides=(1, 1), padding='same')(x)
x = BatchNormalization()(x)
x = Activation('relu')(x)
x = SeparableConv2D(128, (3, 3), strides=(1, 1), padding='same')(x)
x = BatchNormalization()(x)
x = Activation('relu')(x)
# 全局平均池化和输出层
x = GlobalAveragePooling2D()(x)
outputs = Dense(num_classes, activation='softmax')(x)
# 创建模型
model = Model(inputs=inputs, outputs=outputs)
return model
4.実験結果と解析
4.1 モデルのトレーニング
この記事の研究では、Keras 深層学習フレームワークに基づいて Mini-Xception モデルを構築し、モデルのトレーニングに前処理された Fer2013 式データセットを使用します。トレーニングが完了すると、トレーニングされたモデルは指定したフォルダーに hdf5 ファイルとして保存され、トレーニング処理の結果出力は図のようになります。
4.2結果の分析
トレーニングが継続するにつれて、トレーニング曲線は変動し続けますが、トレーニング セットと検証セットの精度は徐々に向上し続け、最終的には両方の曲線が安定した状態に達し、結果として得られるトレーニング カーブが図に示されています。
トレーニングが完了すると、検証セット内で最も精度の高いモデル パラメーターが選択され、最終的にテスト セット上でテストおよび検証されます。この記事では、混同行列を使用して、テスト セットに対するモデルの効果を評価します。混同行列の結果を図に示します。Mini-Xception の Happy の認識率は 92% に達することもありますが、Scared の最低認識率はわずか 56% です。これは、さまざまな表現の数の不均衡が原因である可能性があります。認識プロセス中に、悲しいこと、怖いこと、怒り、嫌悪感の認識がより困難であることが観察されます。
4.3アプリケーションのテスト
これを日常の表情認識シナリオにさらに適切に適用し、実際の表情認識パフォーマンスをテストするために、前の章で紹介した顔検出および表情認識アルゴリズムと組み合わせて、実際のシナリオでの表情認識プロセスを設計しました。図。
まず、画像を取得して前処理を行い、Haar カスケード分類器を使用して顔位置を検出し、Mini-Xception を使用して顔位置領域の表情認識を実行し、最後に表情認識結果を表示および出力します。上記のプロセスに従って、この記事では PyQt5 に基づいて表現認識システム インターフェイスを設計します。システム インターフェイスを図 19 に示します。その一般的な機能は次のとおりです。
(1) モデル ファイルを選択し、モデルに基づいて識別を実行できます。
(2) カメラの電源をオンにして、リアルタイム画像内の表情を識別します。
(3) 顔写真を選択し、そこに含まれる表情を特定します。
5. 参考文献
- Zeng ZH、Pantic M、Roisman GI 他 感情認識方法の調査: 音声、視覚、および自発的な表現[J]。パターン分析とマシン インテリジェンスに関する IEEE トランザクション、2009、31(1): 39-58。
- Ekman P、Friesen W V. 文化を超えた顔と感情の定数[J]。パーソナリティと社会心理学のジャーナル、1971、17(2): 124-129。
- Ojala T、Pietikainen M、Harwood D. 特徴的な分布に基づく分類によるテクスチャ測定の比較研究 [J]。パターン認識、1996 年、29(1): 51-59。
- アルビオールA、モンゾD、マーティンAなど。HOG – EBGM[J] を使用した顔認識。パターン認識レター、2008、29(10): 1537-1543。
- Viola P、Jones M J. 堅牢なリアルタイム顔検出[J]。コンピュータ ビジョンの国際ジャーナル、2004、57(2):137-154。
- Neubeck A、Gool L. 効率的な非最大抑制[C]// パターン認識に関する国際会議。IEEE コンピュータ協会、2006 年。
- Szegedy C、Liu W、Jia YQ 他 畳み込みでさらに深くなる[C]//2015 IEEE Conference on Computer Vision and Pattern Recognition (CVPR)、2015 年 6 月 7 ~ 12 日、米国マサチューセッツ州ボストン。IEEE、2015:1-9。
- Chollet F. Xception: 深さ方向に分離可能な畳み込みを使用した深層学習[C]//2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR)、2017 年 7 月 21 ~ 26 日、ハワイ州ホノルル。IEEE、2017: 1800-1807。
- Wang M、Liu B、Foroosh H. 単一チャネル内畳み込み、トポロジカル細分化および空間「ボトルネック」構造を使用した効率的な畳み込み層の設計[EB/OL]。[2020-03-15]。http://arxiv.org/abs/1608.04337。
- Ioffe S、Szegedy C. バッチ正規化: 内部共変量シフトを削減することでディープ ネットワーク トレーニングを加速します[C]。第 32 回機械学習国際会議、ICML、2015 年、2015(1): 448-456。
- Goodfellow IJ、Erhan D、Luc Carrier P、他 表現学習の課題: 3 つの機械学習コンテストに関するレポート[J]。ニューラル ネットワーク、2015(64): 59-63。
- Kingma DP、Ba J L. Adam: 確率的最適化の手法 [J]。第 3 回学習表現に関する国際会議、ICLR 2015 - Conference Track Proceedings、2015: 1-15。