深度学习之SSD算法下的路径跟踪—Python

这篇博客发完意味着我已经毕业了,这可能是我最后一次发有关深度学习的图像识别的博客了,之前看过有人做过小球路径的跟踪,所以就仿照小球路径跟踪做了一个船舶路径跟踪,有不足之处还请大虾们多多包涵哈。
我主要是用python写的,因为比较好学嘛,下面进入正题。路径追踪包含两点,一点就是物体识别,另一点就是路径提取。物体识别模块我通过水网上的SSD代码,已经实现并且进行了细微改进了。本次博客就不对物体识别进行多余的描述了,网上有很多资源可供参考。下面主要介绍路径跟踪,路径跟踪说白了就是提取关键点,然后在放回去,由点成线嘛,然后就有了。

动态船舶路径关键点提取

在视频流送入改进SSD路径检测系统后,视频流的每一帧图片先进入改进SSD识别模型进行识别,随后返回真实框以及相应的坐标,通过真实框的坐标可以获取框的中心点的位置如图所示:
在这里插入图片描述

由图可知,可以通过真实框的两个点坐标算出中心坐标Center,如式所示:

在这里插入图片描述
系统获取视频流后,将视频流输入到改进SSD框架,在由框架输出含有真实框的船舶检测结果的每一帧图片,随后对每一帧图片进行路径关键点提取,从而得到不同时间段的路径关键点图片,然后在将这些关键点存储起来,依次对应输出,从而生成船舶的运动路径。
SSD算法的实现以及改进我就不说了,网上有很多的资源可供参考,我是在demotest里面进行了修改,并增加了路径跟踪模块。由于本人比较懒,且我做的时二分类,即识别船舶和背景,所以未在检测框中调用visualization.py这个文件,所以检测结果的框中不含有障碍物名称。

下面贴出跟踪模块代码:

代码中的调试我就不删了啊,不然代码看起来太少了,哈哈。。。。。

def track_s(img,xx1,xx2,yy1,yy2):
import time

qwe = time.time()
counter =0

center = (yy1 + ((yy2 - yy1) // 2), xx1 + ((xx2 - xx1) // 2))
# print(center)
pts.append(center)

# #
for ii in range(0,len(pts)):
    # print(ii)
    # if pts[ii - 1] is None or pts[ii] is None:
    #     continue
    # if counter >= 10 and ii == 1 and pts[-10] is not None:
    #     # compute the difference between the x and y
    #     # coordinates and re-initialize the direction
    #     # text variables
    #     dxx = pts[-10][0] - pts[ii][0]
    #     dyy = pts[-10][1] - pts[ii][1]
    #     (dirxx, diryy) = ("", "")
    #
    #     # ensure there is significant movement in the
    #     # x-direction
    #     if np.abs(dxx) > 20:
    #         dirxx = "East" if np.sign(dxx) == 1 else "West"
    #
    #     # ensure there is significant movement in the
    #     # y-direction
    #     if np.abs(dyy) > 20:
    #         diryy = "North" if np.sign(dyy) == 1 else "South"
    #
    #     # handle when both directions are non-empty
    #     if dirxx != "" and diryy != "":
    #         direction = "{}-{}".format(diryy, dirxx)
    #
    #     # otherwise, only one direction is non-empty
    #     else:
    #         direction = dirxx if dirxx != "" else diryy


    thickness = 20
    cv2.line(img, pts[ii], pts[ii - 1], (0, 0, 255), thickness)
    # counter += 1
#
# cv2.imshow("img",img)
# counter += 1
# cv2.imshow("img",img)
# cv2.waitKey(0)

下面是主模块调用代码:

def bboxes_draw_on_img(img, classes, scores, bboxes, colors, thickness=20):
shape = img.shape
pts = deque(maxlen=256)
for i in range(bboxes.shape[0]):
    bbox = bboxes[i]
    color = colors[classes[i]]
    # Draw bounding box...

    xx1=int(bbox[0] * shape[0])
    yy1=int(bbox[1] * shape[1])
    xx2=int(bbox[2] * shape[0])
    yy2=int(bbox[3] * shape[1])

    p1 = (xx1, yy1)
    p2 = (xx2, yy2)
    cv2.rectangle(img, (yy1,xx1),(yy2,xx2), color, thickness)


    track_s(img,xx1,xx2,yy1,yy2)
    # Draw text...
    s = '%s/%.3f' % (l_VOC_CLASS[int(classes[i]) - 1], scores[i])
    p1 = (p1[0] - 5, p1[1])
    # cv2.putText(img, s, p1[::-1], cv2.FONT_HERSHEY_DUPLEX, 1.5, color, 3)

我使用的是Carver C43 Coupe Running Video的网上离线视频做的检测,有条件的也可以使用网络摄像头来做。至于水印嘛就没去除了,在网上找了好久带水印的太多了,就凑合用吧。
下面贴上gift图片,我是用剪辑大师导出的图片居然也带水印,泪崩。。。

在这里插入图片描述

一起开启新世界的大门吧😊

Logo

更多推荐