99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁大數(shù)據(jù)時代太奇妙了,基于OpencvCV的情緒檢測!
太奇妙了,基于OpencvCV的情緒檢測!
2020-08-20
收藏

情緒檢測或表情分類在深度學(xué)習(xí)領(lǐng)域中有著廣泛的研究。使用相機和一些簡單的代碼我們就可以對情緒進行實時分類,這也是邁向高級人機交互的一步。

前言

本期我們將首先介紹如何使用Keras 創(chuàng)建卷積神經(jīng)網(wǎng)絡(luò)模型,再使用攝像頭獲取圖片進行情緒檢測。

為了更好的閱讀體驗,我們最好具備一下知識:

? Python

OpenCV

? 卷積神經(jīng)網(wǎng)絡(luò)(CNN)

numpy

(注意:我們使用的Tensorflow是1.13.1版本、keras是 版本2.3.1)

模型制作

首先,我們將創(chuàng)建模型代碼并解釋其中的含義。代碼的創(chuàng)建總共分為以下5個部分。

任務(wù)1:

導(dǎo)入該項目所需的必需模塊。

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é)省手動輸入的時間。

num_classes=5img_rows,img_cols=48,48batch_size=32

以上變量的說明如下:

? num_classses = 5:訓(xùn)練模型時要處理的類即情感的種類數(shù)。

? img_rows=48,img_cols = 48:饋送到神經(jīng)網(wǎng)絡(luò)中的圖像陣列大小。

? batch_size = 32:更新模型之前處理的樣本數(shù)量。epochs 是完整通過訓(xùn)練數(shù)據(jù)集的次數(shù)。batch_size必須大于等于1并且小于或等于訓(xùn)練數(shù)據(jù)集中的樣本數(shù)。

任務(wù)2:

現(xiàn)在讓我們開始加載模型,這里使用的數(shù)據(jù)集是fer2013,該數(shù)據(jù)集是由kaggle托管的開源數(shù)據(jù)集。數(shù)據(jù)集共包含7類,分別是憤怒、厭惡、恐懼、快樂、悲傷、驚奇、無表情,訓(xùn)練集共有28,709個示例。該數(shù)據(jù)集已從網(wǎng)站上刪除,但我們在以下鏈接中可以找到相關(guān)代碼和數(shù)據(jù)集。https://github.com/karansjc1/emotion-detection

數(shù)據(jù)集的存儲庫中

我們將數(shù)據(jù)儲存在特定文件夾中。例如,“憤怒”文件夾包含帶有憤怒面孔等的圖片。在這里,我們使用5類,包括“憤怒”,“快樂”,“悲傷”,“驚奇”和“無表情”。使用24256張圖像作為訓(xùn)練數(shù)據(jù),3006張圖像作為檢測數(shù)據(jù)。

現(xiàn)在讓我們將數(shù)據(jù)加載到一些變量中。

train_data_dir='fer2013/train'validation_data_dir='fer2013/validation'

以上兩行導(dǎo)入了檢測和訓(xùn)練數(shù)據(jù)。該模型是在訓(xùn)練數(shù)據(jù)集上進行訓(xùn)練的;在檢測數(shù)據(jù)集上檢測該模型性能,檢測數(shù)據(jù)集是原始數(shù)據(jù)集的一部分,從原始數(shù)據(jù)集上分離開來的。

任務(wù)3:

現(xiàn)在,我們對這些數(shù)據(jù)集進行圖像增強。圖像數(shù)據(jù)增強可以擴展訓(xùn)練數(shù)據(jù)集大小,改善圖像質(zhì)量。Keras深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)庫中的ImageDataGenerator類通過圖像增強來擬合模型。

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變量以下方法人為地擴展數(shù)據(jù)集:

? rotation_range:隨機旋轉(zhuǎn),在這里我們使用30度。

? shear_range:剪切強度(逆時針方向的剪切角,以度為單位)。在這里我們使用0.3作為剪切范圍。

? zoom_range:隨機縮放的范圍,這里我們使用0.3作為縮放范圍。

? width_shift_range:在圖像的整個寬度上移動一個值。

? height_shift_range:這會在整個圖像高度上移動一個值。

? horizontal_flip:水平翻轉(zhuǎn)圖像。

? fill_mode:通過上述使用的方法更改圖像的方向后填充像素,使用“最近”作為填充模式,即用附近的像素填充圖像中丟失的像素。

在這里,我只是重新保存驗證數(shù)據(jù),而沒有執(zhí)行任何其他擴充操作,因為我想使用與訓(xùn)練模型中數(shù)據(jù)不同的原始數(shù)據(jù)來檢查模型。

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ù)集,該目錄已擴充并存儲在train_generator和validation_generator變量中。flow_from_directory()采用目錄的路徑并生成一批擴充數(shù)據(jù)。因此,在這里,我們?yōu)樵摲椒ㄌ峁┝艘恍┻x項,以自動更改尺寸并將其劃分為類,以便更輕松地輸入模型。

