智能圖像處理:Python和OpenCV實(shí)現(xiàn)-課件 13.6口罩佩戴的檢測_第1頁
智能圖像處理:Python和OpenCV實(shí)現(xiàn)-課件 13.6口罩佩戴的檢測_第2頁
智能圖像處理:Python和OpenCV實(shí)現(xiàn)-課件 13.6口罩佩戴的檢測_第3頁
智能圖像處理:Python和OpenCV實(shí)現(xiàn)-課件 13.6口罩佩戴的檢測_第4頁
智能圖像處理:Python和OpenCV實(shí)現(xiàn)-課件 13.6口罩佩戴的檢測_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

13.6口罩佩戴的檢測目錄CONTENT13.6.1

|口罩?jǐn)?shù)據(jù)集的采集與處理13.6.2

|數(shù)據(jù)集的劃分13.6.3

|數(shù)據(jù)集的訓(xùn)練13.6.4

|檢測是否佩戴口罩13.6.5

|視頻實(shí)時監(jiān)測口罩佩戴情況13.6.1

口罩?jǐn)?shù)據(jù)集的采集與處理13.6.1

|口罩?jǐn)?shù)據(jù)集的采集與處理1.口罩?jǐn)?shù)據(jù)的采集首先在網(wǎng)絡(luò)上獲取了大量的佩戴口罩的照片與沒有帶口罩的照片,然后對獲取的照片進(jìn)行了篩選,最終確定了4800張佩戴口罩的照片和5051張沒有佩戴口罩的照片。由于獲取的圖像大小,文件名不統(tǒng)一,所以需要對這些照片進(jìn)行預(yù)處理,大小重新調(diào)整為250*250,并給圖像規(guī)范命名,即將圖像命名為0.jpg、1.jpg、2.jpg、……的統(tǒng)一格式。建立了兩個文件夾,一個文件夾命名為have-mask,里面存放的是篩選完后的4800張佩戴口罩的照片,另一個文件夾命名為no-mask,里面存放的是5051張沒有佩戴口罩的照片。

運(yùn)行環(huán)境要包含tensorflow、keras以及dlib庫。安裝命令為pipinstalldlib==19.19.0,pipinstalltensorflow-gpu==2.3.1,pipinstallkeras==2.4.3。13.6.1

|口罩?jǐn)?shù)據(jù)集的采集與處理importosclassBatchRename():def__init__(self):#設(shè)置圖像文件的路徑

self.path='D:/ImagePP/Maskdetection/Maskdataset/train/have-mask'defrename(self):filelist=os.listdir(self.path)total_num=len(filelist)i=0foriteminfilelist:ifitem.endswith('.jpg'):src=os.path.join(os.path.abspath(self.path),item)dst=os.path.join(os.path.abspath(self.path),str(i)+'.jpg')try:os.rename(src,dst)print('converting%sto%s...'%(src,dst))i=i+1except:continueprint('total%dtorename&converted%djpgs'%(total_num,i))if__name__=='__main__’:rename=BatchRename()rename.rename()修改程序中的圖像文件路徑,分別以帶口罩(have-mask)和不帶口罩(no-mask)文件夾運(yùn)行程序,將have-mask與no-mask兩個文件夾中的圖像被重新命名為統(tǒng)一的格式。批量命名文件夾中的圖片文件13.6.1

|口罩?jǐn)?shù)據(jù)集的采集與處理2.圖像歸一化

由于收集到的這些圖像尺寸大小不一,所以需要再對圖像尺寸大小歸一化調(diào)整,得到分辨率為250*250大小的圖像。程序中用到的glob模塊是用來查找符合特定規(guī)則命名的文件名“路徑+文件名”,其功能是檢索路徑。13.6.1

|口罩?jǐn)?shù)據(jù)集的采集與處理圖片分辨率做歸一化調(diào)整fromPILimportImageimportos.pathimportglob

defconvertjpg(jpgfile,outdir,width=250,height=250):img=Image.open(jpgfile)try:new_img=img.resize((width,height),Image.BILINEAR)new_img.save(os.path.join(outdir,os.path.basename(jpgfile)))exceptExceptionase:print(e)

forjpgfileinglob.glob(r"D:/ImagePP/Maskdetection/Maskdataset/train/have-mask/*.jpg"):#讀取文件convertjpg(jpgfile,r"D:/ImagePP/Maskdetection/Maskdataset/train/have-mask1")#保存文件13.6.1

