1. 程式人生 > >疲勞駕駛識別專案(一)

疲勞駕駛識別專案(一)

接到一個小專案,做疲勞駕駛檢測(實時),剛開始著手,感覺有點古怪(其實就是難或者自己菜)。
因為專案方給的是視訊,首先特徵提取和學習(如果有學習)過程和預測應該是要用圖片做的。
在這裡插入圖片描述
給定資料為視訊,如上,要求是檢測四個專案的完成度並提出預警,首先我不認為四個類別全部使用DL或底層的特徵分類的其中一種會得到最好的效果,肯定是要嘗試。
最先開始做的肯定是最簡單的,個人認為不需要ROI,並且可以使用流行的DL模型做的是calling,資料集我展示一小部分。
在這裡插入圖片描述
由於拍攝用的是紅外,所以只有calling這一部分是不失真的,完全可以不經預處理直接去訓練的。
下面是我的訓練過程和結果:(程式碼就不放了太長了)

首先手動給VGG16加上下面幾層:
在這裡插入圖片描述

train_data_dir = 'data_call/train'
validation_data_dir = 'data_call/val'

nb_train_samples = 748
nb_validation_samples = 196
epochs = 40
batch_size = 32
train_datagen = ImageDataGenerator(
#    samplewise_center = True,
    rotation_range=10,
    width_shift_range=0.3,
    height_shift_range=0.3,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip= True,
  #  vertical_flip=True,
    rescale=1. / 255
    )
imagedatagenerator部分還在求助,是真的看不太懂。
# this is the augmentation configuration we will use for testing:
# only rescaling
validation_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_height, img_width),
    batch_size=batch_size,
    class_mode='categorical')

validation_generator = validation_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_height, img_width),
    batch_size=batch_size,
    class_mode='categorical')
    

fit部分:

history = model.fit_generator(
    train_generator,
    steps_per_epoch=nb_train_samples // batch_size,
    epochs=40,
    validation_data=validation_generator,
    validation_steps=nb_validation_samples // batch_size,
    verbose=1,   
    #callbacks=None)
    callbacks=callbacks)
#callbacks=[batch_parms])

訓練過程:
在這裡插入圖片描述

test預處理和預測部分:
#files = glob.glob("validation/P_NG/*")
files = glob.glob("data_call/test/*bmp")
image_list = [] 
for f in files:
    print (f)
    image = cv2.imread(f)
    if  np.all(image ==None):  
        pass
    else:
        image = cv2.resize(image,(128,128))
        image = image/ 255.
        image = np.expand_dims(image,axis=0)
       # image_list.append(image)
        pre=model.predict(image, verbose=1, batch_size=32)
        #pre.append(f)
        print(pre)
        if pre[0][0]>pre[0][1]:
           image_list.append(f)
            
# image_list = np.array(image_list)
# predictions = model.predict(image_list, verbose=1, batch_size=32)
print(image_list)

預測結果展示:
在這裡插入圖片描述
acc和loss:
在這裡插入圖片描述
在這裡插入圖片描述
loss是可以輕鬆做到0.01級別的,我心甚慰。

接下來的工作還是想用不同的方法把四個部分的二分類先做出來,然後根據聯動特徵組合出疲勞預警;
比如眼部和嘴部可能需要用底層技術解決,使用深度學習效果不一定最好的。