基于Python實現(xiàn)口罩佩戴檢測功能_第1頁
基于Python實現(xiàn)口罩佩戴檢測功能_第2頁
基于Python實現(xiàn)口罩佩戴檢測功能_第3頁
基于Python實現(xiàn)口罩佩戴檢測功能_第4頁
基于Python實現(xiàn)口罩佩戴檢測功能_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第基于Python實現(xiàn)口罩佩戴檢測功能目錄口罩佩戴檢測一題目背景1.1實驗介紹1.2實驗要求1.3實驗環(huán)境1.4實驗思路二實驗內(nèi)容2.1已知文件與數(shù)據(jù)集2.2圖片尺寸調(diào)整2.3制作訓練時需要用到的批量數(shù)據(jù)集2.4調(diào)用MTCNN2.5加載預訓練模型MobileNet2.6訓練模型2.6.1加載和保存2.6.2手動調(diào)整學習率2.6.3早停法2.6.4亂序訓練數(shù)據(jù)2.6.5訓練模型三算法描述3.1MTCNN3.2MobileNet四求解結(jié)果五比較分析六心得與感想

口罩佩戴檢測

一題目背景

1.1實驗介紹

今年一場席卷全球的新型冠狀病毒給人們帶來了沉重的生命財產(chǎn)的損失。有效防御這種傳染病毒的方法就是積極佩戴口罩。我國對此也采取了嚴肅的措施,在公共場合要求人們必須佩戴口罩。在本次實驗中,我們要建立一個目標檢測的模型,可以識別圖中的人是否佩戴了口罩。

1.2實驗要求

建立深度學習模型,檢測出圖中的人是否佩戴了口罩,并將其盡可能調(diào)整到最佳狀態(tài)。學習經(jīng)典的模型MTCNN和MobileNet的結(jié)構(gòu)。學習訓練時的方法。

1.3實驗環(huán)境

實驗使用重要python包:

importcv2ascv

importnumpyasnp

importmatplotlib.pyplotasplt

fromtensorflow.keras.callbacksimportModelCheckpoint,ReduceLROnPlateau,EarlyStopping

由于擔心平臺GPU時長不夠用,所以在自己電腦上搭建了配套實驗環(huán)境,由于電腦顯卡CUDA版本較老,所以最終本地配置如下:

Python:3.8Tensorflow-GPU:2.3.0Keras:2.7.0

1.4實驗思路

針對目標檢測的任務(wù),可以分為兩個部分:目標識別和位置檢測。通常情況下,特征提取需要由特有的特征提取神經(jīng)網(wǎng)絡(luò)來完成,如VGG、MobileNet、ResNet等,這些特征提取網(wǎng)絡(luò)往往被稱為Backbone。而在BackBone后面接全連接層***(FC)***就可以執(zhí)行分類任務(wù)。但FC對目標的位置識別乏力。經(jīng)過算法的發(fā)展,當前主要以特定的功能網(wǎng)絡(luò)來代替FC的作用,如Mask-Rcnn、SSD、YOLO等。我們選擇充分使用已有的人臉檢測的模型,再訓練一個識別口罩的模型,從而提高訓練的開支、增強模型的準確率。

常規(guī)目標檢測:

本次案例:

圖1實驗口罩佩戴檢測流程

二實驗內(nèi)容

2.1已知文件與數(shù)據(jù)集

首先,導入已經(jīng)寫好的python文件并對數(shù)據(jù)集進行處理。

image文件夾:圖片分成兩類,戴口罩的和沒有戴口罩的train.txt:存放的是image文件夾下對應(yīng)圖片的標簽keras_model_data文件夾:存放keras框架相關(guān)預訓練好的模型

2.2圖片尺寸調(diào)整

將圖片尺寸調(diào)整到網(wǎng)絡(luò)輸入的圖片尺寸

2.3制作訓練時需要用到的批量數(shù)據(jù)集

圖片生成器的主要方法:

fit(x,augment=False,rounds=1):計算依賴于數(shù)據(jù)的變換所需要的統(tǒng)計信息(均值方差等)。flow(self,X,y,batch_size=32,shuffle=True,seed=None,save_to_dir=None,save_prefix=,save_format=png):接收Numpy數(shù)組和標簽為參數(shù),生成經(jīng)過數(shù)據(jù)提升或標準化后的batch數(shù)據(jù),并在一個無限循環(huán)中不斷的返回batch數(shù)據(jù)。flow_from_directory(directory):以文件夾路徑為參數(shù),會從路徑推測label,生成經(jīng)過數(shù)據(jù)提升/歸一化后的數(shù)據(jù),在一個無限循環(huán)中無限產(chǎn)生batch數(shù)據(jù)。

