位置: IT常识 - 正文

计算机视觉项目-实时目标追踪(计算机视觉项目队友只让你打标签是什么意思)

编辑:rootadmin
计算机视觉项目-实时目标追踪

推荐整理分享计算机视觉项目-实时目标追踪(计算机视觉项目队友只让你打标签是什么意思),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:计算机视觉项目怎么找,计算机视觉项目实战,计算机视觉项目队友只让你打标签是什么意思,计算机视觉项目推荐,计算机视觉项目推荐,计算机视觉项目推荐,计算机视觉项目实战,计算机视觉项目实战,内容如对您有帮助,希望把文章链接给更多的朋友!

😊😊😊欢迎来到本博客😊😊😊 本次博客内容将继续讲解关于OpenCV的相关知识 🎉作者简介:⭐️⭐️⭐️目前计算机研究生在读。主要研究方向是人工智能和群智能算法方向。目前熟悉深度学习(keras、pytorch、yolo系列),python网页爬虫、机器学习、计算机视觉(OpenCV)、群智能算法。然后正在学习深度学习的相关内容。以后可能会涉及到网络安全相关领域,毕竟这是每一个学习计算机的梦想嘛! 📝目前更新:🌟🌟🌟目前已经更新了关于网络爬虫的相关知识、机器学习的相关知识、目前正在更新计算机视觉-OpenCV的相关内容。 💛💛💛本文摘要💛💛💛

本文我们将继续讲解计算机视觉项目-目标实时追踪的相关操作。

文章目录🌟项目前言🌟项目详解🌟项目深究

🌟项目前言

目标追踪技术对于民生、社会的发展以及国家军事能力的壮大都具有重要的意义。它不仅仅可以应用到体育赛事当中目标的捕捉,还可以应用到交通上,比如实时监测车辆是否超速等!对于国家的军事也具有一定的意义,比如说导弹识别目标等方向。所以说实时目标追踪技术对于整个社会来说都是非常重要的!目前被应用的比较多的,而且效果较好的是YOLO系列,目前已经更新到了YOLO7。原作者更新到了YOLO3之后就不再更新YOLO这个系列了,因为被一些不法人员应用到了军事上,给民众要造成了一定的伤害!但是依旧没有阻挡住YOLO的发展。但是我们提出来的这个是基于计算机视觉的,那么为什么有了YOLO这么好的东西我们还要基于计算机视觉来做呢?因为YOLO训练的模型占用的内存一般不小,这就会影响了一些东西的使用,比如说摄像头!就没有办法有这么大的内存来存储,所以还需要一些不需要那么大内存的东西来去实时跟踪目标!

🌟项目详解

首先我们来根据代码来讲解一下如何追踪实时物体! 首先我们导入库和配置参数,对于参数的配置。我们需要在参数框架上输入--video videos/nascar.mp4 --tracker kcf。表示的意思就是我们导入的视频是nascar.mp4,然后用kcf这个框架来干活。

import argparseimport timeimport cv2import numpy as np# 配置参数ap = argparse.ArgumentParser()ap.add_argument("-v", "--video", type=str,help="path to input video file")ap.add_argument("-t", "--tracker", type=str, default="kcf",help="OpenCV object tracker type")args = vars(ap.parse_args())

然后我们写一些OpenCV已经有的算法。

OPENCV_OBJECT_TRACKERS = {"csrt": cv2.legacy.TrackerCSRT_create,"kcf": cv2.legacy.TrackerKCF_create,"boosting": cv2.legacy.TrackerBoosting_create,"mil": cv2.legacy.TrackerMIL_create,"tld": cv2.legacy.TrackerTLD_create,"medianflow": cv2.legacy.TrackerMedianFlow_create,"mosse": cv2.legacy.TrackerMOSSE_create}

这里注意一定要按照这个来写。其他的由于版本问题,可能会有问题。对于新老版本是不一样的。 然后我们建立多个追踪器。并且开始读入视频数据。这里的trackers就是我们需要建立的多目标追踪器。

trackers = cv2.legacy.MultiTracker_create()vs = cv2.VideoCapture(args["video"])

这里我们取出来视频中的每一帧,然后视频结束了就直接结束。对于每一帧我们都要做一个操作就是同比例处理图像。

while True:# 取当前帧frame = vs.read()# (true, data)frame = frame[1]if frame is None:break# resize每一帧(h, w) = frame.shape[:2]width=600r = width / float(w)dim = (width, int(h * r))frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)

对于追踪结果来说,我们需要每一帧每一帧的进行更新框框。因为物体在运动,所以我们也要更新框框。

