
情緒檢測(cè)或表情分類(lèi)在深度學(xué)習(xí)領(lǐng)域中有著廣泛的研究。使用相機(jī)和一些簡(jiǎn)單的代碼我們就可以對(duì)情緒進(jìn)行實(shí)時(shí)分類(lèi),這也是邁向高級(jí)人機(jī)交互的一步。
前言
本期我們將首先介紹如何使用Keras 創(chuàng)建卷積神經(jīng)網(wǎng)絡(luò)模型,再使用攝像頭獲取圖片進(jìn)行情緒檢測(cè)。
為了更好的閱讀體驗(yàn),我們最好具備一下知識(shí):
? Python
? OpenCV的
? 卷積神經(jīng)網(wǎng)絡(luò)(CNN)
? numpy
(注意:我們使用的Tensorflow是1.13.1版本、keras是 版本2.3.1)
模型制作
首先,我們將創(chuàng)建模型代碼并解釋其中的含義。代碼的創(chuàng)建總共分為以下5個(gè)部分。
任務(wù)1:
導(dǎo)入該項(xiàng)目所需的必需模塊。
import kerasfrom keras.preprocessing.image import ImageDataGeneratorfrom keras.models import Sequentialfrom keras.layers import Dense,Dropout,Activation,Flatten,BatchNormalizationfrom keras.layers import Conv2D,MaxPooling2Dimport os
現(xiàn)在讓我們定義一些變量,這些變量將節(jié)省手動(dòng)輸入的時(shí)間。
num_classes=5img_rows,img_cols=48,48batch_size=32
以上變量的說(shuō)明如下:
? num_classses = 5:訓(xùn)練模型時(shí)要處理的類(lèi)即情感的種類(lèi)數(shù)。
? img_rows=48,img_cols = 48:饋送到神經(jīng)網(wǎng)絡(luò)中的圖像陣列大小。
? batch_size = 32:更新模型之前處理的樣本數(shù)量。epochs 是完整通過(guò)訓(xùn)練數(shù)據(jù)集的次數(shù)。batch_size必須大于等于1并且小于或等于訓(xùn)練數(shù)據(jù)集中的樣本數(shù)。
任務(wù)2:
現(xiàn)在讓我們開(kāi)始加載模型,這里使用的數(shù)據(jù)集是fer2013,該數(shù)據(jù)集是由kaggle托管的開(kāi)源數(shù)據(jù)集。數(shù)據(jù)集共包含7類(lèi),分別是憤怒、厭惡、恐懼、快樂(lè)、悲傷、驚奇、無(wú)表情,訓(xùn)練集共有28,709個(gè)示例。該數(shù)據(jù)集已從網(wǎng)站上刪除,但我們?cè)谝韵骆溄又锌梢哉业较嚓P(guān)代碼和數(shù)據(jù)集。https://github.com/karansjc1/emotion-detection
數(shù)據(jù)集的存儲(chǔ)庫(kù)中
我們將數(shù)據(jù)儲(chǔ)存在特定文件夾中。例如,“憤怒”文件夾包含帶有憤怒面孔等的圖片。在這里,我們使用5類(lèi),包括“憤怒”,“快樂(lè)”,“悲傷”,“驚奇”和“無(wú)表情”。使用24256張圖像作為訓(xùn)練數(shù)據(jù),3006張圖像作為檢測(cè)數(shù)據(jù)。
現(xiàn)在讓我們將數(shù)據(jù)加載到一些變量中。
train_data_dir='fer2013/train'validation_data_dir='fer2013/validation'
以上兩行導(dǎo)入了檢測(cè)和訓(xùn)練數(shù)據(jù)。該模型是在訓(xùn)練數(shù)據(jù)集上進(jìn)行訓(xùn)練的;在檢測(cè)數(shù)據(jù)集上檢測(cè)該模型性能,檢測(cè)數(shù)據(jù)集是原始數(shù)據(jù)集的一部分,從原始數(shù)據(jù)集上分離開(kāi)來(lái)的。
任務(wù)3:
現(xiàn)在,我們對(duì)這些數(shù)據(jù)集進(jìn)行圖像增強(qiáng)。圖像數(shù)據(jù)增強(qiáng)可以擴(kuò)展訓(xùn)練數(shù)據(jù)集大小,改善圖像質(zhì)量。Keras深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)庫(kù)中的ImageDataGenerator類(lèi)通過(guò)圖像增強(qiáng)來(lái)擬合模型。
train_datagen = ImageDataGenerator( rescale=1./255, rotation_range=30, shear_range=0.3, zoom_range=0.3, width_shift_range=0.4, height_shift_range=0.4, horizontal_flip=True, fill_mode='nearest')validation_datagen = ImageDataGenerator(rescale=1./255)
train_datagen變量以下方法人為地?cái)U(kuò)展數(shù)據(jù)集:
? rotation_range:隨機(jī)旋轉(zhuǎn),在這里我們使用30度。
? shear_range:剪切強(qiáng)度(逆時(shí)針?lè)较虻募羟薪?,以度為單位)。在這里我們使用0.3作為剪切范圍。
? zoom_range:隨機(jī)縮放的范圍,這里我們使用0.3作為縮放范圍。
? width_shift_range:在圖像的整個(gè)寬度上移動(dòng)一個(gè)值。
? height_shift_range:這會(huì)在整個(gè)圖像高度上移動(dòng)一個(gè)值。
? horizontal_flip:水平翻轉(zhuǎn)圖像。
? fill_mode:通過(guò)上述使用的方法更改圖像的方向后填充像素,使用“最近”作為填充模式,即用附近的像素填充圖像中丟失的像素。
在這里,我只是重新保存驗(yàn)證數(shù)據(jù),而沒(méi)有執(zhí)行任何其他擴(kuò)充操作,因?yàn)槲蚁胧褂门c訓(xùn)練模型中數(shù)據(jù)不同的原始數(shù)據(jù)來(lái)檢查模型。
train_generator = train_datagen.flow_from_directory( train_data_dir, color_mode='grayscale', target_size=(img_rows,img_cols), batch_size=batch_size, class_mode='categorical', shuffle=True)validation_generator = validation_datagen.flow_from_directory( validation_data_dir, color_mode='grayscale', target_size=(img_rows,img_cols), batch_size=batch_size, class_mode='categorical', shuffle=True)
上面代碼的輸出將是:
Found 24256 images belonging to 5 classes.Found 3006 images belonging to 5 classes.
在上面的代碼中,我正在使用flow_from_directory()方法從目錄中加載我們的數(shù)據(jù)集,該目錄已擴(kuò)充并存儲(chǔ)在train_generator和validation_generator變量中。flow_from_directory()采用目錄的路徑并生成一批擴(kuò)充數(shù)據(jù)。因此,在這里,我們?yōu)樵摲椒ㄌ峁┝艘恍┻x項(xiàng),以自動(dòng)更改尺寸并將其劃分為類(lèi),以便更輕松地輸入模型。
給出的選項(xiàng)是:
? directory:數(shù)據(jù)集的目錄。
? color_mode:在這里,我將圖像轉(zhuǎn)換為灰度,因?yàn)槲覍?duì)圖像的顏色不感興趣,而僅對(duì)表達(dá)式感興趣。
? target_size:將圖像轉(zhuǎn)換為統(tǒng)一大小。
? batch_size:制作大量數(shù)據(jù)以進(jìn)行訓(xùn)練。
? class_mode:在這里,我將“類(lèi)別”用作類(lèi)模式,因?yàn)槲覍D像分為5類(lèi)。
? shuffle:隨機(jī)播放數(shù)據(jù)集以進(jìn)行更好的訓(xùn)練。
任務(wù)4:
數(shù)據(jù)集的修改已完成,現(xiàn)在是該模型的大腦即CNN網(wǎng)絡(luò)。
因此,首先,我將定義將要使用的模型的類(lèi)型。在這里,我使用的是Sequential模型,該模型定義網(wǎng)絡(luò)中的所有層將依次相繼并將其存儲(chǔ)在變量模型中。
model = Sequential()
該網(wǎng)絡(luò)由7個(gè)塊組成:(后面我們將逐層解釋?zhuān)?/strong>
#Block-1model.add(Conv2D(32,(3,3),padding='same',kernel_initializer='he_normal', input_shape=(img_rows,img_cols,1)))model.add(Activation('elu'))model.add(BatchNormalization())model.add(Conv2D(32,(3,3),padding='same',kernel_initializer='he_normal', input_shape=(img_rows,img_cols,1)))model.add(Activation('elu'))model.add(BatchNormalization())model.add(MaxPooling2D(pool_size=(2,2)))model.add(Dropout(0.2))#Block-2model.add(Conv2D(64,(3,3),padding='same',kernel_initializer='he_normal'))model.add(Activation('elu'))model.add(BatchNormalization())model.add(Conv2D(64,(3,3),padding='same',kernel_initializer='he_normal'))model.add(Activation('elu'))model.add(BatchNormalization())model.add(MaxPooling2D(pool_size=(2,2)))model.add(Dropout(0.2))#Block-3model.add(Conv2D(128,(3,3),padding='same',kernel_initializer='he_normal'))model.add(Activation('elu'))model.add(BatchNormalization())model.add(Conv2D(128,(3,3),padding='same',kernel_initializer='he_normal'))model.add(Activation('elu'))model.add(BatchNormalization())model.add(MaxPooling2D(pool_size=(2,2)))model.add(Dropout(0.2))#Block-4model.add(Conv2D(256,(3,3),padding='same',kernel_initializer='he_normal'))model.add(Activation('elu'))model.add(BatchNormalization())model.add(Conv2D(256,(3,3),padding='same',kernel_initializer='he_normal'))model.add(Activation('elu'))model.add(BatchNormalization())model.add(MaxPooling2D(pool_size=(2,2)))model.add(Dropout(0.2))#Block-5model.add(Flatten())model.add(Dense(64,kernel_initializer='he_normal'))model.add(Activation('elu'))model.add(BatchNormalization())model.add(Dropout(0.5))#Block-6model.add(Dense(64,kernel_initializer='he_normal'))model.add(Activation('elu'))model.add(BatchNormalization())model.add(Dropout(0.5))#Block-7model.add(Dense(num_classes,kernel_initializer='he_normal'))model.add(Activation('softmax'))
運(yùn)行以上代碼,如果使用的是舊版本的tensorflow,則會(huì)收到一些警告。
在這里,我使用了存在于keras.layers中的7種類(lèi)型的層。
這些層是:
?Conv2D(
filters, kernel_size, strides=(1, 1), padding=’valid’, data_format=None,
dilation_rate=(1, 1), activation=None, use_bias=True,
kernel_initializer=’glorot_uniform’, bias_initializer=’zeros’,
kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None,
kernel_constraint=None, bias_constraint=None, **kwargs)
? Activation(activation_type)
? BatchNormalization()
? MaxPooling2D(pool_size, strides,padding, data_format, **kwargs)
? Dropout(dropout_value)
? Flatten()
? Dense(
units,
activation=None,
use_bias=True,
kernel_initializer=”glorot_uniform”,
bias_initializer=”zeros”,
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
**kwargs)
Block-1層的出現(xiàn)順序如下:
? Conv2D層-此層為網(wǎng)絡(luò)創(chuàng)建卷積層。我們創(chuàng)建的該層包含32個(gè)大小為(3,3)濾波器,其中使用padding ='same'填充圖像并使用內(nèi)核初始化程序he_normal。添加了2個(gè)卷積層,每個(gè)層都有一個(gè)激活層和批處理歸一化層。
? 激活層-使用elu激活。
? BatchNormalization(批處理歸一化)-歸一化每一層的激活,即將平均激活值保持在接近0并將激活標(biāo)準(zhǔn)偏差保持在接近1。
? MaxPooling2D層-通過(guò)沿pool_size定義的沿特征軸的每個(gè)尺寸的窗口上的最大值,對(duì)輸入表示進(jìn)行下采樣。在此, pool_size大小為(2,2)。
? Dropout:是一種在訓(xùn)練過(guò)程中忽略隨機(jī)選擇的神經(jīng)元的技術(shù)。在這里,我將dropout設(shè)為0.5,這意味著它將忽略一半的神經(jīng)元。
Block-2層的出現(xiàn)順序如下:
? 與block-1相同的層,但是卷積層具有64個(gè)濾波器。
Block-3層的出現(xiàn)順序如下:
? 與block-1相同的層,但是卷積層具有128個(gè)濾波器。
Block-4層的出現(xiàn)順序如下:
? 與block-1相同的層,但是卷積層具有256個(gè)濾波器。
Block-5層的出現(xiàn)順序如下:
? 展平層-將前一層的輸出展平,即轉(zhuǎn)換為矢量形式。
? 密集層-該層中每個(gè)神經(jīng)元都與其他每個(gè)神經(jīng)元相連。在這里,我使用帶有內(nèi)核的程序初始化64個(gè)單元或64個(gè)神經(jīng)元-he_normal。
? 這些層之后使用elu激活,批處理歸一化,最后以dropout為50%選擇忽略。
塊6層的出現(xiàn)順序如下:
? 與模塊5相同的層,但沒(méi)有展平層,因?yàn)樵撃K的輸入已展平。
塊7層的出現(xiàn)順序如下:
? 密集層-網(wǎng)絡(luò)的最后一個(gè)塊中,我使用num_classes創(chuàng)建一個(gè)密集層,該層具有he_normal初始值設(shè)定項(xiàng),其unit =類(lèi)數(shù)。
? 激活層-在這里,我使用softmax,該層多用于分類(lèi)。
現(xiàn)在檢查模型的整體結(jié)構(gòu):
print(model.summary())
輸出將是:
Model: "sequential_1"_________________________________________________________________Layer (type) Output Shape Param # =================================================================conv2d_1 (Conv2D) (None, 48, 48, 32) 320 _________________________________________________________________activation_1 (Activation) (None, 48, 48, 32) 0 _________________________________________________________________batch_normalization_1 (Batch (None, 48, 48, 32) 128 _________________________________________________________________conv2d_2 (Conv2D) (None, 48, 48, 32) 9248 _________________________________________________________________activation_2 (Activation) (None, 48, 48, 32) 0 _________________________________________________________________batch_normalization_2 (Batch (None, 48, 48, 32) 128 _________________________________________________________________max_pooling2d_1 (MaxPooling2 (None, 24, 24, 32) 0 _________________________________________________________________dropout_1 (Dropout) (None, 24, 24, 32) 0 _________________________________________________________________conv2d_3 (Conv2D) (None, 24, 24, 64) 18496 _________________________________________________________________activation_3 (Activation) (None, 24, 24, 64) 0 _________________________________________________________________batch_normalization_3 (Batch (None, 24, 24, 64) 256 _________________________________________________________________conv2d_4 (Conv2D) (None, 24, 24, 64) 36928 _________________________________________________________________activation_4 (Activation) (None, 24, 24, 64) 0 _________________________________________________________________batch_normalization_4 (Batch (None, 24, 24, 64) 256 _________________________________________________________________max_pooling2d_2 (MaxPooling2 (None, 12, 12, 64) 0 _________________________________________________________________dropout_2 (Dropout) (None, 12, 12, 64) 0 _________________________________________________________________conv2d_5 (Conv2D) (None, 12, 12, 128) 73856 _________________________________________________________________activation_5 (Activation) (None, 12, 12, 128) 0 _________________________________________________________________batch_normalization_5 (Batch (None, 12, 12, 128) 512 _________________________________________________________________conv2d_6 (Conv2D) (None, 12, 12, 128) 147584 _________________________________________________________________activation_6 (Activation) (None, 12, 12, 128) 0 _________________________________________________________________batch_normalization_6 (Batch (None, 12, 12, 128) 512 _________________________________________________________________max_pooling2d_3 (MaxPooling2 (None, 6, 6, 128) 0 _________________________________________________________________dropout_3 (Dropout) (None, 6, 6, 128) 0 _________________________________________________________________conv2d_7 (Conv2D) (None, 6, 6, 256) 295168 _________________________________________________________________activation_7 (Activation) (None, 6, 6, 256) 0 _________________________________________________________________batch_normalization_7 (Batch (None, 6, 6, 256) 1024 _________________________________________________________________conv2d_8 (Conv2D) (None, 6, 6, 256) 590080 _________________________________________________________________activation_8 (Activation) (None, 6, 6, 256) 0 _________________________________________________________________batch_normalization_8 (Batch (None, 6, 6, 256) 1024 _________________________________________________________________max_pooling2d_4 (MaxPooling2 (None, 3, 3, 256) 0 _________________________________________________________________dropout_4 (Dropout) (None, 3, 3, 256) 0 _________________________________________________________________flatten_1 (Flatten) (None, 2304) 0 _________________________________________________________________dense_1 (Dense) (None, 64) 147520 _________________________________________________________________activation_9 (Activation) (None, 64) 0 _________________________________________________________________batch_normalization_9 (Batch (None, 64) 256 _________________________________________________________________dropout_5 (Dropout) (None, 64) 0 _________________________________________________________________dense_2 (Dense) (None, 64) 4160 _________________________________________________________________activation_10 (Activation) (None, 64) 0 _________________________________________________________________batch_normalization_10 (Batc (None, 64) 256 _________________________________________________________________dropout_6 (Dropout) (None, 64) 0 _________________________________________________________________dense_3 (Dense) (None, 5) 325 _________________________________________________________________activation_11 (Activation) (None, 5) 0 =================================================================Total params: 1,328,037Trainable params: 1,325,861Non-trainable params: 2,176_________________________________________________________________None
上面的輸出顯示了該網(wǎng)絡(luò)中使用的所有層。這是一個(gè)大型網(wǎng)絡(luò),包含1,328,037個(gè) 參數(shù)。
任務(wù)5:
最后一步:編譯和訓(xùn)練
現(xiàn)在剩下的事情就是編譯和訓(xùn)練模型。但是首先讓我們導(dǎo)入更多的依賴(lài)。
from keras.optimizers import RMSprop,SGD,Adamfrom keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau
在編譯之前,我將使用keras.callbacks類(lèi)創(chuàng)建以下3個(gè)東西:
Checkpoint(函數(shù)— ModelCheckpoint())
它將監(jiān)視驗(yàn)證損失,并使用mode ='min'屬性嘗試將損失降至最低。到達(dá)檢查點(diǎn)時(shí),它將保存訓(xùn)練有素的最佳大小。Verbose = 1僅用于代碼創(chuàng)建檢查點(diǎn)時(shí)的可視化。這里我使用以下參數(shù):
? file-path:保存模型文件的路徑,這里我保存的模型文件名為EmotionDetectionModel.h5
? monitor:要監(jiān)視的數(shù)量。在這里,我正在監(jiān)視驗(yàn)證損失。
? mode:{自動(dòng),最小,最大}之一。如果save_best_only = True,則基于監(jiān)視數(shù)量的最大化或最小化來(lái)決定覆蓋當(dāng)前保存文件。
? save_best_only:如果save_best_only = True,則根據(jù)監(jiān)視數(shù)量的最新最佳模型將不會(huì)被覆蓋。
? verbose:1:更新數(shù)據(jù),0:不變。
提前停止(功能— EarlyStopping())
通過(guò)檢查以下屬性,以提前結(jié)束運(yùn)行。
? monitor:要監(jiān)視的數(shù)量。在這里,我正在監(jiān)視驗(yàn)證損失。
? min_delta:被監(jiān)視的數(shù)量的最小變化有資格作為改進(jìn),即絕對(duì)變化小于min_delta將被視為沒(méi)有任何改進(jìn)。在這里我給了0。
? patience:沒(méi)有改善的時(shí)期數(shù),此后將停止訓(xùn)練。我在這里給了它3。
? restore_best_weights:是否從時(shí)期以受監(jiān)視數(shù)量的最佳值恢復(fù)模型權(quán)重。如果為False,則使用在訓(xùn)練的最后一步獲得的模型權(quán)重。
? verbose:1:更新數(shù)據(jù),0:不變。
降低學(xué)習(xí)率(函數(shù)— ReduceLROnPlateau())
一旦學(xué)習(xí)停滯,模型通常會(huì)受益于將學(xué)習(xí)率降低2-10倍。回調(diào)監(jiān)視數(shù)量,并且如果沒(méi)有發(fā)現(xiàn)patience的改善,則學(xué)習(xí)率會(huì)降低,為此使用了以下屬性。
? monitor:監(jiān)視特定損失。在這里,我正在監(jiān)視驗(yàn)證損失。
? factor:降低學(xué)習(xí)率的因素。new_lr = lr *因子。在這里我使用0.2作為系數(shù)。
? patience:沒(méi)有改善的時(shí)期數(shù),之后學(xué)習(xí)率將降低。我在這里使用3。
? min_delta:測(cè)量新的最佳閾值,僅關(guān)注重大變化。
? verbose:1:更新數(shù)據(jù),0:不變。
現(xiàn)在是時(shí)候到最后使用編譯模型model.compile()和適合訓(xùn)練數(shù)據(jù)集的模型model.fit_generator()
model.compile()
具有以下參數(shù):
? loss:此值將確定要在代碼中使用的損失函數(shù)的類(lèi)型。在這里,我們有5個(gè)類(lèi)別或類(lèi)別的分類(lèi)數(shù)據(jù),因此使用了“ categorical_crossentropy”損失。
? optimizer:此值將確定要在代碼中使用的優(yōu)化器功能的類(lèi)型。這里我使用的學(xué)習(xí)率是0.001的Adam優(yōu)化器,因?yàn)樗欠诸?lèi)數(shù)據(jù)的最佳優(yōu)化器。
? metrics:metrics參數(shù)應(yīng)該是一個(gè)列表,模型可以有任意數(shù)量的metrics。它是模型在訓(xùn)練和測(cè)試過(guò)程中要評(píng)估的metrics列表。這里我們使用了精度作為度量標(biāo)準(zhǔn)。
model.fit_generator()
使模型適合Python逐批生成的數(shù)據(jù)。
它具有以下參數(shù):
? generator:我們之前創(chuàng)建的train_generator對(duì)象。
? steps_per_epochs:在一個(gè)紀(jì)元內(nèi)接受訓(xùn)練數(shù)據(jù)的步驟。
? epoch:一次通過(guò)整個(gè)數(shù)據(jù)集。
? callbacks:包含我們之前創(chuàng)建的所有回調(diào)的列表。
? validation_data:我們之前創(chuàng)建的validation_generator對(duì)象。
? validation_steps:在一個(gè)時(shí)期內(nèi)采取驗(yàn)證數(shù)據(jù)的步驟。
model.compile(loss='categorical_crossentropy', optimizer = Adam(lr=0.001), metrics=['accuracy'])nb_train_samples = 24176nb_validation_samples = 3006epochs=25history=model.fit_generator( train_generator, steps_per_epoch=nb_train_samples//batch_size, epochs=epochs, callbacks=callbacks, validation_data=validation_generator, validation_steps=nb_validation_samples//batch_size)
完成!
現(xiàn)在,可以使用此模型創(chuàng)建情緒檢測(cè)器,從而完成模型生成。
驅(qū)動(dòng)程式碼
現(xiàn)在,我們將使用在上一節(jié)中創(chuàng)建的模型來(lái)說(shuō)明用于情感檢測(cè)的代碼。
首先,讓我們?cè)俅螌?dǎo)入一些運(yùn)行代碼所需的模塊。
from keras.models import load_modelfrom keras.preprocessing.image import img_to_arrayfrom keras.preprocessing import imageimport cv2import numpy as np
現(xiàn)在,讓我們加載模型,并加載我用來(lái)檢測(cè)攝像頭前方人臉的分類(lèi)器。使用haarcascade_frontalface_default分類(lèi)器。Haar Cascade是一種機(jī)器學(xué)習(xí)對(duì)象檢測(cè)算法,用于識(shí)別圖像或視頻中的對(duì)象,并基于Paul Viola和Michael Jones在其論文《使用簡(jiǎn)單特征的增強(qiáng)級(jí)聯(lián)進(jìn)行快速對(duì)象檢測(cè)》中提出的特征概念。2001。haarcascade_frontalface_default分類(lèi)器可檢測(cè)圖像或連續(xù)視頻源中人的正面。
face_classifier=cv2.CascadeClassifier('/haarcascade_frontalface_default.xml')classifier = load_model('/EmotionDetectionModel.h5')
現(xiàn)在,我將定義一個(gè)變量class_labels來(lái)存儲(chǔ)類(lèi)的名稱(chēng)或我們要預(yù)測(cè)的情緒類(lèi)型,還定義一個(gè)變量cap來(lái)存儲(chǔ)cv2.VideoCapture方法返回的值。在此,VideoCapture中的值0用于指示該方法使用便攜式計(jì)算機(jī)的主要網(wǎng)絡(luò)攝像頭。
class_labels=['Angry','Happy','Neutral','Sad','Surprise']cap=cv2.VideoCapture(0)
結(jié)論
因此,在這里我已經(jīng)解釋了使用OpenCV和Keras創(chuàng)建情緒檢測(cè)的過(guò)程。通過(guò)以下鏈接可以查看完整的代碼以及數(shù)據(jù)集。
https://github.com/karansjc1/emotion-detection
實(shí)驗(yàn)結(jié)果如下:
數(shù)據(jù)分析咨詢(xún)請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
LSTM 模型輸入長(zhǎng)度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長(zhǎng)序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶(hù) ...
2025-07-11尊敬的考生: 您好! 我們誠(chéng)摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡(jiǎn)稱(chēng) BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測(cè)分析中的應(yīng)用:從數(shù)據(jù)查詢(xún)到趨勢(shì)預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測(cè)分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢(xún)結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢(xún)結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭(zhēng)搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢(shì)性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢(shì)性檢驗(yàn)如同一位耐心的偵探,專(zhuān)注于從單 ...
2025-07-09year_month數(shù)據(jù)類(lèi)型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類(lèi)型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢(shì)與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢(shì)變化以及識(shí)別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國(guó)內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對(duì)策略? 長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門(mén)控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場(chǎng)調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場(chǎng)調(diào)研是企業(yè)洞察市場(chǎng)動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場(chǎng)調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書(shū)考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專(zhuān)業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開(kāi)啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03