软件杯 深度学习 python opencv 实现人脸年龄性别识别

文章目录

  • 0 前言
  • 1 项目课题介绍
  • 2 关键技术
    • 2.1 卷积神经网络
    • 2.2 卷积层
    • 2.3 池化层
    • 2.4 激活函数:
    • 2.5 全连接层
  • 3 使用tensorflow中keras模块实现卷积神经网络
  • 4 Keras介绍
    • 4.1 Keras深度学习模型
    • 4.2 Keras中重要的预定义对象
    • 4.3 Keras的网络层构造
  • 5 数据集处理训练
    • 5.1 分为年龄、性别
    • 5.2 性别分为两类
    • 5.3性别训练代码
    • 5.4 年龄分为七个年龄段
    • 5.5 年龄训练代码
  • 6 模型验证预测
    • 6.1 实现效果
    • 6.2 关键代码
  • 7 最后

0 前言

🔥 优质竞赛项目系列,今天要分享的是

🚩 基于深度学习的人脸年龄性别识别算法实现

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:4分
  • 工作量:4分
  • 创新点:3分

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate


1 项目课题介绍

年龄和性别作为人重要的生物特征, 可以应用于多种场景,
如基于年龄的人机交互系统、电子商务中个性营销、刑事案件侦察中的年龄过滤等。然而基于图像的年龄分类和性别检测在真实场景下受很多因素影响,
如后天的生活工作环境等, 并且人脸图像中的复杂光线环境、姿态、表情以及图片本身的质量等因素都会给识别造成困难。

学长这次设计的项目 基于深度学习卷积神经网络,利用Tensorflow和Keras等工具实现图像年龄和性别检测。

在这里插入图片描述

2 关键技术

2.1 卷积神经网络

受到人类大脑神经突触结构相互连接的模式启发,神经网络作为人工智能领域的重要组成部分,通过分布式的方法处理信息,可以解决复杂的非线性问题,从构造方面来看,主要包括输入层、隐藏层、输出层三大组成结构。每一个节点被称为一个神经元,存在着对应的权重参数,部分神经元存在偏置,当输入数据x进入后,对于经过的神经元都会进行类似于:y=w*x+b的线性函数的计算,其中w为该位置神经元的权值,b则为偏置函数。通过每一层神经元的逻辑运算,将结果输入至最后一层的激活函数,最后得到输出output。

在这里插入图片描述

2.2 卷积层

卷积核相当于一个滑动窗口,示意图中3x3大小的卷积核依次划过6x6大小的输入数据中的对应区域,并与卷积核滑过区域做矩阵点乘,将所得结果依次填入对应位置即可得到右侧4x4尺寸的卷积特征图,例如划到右上角3x3所圈区域时,将进行0x0+1x1+2x1+1x1+0x0+1x1+1x0+2x0x1x1=6的计算操作,并将得到的数值填充到卷积特征的右上角。

在这里插入图片描述

2.3 池化层

池化操作又称为降采样,提取网络主要特征可以在达到空间不变性的效果同时,有效地减少网络参数,因而简化网络计算复杂度,防止过拟合现象的出现。在实际操作中经常使用最大池化或平均池化两种方式,如下图所示。虽然池化操作可以有效的降低参数数量,但过度池化也会导致一些图片细节的丢失,因此在搭建网络时要根据实际情况来调整池化操作。

在这里插入图片描述

2.4 激活函数:

激活函数大致分为两种,在卷积神经网络的发展前期,使用较为传统的饱和激活函数,主要包括sigmoid函数、tanh函数等;随着神经网络的发展,研宄者们发现了饱和激活函数的弱点,并针对其存在的潜在问题,研宄了非饱和激活函数,其主要含有ReLU函数及其函数变体

2.5 全连接层