給出的選項是:

? directory:數(shù)據(jù)集的目錄。

? color_mode:在這里,我將圖像轉(zhuǎn)換為灰度,因為我對圖像的顏色不感興趣,而僅對表達(dá)式感興趣。

? target_size:將圖像轉(zhuǎn)換為統(tǒng)一大小。

? batch_size:制作大量數(shù)據(jù)以進行訓(xùn)練。

? class_mode:在這里,我將“類別”用作類模式,因為我將圖像分為5類。

shuffle:隨機播放數(shù)據(jù)集以進行更好的訓(xùn)練。

任務(wù)4:

數(shù)據(jù)集的修改已完成,現(xiàn)在是該模型的大腦即CNN網(wǎng)絡(luò)。

因此,首先,我將定義將要使用的模型的類型。在這里,我使用的是Sequential模型,該模型定義網(wǎng)絡(luò)中的所有層將依次相繼并將其存儲在變量模型中。

model = Sequential()

該網(wǎng)絡(luò)由7個塊組成:(后面我們將逐層解釋)

#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'))

運行以上代碼,如果使用的是舊版本的tensorflow,則會收到一些警告。

在這里,我使用了存在于keras.layers中的7種類型的層。

這些層是:

?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個大小為(3,3)濾波器,其中使用padding ='same'填充圖像并使用內(nèi)核初始化程序he_normal。添加了2個卷積層,每個層都有一個激活層和批處理歸一化層。

? 激活層-使用elu激活。

? BatchNormalization(批處理歸一化)-歸一化每一層的激活,即將平均激活值保持在接近0并將激活標(biāo)準(zhǔn)偏差保持在接近1。

? MaxPooling2D層-通過沿pool_size定義的沿特征軸的每個尺寸的窗口上的最大值,對輸入表示進行下采樣。在此, pool_size大小為(2,2)。

? Dropout:是一種在訓(xùn)練過程中忽略隨機選擇的神經(jīng)元的技術(shù)。在這里,我將dropout設(shè)為0.5,這意味著它將忽略一半的神經(jīng)元。

Block-2層的出現(xiàn)順序如下:

? 與block-1相同的層,但是卷積層具有64個濾波器。

Block-3層的出現(xiàn)順序如下:

? 與block-1相同的層,但是卷積層具有128個濾波器。

Block-4層的出現(xiàn)順序如下:

? 與block-1相同的層,但是卷積層具有256個濾波器。

Block-5層的出現(xiàn)順序如下:

? 展平層-將前一層的輸出展平,即轉(zhuǎn)換為矢量形式。

? 密集層-該層中每個神經(jīng)元都與其他每個神經(jīng)元相連。在這里,我使用帶有內(nèi)核的程序初始化64個單元或64個神經(jīng)元-he_normal。

? 這些層之后使用elu激活,批處理歸一化,最后以dropout為50%選擇忽略。

塊6層的出現(xiàn)順序如下:

? 與模塊5相同的層,但沒有展平層,因為該模塊的輸入已展平。

塊7層的出現(xiàn)順序如下:

? 密集層-網(wǎng)絡(luò)的最后一個塊中,我使用num_classes創(chuàng)建一個密集層,該層具有he_normal初始值設(shè)定項,其unit =類數(shù)。

? 激活層-在這里,我使用softmax,該層多用于分類。

現(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ò)中使用的所有層。這是一個大型網(wǎng)絡(luò),包含1,328,037個 參數(shù)。

任務(wù)5:

最后一步:編譯和訓(xùn)練

現(xiàn)在剩下的事情就是編譯和訓(xùn)練模型。但是首先讓我們導(dǎo)入更多的依賴。

from keras.optimizers import RMSprop,SGD,Adamfrom keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau

在編譯之前,我將使用keras.callbacks類創(chuàng)建以下3個東西:

Checkpoint(函數(shù)— ModelCheckpoint())

它將監(jiān)視驗證損失,并使用mode ='min'屬性嘗試將損失降至最低。到達(dá)檢查點時,它將保存訓(xùn)練有素的最佳大小。Verbose = 1僅用于代碼創(chuàng)建檢查點時的可視化。這里我使用以下參數(shù):

? file-path:保存模型文件的路徑,這里我保存的模型文件名為EmotionDetectionModel.h5

? monitor:要監(jiān)視的數(shù)量。在這里,我正在監(jiān)視驗證損失。

? mode:{自動,最小,最大}之一。如果save_best_only = True,則基于監(jiān)視數(shù)量的最大化或最小化來決定覆蓋當(dāng)前保存文件。

? save_best_only:如果save_best_only = True,則根據(jù)監(jiān)視數(shù)量的最新最佳模型將不會被覆蓋。

? verbose:1:更新數(shù)據(jù),0:不變。

提前停止(功能— EarlyStopping())