結(jié)果:

Found693imagesbelongingto2classes.

Found76imagesbelongingto2classes.

{mask:0,nomask:1}

{0:mask,1:nomask}

2.4調(diào)用MTCNN

通過搭建MTCNN網(wǎng)絡(luò)實現(xiàn)人臉檢測

keras_py/mtcnn.py文件是在搭建MTCNN網(wǎng)絡(luò)。keras_py/face_rec.py文件是在繪制人臉檢測的矩形框。

這里直接使用現(xiàn)有的表現(xiàn)較好的MTCNN的三個權(quán)重文件,它們已經(jīng)保存在datasets/5f680a696ec9b83bb0037081-momodel/data/keras_model_data文件夾下

2.5加載預訓練模型MobileNet

#加載MobileNet的預訓練模型權(quán)重

weights_path=basic_path+'keras_model_data/mobilenet_1_0_224_tf_no_top.h5'

2.6訓練模型

2.6.1加載和保存

為了避免訓練過程中遇到斷電等突發(fā)事件,導致模型訓練成果無法保存。我們可以通過ModelCheckpoint規(guī)定在固定迭代次數(shù)后保存模型。同時,我們設(shè)置在下一次重啟訓練時,會檢查是否有上次訓練好的模型,如果有,就先加載已有的模型權(quán)重。這樣就可以在上次訓練的基礎(chǔ)上繼續(xù)模型的訓練了。

2.6.2手動調(diào)整學習率

學習率的手動設(shè)置可以使模型訓練更加高效。這里我們設(shè)置當模型在三輪迭代后,準確率沒有上升,就調(diào)整學習率。

#學習率下降的方式,acc三次不下降就下降學習率繼續(xù)訓練

reduce_lr=ReduceLROnPlateau(

monitor='accuracy',#檢測的指標

factor=0.5,#當acc不下降時將學習率下調(diào)的比例

patience=3,#檢測輪數(shù)是每隔三輪

verbose=2#信息展示模式

)

2.6.3早停法

當我們訓練深度學習神經(jīng)網(wǎng)絡(luò)的時候通常希望能獲得最好的泛化性能。但是所有的標準深度學習神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)如全連接多層感知機都很容易過擬合。當網(wǎng)絡(luò)在訓練集上表現(xiàn)越來越好,錯誤率越來越低的時候,就極有可能出現(xiàn)了過擬合。早停法就是當我們在檢測到這一趨勢后,就停止訓練,這樣能避免繼續(xù)訓練導致過擬合的問題。

early_stopping=EarlyStopping(

monitor='val_accuracy',#檢測的指標

min_delta=0.0001,#增大或減小的閾值

patience=3,#檢測的輪數(shù)頻率

verbose=1#信息展示的模式

)

2.6.4亂序訓練數(shù)據(jù)

打亂txt的行,這個txt主要用于幫助讀取數(shù)據(jù)來訓練,打亂的數(shù)據(jù)更有利于訓練。

np.random.seed(10101)

np.random.shuffle(lines)

np.random.seed(None)

2.6.5訓練模型

一次訓練集大小設(shè)定為64,優(yōu)化器使用Adam,初始學習率設(shè)定為0.001,優(yōu)化目標為accuracy,總的學習輪次設(shè)定為20輪。(通過多次實驗測定,在這些參數(shù)條件下,準確率較高)

#一次的訓練集大小

batch_size=64

#編譯模型

pile(loss='binary_crossentropy',#二分類損失函數(shù)

optimizer=Adam(lr=0.001),#優(yōu)化器

metrics=['accuracy'])#優(yōu)化目標

#訓練模型

history=model.fit(train_generator,

epochs=20,#epochs:整數(shù),數(shù)據(jù)的迭代總輪數(shù)。

#一個epoch包含的步數(shù),通常應(yīng)該等于你的數(shù)據(jù)集的樣本數(shù)量除以批量大小。

steps_per_epoch=637//batch_size,

validation_data=test_generator,

validation_steps=70//batch_size,

initial_epoch=0,#整數(shù)。開始訓練的輪次(有助于恢復之前的訓練)。

callbacks=[checkpoint_period,reduce_lr])

