基于YOLOv5+多目标跟踪的闯入识别python源码

作品简介


在地图上标记出禁区(多边形),用计算机视觉技术监控进入禁区的物体。

用到的技术有:

  • 目标检测(行人识别)
  • 多目标跟踪(MOT)

1. 点在多边形内

如果把行人用1个坐标点来表示,核心要做的是判断点是否在多边形(禁区)内。

如果禁区是简单的矩形,判断方法非常简单,用 x,y 坐标大小即可判断。

但如果禁区是复杂多边形,要怎么判断呢

这时候,我想到了 ChatGPT,它给出了一种射线法来判断

方法是,画一条以坐标点为起点的水平射线,射线与多边形的边交点个数为奇数个时,点在多边形内,偶数个时,点在多边形外。

def is_point_in_polygon(self, vertices, point):
    """
    判断点是否在多边形内

    :param vertices: 多边形顶点坐标列表 [(x1, y1), (x2, y2), ..., (xn, yn)]
    :param point: 需要判断的点坐标 (x, y)
    :return: True or False
    """
    n = len(vertices)
    inside = False

    p1x, p1y = vertices[0]
    for i in range(1, n + 1):
        p2x, p2y = vertices[i % n]
        if point[1] > min(p1y, p2y):
            if point[1] <= max(p1y, p2y):
                if point[0] <= max(p1x, p2x):
                    if p1y != p2y:
                        xints = (point[1] - p1y) * (p2x - p1x) / (p2y - p1y) + p1x
                    if p1x == p2x or point[0] <= xints:
                        inside = not inside
        p1x, p1y = p2x, p2y

    return inside

2. 人体识别

人体识别一般用目标检测模型,具体的方案也有很多,这里我用的是YOLOv5

YOLOv5使用预训练模型即可,当然你可以训练自己的模型,关于YOLOv5模型的训练,我在之前的文章里介绍过很多次,感兴趣的朋友可以自行查询。

这里也用 ChatGPT 生成了YOLOv5识别行人的代码,返回的结果比较啰嗦,代码量比我们自己写的要多很多,我没有直接用

3. 行人跟踪

多目标跟踪(MOT)我们之前也介绍过它的原理和各种方案的对比,这里也不再赘述了。

多目标跟踪的目的是可以给同一个行人打上唯一的标识,这样,我们就可以追踪到同一个人,方便做统计。

这里我用的是ByteTrack做多目标追踪,同样可以让ChatGPT代码







创作时间: