人脸识别帧数太低的解决方法

您所在的位置:网站首页 人脸识别怎么不行 人脸识别帧数太低的解决方法

人脸识别帧数太低的解决方法

2024-07-04 02:03:09| 来源: 网络整理| 查看: 265

前一个月做了一个项目,那个项目中涉及到人脸识别的显示,本来这块功能不是我做的,但是,由于感兴趣吧,突然就想搞搞人脸识别,就自己做了这个功能,但是在做的过程中发现一个问题,人脸识别涉及到的运算量很大,对于我这台已经差不多六年的笔记本,识别出来一张图像,方法不同,最后的识别效率也是不一样,在我学了各种人脸识别的框架,opencv,dlib, face_recongnize,做了一系列实验之后,我发现无论哪个框架,对于人脸识别,帧数不可能达到20帧以上,如果你是用gpu跑的当我没说,我这电脑,反正最快的识别速度也就是0.2S识别一张照片,算下来帧数就是5帧左右,最后的显示效果就给人一种卡卡的感觉,很不好,不是我想要的效果,所以我得想办法去解决。

使用技术:python + opencv + face_recongnize + pyqt

为了解决这个问题,我采取的措施如下面所示: 在这里插入图片描述 还是做个图,这样看起来更加清晰,就跟这张图显示的那般,在这里,我们得注意几个点:1:子线程中是不能另外建子进程的,我的实验结果是不可行。2:子线程之间是可以共享全局变量的,但是子进程是不可以的,子进程之间的通信方式有很多种,我习惯采用管道的方式来通信。3:上面的子进程1你可以试一下不开启,我这是为了防止进程之间相互影响就开启了,如果去掉后效果怎么样,我不清楚,也许没有影响,也许影响很大。

接下来,就给大家展示一些代码吧,大家可以看看:

'''这里用来创建子进程1和界面子线程1,this code was designed by nike hu''' cameraReciv, cameraSend = multiprocessing.Pipe(False) # 创建一个管道,用于摄像机数据的传输 p1 = multiprocessing.Process(target=getCamera, args=(cameraSend,)) # 创建一个子进程1,参数传入的是创建管道的时候返回的变量 p4 = Thread(target=cameraDataProcessing, args=(cameraReciv,)) # 这里用来处理接收到的可见光数据 p1.start() p4.start()

然后我们再看看子进程1的处理的代码:

'''this code was desinged by Nike hu''' def getCamera(cameraSend): global cameraImage, lastPosition # 通过这个全局变量来确定最后究竟传处理后的图像还是原图像 lastPosition = {} cameraImage = [] firstData, processData = multiprocessing.Pipe(True) # 这个通道两边都发数据 cam = multiprocessing.Process(target=useFaceModel, args=(processData,)) # 创建新的线程来处理后台的大量人脸识别数据,对应子进程2 cam.start() imageRec = Thread(target=sendRecongnize, args=(firstData, cameraSend)) # 这个线程就用来接收处理后的数据,对应上图的子线程2 imageRec.start() p = Thread(target=sendData, args=(firstData,)) # 事实证明不要在无限循环中不停创建线程,特别是线程的创建速度非常快,会导致系统崩溃,对应子进程1 p.start() savePosion = Thread(target=lookBetter) # 这个函数可以将最后的边框保存更长的时间 savePosion.start() print('开始打开摄像头') cap = cv2.VideoCapture(0) print(cap.isOpened()) now1 = datetime.datetime.now() # fcount = 1 # time.sleep(1) if cap.isOpened(): while True: ret, frame = cap.read() if ret == False: # 出现过界面放大缩小的时候卡死,但是加上这行代码之后就没有出现这情况了,不知道是否有关系。 print('摄像头数据-》',ret) continue # print('摄像头数据-》',ret) cameraImage = frame #(480, 640, 3) cameraImage = cv2.resize(frame, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR) # 我这里给你缩小一些,是为了人脸识别的时候更快速 # print('可见光的帧数为...................................->', fcount / (datetime.datetime.now() - now1).seconds) # fcount += 1 if lastPosition != {}: # 这里代表子进程2已经将人脸数据处理完了,这时候我们将人脸框,人名发过去 imageRGB = cv2.cvtColor(cameraImage, cv2.COLOR_BGR2RGB) # BGR->RGB cameraImage1 = Image.fromarray(imageRGB) # 由于人脸识别中最后会在图片中标记中文,直接用opencv标注不行,得换个方式,Image是从from PIL import Image来的 for name, position in lastPosition.items(): (t, r, b, l) = position lastImage = operateImage((l, t, r, b), name, cameraImage1) # 这里就是对图像进行标注,这个函数可以再图片上标注中文 # print('开始传输数据') cameraSend.send(lastImage) # 将数据传送到子进程1,然后通过全局变量,界面子线程可以读取 # lastPosition = {} else: cameraSend.send(cameraImage) # 为了避免帧数太低的情况发生,我们在后台处理人脸识别的过程中依旧往子进程发图像数据 # cameraSend.send(cameraImage) time.sleep(0.01) def sendData(firstData): global cameraImage # print('开始传数据') while True: if cameraImage == []: time.sleep(0.3) continue firstData.send(cameraImage) time.sleep(0.2)#这里没必要把传输速度放那么快,本来人脸识别就需要时间 # print('传送完毕') # 这个用来接收人脸识别的数据然后实时更新全局变量lastPosition def sendRecongnize(processData, cameraSend): global lastPosition while True: lastPosition = processData.recv() # 这个函数用来将坐标保存长一点时间 def lookBetter(): global lastPosition while True: if lastPosition != {}: time.sleep(0.5)#这里就是讲位置边框保证稍微久一点的原理 lastPosition = {} time.sleep(0.2)

好了,基本的情况就是这样了,以上代码将我们图里面的流程都实现了,我个人觉得上面的注释还是很详细了,都是中文,大家看起来也没障碍,这里得说一下,本来我对于人脸识别的那部分函数,最开始返回的是画好边框这些的图像数据,但是这样就会存在几个问题:1:整个人脸识别视频好好的,突然冒出一张照片,而且这种照片跟当前的情况不匹配,就跟我们电影中看的那种精神分裂很像。2:人脸识别的边框会一闪就消息,这也是我为什么利用上面的lookBetter这个函数来将这个边框保存的时间更长点的原因了。至于人脸识别那一块的函数,每一个人喜欢用的框架不一样,实现也不一样,这个根据你们的喜好就行,这里注意一下,人脸识别函数最后返回的是人脸定位边框的位置,左上角右下角的位置或者中心位置和宽高都可以,你随意,除了位置,还有最后预测出来的人的名字,如果预测出来多个人,那么你还得为这些预测出来的结果进行排序人后输出,排序可以根据边框的坐标来排序。对于界面子线程1的功能实现,你可以看看我的另一篇文章:如何使用pyqt来不卡顿的显示视频对于我的这个程序,最后的实验结果还是挺满意的,帧数30帧左右,跟我不经过人脸识别直接显示摄像头的数据达到的帧数差不多,也就证明了用多进程来处理大量的数据运算是行得通的,如果使用多线程来处理大量的数据运算,这个帧数至少要减少一半,你不要不服,我这电脑的情况就是这样。如果把这程序拿到工程中运用,那时候所使用的电脑可能由于成本原因还赶不上我这笔记本,由此可见多进程和多线程在选择的时候还是要注意一下。更多时候是多进程和多线程混用。

好了,这篇文章的干货就是这样了,写了这么久,能看到这的点个赞再走呗。

2020 4.14



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