热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

人工智能_人工智能神经网络不训练检测模型,如何进行对象的检测与追踪?

篇首语:本文由编程笔记#小编为大家整理,主要介绍了人工智能神经网络不训练检测模型,如何进行对象的检测与追踪?相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了人工智能神经网络不训练检测模型,如何进行对象的检测与追踪?相关的知识,希望对你有一定的参考价值。




前面的文章,小编分享了很多关于目标检测与目标追踪的文章,且使用python方面的目标检测算法打造了自己的目标追踪专栏文章,小伙伴们可以参考


由于目标检测算法太大,需要大量的计算机的计算能力,在小型的应用场景中,使用YOLO系列,或者SSD对象检测(虽然SSD算法简单,模型较小),Fast-RCNN 等等对象检测算法,需要配备高计算能力的计算机,有没有简单的适合小型应用场景的目标检测与追踪算法??本期我们利用OpenCV的背景分割技术来实现。


背景分割技术


背景分割技术在许多计算机视觉应用十分常见,比如统计小区入门的车辆与人数量,商场进入人流量等等。这里我们将其用于运动检测与运行追踪上。


OpenCV中执行运动检测,跟踪和分析的方法很多。有些比较简单,还有一些比较复杂。但都是基于高斯混合模型的前景和背景分割技术的方式实现,我们采用基于贝叶斯(概率)的前景和背景分割技术。



目标检测


视频流的背景在很大程度上是 静态的,并且在视频的连续帧中保持不变,这里我们首先收集背景图片,在没有任何物体移动的情况下,把这张图片定义为背景。因此,如果我们可以对背景进行计算检测,则可以对其内部的移动物体进行监视。如果背景里面有移动物体的存在,我们可以检测到此运动物体,并实时进行物体的追踪。


显然在现实世界中,由于阴影,反射,照明条件以及环境中任何其他可能的变化,我们的背景在视频的各个帧中看起来可能完全不同。如果背景看起来不同,则可能会使我们的算法失效。这就是为什么最成功的背景减法/前景检测系统使用固定安装的摄像机并在可控制的照明条件下使用的原因。


背景分割技术,讲的明白一些就是收集背景图片,此图片作为参考图片,当有移动物体进入背景后,实时对当前视频帧图片与背景帧图片进行对比,进而检测出运动物体的存在,并实时进行追踪

人工智能神经网络不训练检测模型,如何进行对象的检测与追踪?



目标追踪


Python代码实现背景分割技术 import datetimeimport timeimport cv2vs = cv2.VideoCapture(0)time.sleep(2.0)firstFrame = None


首先,我们导入需要的第三方库,并打开笔记本的默认摄像头,定义第一帧,也是背景帧图片

人工智能神经网络不训练检测模型,如何进行对象的检测与追踪?



代码截图


摄像头打开后,默认会使用第一帧图片作为背景图片,当运行软件时,请先设置好摄像头的位置以及环境背景灯光等能够影响到背景的因素,避免后期计算产生错误的数据


while True: ret, frame = vs.read() text = "find nothing" if frame is None: break frame = cv2.resize(frame, (500, 600)) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur(gray, (21, 21), 0) if firstFrame is None: firstFrame = gray continue frameDelta = cv2.absdiff(firstFrame, gray) thresh = cv2.threshold(frameDelta, 25, 255, cv2.THRESH_BINARY)[1] thresh = cv2.dilate(thresh, None, iteratiOns=2) cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0]


视频打开后,loop整个视频帧


ret, frame = vs.read()为读取视频的一帧图片frame = cv2.resize(frame, (500, 600))这里对视频帧图片进行resize,避免后期大量的图片对比计算gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)转换图片到灰度空间gray = cv2.GaussianBlur(gray, (21, 21), 0)对图片进行高斯模糊,关于此函数,可以参考小编以前的文章


你是不是认为视频中的马赛克是后期添加的,这篇文章颠覆你的想象


frameDelta = cv2.absdiff(firstFrame, gray)然后计算前景图片与背景图片的差值thresh = cv2.threshold(frameDelta, 25, 255, cv2.THRESH_BINARY)[1]thresh = cv2.dilate(thresh, None, iteratiOns=2)


若差值小于25,我们认为此处没有要检测的物体,并把此处设置为黑色(即背景色),若差值大于25,我们认为此处存在要检测的物体,设置前景色为白色


cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)cnts = cnts[0]


前景一旦检测到后,便可以计算出前景的轮廓,并保存下来,以便后期处理

人工智能神经网络不训练检测模型,如何进行对象的检测与追踪?



代码截图


for c in cnts: if cv2.contourArea(c) <500: continue (x, y, w, h) = cv2.boundingRect(c) cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) text = "find something" cv2.putText(frame, "Status: {}".format(text), (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2) cv2.putText(frame, datetime.datetime.now().strftime("%A %d %B %Y %I:%M:%S%p"), (10, frame.shape[0] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 0, 255), 1) cv2.imshow("frame", frame) cv2.imshow("Thresh", thresh) cv2.imshow("Delta", frameDelta) key = cv2.waitKey(1) & 0xFF if key == ord("q"): breakvs.release()cv2.destroyAllWindows()


当检测到外轮廓后,遍历外轮廓,这里小于500的小型轮廓,我们忽略不计,然后画出图片box并实时同步到视频中,我们也同步查看一下计算过程中frameDelta与thresh的图像


cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)cv2.putText(frame, "Status: {}".format(text), (10, 20),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)cv2.putText(frame, datetime.datetime.now().strftime("%A %d %B %Y %I:%M:%S%p"),(10, frame.shape[0] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 0, 255), 1)cv2.imshow("frame", frame)


以上代码的具体含义,小编这里不再一一介绍,主要功能是画出box,添加文字,并显示图片

人工智能神经网络不训练检测模型,如何进行对象的检测与追踪?



代码截图


最后我们打开摄像头,看看实际运行的效果(我们的小编终于露脸了),从视频中可以看出,目标能够很好的检测,这里由于其他条件的限制,有个别失误的情况,所以要使用此方法,需要固定背景灯光,背景色,以及好的硬件设施等条件

人工智能神经网络不训练检测模型,如何进行对象的检测与追踪?



视频背景检测


opencv相关的函数来实现背景分割技术


opencv的MOG2背景分割器


import numpy as npimport cv2import timecap = cv2.VideoCapture(0)time.sleep(2.0)mog = cv2.createBackgroundSubtractorMOG2()while(1): ret, frame = cap.read() fgmask = mog.apply(frame) cv2.imshow('frame', fgmask) key = cv2.waitKey(1) & 0xFF if key == ord("q"): breakcap.release()cv2.destroyAllWindows()


使用opencv的MOG2背景分割器cv2.createBackgroundSubtractorMOG2()函数来实现背景分割技术

人工智能神经网络不训练检测模型,如何进行对象的检测与追踪?



代码截图


从视频中可以看出opencv的MOG2背景分割器自动优化背景,当某个背景一动不动的时候,默认是背景,当然我们以上的方法也可以实时的与上一帧的视频进行对比,进而实现opencv的MOG2背景分割器的效果



视频背景分割技术


当然opencv 还有KNN分割器目标检测,均值漂移(Meanshift)和CAMShift等众多背景分割技术,小伙伴们可以自行学习


本文转载自网易号【晓萱的娱乐】,更多内容请点击“阅读原文”


推荐阅读
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
author-avatar
tingting
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有