基于Mask-rcnn的人流量统计

本文介绍了作者使用Mask-RCNN进行人流量统计的项目经验,包括遇到的问题、解决方案以及最终实现的思路。通过Mask-RCNN的高精度包围框,结合坐标判断进出人数,但存在无法区分相近人员的局限性,准确率约95%以上。代码能力有限,整个项目花费了一周时间,强调了坚持在解决问题中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这次是记录一下最近做的项目,要求是统计一些摄像头的人流量,有一些是旅游景点的视频,有些是安检口的视频,要求统计出in,out的人数。

一开始是找追踪算法,deep-sort,kcf等等,效果不太理想,然后用了百度ai的人流量统计,它的追踪做的不错,但是他的摄像头的角度和高度是固定的,用在我的视频上可能是因为角度的问题,准确率只有百分之六七十。然后试了试mask-rcnn,mask-rcnn的包围框的准确度很高,然后就想办法用这个来实现人流量的追踪。mask-rcnn的效果图如下。

我的想法大致就是通过框的左上角的坐标来判断,如上图,通过maskrcnn可以直接返给我每个人的左上角的坐标,然后我只要每张图在中间左右的坐标,上图是580x1040的大小,我只要x轴在500附近的点,然后通过这一帧的坐标和下一帧的坐标来判断,如果这一帧的x坐标是小于500,下一帧的大于500,我就认为这个人跨过去了,这里还有很大的bug,就是怎么判断maskrcnn所返回的坐标是否为同一个人,我的做法是看y坐标,因为连续2帧人的走动不可能太大,如果这一帧的y坐标和下一帧的y坐标相差太大,我就认为不是同一人,如果相差比较小,我就认为是同一个人,大致思想是这样,但是这种方法在不同的场景下肯定要自己动手调整的,就是没有泛化能力,但是每个这种监控摄像头都是固定了,所以调整一次就好,准确度还行,估计有95以上吧,有种情况会出错,就是两个人贴的太近,maskrcnn会检测为一个人,比如这段视频里有点对情侣抱着一起走,maskrcnn只能检测为一个人,emmmmmmmmmmmmm,还有78个人一个走过中间线的时候也会漏检。这个也只是一个最初的版本,所以应该还会有很多的漏洞。我的代码能力也比较差,差不多弄了一个星期来弄出来,前面也是各种试错,总结一下就是还是要坚持,因为在网上找没有什么可以直接套用的方法,就觉得网上都没有,我也不可能写出自己的方法吧,最后坚持的试着写了写,也算是达成一个小目标了,所以坚持很重要。下面贴代码,就是一些很简单的if判断。觉得适用的场景也比较少吧。

主要是基于maskrcnn的,我用的这个https://github.com/matterport/Mask_RCNN,基于这个代码修改的。

首先是改了samples/demp.ipynd ,改成了py形式,里面代码也小改,主要是该2个地方,一是改成只识别人,而是正常一份txt文档,一张图对应一个txt,里面记录的是每个人的左上角的左边,但是对于我上面的场景来说,我只要x坐标在5百附近的点。

# demp.py

import os
import sys
import random
import math
import numpy as np
import skimage.io
import matplotlib
import matplotlib.pyplot as plt
import time
import cv2
import re
import json

# Root directory of the project
ROOT_DIR = os.path.abspath("/data/Mask_RCNN/samples/")

# Import Mask RCNN
sys.path.append(ROOT_DIR)  # To find local version of the library
from mrcnn import utils
import mrcnn.model as modellib
from mrcnn import visualize
# Import COCO config
sys.path.append(os.path.join(ROOT_DIR, "samples/coco/"))  # To find local version
import coco

# %matplotlib inline

# Directory to save logs and trained model
MODEL_DIR = os.path.join(ROOT_DIR, "logs")

print("MODEL_DIR = " , MODEL_DIR)

# Local path to trained weights file
COCO_MODEL_PATH = os.path.join(ROOT_DIR, "mask_rcnn_coco.h5")
print("COCO_MODEL_PATH = ",COCO_MODEL_PATH)
#Download COCO trained weights from Releases if needed
if not os.path.exists(COCO_MODEL_PATH):
    utils.download_trained_weights(COCO_MODEL_PATH)

# Directory of images to run detection on
IMAGE_DIR = os.path.join(ROOT_DIR, "images")
print("IMAGE_DIR = ",IMAGE_DIR)

# Configurations

class InferenceConfig(coco.CocoConfig):
    # Set batch size to 1 since we'll be running inference on
    # one image at a time. Batch size = GPU_COUNT * IMAGES_PER_GPU
    GPU_COUNT = 1
    IMAGES_PER_GPU = 1

config = InferenceConfig()
config.display()

# Create Model and Load Trained Weights

# Create model object in inference mode.
model = modellib.MaskRCNN(mode="inference", model_dir=MODEL_DIR, config=config)

# Load weights trained on MS-COCO
model.load_weights(COCO_MODEL_PATH, by_name=True)

class_names = ['BG', 'person', 'bicycle', 'car', 'motorcycle', 'airplane',
               'bus', 'train', 'truck', 'boat', 'traffic light',
               'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird',
               'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear',
               'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie',
               'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball',
               'kite', 'baseball bat', 'baseball glove', 'skateboard',
               'surfboard', 'tennis r
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值