|口罩?jǐn)?shù)據(jù)集的采集與處理3.圖像增強(qiáng)對這些圖像再進(jìn)行一次增強(qiáng),獲得更多的圖像數(shù)據(jù)。對這些圖像使用七種變換,分別是左右變換、向左旋轉(zhuǎn)20°、向右旋轉(zhuǎn)20°、顏色增強(qiáng)、對比度增強(qiáng)、亮度增強(qiáng)和隨機(jī)顏色變換。13.6.1

|口罩?jǐn)?shù)據(jù)集的采集與處理對圖像做7種變換增強(qiáng)fromPILimportImagefromPILimportImageEnhanceimportosimportcv2importnumpyasnpdefflipLF(root_path,img_name):#左右翻轉(zhuǎn)圖像img=Image.open(os.path.join(root_path,img_name))filp_img=img.transpose(Image.FLIP_LEFT_RIGHT)returnfilp_imgdefrotation20(root_path,img_name):img=Image.open(os.path.join(root_path,img_name))rotation_img=img.rotate(20)#旋轉(zhuǎn)角度returnrotation_imgdefrotation340(root_path,img_name):img=Image.open(os.path.join(root_path,img_name))rotation_img=img.rotate(340)#旋轉(zhuǎn)角度returnrotation_img13.6.1

|口罩?jǐn)?shù)據(jù)集的采集與處理對圖像做7種變換增強(qiáng)defrandomColor(root_path,img_name):#隨機(jī)顏色image=Image.open(os.path.join(root_path,img_name))random_factor=np.random.randint(0,31)/10.#隨機(jī)因子#調(diào)整圖像的飽和度color_image=ImageEnhance.Color(image).enhance(random_factor)random_factor=np.random.randint(10,21)/10.#隨機(jī)因子#調(diào)整圖像的亮度brightness_image=ImageEnhance.Brightness(color_image).enhance(random_factor)random_factor=np.random.randint(10,21)/10.#隨機(jī)因子#調(diào)整圖像對比度contrast_image=ImageEnhance.Contrast(brightness_image).enhance(random_factor)random_factor=np.random.randint(0,31)/10.#隨機(jī)因子#調(diào)整圖像銳度returnImageEnhance.Sharpness(contrast_image).enhance(random_factor)defcontrastEnhancement(root_path,img_name):#對比度增強(qiáng)image=Image.open(os.path.join(root_path,img_name))enh_con=ImageEnhance.Contrast(image)contrast=1.5image_contrasted=enh_con.enhance(contrast)returnimage_contrasted13.6.1

|口罩?jǐn)?shù)據(jù)集的采集與處理對圖像做7種變換增強(qiáng)defbrightnessEnhancement(root_path,img_name):#亮度增強(qiáng)image=Image.open(os.path.join(root_path,img_name))enh_bri=ImageEnhance.Brightness(image)brightness=1.5image_brightened=enh_bri.enhance(brightness)returnimage_brighteneddefcolorEnhancement(root_path,img_name):#顏色增強(qiáng)image=Image.open(os.path.join(root_path,img_name))enh_col=ImageEnhance.Color(image)color=1.5image_colored=enh_col.enhance(color)returnimage_coloredimageDir="D:/ImagePP/Maskdetection/Maskdataset/train/have-mask1"#讀取圖像路徑文件夾saveDir="D:/ImagePP/Maskdetection/Maskdataset/train/have-mask2"#保存圖像路徑文件夾13.6.1

|口罩?jǐn)?shù)據(jù)集的采集與處理對圖像做7種變換增強(qiáng)fornameinos.listdir(imageDir):#原始圖像saveName=name[:-4]+"id.jpg"image=Image.open(os.path.join(imageDir,name))image.save(os.path.join(saveDir,saveName))#亮度增強(qiáng)saveName=name[:-4]+"bright.jpg"saveImage=brightnessEnhancement(imageDir,name)saveImage.save(os.path.join(saveDir,saveName))#左右變換saveName=name[:-4]+"l_r.jpg"saveImage=flipLF(imageDir,name)saveImage.save(os.path.join(saveDir,saveName))#左旋轉(zhuǎn)20saveName=name[:-4]+"ro20.jpg"saveImage=rotation20(imageDir,name)saveImage.save(os.path.join(saveDir,saveName))#右旋轉(zhuǎn)20saveName=name[:-4]+"ro340.jpg"saveImage=rotation340(imageDir,name)saveImage.save(os.path.join(saveDir,saveName))#顏色增強(qiáng)saveName=name[:-4]+"color.jpg"saveImage=colorEnhancement(imageDir,name)saveImage.save(os.path.join(saveDir,saveName))#隨機(jī)顏色saveName=name[:-4]+"random.jpg"saveImage=randomColor(imageDir,name)saveImage.save(os.path.join(saveDir,saveName))#對比度增強(qiáng)saveName=name[:-4]+"contrast.jpg"saveImage=contrastEnhancement(imageDir,name)saveImage.save(os.path.join(saveDir,saveName))13.6.1

|口罩?jǐn)?shù)據(jù)集的采集與處理對圖像做7種變換增強(qiáng)程序運(yùn)行得到有七種不同的效果圖像,如圖所示。這樣就擴(kuò)充了數(shù)據(jù)集,使得目前有戴口罩照片是4800*8=38400張照片,不戴口罩照片是5051*8=40408張照片。原圖像亮度增強(qiáng)右旋轉(zhuǎn)20°左右變換顏色增強(qiáng)隨機(jī)顏色左旋轉(zhuǎn)20°對比度增強(qiáng)13.6.2

數(shù)據(jù)集的劃分13.6.2

|數(shù)據(jù)集的劃分訓(xùn)練集訓(xùn)練集的作用是用來擬合模型,通過設(shè)置分類器的參數(shù),訓(xùn)練分類模型驗(yàn)證集驗(yàn)證集的作用是當(dāng)通過訓(xùn)練集訓(xùn)練出多個模型后,為了能找出效果的最佳模型,使用各個模型對驗(yàn)證集數(shù)據(jù)進(jìn)行預(yù)測,并記錄模型準(zhǔn)確率。選出效果最佳的模型所對應(yīng)的參數(shù),即用來調(diào)整模型參數(shù)測試集測試集通過訓(xùn)練集和驗(yàn)證集得出最優(yōu)模型后,使用測試集進(jìn)行模型預(yù)測。用來衡量該最優(yōu)模型的性能和分類能力。13.6.3

數(shù)據(jù)集的訓(xùn)練13.6.3

