前一个月做了一个项目,那个项目中涉及到人脸识别的显示,本来这块功能不是我做的,但是,由于感兴趣吧,突然就想搞搞人脸识别,就自己做了这个功能,但是在做的过程中发现一个问题,人脸识别涉及到的运算量很大,对于我这台已经差不多六年的笔记本,识别出来一张图像,方法不同,最后的识别效率也是不一样,在我学了各种人脸识别的框架,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,)) # 创建新的线程来处理后台的大量人脸识别数据,对应子进程2cam.start()imageRec = Thread(target=sendRecongnize, args=(firstData, cameraSend)) # 这个线程就用来接收处理后的数据,对应上图的子线程2imageRec.start()p = Thread(target=sendData, args=(firstData,)) # 事实证明不要在无限循环中不停创建线程,特别是线程的创建速度非常快,会导致系统崩溃,对应子进程1p.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 += 1if lastPosition != {}: # 这里代表子进程2已经将人脸数据处理完了,这时候我们将人脸框,人名发过去imageRGB = cv2.cvtColor(cameraImage, cv2.COLOR_BGR2RGB) # BGR->RGBcameraImage1 = Image.fromarray(imageRGB) # 由于人脸识别中最后会在图片中标记中文,直接用opencv标注不行,得换个方式,Image是从from PIL import Image来的for name, position in lastPosition.items():(t, r, b, l) = positionlastImage = 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)continuefirstData.send(cameraImage)time.sleep(0.2)#这里没必要把传输速度放那么快,本来人脸识别就需要时间# print('传送完毕')# 这个用来接收人脸识别的数据然后实时更新全局变量lastPosition
def sendRecongnize(processData, cameraSend):global lastPositionwhile True:lastPosition = processData.recv()# 这个函数用来将坐标保存长一点时间
def lookBetter():global lastPositionwhile True:if lastPosition != {}:time.sleep(0.5)#这里就是讲位置边框保证稍微久一点的原理lastPosition = {}time.sleep(0.2)

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

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

2020 4.14

人脸识别帧数太低的解决方法相关推荐

  1. 计算机性能低玩游戏卡顿,Win7电脑玩游戏很卡和FPS帧数太低的优化方法

    有些用户在Win7电脑上玩游戏,特别卡,游戏FPS帧数也很低,这很容易影响我们玩游戏的心情,我们要怎么来解决这个问题呢?关于在Win7电脑上玩游戏FPS帧数低的问题, 小编就给大家讲述一下解决方法,不 ...

  2. 电脑tdr太低是什么意思_电脑帧数变低是什么原因 电脑帧数变低解决方法

    有网友问电脑玩游戏很卡的情况,经过分析可能是网友的帧数很低造成电脑卡也是原因之一.可能在人多的地方就很卡.卡屏的情况,那么关于 电脑帧数变低 怎么办呢? 一般情况电脑配置没有达到要求可能会造成电脑玩哟 ...

  3. 计算机电源影响吗,电脑主机电源瓦数太低会不会影响显卡和处理器发挥最高性能?...

    电脑电源相当于人体的血液,为每一个硬件提供血液(供电),因此可见电源的重要性,它决定了电脑稳定性.不过装机用户在搭配电源的时候,就怕将电源的功率配小了.那么电脑主机电源瓦数太低会不会影响显卡和处理器发 ...

  4. 人脸识别经典算法一:特征脸方法(Eigenface)

    这篇文章是撸主要介绍人脸识别经典方法的第一篇,后续会有其他方法更新.特征脸方法基本是将人脸识别推向真正可用的第一种方法,了解一下还是很有必要的.特征脸用到的理论基础PCA在另一篇博客里:特征脸(Eig ...

  5. Unity3D占用内存太大的解决方法【先转,慢慢看】

    2019独角兽企业重金招聘Python工程师标准>>> Unity3D占用内存太大的解决方法 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unit ...

  6. STC管脚上电复位低电平解决方法

    STC管脚上电复位低电平解决方法 https://blog.csdn.net/firestarway/article/details/50275463 欢迎使用Markdown编辑器 你好! 这是你第 ...

  7. 车牌识别系统连接不到后台服务器,车牌识别系统的常见故障以及解决方法

    原标题:车牌识别系统的常见故障以及解决方法 车辆识别停车场系统的普及给我们的生活带来了极大的便利.当然我们在使用的过程的当中,也会遇到一些小问题.停车场系统厂家给我们整理了常见问题及解决方法: 一.显 ...

  8. Git仓库占用空间太大的解决方法

    Git仓库占用空间太大的解决方法 $ git gc $ git gc --aggressive $ git gc --auto Mac机的500G容量在一段时间后,快被撑满了,现在需要给Git本地库减 ...

  9. 人脸识别拷勤门禁主板_捷易讲解AI无感人脸识别考勤门禁终端设备在使用中的维护方法...

    人脸识别考勤门禁终端设备虽然在出厂时,都有做密封处理,但面对细小的灰尘,并没有做到百分百防尘.灰尘对于AI无感人脸识别考勤门禁终端设备是有一定的影响的,他会沉淀在主板上.屏幕上,影响设备散热和正常工作 ...

  10. 安卓 图像清晰度识别_智能车牌识别系统的常见故障和解决方法

    车牌号是车辆的唯一身份标志,它的特殊性与重要性从而决定了车牌识别系统在智慧城市交通管理系统中成为不可或缺的重要组成部分.下面智能车牌识别系统厂家畅荧智能科技将详细为您介绍一些智能车牌识别系统常见的故障 ...

最新文章

  1. MPB:农科院田健、韩东飞等-​​水稻根系互作功能微生物的筛选方法
  2. capistranorb
  3. 如何在Kubernetes上运行Apache Flink
  4. 《构建之法》阅读笔记二
  5. 去除PreferenceScreen过期提示
  6. 什么是数据建模_数据建模是什么意思
  7. 老路用得上的商学课-61-80学习(读书)笔记
  8. Docker部署Nebula Graph2.0和Studio
  9. String实现 intern
  10. CSS溢出文字使用省略号表示
  11. 记一次投票活动的感触
  12. easypanel面板搭建虚拟主机教程
  13. 分享:如何在线将两个PDF合并成一个
  14. 电脑主板线路连接图解_台式机电源线接法图解(电脑主板接线图解高清图)
  15. ubuntu9.10 添加bones7456源
  16. 一些浏览器HACKS
  17. 末日孤舰第三季/全集The Last Ship 迅雷下载
  18. IDEA 打开一片空白
  19. 服务器无线桥接怎么设置,高科路由器怎么设置无线中继 | 192路由网
  20. LabVIEW下载 安装 和谐 与卸载教程

热门文章

  1. java定义全局变量_java全局变量
  2. 笔记本 安装Linux系统
  3. c语言怎样处理lrc文件格式,lrc文件的一般格式是什么_教你如何打开lrc文件 - 驱动管家...
  4. 计算机一级证件照尺寸,照相馆不会告诉你的哪些事:常用证件照尺寸汇总
  5. 重磅消息集中来袭 A股再现“独立行情”?
  6. AS中NDK环境搭建
  7. 西安交通大学保研面试题
  8. 输入上下文句柄相关函数 linux,一起聊聊WSL的那些事儿(上)
  9. Android使用BottomNavigationView+NavigationUI报错
  10. win10 修改c盘用户文件夹名称