三算法描述

3.1MTCNN

三階段的級聯(lián)(cascaded)架構(gòu)coarse-to-fine的方式newonlinehardsamplemining策略同時進行人臉檢測和人臉對齊state-of-the-art性能

圖2MTCNN架構(gòu)

3.2MobileNet

圖3MobileNet架構(gòu)

MobileNet的網(wǎng)絡(luò)結(jié)構(gòu)如圖3所示。首先是一個3x3的標準卷積,然后后面就是堆積depthwiseseparableconvolution,并且可以看到其中的部分depthwiseconvolution會通過strides=2進行downsampling。然后采用averagepooling將feature變成1x1,根據(jù)預測類別大小加上全連接層,最后是一個softmax層。

四求解結(jié)果

最終確定最佳取值為batch_size=64,lr=0.0001,epochs=20,其它參數(shù)如下,連續(xù)訓練兩次,可以獲得最佳結(jié)果。此處僅展示兩個參數(shù)條件下的結(jié)果作為對比

#一次的訓練集大小

batch_size=64

#編譯模型

pile(loss='binary_crossentropy',#二分類損失函數(shù)

optimizer=Adam(lr=0.001),#優(yōu)化器

metrics=['accuracy'])#優(yōu)化目標

#訓練模型

history=model.fit(train_generator,

epochs=20,#epochs:整數(shù),數(shù)據(jù)的迭代總輪數(shù)。

#一個epoch包含的步數(shù),通常應(yīng)該等于你的數(shù)據(jù)集的樣本數(shù)量除以批量大小。

steps_per_epoch=637//batch_size,

validation_data=test_generator,

validation_steps=70//batch_size,

initial_epoch=0,#整數(shù)。開始訓練的輪次(有助于恢復之前的訓練)。

callbacks=[checkpoint_period,reduce_lr])

條件1:取batch_size=48,lr=0.001,epochs=20,對訓練之后的模型進行測試,得到結(jié)果如下:

圖4條件1loss曲線

由loss曲線可以看出,隨著訓練迭代次數(shù)的加深,驗證集上的損失在逐漸的減小,最終穩(wěn)定在0.2左右;而在訓練集上loss始終在0附近。

圖5條件1acc曲線

從驗證集和測試集的準確率變化曲線上可以看出,隨著訓練輪次的增加,驗證集的準確率逐漸上升,最終穩(wěn)定在96%左右,效果還是不錯的。

圖6條件1測試樣例1

使用樣例照片進行測試,首先人臉識別部分順利識別到了五張人臉,但是口罩識別部分將一個沒有帶口罩的人識別成了帶著口罩的人,說明還有進步空間,實際錯誤率達到了20%。

圖7條件1測試樣例2

另一張樣例照片的測試結(jié)果同樣是人臉識別部分沒有出現(xiàn)問題,正確識別到了四張人臉,但是同樣將一個沒有帶口罩的人識別成了帶有口罩的人。

平臺測試:

后續(xù)通過調(diào)整各項參數(shù)并打亂測試集和訓練集圖片順序來進行了多次實驗,最終確定的最佳狀態(tài)如下:

條件2:取batch_size=64,lr=0.0001,epochs=20,對訓練之后的模型進行測試,得到結(jié)果如下:

圖8條件2loss曲線

觀察準確率曲線可以看出,在該條件下,驗證集上的準確率最終穩(wěn)定在98%附近,效果非常的好,說明我們做出的一些優(yōu)化還是具有一定效果的。

圖9條件2acc曲線

觀察此條件下的loss曲線可以看到最終驗證集的loss穩(wěn)定在0.2左右,訓練集的loss非常小,基本趨近于0

圖10條件2測試樣例1

使用兩張測試樣例對模型進行檢測,第一張圖片所有檢測點均正確,正確識別出了五張人臉并且口罩佩戴檢測均正確,識別正確率100%。

圖11條件2測試樣例2

第二章測試樣例上,正確識別出了4張人臉并且口罩佩戴檢測結(jié)果均正確。

兩張測試樣例上所有檢測點檢測結(jié)果均正確,說明在此參數(shù)條件下,模型識別效果較好,達到了口罩佩戴檢測的要求。

平臺測試:

條件3:

使用更多測試樣例發(fā)現(xiàn)MTCNN人臉識別部分存在不能正確識別人臉的問題,故通過多次實驗和測試,修改了mask_rec()的門限函數(shù)權(quán)重self.threshold,由原來的self.threshold=[0.5,0.6,0.8]修改為self.threshold=[0.4,0.15,0.65]

在本地使用更多自選圖片進行測試,發(fā)現(xiàn)人臉識別準確率有所提升。在條件2訓練參數(shù)不變的情況下,使用同一模型進行平臺測試,結(jié)果如下:

平臺測試成績有所提升。

條件4:

繼續(xù)調(diào)整mask_rec()的門限函數(shù)權(quán)重self.threshold,通過系統(tǒng)測試反饋來決定門限函數(shù)的權(quán)重,通過多次測試,由原來的self.threshold=[0.4,0.15,0.65]修改為self.threshold=[0.4,0.6,0.65]

平臺測試,結(jié)果如下:

平臺測試成績有所提升,達到95分。

為了達到條件4所展示的效果,對門限函數(shù)的數(shù)值進行了大量的嘗試,根據(jù)提交測試的反饋結(jié)果,最終確定數(shù)值為條件4時,可以達到最優(yōu)。由于不知道后臺測試圖片是什么且沒有反饋數(shù)據(jù),所以最終再次修改人臉識別的門限函數(shù)或者修改參數(shù)重新訓練口罩識別模型依舊沒有提升。

五比較分析

驗證集準確率測試樣例結(jié)果平臺成績條件196%7/977.5條件298%9/988.33333334條件398%9/990條件498%9/995

最終通過不斷調(diào)試與優(yōu)化算法,得到了95分的平臺成績。

六心得與感想

本次實驗過程中主要使用了keras方法進行訓練,由于初次使用這些方法,所以前期實現(xiàn)的過程相對困難。最初我想通過調(diào)用GPU資源來進行訓練,所以給自己的電腦配套安裝了tensorflow-gpu、CUDA等等配套的軟件和包,由于個人電腦的顯卡版本較老,所以安裝的過程也是非常的曲折。好在最終安裝好了所有的東西,但是由于顯卡顯存比較小,所以bath_size大小一直上不去,最大只能給到32,不過影響也不大。調(diào)整參數(shù)的過程花費了很多的時間,優(yōu)化算法也花費了很多的時間。之后又對門限函數(shù)進行了修改,雖然過程非常的辛苦,但最終的結(jié)果還是很不錯的,最終整體達到95分,在兩張給定的測試樣例上所有檢測點都是正確的,由于不知道平臺的五張檢測照片是什么,所以不知道到底出錯在哪里,希望之后平臺可以反饋一些修改意見~。總的來說在過程中收獲還是很大的,受益匪淺。

訓練源代碼:

importwarnings

#忽視警告

warnings.filterwarnings('ignore')

importos

importmatplotlib

importcv2ascv

importnumpyasnp

importmatplotlib.pyplotasplt

fromtensorflow.keras.callbacksimportModelCheckpoint,ReduceLROnPlateau,EarlyStopping

fromtensorflow.keras.applications.imagenet_utilsimportpreprocess_input

fromtensorflow.kerasimportbackendasK

fromtensorflow.keras.optimizersimportAdam

K.image_data_format()=='channels_last'

fromkeras_py.utilsimportget_random_data

fromkeras_py.face_recimportmask_rec

fromkeras_py.face_recimportface_rec

fromkeras_py.mobileNetimportMobileNet

fromtensorflow.keras.preprocessing.imageimportImageDataGenerator

#數(shù)據(jù)集路徑

basic_path="./datasets/5f680a696ec9b83bb0037081-momodel/data/"

defletterbox_image(image,size):#調(diào)整圖片尺寸,返回經(jīng)過調(diào)整的照片

new_image=cv.resize(image,size,interpolation=cv.INTER_AREA)

returnnew_image

read_img=cv.imread("test1.jpg")

print("調(diào)整前圖片的尺寸:",read_img.shape)

read_img=letterbox_image(image=read_img,size=(50,50))

print("調(diào)整前圖片的尺寸:",read_img.shape)

defprocessing_data(data_path,height,width,batch_size=32,test_split=0.1):#數(shù)據(jù)處理,batch_size默認大小為32