(success, boxes) = trackers.update(frame)for box in boxes:(x, y, w, h) = [int(v) for v in box]cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

对于每一个框框我们在更新的时候我们都要绘制出来!

cv2.imshow("Frame", frame)key = cv2.waitKey(100) & 0xFF

然后将框框展示出来。cv2.waitKey(100)这个部分100可以改成其他的这里可以调节视频的快慢。

if key == ord("s"):# 选择一个区域,按sbox = cv2.selectROI("Frame", frame, fromCenter=False,showCrosshair=True)

如果我们按下S键,然后我们就可以手动的框出来ROI区域了。

tracker = OPENCV_OBJECT_TRACKERS[args["tracker"]]()#创建一个追踪器 添加追踪器trackers.add(tracker, frame, box)

这里创建出来追踪器,然后添加上。

elif key == 27:breakvs.release()cv2.destroyAllWindows()

最后退出。 可以手动的任意追踪目标!!!完美!!! 追踪效果总体来说还是不错的!

🌟项目深究

然后又继续做了一个多目标自动识别目标追踪。这里我们以运动员短跑为案例继续来讲解。

计算机视觉项目-实时目标追踪(计算机视觉项目队友只让你打标签是什么意思)

这里面我们导入库和第三方参数。

from utils import FPSimport numpy as npimport argparseimport dlibimport cv2ap = argparse.ArgumentParser()ap.add_argument("-p", "--prototxt", required=True,help="path to Caffe 'deploy' prototxt file")ap.add_argument("-m", "--model", required=True,help="path to Caffe pre-trained model")ap.add_argument("-v", "--video", required=True,help="path to input video file")ap.add_argument("-o", "--output", type=str,help="path to optional output video file")ap.add_argument("-c", "--confidence", type=float, default=0.2,help="minimum probability to filter weak detections")args = vars(ap.parse_args())

其中参数导入的话是这样:

--prototxt mobilenet_ssd/MobileNetSSD_deploy.prototxt --model mobilenet_ssd/MobileNetSSD_deploy.caffemodel --video race.mp4--model mobilenet_ssd/MobileNetSSD_deploy.caffemodel --video race.mp4

把这段代码直接复制粘贴到参数配置当中就好。 然后我们建立一些分类标签,看看计算机到时候框出来的很多很多框框都属于什么东西,然后我们进行过滤操作。

CLASSES = ["background", "aeroplane", "bicycle", "bird", "boat","bottle", "bus", "car", "cat", "chair", "cow", "diningtable","dog", "horse", "motorbike", "person", "pottedplant", "sheep","sofa", "train", "tvmonitor"]

读取网络模型。

print("[INFO] loading model...")net = cv2.dnn.readNetFromCaffe(args["prototxt"], args["model"])

其中cv2.dnn.readNetFromCaffe(prototxt, model) 用于进行SSD网络的caffe框架的加载 参数说明:prototxt表示caffe网络的结构文本,model表示已经训练好的参数结果把视频读入进来。

print("[INFO] starting video stream...")vs = cv2.VideoCapture(args["video"])writer = Nonetrackers = []labels = []fps = FPS().start()

这里我们设置两个列表,等会来添加追踪器和标签信息。并且计算一下视频的fps数值。fps也就是一秒钟计算机可以处理多少帧图像。

while True:# 读取一帧(grabbed, frame) = vs.read()# 是否是最后了if frame is None:break# 预处理操作(h, w) = frame.shape[:2]width=600r = width / float(w)dim = (width, int(h * r))frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

在这里面和上面一样同样也要同比例放大或者缩小每一帧图像。然后有一个重要操作,就是一定要将BGR图像通道改成RGB通道顺序。

if args["output"] is not None and writer is None:fourcc = cv2.VideoWriter_fourcc(*"MJPG")writer = cv2.VideoWriter(args["output"], fourcc, 30,(frame.shape[1], frame.shape[0]), True)

这里是保存数据,如果output这个文件夹是空的并且writer也是空的,那么我们将实时视频保存下来。这个就涉及到了视频保存的代码,有需要的可以自行提取。

if len(trackers) == 0:# 获取blob数据(h, w) = frame.shape[:2]blob = cv2.dnn.blobFromImage(frame, 0.007843, (w, h), 127.5)

cv2.dnn.blobFromImage主要是对图像进行一个预处理,其中0.007843表示各通道数值的缩放比例。127.5表示各个通道减去的均值。

net.setInput(blob)detections = net.forward()

