龙空技术网

66.人工智能——跨镜头单目标实时跟踪

UNET 469

前言:

眼前你们对“ct跟踪算法程序”可能比较注重,看官们都需要分析一些“ct跟踪算法程序”的相关文章。那么小编在网络上收集了一些关于“ct跟踪算法程序””的相关内容,希望小伙伴们能喜欢,兄弟们一起来学习一下吧!

在上一文中使用dlib实现视频流中的多目标跟踪,详情可以参看:65.人工智能——如何实现视频流中的多目标跟踪。这里感谢网友提出专业意见:如何实现换镜头也能实现目标追踪?

这里可以考虑使用PaddlePaddle的PP-Tracking来实现,PP-Tracking支持单镜头跟踪(MOT)和跨镜头跟踪(MTMCT)两种模式。详细可以参看官网。

本文主要使用目标检测来解决目标跟踪中的问题,最主要的问题就是跟踪目标丢失问题和置信度过低问题。如果是跨镜头的话,跟踪的目标肯定会出现丢失现象,这里如果发现目标丢失,就重新检测目标,直到跟踪目标出现,重新跟踪。

如果跟踪的目标置信度太低,我们也可以认为是目标跟踪丢失,这里也需要重新重新检测目标,直到跟踪目标出现,重新跟踪。

本文跟踪的目标是一个3D打印花瓶。为测试演示,做了一个测试视频。视频中间故意截断,人为制造切换镜头的效果。

bottle

视频加载中...

目标检测算法:

为了能实现快速目标检测,这里选择PP-PicoDet轻量级目标检测模型,具体可以参看:23.基于PP-PicoDet轻量级目标检测模型——实现目标检测项目。

实现的完整代码

import paddlex as pdximport osimport cv2import dlib#配置GPUos.environ["CUDA_VISIBLE_DEVICES"] = "0,1"#创建推理器predictor=pdx.deploy.Predictor("output/picodet-bottle/inference_model",use_gpu=True)videofile="img/bottle.mp4"#创建视频流cap=cv2.VideoCapture(videofile)#创建跟踪器tracker=dlib.correlation_tracker()isfirst=True #第一帧while cap.isOpened():    ret,frame=cap.read()        if not ret:        break        if isfirst:        #获取推理结果        result=predictor.predict(frame)        if len(result)>0:            res=result[0]["bbox"]            score=round(result[0]["score"],2)            name=result[0]["category"]            #获取检测框的坐标            if score>0.6: #只有当检测到目标时才进行跟踪                x1,y1,w,h=int(res[0]),int(res[1]),int(res[2]),int(res[3])                #print(x1,y1,w,h)                #初始化跟踪目标,                tracker.start_track(frame, dlib.rectangle(x1, y1, x1+w, y1+h))                isfirst=False            else: #当检测到的目标不符合要求时,重新开始跟踪                isfirst=True                score=0    else:        sc=tracker.update(frame) #返回置信度,值越大表示置信度越高        s=round(sc,2)        if sc<5: #当置信度小于5时,重新开始跟踪            isfirst=True            score=0        else: #当置信度大于6时,获取跟踪目标的坐标            #获取跟踪结果            box_pred=tracker.get_position()            #获取跟踪框的坐标,            x1,y1,x2,y2=int(box_pred.left()),int(box_pred.top()),int(box_pred.right()),int(box_pred.bottom())                        #绘制跟踪框            cv2.rectangle(frame,(x1,y1),(x2,y2),(0,0,255),2)            #写文字            cv2.putText(frame,name+"---"+str(s),(x1,y1),cv2.FONT_HERSHEY_SIMPLEX,0.6,(0,255,0),1)    #显示    cv2.imshow("Tracking",frame)        if cv2.waitKey(10)==27:        break    cap.release()cv2.destroyAllWindows()

实现效果视频:

视频加载中...

跟踪画面1

画面二

标签: #ct跟踪算法程序