train_data=ImageDataGenerator(

#對圖片的每個像素值均乘上這個放縮因子,把像素值放縮到0和1之間有利于模型的收斂

rescale=1./255,

#浮點數(shù),剪切強度(逆時針方向的剪切變換角度)

shear_range=0.1,

#隨機縮放的幅度,若為浮點數(shù),則相當于[lower,upper]=[1-zoom_range,1+zoom_range]

zoom_range=0.1,

#浮點數(shù),圖片寬度的某個比例,數(shù)據(jù)提升時圖片水平偏移的幅度

width_shift_range=0.1,

#浮點數(shù),圖片高度的某個比例,數(shù)據(jù)提升時圖片豎直偏移的幅度

height_shift_range=0.1,

#布爾值,進行隨機水平翻轉(zhuǎn)

horizontal_flip=True,

#布爾值,進行隨機豎直翻轉(zhuǎn)

vertical_flip=True,

#在0和1之間浮動。用作驗證集的訓練數(shù)據(jù)的比例

validation_split=test_split

#接下來生成測試集,可以參考訓練集的寫法

test_data=ImageDataGenerator(

rescale=1./255,

validation_split=test_split)

train_generator=train_data.flow_from_directory(

#提供的路徑下面需要有子目錄

data_path,

#整數(shù)元組(height,width),默認:(256,256)。所有的圖像將被調(diào)整到的尺寸。

target_size=(height,width),

#一批數(shù)據(jù)的大小

batch_size=batch_size,

#"categorical","binary","sparse","input"或None之一。

#默認:"categorical",返回one-hot編碼標簽。

class_mode='categorical',

#數(shù)據(jù)子集("training"或"validation")

subset='training',

seed=0)

test_generator=test_data.flow_from_directory(

data_path,

target_size=(height,width),

batch_size=batch_size,

class_mode='categorical',

subset='validation',

seed=0)

returntrain_generator,test_generator

#數(shù)據(jù)路徑

data_path=basic_path+'image'

#圖像數(shù)據(jù)的行數(shù)和列數(shù)

height,width=160,160

#獲取訓練數(shù)據(jù)和驗證數(shù)據(jù)集

train_generator,test_generator=processing_data(data_path,height,width)

#通過屬性class_indices可獲得文件夾名與類的序號的對應(yīng)字典。

labels=train_generator.class_indices

print(labels)

#轉(zhuǎn)換為類的序號與文件夾名對應(yīng)的字典

labels=dict((v,k)fork,vinlabels.items())

print(labels)

pnet_path="./datasets/5f680a696ec9b83bb0037081-momodel/data/keras_model_data/pnet.h5"

rnet_path="./datasets/5f680a696ec9b83bb0037081-momodel/data/keras_model_data/rnet.h5"

onet_path="./datasets/5f680a696ec9b83bb0037081-momodel/data/keras_model_data/onet.h5"

#加載MobileNet的預訓練模型權(quán)重

weights_path=basic_path+'keras_model_data/mobilenet_1_0_224_tf_no_top.h5'

#圖像數(shù)據(jù)的行數(shù)和列數(shù)

height,width=160,160

model=MobileNet(input_shape=[height,width,3],classes=2)

model.load_weights(weights_path,by_name=True)

print('加載完成...')

defsave_model(model,checkpoint_save_path,model_dir):#保存模型

ifos.path.exists(checkpoint_save_path):

print("模型加載中")

model.load_weights(checkpoint_save_path)

print("模型加載完畢")

checkpoint_period=ModelCheckpoint(

#模型存儲路徑

model_dir+'ep{epoch:03d}-loss{loss:.3f}-val_loss{val_loss:.3f}.h5',

#檢測的指標

monitor='val_acc',

#‘a(chǎn)uto',‘min',‘max'中選擇

mode='max',

#是否只存儲模型權(quán)重

save_weights_only=False,

#是否只保存最優(yōu)的模型

save_best_only=True,

#檢測的輪數(shù)是每隔2輪

period=2

returncheckpoint_period

checkpoint_save_path="./results/last_one88.h5"

model_dir="./results/"

checkpoint_period=save_model(model,checkpoint_save_path,model_dir)

#學習率下降的方式,acc三次不下降就下降學習率繼續(xù)訓練

reduce_lr=ReduceLROnPlateau(

monitor='accuracy',#檢測的指標

factor

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論