这里面把预处理的图像输入到了模型的输入当中,然后进行了一次前向传播。这里面我们就得到了很多的检测框框了。

for i in np.arange(0, detections.shape[2]):# 能检测到多个结果,只保留概率高的confidence = detections[0, 0, i, 2]# 过滤if confidence > args["confidence"]:# extract the index of the class label from the# detections listidx = int(detections[0, 0, i, 1])label = CLASSES[idx]# 只保留人的if CLASSES[idx] != "person":continue

这里面在前向传播当中,我们得到一些概率值较大的,这里怎么定义较大呢,用args["confidence"]这个数值来定义,如果大于我们设定的概率数值,我们就把他的索引拿出来,然后取出来对应的标签,如果不是人的话我们就过滤除去,最后留下这一帧图像当中所有检测到的人。

box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])(startX, startY, endX, endY) = box.astype("int")

这里面就是我们要得到这个框框,然后拿到这个框框的左上角和右下角坐标。

t = dlib.correlation_tracker()rect = dlib.rectangle(int(startX), int(startY), int(endX), int(endY))t.start_track(rgb, rect)

然后我们创建一个追踪器,然后得到检测到的框框,然后开始追踪,追踪的时候按照rgb,并且在第一帧图像的时候开始追踪。

labels.append(label)trackers.append(t)

然后添加人的标签,并且添加多个追踪器,因为不仅仅一个目标。

cv2.rectangle(frame, (startX, startY), (endX, endY),(0, 255, 0), 2)cv2.putText(frame, label, (startX, startY - 15),cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 255, 0), 2)

然后我们把框画出来,并且把标签贴上去。都是人的标签。

else: for (t, l) in zip(trackers, labels):t.update(rgb)#更新追踪器pos = t.get_position()#获得位置# 得到位置startX = int(pos.left())startY = int(pos.top())endX = int(pos.right())endY = int(pos.bottom())

如果检测到框框了,那么就我们遍历一下追踪器和标签,然后更新追踪器,并且获得追踪器的位置。并且得到位置。

if writer is not None:writer.write(frame)# 显示cv2.imshow("Frame", frame)key = cv2.waitKey(1) & 0xFF# 退出if key == 27:break# 计算FPSfps.update()fps.stop()print("[INFO] elapsed time: {:.2f}".format(fps.elapsed()))print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))if writer is not None:writer.release()cv2.destroyAllWindows()vs.release()

后面这些就是一些退出的一些简单的操作了。 FPS就是表示一秒钟可以处理17帧图片。运行时间是大概有20秒。然后我们想法就是继续进行一下改进,让处理的快一些。那么我们想到的就是使用多线程进行操作。多线程是指从软件或者硬件上实现多个线程并发执行的技术。 然后我们使用多线程进行改进程序:这里主函数就是要加上多线程。

if __name__ == '__main__':while True:(grabbed, frame) = vs.read()if frame is None:break(h, w) = frame.shape[:2]width=600r = width / float(w)dim = (width, int(h * r))frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)#深度学习必要要处理的部分if args["output"] is not None and writer is None:fourcc = cv2.VideoWriter_fourcc(*"MJPG")writer = cv2.VideoWriter(args["output"], fourcc, 30,(frame.shape[1], frame.shape[0]), True)#首先检测位置if len(inputQueues) == 0:(h, w) = frame.shape[:2]blob = cv2.dnn.blobFromImage(frame, 0.007843, (w, h), 127.5)#图像的预处理操作 详情看笔记net.setInput(blob)detections = net.forward()#输出追踪 因为是多个 所以我们下方要进行过滤for i in np.arange(0, detections.shape[2]): #检测了多少个模型confidence = detections[0, 0, i, 2]#置信度 这里我们可以理解为每一个模型对应CLASS的概率 然后选出来一个最高的if confidence > args["confidence"]:idx = int(detections[0, 0, i, 1])#表示CLASS的类别序号label = CLASSES[idx]#选出来if CLASSES[idx] != "person":#过滤掉除了人以外所有的追踪目标continuebox = detections[0, 0, i, 3:7] * np.array([w, h, w, h])#这里标记处框架 这里表示按照长宽背书来定义(startX, startY, endX, endY) = box.astype("int")bb = (startX, startY, endX, endY)# 创建输入q和输出qiq = multiprocessing.Queue()#定义多进程oq = multiprocessing.Queue()inputQueues.append(iq)outputQueues.append(oq)# 多核p = multiprocessing.Process(#八所有追踪器放进进程当中,本电脑为8核 12核会更快target=start_tracker,args=(bb, label, rgb, iq, oq))p.daemon = Truep.start()cv2.rectangle(frame, (startX, startY), (endX, endY),(0, 255, 0), 2)cv2.putText(frame, label, (startX, startY - 15),cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 255, 0), 2)else:# 多个追踪器处理的都是相同输入for iq in inputQueues:iq.put(rgb)for oq in outputQueues:# 得到更新结果(label, (startX, startY, endX, endY)) = oq.get()# 绘图cv2.rectangle(frame, (startX, startY), (endX, endY),(0, 255, 0), 2)cv2.putText(frame, label, (startX, startY - 15),cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 255, 0), 2)if writer is not None:writer.write(frame)cv2.imshow("Frame", frame)key = cv2.waitKey(1) & 0xFFif key == 27:breakfps.update()fps.stop()print("[INFO] elapsed time: {:.2f}".format(fps.elapsed()))print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))if writer is not None:writer.release()cv2.destroyAllWindows()vs.release()

