图像预处理一般包括数字化、归一化、几何变化、平滑、恢复和增强等步骤。
在边缘检测之前,通常会进行灰度处理、噪声处理、二值化、开闭运算等。
二、图片检测
首先,运行所需的库:
导入系统
将numpy 导入为np
导入库
导入CV2
导入os和检测68个关键点所需的参数模型:shape_predictor_68_face_landmarks.dat
链接:https://pan.baidu.com/s/1Xkh17Wdmn9dfx33yA8ghRw
提取码:rxwh
人体表情检测参数模型(这个是我自己训练的,准确率有待参考~):my_merge_Xception_0807.61-0.669.hdf5
链接:https://pan.baidu.com/s/1zviLruPE3wG4BFQhNSJsyA
提取码:rg3d
当然,您也可以使用自己训练的模型参数。
2.1、检测人脸区域,并标上68个点,按区域连线
导入训练好的模型和相关变量。有7种基本面部表情:“愤怒”、“厌恶”、“害怕”、“高兴”、“悲伤”、“惊讶”、“中性”;
image_file="图片/5.jpg"
检测器=dlib.get_frontal_face_ detector()
预测器=dlib.shape_predictor("face_landmarks/shape_predictor_68_face_landmarks.dat")
情感模型路径="模型/my_merge_Xception_0807.61-0.669.hdf5"
情感分类器=加载模型(情感模型路径,编译=假)
EMOTIONS=["愤怒", "厌恶", "害怕", "快乐", "悲伤", "惊讶", "中性"] 读取图片并显示:
图像=cv2.imread(image_file)
cv2.imshow("origin", image) 处理部分,调整图像大小:
#这个函数中的图像就是我们要检测的图片。
#人脸检测程序结束时,我们会显示检测结果图片进行验证。这里调整大小的目的是为了防止图片太大而超出屏幕范围。
def 调整大小(图像,宽度=1200):
r=宽度* 1.0/image.shape[1]
暗淡=(宽度, int(image.shape[0] * r))
调整大小=cv2.resize(图像,暗淡,插值=cv2.INTER_AREA)
return resized 调用人脸检测模型,在检测前对图像进行灰度处理;
灰度处理的原因:
1、最直接的原因是彩色图像的单个像素为(R,G,B),转换为灰度图像为(L),简化了矩阵,提高了计算速度。
2.首先,梯度信息对于识别物体很重要。所以我们可以把灰度图像看成图像的强度来寻找一些梯度特征。比较常用的有HOG、LBP、SIFT等,下图是行人检测中的hog模型。使用hog来检测成分,最终找到图像中的行人。 (参考:rbgirshick/voc-dpm)注意:可视化是RGB图像,但输入是灰度图像,不要被愚弄。
当前的许多算法需要在处理之前对彩色图像进行灰度化。事实上,你要明白灰度之后你失去了什么,得到了什么。
灰度化后颜色信息会丢失,这对于许多基于颜色的算法来说是不可能的。然而,许多简单的识别算法并不强烈依赖于颜色,手工特征更关注边缘梯度信息。添加颜色信息后,工程中的许多应用的鲁棒性都会降低。灰度化后,矩阵维数降低,运算速度大大提高,并且梯度信息仍然保留。这只是性能和效率之间的权衡。
链接:https://www.zhihu.com/question/24453478
来源:知乎
灰色=cv2.cvtColor(图像, cv2.COLOR_BGR2GRAY)
rects=detector(gray, 1) 那么检测题就说,当我检测到一张图片中所有人脸的相关信息时(都存储在rects中);然后我们就可以根据关键点得到相关的人脸区域图片,方便后面的表情识别。
首先我们看一下如何标记每张脸的关键点(这次是连接68个点击区域),并进一步检测检测到的人脸区域中的器官(眼睛、鼻子等)。嘴、下巴、眉毛)。
划分相关区域;
脸部轮廓=[]
左脸=[]
右脸=[]
左脸眉毛=[]
右脸眉毛=[]
脸部鼻托=[]
脸鼻子=[]
脸嘴=[]
脸唇=[]
我=0
对于形状: 中的(x, y)
我=我+1
# 打印(i,x,y)
如果i=1 且i=17:
# print("脸部轮廓")
Face_outline.append((x, y))
如果i=18 且i=22:
face_eyebrow_left.append((x, y))
如果i=23 且i=27:
face_eyebrow_right.append((x, y))
如果i=37 且i=42:
Face_eye_left.append((x, y))
如果i=43 且i=48:
face_eye_right.append((x, y))
如果i=28 且i=31:
face_nosepiece.append((x, y))
如果i=32 且i=36:
face_nose.append((x, y))
如果i=49 且i=60:
face_mouth.append((x, y))
如果i=61 且i=68:
face_lip.append((x, y)) 连接关键点;
颜色=(225, 225, 225)
厚度=1def draw_line(图像, pixls):
我=0
# 打印(像素)
对于pixls: 中的x、y
如果我len(pixls)-1:
next_x, next_y=pixls[i+1]
cv2.line(图像,(x,y),(next_x,next_y),颜色,厚度)
#else:
# next_x, next_y=pixls[0]
# cv2.line(图像, (x, y), (next_x, next_y), (225, 225, 225), 2)
i=i + 1draw_line(图像, 脸部轮廓)
画线(图像,face_eyebrow_left)
画线(图像,face_eyebrow_right)
画线(图像,face_eye_left)
cv2.line(图像,face_eye_left[0],face_eye_left[-1],颜色,厚度)
画线(图像,face_eye_right)
cv2.line(图像,face_eye_right[0],face_eye_right[-1],颜色,厚度)
画线(图像,脸部鼻子)
画线(图像,face_nosepiece)
cv2.line(图像、face_nose[0]、face_nosepiece[-1]、颜色、厚度)
cv2.line(图像、face_nose[-1]、face_nosepiece[-1]、颜色、厚度)
画线(图像,脸嘴)
cv2.line(图像,face_mouth[0],face_mouth[-1],颜色,厚度)
画线(图像,face_lip)
cv2.line(image,face_lip[0],face_lip[-1],color,thickness)图:原图渲染
2.2、表情识别
导入资源包:
从tensorflow.keras.models导入load_model
from keras.preprocessing.image import img_to_arraydlib 面部特征检测的输出,一个shape包含前面提到的面部特征的68个点
形状=预测器(灰色,矩形)
shape=shape_to_np(shape)#该函数将shape转换为Numpy数组,方便后续处理。
def shape_to_np(形状, dtype="int"):
坐标=np.zeros((68, 2), dtype=dtype)
对于范围(0, 68): 内的i
坐标[i]=(shape.part(i).x, shape.part(i).y)
return coords 取出68个关键点的max_left、max_right、max_top、max_bottom并进行裁剪。
左、右、上、下=顶部(形状)
cropped=grey[top:bottom, left:right] # 裁剪坐标为[y0:y1, x0:x1]def copep(shape):
x, y=形状[0]
左最小值=x
最大右=x
最小顶部=y
最大底部=y
对于形状: 中的(x, y)
如果min_left x:
左最小值=x
如果max_right x:
最大右=x
如果min_top y:
最小顶部=y
如果max_bottom y:
最大底部=y
打印(最小左,最大右,最小顶部,最大底部)
返回min_left、max_right、min_top、max_bottom将对裁剪后的单通道图像进行预处理、调整大小、归一化等。
def preprocess_input(x, v2=True):
# 标准化
x=x.astype("float32")
x=x/255.0
如果v2:
x=x - 0.5
x=x * 2.0
返回xroi=cv2.resize(裁剪,emotion_classifier.input_shape[1:3])
roi=预处理输入(roi)
roi=img_to_array(roi)
roi=np.expand_dims(roi, axis=0)每个表情分类和表情概率。
# 使用模型预测每个类别的概率
preds=情感_分类器.预测(roi)[0]
emotion_probability=np.max(preds) # 最大概率
label=EMOTIONS[preds.argmax()] # 选择概率最大的表情类圈出人脸区域并显示识别结果。
cv2.putText(图像,
"人脸{}".format(i + 1) + ", " + label + ":" + str(round(emotion_probability * 100, 2)) + "%",
(左- 10,上- 10),
cv2.FONT_HERSHEY_TRIPLEX, 0.5, (0, 225, 225), 1) # putText的参数为:图片,添加渲染。另外,如果是多人脸检测,只需要在外层添加一个循环即可。多人渲染
三、视频检测
视频检测其实就是对视频的每一帧进行检测,其中人脸检测和表情识别与图片检测方法相同(可以参考上面的图片检测)。
将numpy 导入为np
导入库
导入CV2
从tensorflow.keras.models导入load_model
from keras.preprocessing.image import img_to_arraycv2.VideoCapture 调用笔记本内置摄像头,所以参数为0。如果有其他摄像头,可以将参数调整为1、2或视频路径;
cap=cv2.VideoCapture("image/7.mp4")
fps=cap.get(cv2.CAP_PROP_FPS) # 调用cv2方法获取cap的视频帧(帧:每秒多少张图片)
# 获取cap视频流每帧的大小
大小=(int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
# 定义编码格式mpge-4
# 具有固定参数的视频格式。不同的编码格式对应不同的参数。
fourcc=cv2.VideoWriter_fourcc(*"XVID")
#定义视频文件输入对象
文章分享结束,高效部署深度学习网络:表情识别演示教程和的答案你都知道了吗?欢迎再次光临本站哦!
【高效部署深度学习网络:表情识别演示教程】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
感觉这个表情识别Demo很有意思!
有9位网友表示赞同!
我一直想了解一下深度学习是怎么应用在图像识别的上的,这个demo能让我更直观的理解。
有17位网友表示赞同!
现在深度学习的应用越来越多了,比如这类的表情识别技术,未来应该会有更多实际运用吧?
有7位网友表示赞同!
部署模型这块看起来挺复杂的啊,不知道教程里会详细介绍吗?
有14位网友表示赞同!
希望这个demo能给大家提供一些关于深度学习和图像识别的入门了解。
有16位网友表示赞同!
表情识别技术已经越来越普遍了,想想各种智能设备都可能用到吧。
有10位网友表示赞同!
这个demo演示可以帮助大家快速上手,感觉还挺简单的。
有16位网友表示赞同!
做个简单的emoji分类程序也是很有趣的,或许可以参考这个Demo啊!
有15位网友表示赞同!
深度学习真的是一项很厉害的技术,越来越感觉它能改变很多行业了。
有9位网友表示赞同!
期待看到更多关于深度学习应用在其他领域的演示。
有6位网友表示赞同!
有没有人尝试过用这款模型识别多种情绪的表情呢?
有18位网友表示赞同!
这个demo可以作为入门级别的教程很好,希望能有一些更进阶的教材。
有18位网友表示赞同!
部署模型的过程是不是需要专业的硬件支持啊?
有7位网友表示赞同!
不知道这个demo所使用的深度学习网络模型是怎样的结构呢?
有8位网友表示赞同!
期待这个demo能够提供更多关于模型训练和调优的信息。
有15位网友表示赞同!
这篇文章能帮助我更好地理解部署深度学习模型的整个过程。
有19位网友表示赞同!
我觉得表情识别技术非常实用,可以应用于很多场景之中。
有12位网友表示赞同!
这个demo展示了深度学习的可塑性,让人期待更多创新应用。
有11位网友表示赞同!
希望能够看到更多相关的文章和教程,不断提高我对深度学习的理解。
有18位网友表示赞同!
这个demo是一个很好的资源,可以帮助我入门深度学习。
有6位网友表示赞同!