|數(shù)據(jù)集的訓(xùn)練訓(xùn)練過程可拆分成五部分20%40%60%構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)模型歸一化處理加載數(shù)據(jù)文件100%80%繪制訓(xùn)練集與驗(yàn)證集準(zhǔn)確率和損失率曲線訓(xùn)練模型并保存模型13.6.3|數(shù)據(jù)集的訓(xùn)練加載數(shù)據(jù)文件importkerasimportos,shutilfromkerasimportlayersfromkerasimportmodelsfromkerasimportoptimizersfromkeras.preprocessing.imageimportImageDataGeneratorimportmatplotlib.pyplotaspltfromkeras.preprocessingimportimageimporttensorflowastf#加載數(shù)據(jù)train_havemask_dir="D:/ImagePP/Maskdetection/Maskdataset/train/have-mask/"train_nomask_dir="D:/ImagePP/Maskdetection/Maskdataset/train/no-mask/"test_havemask_dir="D:/ImagePP/Maskdetection/Maskdataset/test/have-mask/"test_nomask_dir="D:/ImagePP/Maskdetection/Maskdataset/test/no-mask/"validation_havemask_dir="D:/ImagePP/Maskdetection/Maskdataset/validation/have-mask/"validation_nomask_dir="D:/ImagePP/Maskdetection/Maskdataset/validation/no-mask/"train_dir="D:/ImagePP/Maskdetection/Maskdataset/train/"test_dir="D:/ImagePP/Maskdetection/Maskdataset/test/"validation_dir="D:/ImagePP/Maskdetection/Maskdataset/validation/"13.6.3|數(shù)據(jù)集的訓(xùn)練構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)模型#創(chuàng)建模型model=models.Sequential()model.add(layers.Conv2D(32,(3,3),activation='relu',input_shape=(224,224,3)))model.add(layers.MaxPooling2D((2,2)))model.add(layers.Conv2D(64,(3,3),activation='relu'))model.add(layers.MaxPooling2D((2,2)))model.add(layers.Conv2D(128,(3,3),activation='relu'))model.add(layers.MaxPooling2D((2,2)))model.add(layers.Conv2D(128,(3,3),activation='relu'))model.add(layers.MaxPooling2D((2,2)))model.add(layers.Flatten())model.add(layers.Dense(512,activation='relu'))model.add(layers.Dense(1,activation='sigmoid'))model.summary()pile(loss='binary_crossentropy',optimizer=optimizers.RMSprop(lr=1e-4),metrics=['acc'])13.6.3|數(shù)據(jù)集的訓(xùn)練歸一化處理#歸一化處理train_datagen=ImageDataGenerator(rescale=1./255)validation_datagen=ImageDataGenerator(rescale=1./255)test_datagen=ImageDataGenerator(rescale=1./255)train_generator=train_datagen.flow_from_directory(#目標(biāo)文件目錄train_dir,#所有圖像的size必須是224x224target_size=(224,224),batch_size=100,#Sinceweusebinary_crossentropyloss,weneedbinarylabelsclass_mode='binary')validation_generator=test_datagen.flow_from_directory(validation_dir,target_size=(224,224),batch_size=100,class_mode='binary')test_generator=test_datagen.flow_from_directory(test_dir,target_size=(224,224),batch_size=100,class_mode='binary')fordata_batch,labels_batchintrain_generator:print('databatchshape:',data_batch.shape)print('labelsbatchshape:',labels_batch)break13.6.3|數(shù)據(jù)集的訓(xùn)練訓(xùn)練并保存模型history=model.fit_generator(train_generator,steps_per_epoch=300,epochs=10,validation_data=validation_generator,validation_steps=300)#保存模型model.save('D:/ImagePP/Maskdetection/Maskdataset/model/mask.h5')13.6.3|數(shù)據(jù)集的訓(xùn)練繪制訓(xùn)練集與驗(yàn)證集準(zhǔn)確率和損失率曲線acc=history.history['acc']val_acc=history.history['val_acc']loss=history.history['loss']val_loss=history.history['val_loss']epochs=range(len(acc))plt.plot(epochs,acc,'bo',label='Trainingacc')plt.plot(epochs,val_acc,'b',label='Validationacc')plt.title('Trainingandvalidationaccuracy')plt.legend()plt.figure()plt.plot(epochs,loss,'bo',label='Trainingloss')plt.plot(epochs,val_loss,'b',label='Validationloss')plt.title('Trainingandvalidationloss')plt.legend()plt.show()13.6.3|數(shù)據(jù)集的訓(xùn)練繪制訓(xùn)練集與驗(yàn)證集準(zhǔn)確率和損失率曲線準(zhǔn)確度損失率13.6.4

檢測是否佩戴口罩13.6.4|檢測是否佩戴口罩對單張圖像進(jìn)行判斷importcv2fromkeras.preprocessingimportimagefromkeras.modelsimportload_modelimportnumpyasnp#加載神經(jīng)網(wǎng)絡(luò)模型model=load_model('D:/face-recognition/train2/train4/model/mask1.h5')img_path='D:/pythonpicture/lena.jpg'#口罩佩戴檢測圖像img=image.load_img(img_path,target_size=(224,224))img_tensor=image.img_to_array(img)/255.0img_tensor=np.expand_dims(img_tensor,axis=0)prediction=model.predict(img_tensor)print('口罩佩戴可能性:',prediction)ifprediction[0][0]>0.5:result='未戴口罩'else:result='戴口罩'print('結(jié)論:',result)運(yùn)行程序,分別用兩個圖像驗(yàn)證,一個未帶口罩,一個是帶口罩,檢測結(jié)果如圖13-23所示,(a)口罩佩戴可能性:12.330198287963867%,結(jié)論:未戴口罩;(b)口罩佩戴可能性:99.9907610254013%,結(jié)論:戴口罩。(a)未戴口罩(b)戴口罩13.6.5視頻實(shí)時監(jiān)測口罩佩戴情況13.6.5

|視頻實(shí)時監(jiān)測口罩佩戴情況importcv2fromkeras.preprocessingimportimagefromkeras.modelsimportload_modelimportnumpyasnpimportdlibfromPILimportImagemodel=load_model('D:/ImagePP/Maskdetection/Maskdataset/model/mask.h5')detector=dlib.get_frontal_face_detector()#檢測視頻中的人臉video=cv2.VideoCapture('D:/pics/video/P02.avi')13.6.5

|視頻實(shí)時監(jiān)測口罩佩戴情

溫馨提示

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

評論

0/150

提交評論