航拍无人机视角下车流量检测车流量多车型计数无人机车流检测yolov5
最近在研究告诉高速公路无人机航拍多车型车流量检测,分为car和bus,这里主要说一下遇到的问题以及想法,如有问题欢迎大家指正。
设计思路以及遇到的问题
第一步是完成物体(也就是车辆)的检测,这里有两种解决办法,第一种办法是使用opencv的形态学处理,比如背景消除、做帧差、膨胀腐蚀等等,这个办法比较基础,但是要处理好需要调整诸多细节,我的细节调整的不够好,因此实现时会遇到许多小问题。第二个办法是直接实现物体的识别,需要用到一定的训练模型,我测试过googlenet和yolo,最终选择了yolov5
第二步是追踪,这里用了deepsort追踪
第三步是计数,在CSDN 中找到一篇博文,提到的做法是建立一个类,每次出现新的目标就创建一个类,旧的目标就替换坐标,这个做法后来证实的确有效。但问题是如何判断这一帧的车辆是否新的目标,我给出的解决办法是创建一个列表,将第一帧的所有目标(也就是每一个对象)存入,第二帧的时候遍历每一个目标与列表的每一辆车,判断x,y的距离,如果变化不超过车的长度和宽度,就认为这是同一辆车(也有学长告诉为特征值匹配的办法,也许更可行,但我能力不够没有学到这里,所以没有采用)。
待检测视频链接:
航拍广东高速公路风景,飞机上看更震撼,美呆了!,旅游,旅途风光,好看视频航拍广东高速公路风景,飞机上看更震撼,美呆了!,本视频由客家人阿牛哥提供,751次播放,好看视频是由百度团队打造的集内涵和颜值于一身的专业短视频聚合平台https://haokan.baidu.com/v?pd=wisenatural&vid=9283681397163393174
补充:我发现了一个csdn大哥写的计数算法。直接拿来用了。效果很棒。完美解决航拍无人机车流量计数。
检测图:
效果图:
实现程序:
labelsPath = "./yolo-coco/coco.names"
LABELS = open(labelsPath).read().strip().split("\n")np.random.seed(42)
COLORS = np.random.randint(0, 255, size=(200, 3),dtype="uint8")weightsPath = "./yolo-coco/yolov5.weights"
configPath = "./yolo-coco/yolov5.cfg"net = cv2.dnn.readNetFromDarknet(configPath, weightsPath)
ln = net.getLayerNames()
ln = [ln[i - 1] for i in net.getUnconnectedOutLayers()]# ----------------------------------------------------------------------------------------------------------------------
"""
# cv2.VideoCapture() --- 里面参数如果地址,打开视频文件 --- 里面参数是0/1,打开摄像头
# 当参数是0的时候,打开计算机的内置摄像头,当参数为1的时候打开计算机的外置摄像头
# (W, H) = (None, None) --- 视频的宽度和高度,初始化视频编写器(writer)和帧尺寸
"""
# ----------------------------------------------------------------------------------------------------------------------vs = cv2.VideoCapture('./input/123.mp4')
(W, H) = (None, None)# ----------------------------------------------------------------------------------------------------------------------
"""
# try to determine the total number of frames in the video file
# 打开一个指向视频文件的文件指针,循环读取帧 --- 尝试确定视频文件中的总帧数(total),以便估计整个视频的处理时间;
# CV_CAP_PROP_FRAME_COUNT --- 视频的帧数
# 这里使用是处理视频的时候固定的过程,不必过度的纠结其使用 ---
# if imutils.is_cv2():
# prop = cv2.cv.CV_CAP_PROP_FRAME_COUNT
# else:
# prop = cv2.CAP_PROP_FRAME_COUNT
#
# vs.get(prop) --- cv2.VideoCapture.get(prop) --- 得到视频的总帧数
# print("[INFO] {} total frames in video".format(total)) --- 输出视频的帧数
"""
# ----------------------------------------------------------------------------------------------------------------------
try:prop = cv2.cv.CV_CAP_PROP_FRAME_COUNT if imutils.is_cv2() \else cv2.CAP_PROP_FRAME_COUNTtotal = int(vs.get(prop))print("[INFO] {} total frames in video".format(total))except:print("[INFO] could not determine # of frames in video")print("[INFO] no approx. completion time can be provided")total = -1while True:# ----------------------------------------------------------------------------------------------------------------------"""# cv2.VideoCapture.read() ---> 读取视频,在while中循环读取视频的frame# vs.read() ---> 得到两个参数,其中ret是布尔值,如果读取帧是正确的则返回True,# 如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。# 第一个参数为False的时候,if not grabbed --- True --- 循环结束,"""(grabbed, frame) = vs.read()if not grabbed:breakif W is None or H is None:(H, W) = frame.shape[:2]
项目下载:
python小目标识别航拍车流量检测统计航拍车辆计数yolov5-深度学习文档类资源-CSDN下载