在整个网络结构中起到“分类器”的作用,经过前面卷积层、池化层、激活函数层之后,网络己经对输入图片的原始数据进行特征提取,并将其映射到隐藏特征空间,全连接层将负责将学习到的特征从隐藏特征空间映射到样本标记空间,一般包括提取到的特征在图片上的位置信息以及特征所属类别概率等。将隐藏特征空间的信息具象化,也是图像处理当中的重要一环。

3 使用tensorflow中keras模块实现卷积神经网络

class CNN(tf.keras.Model):def __init__(self):super().__init__()self.conv1 = tf.keras.layers.Conv2D(filters=32,             # 卷积层神经元(卷积核)数目kernel_size=[5, 5],     # 感受野大小padding='same',         # padding策略(vaild 或 same)activation=tf.nn.relu   # 激活函数)self.pool1 = tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2)self.conv2 = tf.keras.layers.Conv2D(filters=64,kernel_size=[5, 5],padding='same',activation=tf.nn.relu)self.pool2 = tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2)self.flatten = tf.keras.layers.Reshape(target_shape=(7 * 7 * 64,))self.dense1 = tf.keras.layers.Dense(units=1024, activation=tf.nn.relu)self.dense2 = tf.keras.layers.Dense(units=10)def call(self, inputs):x = self.conv1(inputs)                  # [batch_size, 28, 28, 32]x = self.pool1(x)                       # [batch_size, 14, 14, 32]x = self.conv2(x)                       # [batch_size, 14, 14, 64]x = self.pool2(x)                       # [batch_size, 7, 7, 64]x = self.flatten(x)                     # [batch_size, 7 * 7 * 64]x = self.dense1(x)                      # [batch_size, 1024]x = self.dense2(x)                      # [batch_size, 10]output = tf.nn.softmax(x)return output

4 Keras介绍

keras是一个专门用于深度学习的开发软件。它的编程语言采用的为现在最流行的python语言,集成封装了CNTK,Tensorflow或者Theano深度学习框架为计算机后台进行深度建模,具有易于学习,高效编程的功能,数据的运算处理支持GPU和CPU,真正实现了二者的无缝切换。正是keras有如此特殊功能,所以它的优点有如下几个方面:

4.1 Keras深度学习模型

Keras深度学习模型可以分为两种:一种是序列模型,一种是通用模型。它们的区别在于其拥有不同的网络拓扑结构。序列模型是通用模型的一个范例,通常情况下应用比较广。每层之间的连接方式都是线性的,且在相邻的两

4.2 Keras中重要的预定义对象

Keras预定义了很多对象目的就是构造其网络结构,正是有了这么多的预定义对象才让Keras使用起来非常方便易用。研究中用的最多要数正则化、激活函数及初始化对象了。

  • 正则化是在建模时防止过度拟合的最常用且效果最有效的手段之一。在神经网络中采用的手段有权重参数、偏置项以及激活函数,其分别对应的代码是kernel_regularizier、bias_regularizier以及activity_regularizier。

  • 激活函数在网络定义中的选取十分重要。为了方便Keras预定义了丰富的激活函数,以此是适应不同的网络结构。使用激活对象的方式有两种:一个是单独定义一个激活函数层,二是通利用前置层的激活选项定义激活函数。

  • 初始化对象是随机给定网络层激活函数kernel_initializer or bias_initializer的开始值。权重初始化值好与坏直接影响模型的训练时间的长短。

4.3 Keras的网络层构造

在Keras框架中,不同的网络层(Layer)定义了神经网络的具体结构。在实际网络构建中常见的用Core Layer、Convolution
Layer、Pooling Layer、Emberdding Layer等。

在这里插入图片描述

5 数据集处理训练

该项目将采集的照片分为男女两个性别;‘0-9’, ‘10-19’, ‘20-29’, ‘30-39’, ‘40-49’, ‘50-59’,
‘60+’,七个年龄段;分别把性别和年龄段的图片分别提取出来,并保存到性别和年龄段两个文件夹下,构造如下图:

5.1 分为年龄、性别

在这里插入图片描述

5.2 性别分为两类

在这里插入图片描述

5.3性别训练代码

# ----------------------------------------------------------------------------------------------------------------------# 导入一些第三方包# ----------------------------------------------------------------------------------------------------------------------import tensorflow as tffrom nets import netEPOCHS = 40BATCH_SIZE = 32image_height = 128image_width = 128model_dir = "./models/age.h5"train_dir = "./data/age/train/"test_dir = "./data/age/test/"def get_datasets():train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1.0 / 255.0)train_generator = train_datagen.flow_from_directory(train_dir,target_size=(image_height, image_width),color_mode="rgb",batch_size=BATCH_SIZE,shuffle=True,class_mode="categorical")test_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1.0 /255.0)test_generator = test_datagen.flow_from_directory(test_dir,target_size=(image_height, image_width),color_mode="rgb",batch_size=BATCH_SIZE,shuffle=True,class_mode="categorical")train_num = train_generator.samplestest_num = test_generator.samplesreturn train_generator, test_generator, train_num, test_num# ----------------------------------------------------------------------------------------------------------------------# 网络的初始化 ---  net.CNN(num_classes=7)# model.compile --- 对神经网络训练参数是设置 --- tf.keras.losses.categorical_crossentropy --- 损失函数(交叉熵)# tf.keras.optimizers.Adam(learning_rate=0.001) --- 优化器的选择,以及学习率的设置# metrics=['accuracy'] ---  List of metrics to be evaluated by the model during training and testing# return model --- 返回初始化之后的模型# ----------------------------------------------------------------------------------------------------------------------def get_model():model = net.CNN(num_classes=7)model.compile(loss=tf.keras.losses.categorical_crossentropy,optimizer=tf.keras.optimizers.Adam(lr=0.001),metrics=['accuracy'])return modelif __name__ == '__main__':train_generator, test_generator, train_num, test_num = get_datasets()model = get_model()model.summary()tensorboard = tf.keras.callbacks.TensorBoard(log_dir='./log/age/')callback_list = [tensorboard]model.fit_generator(train_generator,epochs=EPOCHS,steps_per_epoch=train_num // BATCH_SIZE,validation_data=test_generator,validation_steps=test_num // BATCH_SIZE,callbacks=callback_list)model.save(model_dir)# ----------------------------------------------------------------------------------------------------------------------

5.4 年龄分为七个年龄段

在这里插入图片描述

5.5 年龄训练代码

# ----------------------------------------------------------------------------------------------------------------------# 导入一些第三方包# ----------------------------------------------------------------------------------------------------------------------import tensorflow as tffrom nets import netEPOCHS = 20BATCH_SIZE = 32image_height = 128image_width = 128model_dir = "./models/gender.h5"train_dir = "./data/gender/train/"test_dir = "./data/gender/test/"def get_datasets():train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1.0 / 255.0)train_generator = train_datagen.flow_from_directory(train_dir,target_size=(image_height, image_width),color_mode="rgb",batch_size=BATCH_SIZE,shuffle=True,class_mode="categorical")test_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1.0 /255.0)test_generator = test_datagen.flow_from_directory(test_dir,target_size=(image_height, image_width),color_mode="rgb",batch_size=BATCH_SIZE,shuffle=True,class_mode="categorical")train_num = train_generator.samplestest_num = test_generator.samplesreturn train_generator, test_generator, train_num, test_numdef get_model():model = net.CNN(num_classes=2)model.compile(loss=tf.keras.losses.categorical_crossentropy,optimizer=tf.keras.optimizers.Adam(lr=0.001),metrics=['accuracy'])return modelif __name__ == '__main__':train_generator, test_generator, train_num, test_num = get_datasets()model = get_model()model.summary()tensorboard = tf.keras.callbacks.TensorBoard(log_dir='./log/gender/')callback_list = [tensorboard]model.fit_generator(train_generator,epochs=EPOCHS,steps_per_epoch=train_num // BATCH_SIZE,validation_data=test_generator,validation_steps=test_num // BATCH_SIZE,callbacks=callback_list)model.save(model_dir)# ----------------------------------------------------------------------------------------------------------------------

6 模型验证预测

6.1 实现效果

在这里插入图片描述
在这里插入图片描述

6.2 关键代码

# ----------------------------------------------------------------------------------------------------------------------
# 加载基本的库
# ----------------------------------------------------------------------------------------------------------------------
import tensorflow as tf
from PIL import Image
import numpy as np
import cv2
import os
# ----------------------------------------------------------------------------------------------------------------------
# tf.keras.models.load_model('./model/age.h5') --- 加载年龄模型
# tf.keras.models.load_model('./model/gender.h5') --- 加载性别模型
# ----------------------------------------------------------------------------------------------------------------------
model_age = tf.keras.models.load_model('./models/age.h5')
model_gender = tf.keras.models.load_model('./models/gender.h5')
# ----------------------------------------------------------------------------------------------------------------------
# 类别名称
# ----------------------------------------------------------------------------------------------------------------------
classes_age = ['0-9', '10-19', '20-29', '30-39', '40-49', '50-59', '60+']
classes_gender = ['female', 'male']
# ----------------------------------------------------------------------------------------------------------------------
# cv2.dnn.readNetFromCaffe --- 加载人脸检测模型
# ----------------------------------------------------------------------------------------------------------------------
net = cv2.dnn.readNetFromCaffe('./models/deploy.prototxt.txt', './models/res10_300x300_ssd_iter_140000.caffemodel')
# ----------------------------------------------------------------------------------------------------------------------
# os.listdir('./images/') --- 得到文件夹列表
# ----------------------------------------------------------------------------------------------------------------------
files = os.listdir('./images/')
# ----------------------------------------------------------------------------------------------------------------------
# 遍历信息
# ----------------------------------------------------------------------------------------------------------------------
for file in files:# ------------------------------------------------------------------------------------------------------------------# image_path = './images/' + file --- 拼接得到图片文件路径# cv2.imread(image_path) --- 使用opencv读取图片# ------------------------------------------------------------------------------------------------------------------image_path = './images/' + fileprint(image_path)image = cv2.imread(image_path)# ------------------------------------------------------------------------------------------------------------------# (h, w) = image.shape[:2] --- 得到图像的高度和宽度# cv2.dnn.blobFromImage --- 以DNN的方式加载图像# net.setInput(blob) -- 设置网络的输入# detections = net.forward() --- 网络前相传播过程# ------------------------------------------------------------------------------------------------------------------(h, w) = image.shape[:2]blob = cv2.dnn.blobFromImage(cv2.resize(image, (300, 300)), 1.0, (300, 300), 127.5)net.setInput(blob)detections = net.forward()# ------------------------------------------------------------------------------------------------------------------# for i in range(0, detections.shape[2]): --- 遍历检测结果# ------------------------------------------------------------------------------------------------------------------for i in range(0, detections.shape[2]):# --------------------------------------------------------------------------------------------------------------# confidence = detections[0, 0, i, 2] 得到检测的准确率# --------------------------------------------------------------------------------------------------------------confidence = detections[0, 0, i, 2]# --------------------------------------------------------------------------------------------------------------# if confidence > 0.85: --- 对置信度的判断# --------------------------------------------------------------------------------------------------------------if confidence > 0.85:# ----------------------------------------------------------------------------------------------------------# detections[0, 0, i, 3:7] * np.array([w, h, w, h]) --- 得到检测框的信息# (startX, startY, endX, endY) = box.astype("int") --- 将信息分解成左上角的x,y,以及右下角的x,y# cv2.rectangle --- 将人脸框起来# ----------------------------------------------------------------------------------------------------------box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])(startX, startY, endX, endY) = box.astype("int")cv2.rectangle(image, (startX, startY), (endX, endY), (0, 255, 0), 1)# ----------------------------------------------------------------------------------------------------------# 提取人脸部分区域# ----------------------------------------------------------------------------------------------------------roi = image[startY-15:endY+15, startX-15:endX+15]# ----------------------------------------------------------------------------------------------------------# Image.fromarray(cv2.cvtColor(roi, cv2.COLOR_BGR2RGB)) --- 将opencv专程PIL格式的数据# img.resize((128, 128)) --- 改变图像的大小# np.array(img).reshape(-1, 128, 128, 3).astype('float32') / 255 --- 改变数据的形状,以及归一化处理# ----------------------------------------------------------------------------------------------------------img = Image.fromarray(cv2.cvtColor(roi, cv2.COLOR_BGR2RGB))img = img.resize((128, 128))img = np.array(img).reshape(-1, 128, 128, 3).astype('float32') / 255# ----------------------------------------------------------------------------------------------------------# 调用年龄识别模型得到检测结果# ----------------------------------------------------------------------------------------------------------prediction_age = model_age.predict(img)final_prediction_age = [result.argmax() for result in prediction_age][0]# ----------------------------------------------------------------------------------------------------------# 调用性别识别模型得到检测结果# ----------------------------------------------------------------------------------------------------------prediction_gender = model_gender.predict(img)final_prediction_gender = [result.argmax() for result in prediction_gender][0]# ----------------------------------------------------------------------------------------------------------# 将识别的信息拼接,然后使用cv2.putText显示# ----------------------------------------------------------------------------------------------------------res = classes_gender[final_prediction_gender] + ' ' + classes_age[final_prediction_age]y = startY - 10 if startY - 10 > 10 else startY + 10cv2.putText(image, str(res), (startX, y), cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)# ------------------------------------------------------------------------------------------------------------------# 显示# ------------------------------------------------------------------------------------------------------------------cv2.imshow('', image)if cv2.waitKey(0) & 0xFF == ord('q'):break

7 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/279913.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件企业在咨询第三方软件测试机构报价时,应提前准备什么资料?

近年来,随着软件行业的迅速发展,软件企业对于软件质量的重视程度日益增加。为了确保软件产品的质量以及用户的满意度,越来越多的企业倾向于委托第三方软件测试机构进行测试工作。在咨询第三方软件测试机构报价之前,软件企业需要提…

软考81-上午题-【面向对象技术3-设计模式】-行为型设计模式01

一、行为型设计模式一览 二、责任链模式 2-1、意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 1-2、结构 1-3、代码实现 1-4、适…

C/C++炸弹人游戏

参考书籍《啊哈,算法》,很有意思的一本算法书,小白也可以看懂,详细见书,这里只提供代码和运行结果。 这里用到的是枚举思想,还有更好地搜索做法。 如果大家有看不懂的地方或提出建议,欢迎评论区…

【Linux】Linux基本开发工具(yum) (vi/vim)的使用

本文章内容: 学习yum工具,进行软件安装掌握vim编辑器使用 Linux 软件包管理器 yum 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成…

基于python的4s店客户管理系统

技术:pythonmysqlvue 一、背景 进入21世纪网络和计算机得到了飞速发展,并和生活进行了紧密的结合。目前,网络的运行速度以达到了千兆,覆盖范围更是深入到生活中的角角落落。这就促使管理系统的发展。网上办公可以实现远程处理事务…

2024.03.19日志

今日复盘 1 学习导师给的项目 1.1 了解项目的业务背景:经销商-银行贷款 1.2 了解了大致的业务流程 经销商添加客户贷款信息->提交贷款信息->银行审核->审核通过经销商提交客户贷款信息资料->银行审核->制作名单导入网贷系统 1.3 业务功能 经销…

Java 设计模式系列:行为型-状态模式

简介 状态模式(State Pattern)是一种行为型设计模式,允许一个对象在其内部状态改变时改变其行为。状态模式中类的行为是由状态决定的,在不同的状态下有不同的行为。 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂…

linux下关闭swap文件系统

临时关闭(马上生效) 永久关闭(重启计算机才能生效) vim /etc/fstab

深入浅出Hive性能优化策略

我们将从基础的HiveQL优化讲起,涵盖数据存储格式选择、数据模型设计、查询执行计划优化等多个方面。会的直接滑到最后看代码和语法。 目录 引言 Hive架构概览 示例1:创建表并加载数据 示例2:优化查询 Hive查询优化 1. 选择适当的文件格…

基于springboot+vue的交通管理在线服务系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

苏州工业园区党工委书记沈觅一行莅临聚合数据走访调研

3月7日,市委常委、苏州工业园区党工委书记沈觅莅临聚合数据,就数字经济企业情况展开专题调研。园区党工委委员、管委会副主任邹小伟,科创区、经发委、科创委、金融局主要负责人参加调研,聚合数据董事长左磊等人接待来访。 调研组…

Transformer学习笔记(二)

一、文本嵌入层Embedding 1、作用: 无论是源文本嵌入还是目标文本嵌入,都是为了将文本中词汇的数字表示转变为向量表示,希望在这样的高维空间捕捉词汇间的关系。 二、位置编码器Positional Encoding 1、作用: 因为在Transformer的…

将 OpenCV 与 Eclipse 结合使用(插件 CDT)

返回:OpenCV系列文章目录(持续更新中......) 上一篇:将OpenCV与gcc和CMake结合使用 下一篇:OpenCV4.9.0在windows系统下的安装 警告: 本教程可以包含过时的信息。 先决条件 两种方式,一种…

数据治理之数据标准管理及实践方法

什么是数据标准?提到数据标准大家肯定会想到我们公司也有相关的产品设计的标准、质量检验的标准、安全环保的标准,对于金融企业的话,还有市场监管相关的一些标准。些标准其实都不是我们要讲的数据标准,以上的标准最多只能被称作规…

OpenCV系列文章目录(持续更新中......)

引言: OpenCV是一个开源的计算机视觉库,由英特尔公司开发并开源的一组跨平台的C函数和少量的C函数组成,用于实时图像处理、计算机视觉和机器学习等应用领域。OpenCV可以在包括Windows、Linux、macOS等各种操作系统平台上使用,具…

OPENCV(0-1之0.2)

OPENCV-0.2 学习安排图像基础像素访问和修改像素值 色彩空间转换RGB到灰度的转换RGB到HSV的转换 图像操作裁剪缩放旋转和翻转 图像滤波平滑和模糊图像边缘检测 图像变换仿射变换透视变换 总结 官方文档 学习安排 图像基础 像素:了解像素的概念,包括像素…

大厂面试--是否熟悉Node, 主要做过哪些业务,平时用过什么包?

什么是Node ​ Node是一个让Javascript运行在服务端的开发平台,它让Javascript成为了与PHP、Python、Perl、Ruby等服务器语言平起平坐的脚本语言。目前Nodejs已发展成一个成熟的开发平台,吸引了许多开发者。有许多大型高流量网站都采用Nodejs进行开发&a…

Linux——程序地址空间

我们先来看这样一段代码&#xff1a; #include <stdio.h> #include <unistd.h> #include <stdlib.h>int g_val 0;int main() {pid_t id fork();if(id < 0){perror("fork");return 0;}else if(id 0){ //child,子进程肯定先跑完&#xff0c;也…

牛客网-SQL大厂面试题-2.平均播放进度大于60%的视频类别

题目&#xff1a;平均播放进度大于60%的视频类别 DROP TABLE IF EXISTS tb_user_video_log, tb_video_info; CREATE TABLE tb_user_video_log (id INT PRIMARY KEY AUTO_INCREMENT COMMENT 自增ID,uid INT NOT NULL COMMENT 用户ID,video_id INT NOT NULL COMMENT 视频ID,start…

单片机LED灯闪烁

延时函数计算&#xff08;相关代码生成&#xff09;&#xff1a; #include "reg52.h" #include <INTRINS.H> void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();_nop_();i 22;j 3;k 227;do{do{while (--k);} while (--j);} while (--i); }vo…