通過檢查以下屬性,以提前結(jié)束運行。

? monitor:要監(jiān)視的數(shù)量。在這里,我正在監(jiān)視驗證損失。

? min_delta:被監(jiān)視的數(shù)量的最小變化有資格作為改進,即絕對變化小于min_delta將被視為沒有任何改進。在這里我給了0。

? patience:沒有改善的時期數(shù),此后將停止訓(xùn)練。我在這里給了它3。

? restore_best_weights:是否從時期以受監(jiān)視數(shù)量的最佳值恢復(fù)模型權(quán)重。如果為False,則使用在訓(xùn)練的最后一步獲得的模型權(quán)重。

? verbose:1:更新數(shù)據(jù),0:不變。

降低學(xué)習(xí)率(函數(shù)— ReduceLROnPlateau())

一旦學(xué)習(xí)停滯,模型通常會受益于將學(xué)習(xí)率降低2-10倍。回調(diào)監(jiān)視數(shù)量,并且如果沒有發(fā)現(xiàn)patience的改善,則學(xué)習(xí)率會降低,為此使用了以下屬性。

? monitor:監(jiān)視特定損失。在這里,我正在監(jiān)視驗證損失。

? factor:降低學(xué)習(xí)率的因素。new_lr = lr *因子。在這里我使用0.2作為系數(shù)。

? patience:沒有改善的時期數(shù),之后學(xué)習(xí)率將降低。我在這里使用3。

? min_delta:測量新的最佳閾值,僅關(guān)注重大變化。

? verbose:1:更新數(shù)據(jù),0:不變。

現(xiàn)在是時候到最后使用編譯模型model.compile()和適合訓(xùn)練數(shù)據(jù)集的模型model.fit_generator()

model.compile()

具有以下參數(shù):

? loss:此值將確定要在代碼中使用的損失函數(shù)的類型。在這里,我們有5個類別或類別的分類數(shù)據(jù),因此使用了“ categorical_crossentropy”損失。

? optimizer:此值將確定要在代碼中使用的優(yōu)化器功能的類型。這里我使用的學(xué)習(xí)率是0.001的Adam優(yōu)化器,因為它是分類數(shù)據(jù)的最佳優(yōu)化器。

? metrics:metrics參數(shù)應(yīng)該是一個列表,模型可以有任意數(shù)量的metrics。它是模型在訓(xùn)練和測試過程中要評估的metrics列表。這里我們使用了精度作為度量標(biāo)準(zhǔn)。

model.fit_generator()

使模型適合Python逐批生成的數(shù)據(jù)。

它具有以下參數(shù):

? generator:我們之前創(chuàng)建的train_generator對象。

? steps_per_epochs:在一個紀(jì)元內(nèi)接受訓(xùn)練數(shù)據(jù)的步驟。

? epoch:一次通過整個數(shù)據(jù)集。

? callbacks:包含我們之前創(chuàng)建的所有回調(diào)的列表。

? validation_data:我們之前創(chuàng)建的validation_generator對象。

? validation_steps:在一個時期內(nèi)采取驗證數(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)建情緒檢測器,從而完成模型生成。

驅(qū)動程式碼

現(xiàn)在,我們將使用在上一節(jié)中創(chuàng)建的模型來說明用于情感檢測的代碼。

首先,讓我們再次導(dǎo)入一些運行代碼所需的模塊。

from keras.models import load_modelfrom keras.preprocessing.image import img_to_arrayfrom keras.preprocessing import imageimport cv2import numpy as np

現(xiàn)在,讓我們加載模型,并加載我用來檢測攝像頭前方人臉的分類器。使用haarcascade_frontalface_default分類器。Haar Cascade是一種機器學(xué)習(xí)對象檢測算法,用于識別圖像或視頻中的對象,并基于Paul Viola和Michael Jones在其論文《使用簡單特征的增強級聯(lián)進行快速對象檢測》中提出的特征概念。2001。haarcascade_frontalface_default分類器可檢測圖像或連續(xù)視頻源中人的正面。

face_classifier=cv2.CascadeClassifier('/haarcascade_frontalface_default.xml')classifier = load_model('/EmotionDetectionModel.h5')

現(xiàn)在,我將定義一個變量class_labels來存儲類的名稱或我們要預(yù)測的情緒類型,還定義一個變量cap來存儲cv2.VideoCapture方法返回的值。在此,VideoCapture中的值0用于指示該方法使用便攜式計算機的主要網(wǎng)絡(luò)攝像頭。

class_labels=['Angry','Happy','Neutral','Sad','Surprise']cap=cv2.VideoCapture(0)

結(jié)論

因此,在這里我已經(jīng)解釋了使用OpenCVKeras創(chuàng)建情緒檢測的過程。通過以下鏈接可以查看完整的代碼以及數(shù)據(jù)集。

https://github.com/karansjc1/emotion-detection

實驗結(jié)果如下:

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }