版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
7-3刷脸结算实验手册4.1项目目标本项目是完成一个简单的学校食堂刷脸结算系统的设计开发,实现刷脸结算功能中的用户人脸注册登记,与人脸动态识别功能。通过本项目:(1)掌握如何实现人脸采集;(2)掌握如何实现人脸检测;(3)掌握如何实现视觉数据预处理;(4)了解如何构建深度神经网络,并完成模型训练评估;(5)了解如何实现动态人脸识别及识别结果可视化。4.2任务一:人脸采集通过上一节知识技能的学习,我们掌握了应用OpenCV实现图像视频的基本操作技能,现在我们就利用该知识技能来实现食堂用户人脸采集注册。步骤一:创建工程,建立人脸存储文件夹创建工程文件夹“FaceRecognition”,在文件夹下新建Python3脚本文件,重命名为“DataGet”。导入必要的模块,在工作路径下,创建存储人脸文件的文件夹“face_img”,输入以下代码,并运行之后,查看文件夹是否创建成功。#导入必要的模块importcv2importos#创建路径用于存储人脸图片path='./face_img'ifnotos.path.exists(path):os.mkdir(path) 步骤二:打开摄像头,抓拍人脸输入以下代码,并运行之后,出现“请输入ID号”对话框,在对话框中输入待注册用户的唯一编码(如工号、学号),回车后,摄像头启动,开始进入人脸采集界面,通过按键盘“s”键,进行人脸图片抓拍,建议抓拍100张以上,脸部角度、表情尽量丰富。也可以尝试修改代码,进行定时抓拍。 cam=cv2.VideoCapture(0)num=1name_id=input("请输入id:")whilecam:ret,img=cam.read()#转换为灰度图像加快运算速度gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)cv2.imshow('IMG',gray)flag=cv2.waitKey(1)ifflag==ord('q'):breakifflag==ord('s'):#点一次s拍一张照片#保存灰度照片,先在工作路径下手动创建face_img文件夹cv2.imwrite(r"./face_img/user_%s_%s.jpg"%(name_id,num),gray)num+=1cam.release()#释放摄像头cv2.destroyAllWindows()#退出窗口 采集后我看到在“./face_img”文件夹下增加了以用户ID号命名的子文件夹,如图7-11所示。图7-11人脸采集结果4.3任务二:人脸检测针对食堂刷脸结算的目的,我们只需要关注人脸部分,采集到的其他部位则没有必要参与运算,因此需要对人脸做ROI(RegionofInterest感兴趣区域提取)。要实现对人脸区域的图像信息的提取,则首先需要完成人脸检测。通过上一节知识技能的学习,我们了解了用Haar算法实现人脸检测的原理。本项目我们就来应用OpenCV的Haar级联分类器实现人脸检测。OpenCV的Haar级联分类器为“haarcascade_frontalface_default.xml”,可以扫描二维码“项目工程包”中获得。在工程文件夹“FaceRecognition”下,新建Python3脚本文件,重命名为“FaceDetect”,在该脚本文件下,完成本任务代码编写。步骤一:导入OpenCV,加载分类器导入必要的模块,加载OpenCV级联分类器,创建存放脸部区域小图片的文件夹。importcv2importos#加载正面人脸检测分类器face_clf=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')步骤二:截取人脸部分图像获取任务一所采集的人脸大图文件,遍历每个用户的每张大图,检测人脸,并截取所检测到的人脸局部图像,统一尺寸后存储。本项目将人脸小图的分辨率统一为160*160,统一尺寸的目的是方便后续输入模型进行训练。#大图存储路径path_big='./face_img/'#小图存储路径path_small='./small_face'#文件夹列表(多少个用户注册就有多少个文件夹)foldlist=os.listdir(path_big)#遍历每个文件夹forfoldnameinfoldlist:#大图读取路径path_big_sub=os.path.join(path_big,foldname)filenamelist=os.listdir(path_big_sub)print(filenamelist)#小图存放路径#创建路径用于存储人脸图片path_small_sub=os.path.join(path_small,foldname)ifnotos.path.exists(path_small_sub):os.makedirs(path_small_sub)#遍历大图片,检测人脸,截取人脸小图,统一尺寸,并存储forfileinfilenamelist:#文件名加路径file_path=os.path.join(path_big_sub,file)img=cv2.imread(file_path,1)#检测人脸faces=face_clf.detectMultiScale(img,1.3,5)#根据返回绘制人脸矩形框forx,y,w,hinfaces:#脸部区域提取,注意坐标顺序roi=img[y:y+h,x:x+w]#小图片文件名face_img_name=os.path.join(path_small_sub,file)roi=cv2.resize(roi,(160,160))#存储小图片cv2.imwrite(face_img_name,roi)#显示脸部信息提取结果cv2.imshow('ROI',roi)k=cv2.waitKey(1)ifk==ord('q'):breakcv2.destroyAllWindows() 运行以上代码后,可以在工程路径下看到新建的“small_face”文件夹与以用户ID号命名的子文件夹,子文件夹中存储了该用户的脸部小图,效果如图7-12所示。图7-12人脸检测截取结果4.4任务三:数据预处理在工程文件夹“FaceRecognition”下,新建Python3脚本文件,重命名为“FaceReco”,在该脚本文件下,完成任务三到任务六。步骤一:读取图像数据及标签读取任务一所采集的人脸图像及标注信息,在这里标注信息即为每个用户ID,即图7-12中所示的子文件夹名称。#人脸图像读入列表X=[]#标签读入列表Y=[]#人脸小图存储路径path_small='./small_face'#文件夹列表foldlist=os.listdir(path_small)#注册用户数量(多少个用户注册就有多少个文件夹)num_classes=len(foldlist)#遍历每个文件夹forfoldnameinfoldlist:#获取子文件夹列表path_small_sub=os.path.join(path_small,foldname)filenamelist=os.listdir(path_small_sub)#遍历小图片,读入到X中,将标签同步计入Y中forfileinfilenamelist:file_path=os.path.join(path_small_sub,file)img=cv2.imread(file_path,cv2.IMREAD_GRAYSCALE)X.append(img)Y.append(foldname)#文件夹名称即客户ID(注册录入时输入客户ID,作为文件夹名字)步骤二:标签独热编码,切分训练集与测试集为了满足模型训练的输入要求,需要将分类标签信息进行独热编码。前面我们所采集的数据集是以用户ID字符串作为分类标签,需要将标签数字化编码。数字化编码后进一步将标签数据独热编码。一般在模型训练时,需要把数据集随机切分为训练集合测试集,以方便模型验证评估。这里我们按照训练集与测试集按照80%与20%的占比切分。#转换为numpy数组形式X=np.asarray(X)X=X.reshape(len(X),X.shape[1],X.shape[2],1)Y=np.asarray(Y)print('X:全部人脸小图数据:',X.shape)print('Y:全部人脸小图标签:',Y.shape)#对类别进行数值化处理le=preprocessing.LabelEncoder()Y_num=le.fit_transform(Y)#按照学号、工号对结果编码#独热编码Y_onehot=keras.utils.to_categorical(Y_num,num_classes)#数据切分为测试集和训练集x_train,x_test,y_train,y_test=train_test_split(X,Y_onehot,test_size=0.2)print('x_train:训练集人脸小图数据:',x_train.shape)print('y_train:训练集人脸小图标签:',y_train.shape)print('x_test:训练集人脸小图数据:',x_test.shape)print('y_test:训练集人脸小图标签:',y_test.shape)完成数据预处理后,我们可以将训练集图像与标签打印查看数据格式,如图7-13所示。在本例中采集了两名用户的人脸信息,共检测截取355张人脸小图,每张人脸小图的尺寸为160*160。进行训练集与测试集切分后,训练集为284张,测试集为71张图像及标签。图7-13数据集切分前后的存储格式4.5任务四:构建模型要实现食堂刷脸结算,我们就需要能够分辨用户是谁,且需要通过刷脸结算设备动态完成刷脸。这就需要我们完成动态人脸识别。我们在上节知识金额中已经了解了人脸识别的常见方法及原理。目前实现动态人脸识别相对实现效果较好是卷积神经网络。以下我们就应用卷积神经网络来完成动态人脸识别。步骤一:导入必要的模块导入所需的模块,通过TensorFlow导入Keras包含的网络构建、优化器、数据集、序列化模型等模块:#导入相关模块importosimportcv2importnumpyasnpimportpandasaspdimporttensorflowastffromtensorflowimportkerasfromtensorflow.kerasimportlayers,optimizers,datasets,Sequentialfromtensorflow.keras.layersimportConv2D,Activation,MaxPooling2D,Dropout,Flatten,Densefromsklearnimportpreprocessingfromsklearn.model_selectionimporttrain_test_split步骤二:构建动态人脸识别卷积神经网络定义模型构建函数“CNN_classification_model”,在函数汇总实例化模型,并逐层添加卷积、池化层、与Dropout层。卷积层(Conv2D)和池化层(MaxPool2D)作用我们在知识技能中已经学,Dropout层的目的主要是为了防止训练过拟合。#构建卷积神经网络defCNN_classification_model(input_shape,drop_rate,output_size):#实例化模型model=tf.keras.models.Sequential()#添加第一层卷积层model.add(tf.keras.layers.Conv2D(32,(3,3),input_shape=input_shape,padding='SAME'))#2*2池化层model.add(tf.keras.layers.MaxPool2D((2,2),padding='SAME'))#增加dropout层,避免过拟合model.add(tf.keras.layers.Dropout(drop_rate))#添加第二层卷积层model.add(tf.keras.layers.Conv2D(64,(3,3),padding='SAME'))#2*2池化层model.add(tf.keras.layers.MaxPool2D((2,2),padding='SAME'))#增加dropout层,避免过拟合model.add(tf.keras.layers.Dropout(drop_rate))#添加第三层卷积层model.add(tf.keras.layers.Conv2D(64,(3,3),padding='SAME'))#2*2池化层model.add(tf.keras.layers.MaxPool2D((2,2),padding='SAME'))#增加dropout层,避免过拟合model.add(tf.keras.layers.Dropout(drop_rate))#添加全连接深度神经网络层#展平model.add(tf.keras.layers.Flatten())#第一层全连接层model.add(tf.keras.layers.Dense(512))#droupout层model.add(tf.keras.layers.Dropout(drop_rate))#输出层,需要识别的用户个数就是output_sizemodel.add(tf.keras.layers.Dense(output_size,activation='softmax'))#编译模型pile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])returnmodel4.6任务五:训练评估模型在工程文件夹“FaceRecognition”下,新建Python3脚本文件,重命名为“FaceDetect”,在该脚本文件下,完成本任务代码编写。步骤一:初始化模型参数,加载模型在任务四中我们定义了神经网络构建函数,现在我们需要实例化一个网络模型。我们在前面数据采集时统一将人脸小图的尺寸调整为160*160,因此网络输入变量形状为(160,160,1)。前面构建网络时我们增加了Dropout层,在这里需要输入比例参数,这里我们设置为0.5。代码中的output_size是网络输出数,注册N个用用户就设置为N。#实例化网络input_shape=(160,160,1)drop_rate=0.5output_size=2#注册用户的数量model=CNN_classification_model(input_shape,drop_rate,output_size)model.summary()#网络摘要信息上面代码中我们最后输出了网络概要信息,如图7-14所示,主要描述了各层网络的数出形状与参数个数等信息。图7-14网络概要信息步骤二:模型训练、评估与存储数据准备就绪,网络已经加载完成,现在就可以开始训练模型了。在模型训练函数model.fit中,x_train为训练集图像数据,y_train为训练集标签数据。epochs=30表示训练30轮,可以根据实际情况适当调整。verbose表示训练过程可视化的显示方式,对训练结果影响不大。validation_split=0.2指本轮训练中,留出20%的数据不参与训练,用于本轮结束时自动验证计算损失值和精度。注意与前面数据集切分训练集测试集的使用阶段和目的不同。完成模型训练后,可以用model.evaluate函数进行评估,此时我们就可以用任务三数据预处理中所切分留出的测试集数据x_test,y_test进行模型评估。如果评估结果不满意还可以通过尝试调整训练参数重新训练,直到满意为止。如果现有数据集调参效果不明显,则可以考虑将所采集的图像进行图像增广,提升模型的泛化能力。#模型训练model.fit(x_train,y_train,epochs=30,verbose=1,validation_split=0.2)#模型评估metrics=model.evaluate(x_test,y_test,verbose=0)print(metrics)#模型存储model.save_weights('./faceReco_weights.h5')model.save('./final_faceReco.h5')档模型效果满足要求时,就可以存储模型,模型存储“final_faceReco.h5”或“faceReco_weights.h5”文件的形成,存放于工程路径下。以上代码中我们逐一到分别用model.save和model.save_weights两种形式保存了模型。其中,model.save保存了完整的模型结构和参数信息,文件较大,但是调用简单;而model.save_weights只保存模型的参数,文件较小,但是调用时需要重新描述模型结构,再加载参数,相对比较复杂。4.7任务六:动态人脸识别动态人脸识别指的是不需要停驻等待,你只要出现在一定识别范围内,无论你是行走还是停立,系统就会自动进行识别,动态人脸识别。当我们在食堂打完饭菜,需要结账时,我们需要站在刷脸结算终端设备的摄像头前。步骤一:建立识别结果与用户信息的关联由于识别结果并不直接反映用户信息,我们需要实现识别结果与用户信息的关联,这里我们先定义user_Info_get函数实现关联功能。实际一个食堂刷脸结算系统中,用户的注册信息、账户信息需要存储于数据库中管理,但篇幅有限,且重点不在此,此处用y_dic字典结构简单表示。#根据识别结果获取用户ID(工号/学号)defuser_Info_get(y_pre):#用户信息y_dic={0:{'ID':'12002','余额':85,'消费':15},1:{'ID':'12009','余额':84,'消费':16}}#输出格式转换y_pre_num=[]y_user_Info=[]#预测结果转换为用户编号foriinrange(len(y_pre)):y_pre_num.append(y_pre[i].argmax())#预测结果转换为用户信息foriinrange(len(y_pre_num)):temp=y_dic[y_pre_num[i]]y_user_Info.append(temp)returny_user_Info步骤一:定义中文显示函数由于OpenCV不支持中文显示,需要应用PIL库中的Image、ImageFont、ImageDraw模块实现中文显示。#定义中文显示函数fromPILimportImage,ImageFont,ImageDrawdefdraw_chinese(img,text,pos):img_pil=Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))#色彩通道转换为RGBfont=ImageFont.truetype(font='msyh.ttc',size=20)draw=ImageDraw.Draw(img_pil)draw.text(pos,text,font=font,fill=(255,0,0))#红色RGB=(255,0,0)img_cv=np.array(img_pil)img=cv2.cvtColor(img_cv,cv2.COLOR_RGB2BGR)#色彩通道转换回RGBreturnimg步骤二:动态人脸识别与可视化在食堂刷脸结算的应用场景中,当用户人脸出现在刷脸结算设备摄像头中时,可以实时检测并完成动态人脸识别,关联用户信息后,再根据项目6中的菜品识别得到的消费数据进行扣费。这里,动态人脸检测依然采用数据采集中的Haar人脸检测方法。摄像头的操作技能我们在知识技能中已经学习掌握。人脸动态识别中,我们直接调用任务五中训练好的模型进行识别。cam=cv2.VideoCapture(0)#加载人脸检测分类器face_cascade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')#加载人脸识别模型new_model=tf.keras.models.load_model('final_faceReco.h5')whileTrue:ret,img=cam.read()gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转灰度faces=face_cascade.detectMultiScale(gray,1.2,5)#人脸检测iflen(faces)>1:#过滤多张人脸,避免误触发continueforx,y,w,hinfaces:#在原图中画出人脸矩形框img=cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)#人脸部分截取roi=gray[y:y+h,x:x+w]#模型要求图像尺寸为160*160roi=cv2.resize(roi,(160,160))#输入图像四维化,满足模型要求roi=roi.reshape(-1,160,160,1)#识别y_pre_s=new_model.predict(roi)#预测结果转换为用户工号/学号y_user_Info=user_Info_get(y_pre_s)img=draw_chinese(img,'工号/学号:'+str(y_user_Info[0]['ID']),(x,y-70))img=draw_chinese(img,'消费:'+str(y_user_Info[0]['消费'])+'元',(x,y-50))img=draw_chinese(img,'余额:'+str(y_user_Info[0]['余额'])+'元',(x,y-30))cv2.imshow('person',img)flag=cv2.waitKey(1)ifflag==ord('q'):breakcam.release()cv2.destroyAllWindows()执行结果如图7-15所示:图7-15识别结果项目总结:本项目应用Haar算法实现人脸检测采集,应用Keras构建神经网络,实现人脸动态识别。完成了食堂刷脸结算的中最核心的动态人脸识别功能。通过该项目实践体验,读者可以了解计算机视觉应用开发的一般流程,掌握人脸检测、人脸识别的基础原理与基本技能。读者完成项目实训后,可以进一步对代码进行模块化整理,尝试将比较独立的功能封装为函数或类的形式。
项目总结报告项目名称姓名学号小组名称(适合小组项目)实施过程记录测试结果总结后期改进思考成员分工(适合小组项目)姓名职责完成情况组长评分考核评价评价标准:1.执行力:按时完成项目任务。2.学习力:知识技能的掌握情况。3.表达力:实施报告详实、条理清晰。4.创新力:在完成基本任务之外,有创新、有突破者加分。5.协作力:团队分工合理、协作良好,组员得分在项目组得分基础上根据组长评价上下浮动。项目7技能代码包实验手册3.5摄像头控制方法当我们打好饭菜,走近食堂刷脸结算设备时,摄像头会实时捕捉到我们的人脸,回传到服务器或云端进行识别。因此,我们需要先掌握如何控制摄像头,以下我们通过一个简单的任务进行练习。【任务练习】打开摄像头,将摄像头捕捉到的画面显示在屏幕上,并抓拍图片保存到工作路径的“data”文件夹中。步骤一:打开摄像头创建摄像头对象,打开摄像头并捕捉一帧数据。importcv2capture=cv2.VideoCapture(0)#创建一个摄像头对象ret,frame=capture.read()#获取一帧capture.release()#释放摄像头步骤二:捕捉并显示图像实时显示摄像头捕捉的图像数据,在上面代码基础上,增加循环功能,使持续显示摄像头捕捉到的图像。需要特别注意的是,摄像头打开后,需要用capture.release()退出,否则摄像头将一直被占用。importcv2capture=cv2.VideoCapture(0)#创建一个摄像头对象capturenum=0while(True):ret,frame=capture.read()#获取一帧cv2.imshow('frame',frame)flag=cv2.waitKey(1)ifflag==ord('q'):#‘q’键退出breakcapture.release()cv2.destroyAllWindows()步骤三:创建图像存储路径:导入os模块,在工作路径下创建文件夹‘data’,用来保存抓拍的图片。输入以下代码,并运行后,确认文件夹data是否成功创建。importos#导入os模块path='./data'#工作路径下,创建data文件夹ifnotos.path.exists(path):#避免反复创建报错os.mkdir(path)#创建路径data步骤四:抓拍并保存图片:修改前面步骤代码,增加抓拍代码如下。importcv2capture=cv2.VideoCapture(0)#创建一个摄像头对象num=0while(True):ret,frame=capture.read()#获取一帧cv2.imshow('frame',frame)flag=cv2.waitKey(1)#等待1msifflag==ord('q'):#‘q’键退出breakifflag==ord('s'):#点一次s保存一张图片#写入图片,文件名为1.jpg、2.jpg...cv2.imwrite(r"./data/%s.jpg"%num,frame)num+=1capture.release()cv2.destroyAllWindows()打开文件夹“data”可见如图7-6所示采集结果。图7-6图像采集结果3.6识别结果可视化当完成用户人脸检测后,我们需要在检测到的人脸上画上矩形框,完成用户人脸识别后,我们需要将用户的ID号、账户余额、消费额信息显示在图像上;这些功能就是识别结果可视化。以下我们通过一个简单的任务进行练习。【任务练习】读取一张图片如图7-7的“mushroom.jpg”,图中有两个蘑菇,请完成:(1)在左边蘑菇绘制红色矩形框;(2)右边蘑菇绘制黄色圆形轮廓;(3)并在该图片右上角书写品红色英文文本“Heistrulyhappywhomakeothershappy.”;(4)在该图片左上角书写品红色汉字文本“比寻找温暖更重要的是让自己成为一盏灯火。”,并保存可视化结果为“visualization.jpg”。(a)原图(b)可视化结果图7-7图像可视化步骤一:读取并显示原图:新建Python脚本,将原图存放在工作路径下,应用我们项目6所学习的图片读取显示技能,完成原图读取显示,如图7-7(a)所示。#导入必要的模块importosimportcv2#在工作目录下读取一张图片img=cv2.imread('mushroom.jpg',cv2.IMREAD_COLOR)#先显示查看图像cv2.imshow('IMG',img)cv2.waitKey(0)cv2.destroyAllWindows()步骤二:在左边蘑菇绘制矩形框:矩形框绘制函数为cv2.rectangle(img,pt1,pt2,(0,0,255),2),参数中img为原图,pt1为矩形框左上角顶点坐标,pt2为矩形框右下角顶点坐标,(0,0,255)表示矩形框设置为红色,值得注意的是OpenCV图片色彩通道顺序为BGR,其他库一般色彩通道为RGB,2表示线宽。#给定图中左边蘑菇的坐标位置,画一个矩形框#(左边一颗左顶点坐标为(x1,y1)=(240,580),顶点坐标为(x2,y2)=(470,800)),画矩形框pt1=(240,580)#左上角顶点坐标pt2=(470,800)#右下角顶点坐标#画红色矩形框,线宽为2img=cv2.rectangle(img,pt1,pt2,(0,0,255),2)#图像显示cv2.imshow('IMG',img)cv2.waitKey(0)cv2.destroyAllWindows()矩形框绘制结果如图7-8所示。图7-8矩形框绘制结果步骤三:右边蘑菇绘制黄色圆形轮廓:圆形框绘制函数为cv2.circle(img,center,radius,(0,255,255),2),参数中img为原图,center为圆心坐标,radius为半径,(0,255,255)表示黄色(红绿融合),2位线宽。#给定圆心和半径,为右边蘑菇画一个黄色圆形轮廓#圆心(600,330),半径65center=(600,330)radius=65img=cv2.circle(img,center,radius,(0,255,255),2)#图像显示cv2.imshow('IMG',img)cv2.waitKey(0)cv2.destroyAllWindows()圆形轮廓绘制结果如图7-9所示。这里我们观察到步骤二所绘制的红色矩形框依然存在,这是因为cv2.rectangle和cv2.circle等绘制函数是直接在原图img上绘制的,绘制的线条会保留在img数据,如果不想改变img就需要创建副本绘制。图7-9圆形轮廓绘制结果步骤四:在右上角书写品红色英文文本:“Heistrulyhappywhomakeothershappy.”书写函数cv2.putText(img,text,org,cv2.FONT_HERSHEY_SIMPLEX,1.2,(255,0,255),2),参数text为要书写的文本,org
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年《药物化学》药学中职期末题库及解析
- 语言理论基础-2
- 《特定要素模型》课件
- 《激素的临床应》课件
- 《海海人生中山》课件
- 《文学风格与文化》课件
- 《水行星珍贵资源》课件
- 苏州东正年加工电子元件2000万件等新建项目环境影响报告表
- 《数字电视传输技术》课件
- 2026初级护师儿科护理学:新生儿营养性巨幼细胞贫血护理考点+实操要点课件
- Unit3MySchool大单元整体教学分析人教版英语七年级上册
- 老年人防跌倒的预防及护理措施
- 2025年揭阳揭西县选调高中教师考试试题(含答案)
- 咯血患者介入治疗的护理讲课件
- 对口升学考试全真模拟试卷计算机专业(第2版)答案解析
- 《民法典》合同编实务培训课件
- 2025届高考物理说题大赛-以电学实验为例
- 浙江大学嵌入式课件-嵌入式系统
- 中南林业科技大学《机械制图》2023-2024学年第一学期期末试卷
- 2024-2025学年九年级化学上册 第二单元 单元测试卷(人教版)
- 2018尔雅设计与人文每章答案
评论
0/150
提交评论