这里就是5个线程一起跑。一秒钟可以处理24帧图像,运行时间14秒。大大的改进整体的进程。

🔎支持:🎁🎁🎁如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦!这就是给予我最大的支持!

本文链接地址:https://www.jiuchutong.com/zhishi/300305.html 转载请保留说明!

上一篇:【前端】图片懒加载的原理和三种实现方式(前端image)

下一篇:unplugin-auto-import的使用(unplugin-auto-import github)

  • 支付宝心愿储蓄的钱怎么取出来(支付宝心愿储蓄扣款失败能否手动转入)

    支付宝心愿储蓄的钱怎么取出来(支付宝心愿储蓄扣款失败能否手动转入)

  • 如何彻底退出微信群(如何彻底退出微信群并不被拉回)

    如何彻底退出微信群(如何彻底退出微信群并不被拉回)

  • 联想电脑系统恢复,快捷键是什么(联想电脑系统恢复工具)

    联想电脑系统恢复,快捷键是什么(联想电脑系统恢复工具)

  • 双十一是天猫还是淘宝(双十一天猫还是京东优惠大)

    双十一是天猫还是淘宝(双十一天猫还是京东优惠大)

  • 华为手环4支持nfc功能吗(华为手环4支持微信支付吗)

    华为手环4支持nfc功能吗(华为手环4支持微信支付吗)

  • 计算机中应用最普遍的字符编码是(计算机中应用最普遍的字符编码是ascii码)

    计算机中应用最普遍的字符编码是(计算机中应用最普遍的字符编码是ascii码)

  • ddr2内存条最大容量(ddr 2内存)

    ddr2内存条最大容量(ddr 2内存)

  • 抖音极速版可以发私信吗(抖音极速版可以赚钱吗)

    抖音极速版可以发私信吗(抖音极速版可以赚钱吗)

  • 苹果id更新设置是什么意思(苹果id更新设置必须更新吗)

    苹果id更新设置是什么意思(苹果id更新设置必须更新吗)

  • 为什么软件下载后不在手机上显示(为什么软件下载到d盘,c盘内存减少了呢)

    为什么软件下载后不在手机上显示(为什么软件下载到d盘,c盘内存减少了呢)

  • 2mbps是多少网速(472mbps是多少网速)

    2mbps是多少网速(472mbps是多少网速)

  • 抖音注销后身份证可以绑定其他号嘛(抖音注销后身份信息还可以用吗)

    抖音注销后身份证可以绑定其他号嘛(抖音注销后身份信息还可以用吗)

  • 双十一退货红包能退吗(双十一退货红包怎么办)

    双十一退货红包能退吗(双十一退货红包怎么办)

  • qq号如何注册为微信号(qq注册帐号怎么弄)

    qq号如何注册为微信号(qq注册帐号怎么弄)

  • 如何让表头出现在每一页(如何让表头出现在打印的每一页)

    如何让表头出现在每一页(如何让表头出现在打印的每一页)

  • iphone8如何横屏玩(iphone8怎么设置横竖屏)

    iphone8如何横屏玩(iphone8怎么设置横竖屏)

  • 手机怎么整体缩小图片尺寸(手机怎么整体缩小图片尺寸不裁剪)

    手机怎么整体缩小图片尺寸(手机怎么整体缩小图片尺寸不裁剪)

  • iphonex和iphone11pro屏幕大小一样吗(iphonex和iphone11pro哪个好)

    iphonex和iphone11pro屏幕大小一样吗(iphonex和iphone11pro哪个好)

  • 小米手环4怎么坐公交(小米手环4怎么绑定手机)

    小米手环4怎么坐公交(小米手环4怎么绑定手机)

  • 信用借还怎么解约(信用借还怎么解约,支付宝额度被栋结怎么解除)

    信用借还怎么解约(信用借还怎么解约,支付宝额度被栋结怎么解除)

  • 电脑屏幕开不了怎么回事(电脑屏幕开不了机怎么办?如何解决?)

    电脑屏幕开不了怎么回事(电脑屏幕开不了机怎么办?如何解决?)

  • 小米手环4和小米手环4nfc的区别(小米手环4和小米手环6)

    小米手环4和小米手环4nfc的区别(小米手环4和小米手环6)

  • 拼多多订单删除了怎么恢复(拼多多订单删除了拼小圈还能看到吗)

    拼多多订单删除了怎么恢复(拼多多订单删除了拼小圈还能看到吗)

  • webview实现有什么用(webview使用方法)

    webview实现有什么用(webview使用方法)

  • 5g的g是什么意思(1g2g3g4g5g的g是什么意思)

    5g的g是什么意思(1g2g3g4g5g的g是什么意思)

  • 应用软件开发有什么流程(应用软件开发有什么职业)

    应用软件开发有什么流程(应用软件开发有什么职业)

  • 织梦dedecms上下篇文章标题长度修改(织梦怎么新建页面)

    织梦dedecms上下篇文章标题长度修改(织梦怎么新建页面)

  • 个税申报的收入是应发还是实发
  • 2023小规模纳税人所得税税收优惠政策
  • 应交增值税一般纳税人的账怎么做
  • 可以抵扣的进项税额是什么意思
  • 个人所得税退的多好还是少好
  • 开票软件服务费全额抵扣怎么做账
  • 火车票增值税申报表怎么填
  • 房地产公司环境
  • 工会差旅费如何做账
  • 合并财务报表内部固定资产交易的抵消
  • 科研项目间接费用会计分录
  • 公司车辆出售给个人怎么做账
  • 车辆保险赔款怎么入账
  • 应交税金审计
  • 公司前期没有收入开支怎么记账
  • 小微企业企业税率表
  • 预付账款可以用应付账款借方
  • 应交税费借方余额填列资产负债表
  • 所得税费用一年交几次
  • 已发货未开票的货物需要结转成本吗
  • 增值税专用发票查询系统官方网站
  • 收到货款发票怎么记账
  • 商贸公司如何结算成本
  • 发票冲红怎么开具
  • 贷款本息转本金
  • 适用于初学者的美得理电子琴
  • linux系统的介绍
  • 基本工程建设项目清单
  • 现金被盗计入什么科目
  • zhp.exe是什么进程
  • 修建污水处理厂施工方案包括哪些内容
  • 梅林澳大利亚信号好最好吗
  • 差旅费报销会计处理
  • 内外参标定
  • gpt 中文
  • 机器视觉 machine
  • 四轮电车电机价格
  • resize2fs命令 同步文件系统容量到内核
  • php实现定时器
  • python如何提取字典中的键
  • java是什么意思
  • 不缴纳增值税
  • flex:4
  • 其他权益工具投资是什么意思
  • 自然人独资可以变更为有限责任公司
  • php __get()
  • 抵扣联怎么抵扣使用
  • 水运企业会计核算办法
  • sqlserver阻止保存要求重新
  • SQL server 2008中的数据库能否只包含数据文件
  • 建设单位罚款
  • 免征增值税的会计处理一般纳税人
  • 什么是品种法?适用于什么范围?
  • 投资性房地产转为非投资性房地产
  • 税控服务费如何入账
  • 应收应付核销的会计科目
  • 制造费用如何控制
  • 已抵扣的进项税额转出怎么做会计分录
  • 未认证的发票如何进项税转出
  • 银行汇票结算程序有哪些
  • 银行汇票如何兑现金
  • 会计净资产计算公式
  • 产成品核算的内容
  • mysql删除方法
  • ubuntu桌面右键
  • mac系统 硬盘
  • windows8开机蓝屏
  • windows1021h2更新
  • winxp0000007b修复
  • linux cp命令怎么用
  • windows7basic怎么改
  • 电脑开机显示微信号怎么回事
  • [视频大小超过限制,无法查看]怎么打开
  • HttpURLConnection连接 详解
  • 源码分析工具
  • js测试工具
  • 公司开票限额怎么增加
  • 上海税务开户
  • 国家税务总局16号文件
  • 养老专业在职研究生好吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设