智能图像处理:Python和OpenCV实现-课件 13.6口罩佩戴的检测_第1页
智能图像处理:Python和OpenCV实现-课件 13.6口罩佩戴的检测_第2页
智能图像处理:Python和OpenCV实现-课件 13.6口罩佩戴的检测_第3页
智能图像处理:Python和OpenCV实现-课件 13.6口罩佩戴的检测_第4页
智能图像处理:Python和OpenCV实现-课件 13.6口罩佩戴的检测_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

13.6口罩佩戴的检测目录CONTENT13.6.1

|口罩数据集的采集与处理13.6.2

|数据集的划分13.6.3

|数据集的训练13.6.4

|检测是否佩戴口罩13.6.5

|视频实时监测口罩佩戴情况13.6.1

口罩数据集的采集与处理13.6.1

|口罩数据集的采集与处理1.口罩数据的采集首先在网络上获取了大量的佩戴口罩的照片与没有带口罩的照片,然后对获取的照片进行了筛选,最终确定了4800张佩戴口罩的照片和5051张没有佩戴口罩的照片。由于获取的图像大小,文件名不统一,所以需要对这些照片进行预处理,大小重新调整为250*250,并给图像规范命名,即将图像命名为0.jpg、1.jpg、2.jpg、……的统一格式。建立了两个文件夹,一个文件夹命名为have-mask,里面存放的是筛选完后的4800张佩戴口罩的照片,另一个文件夹命名为no-mask,里面存放的是5051张没有佩戴口罩的照片。

运行环境要包含tensorflow、keras以及dlib库。安装命令为pipinstalldlib==19.19.0,pipinstalltensorflow-gpu==2.3.1,pipinstallkeras==2.4.3。13.6.1

|口罩数据集的采集与处理importosclassBatchRename():def__init__(self):#设置图像文件的路径

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)文件夹运行程序,将have-mask与no-mask两个文件夹中的图像被重新命名为统一的格式。批量命名文件夹中的图片文件13.6.1

|口罩数据集的采集与处理2.图像归一化

由于收集到的这些图像尺寸大小不一,所以需要再对图像尺寸大小归一化调整,得到分辨率为250*250大小的图像。程序中用到的glob模块是用来查找符合特定规则命名的文件名“路径+文件名”,其功能是检索路径。13.6.1

|口罩数据集的采集与处理图片分辨率做归一化调整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

|口罩数据集的采集与处理3.图像增强对这些图像再进行一次增强,获得更多的图像数据。对这些图像使用七种变换,分别是左右变换、向左旋转20°、向右旋转20°、颜色增强、对比度增强、亮度增强和随机颜色变换。13.6.1

|口罩数据集的采集与处理对图像做7种变换增强fromPILimportImagefromPILimportImageEnhanceimportosimportcv2importnumpyasnpdefflipLF(root_path,img_name):#左右翻转图像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)#旋转角度returnrotation_imgdefrotation340(root_path,img_name):img=Image.open(os.path.join(root_path,img_name))rotation_img=img.rotate(340)#旋转角度returnrotation_img13.6.1

|口罩数据集的采集与处理对图像做7种变换增强defrandomColor(root_path,img_name):#随机颜色image=Image.open(os.path.join(root_path,img_name))random_factor=np.random.randint(0,31)/10.#随机因子#调整图像的饱和度color_image=ImageEnhance.Color(image).enhance(random_factor)random_factor=np.random.randint(10,21)/10.#随机因子#调整图像的亮度brightness_image=ImageEnhance.Brightness(color_image).enhance(random_factor)random_factor=np.random.randint(10,21)/10.#随机因子#调整图像对比度contrast_image=ImageEnhance.Contrast(brightness_image).enhance(random_factor)random_factor=np.random.randint(0,31)/10.#随机因子#调整图像锐度returnImageEnhance.Sharpness(contrast_image).enhance(random_factor)defcontrastEnhancement(root_path,img_name):#对比度增强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

|口罩数据集的采集与处理对图像做7种变换增强defbrightnessEnhancement(root_path,img_name):#亮度增强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):#颜色增强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

|口罩数据集的采集与处理对图像做7种变换增强fornameinos.listdir(imageDir):#原始图像saveName=name[:-4]+"id.jpg"image=Image.open(os.path.join(imageDir,name))image.save(os.path.join(saveDir,saveName))#亮度增强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))#左旋转20saveName=name[:-4]+"ro20.jpg"saveImage=rotation20(imageDir,name)saveImage.save(os.path.join(saveDir,saveName))#右旋转20saveName=name[:-4]+"ro340.jpg"saveImage=rotation340(imageDir,name)saveImage.save(os.path.join(saveDir,saveName))#颜色增强saveName=name[:-4]+"color.jpg"saveImage=colorEnhancement(imageDir,name)saveImage.save(os.path.join(saveDir,saveName))#随机颜色saveName=name[:-4]+"random.jpg"saveImage=randomColor(imageDir,name)saveImage.save(os.path.join(saveDir,saveName))#对比度增强saveName=name[:-4]+"contrast.jpg"saveImage=contrastEnhancement(imageDir,name)saveImage.save(os.path.join(saveDir,saveName))13.6.1

|口罩数据集的采集与处理对图像做7种变换增强程序运行得到有七种不同的效果图像,如图所示。这样就扩充了数据集,使得目前有戴口罩照片是4800*8=38400张照片,不戴口罩照片是5051*8=40408张照片。原图像亮度增强右旋转20°左右变换颜色增强随机颜色左旋转20°对比度增强13.6.2

数据集的划分13.6.2

|数据集的划分训练集训练集的作用是用来拟合模型,通过设置分类器的参数,训练分类模型验证集验证集的作用是当通过训练集训练出多个模型后,为了能找出效果的最佳模型,使用各个模型对验证集数据进行预测,并记录模型准确率。选出效果最佳的模型所对应的参数,即用来调整模型参数测试集测试集通过训练集和验证集得出最优模型后,使用测试集进行模型预测。用来衡量该最优模型的性能和分类能力。13.6.3

数据集的训练13.6.3

|数据集的训练训练过程可拆分成五部分20%40%60%构建卷积神经网络模型归一化处理加载数据文件100%80%绘制训练集与验证集准确率和损失率曲线训练模型并保存模型13.6.3|数据集的训练加载数据文件importkerasimportos,shutilfromkerasimportlayersfromkerasimportmodelsfromkerasimportoptimizersfromkeras.preprocessing.imageimportImageDataGeneratorimportmatplotlib.pyplotaspltfromkeras.preprocessingimportimageimporttensorflowastf#加载数据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|数据集的训练构建卷积神经网络模型#创建模型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|数据集的训练归一化处理#归一化处理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(#目标文件目录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|数据集的训练训练并保存模型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|数据集的训练绘制训练集与验证集准确率和损失率曲线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|数据集的训练绘制训练集与验证集准确率和损失率曲线准确度损失率13.6.4

检测是否佩戴口罩13.6.4|检测是否佩戴口罩对单张图像进行判断importcv2fromkeras.preprocessingimportimagefromkeras.modelsimportload_modelimportnumpyasnp#加载神经网络模型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('结论:',result)运行程序,分别用两个图像验证,一个未带口罩,一个是带口罩,检测结果如图13-23所示,(a)口罩佩戴可能性:12.330198287963867%,结论:未戴口罩;(b)口罩佩戴可能性:99.9907610254013%,结论:戴口罩。(a)未戴口罩(b)戴口罩13.6.5视频实时监测口罩佩戴情况13.6.5

|视频实时监测口罩佩戴情况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

|视频实时监测口罩佩戴情

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论