基于yolov3的行人目标检测算法在图像和视频中识别检测(代码片段)

biyezuopin biyezuopin     2023-03-31     661

关键词:

资源下载地址:https://download.csdn.net/download/sheziqiong/85772186
资源下载地址:https://download.csdn.net/download/sheziqiong/85772186

主要功能介绍

本项目设计并实现了基于 yolov3 的行人目标检测算法,并将该目标检测算法应用在图像和视频的识别检测之中。

实现的主要功能有:

  • 对静态图像 (jpg、png) 中的行人进行识别,并框选出行人目标所在位置
  • 对视频文件中的行人进行逐帧检测,并生成标记出行人位置的视频文件
  • 对流媒体(rtsp、rtmp 协议)进行处理和分析,实时标记行人位置,可用于对监控视频流的处理

设计思路和实现方法

  • yolov3 目标检测算法的改进

  • 对静态图像中的行人进行识别

    • 项目封装了 python 函数 detection_person 用于处理静态图像,函数接口传入参数 image_path 指向待处理图像路径

    • 图像的读入和处理,使用 openCV 框架进行处理,使用 cv2.imread 函数将图像从硬盘读入内存,并使用 cv2.dnn.readNet 读入之前预训练的模型

    • 之后,将将输入的检测特征图转换成二维张量,并将网络前向传播

      blob = cv2.dnn.blobFromImage(image, 1 / 255.0, (416, 416),
      swapRB=True, crop=False)
      net.setInput(blob)
      start = time.time()
      layerOutputs = net.forward(ln)
      end = time.time()
      

      使用目标分数阈值,对输出结果进行处理,保证检测进度,提高准确性

              for detection in output:
                  scores = detection[5:]
                  classID = np.argmax(scores)
      
                  if confidence > 0.7:  # 目标分数阈值
                      # scale the bounding box coordinates back relative to the
                      # size of the image, keeping in mind that YOLO actually
                      # returns the center (x, y)-coordinates of the bounding
                      # box followed by the boxes' width and height
                      box = detection[0:4] * np.array([W, H, W, H])
                      (centerX, centerY, width, height) = box.astype("int")
      
                      # use the center (x, y)-coordinates to derive the top and
                      # and left corner of the bounding box
                      x = int(centerX - (width / 2))
                      y = int(centerY - (height / 2))
      
                      # update our list of bounding box coordinates, confidences,
                      # and class IDs
                      boxes.append([x, y, int(width), int(height)])
                      confidences.append(float(confidence))
                      classIDs.append(classID)
      

      使用非最大抑制,防止为同一个行人目标对象标记多个邻近的位置

      idxs = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.3)
      

      并将目标对象的范围为绘制在图像上:

      (x, y) = (boxes[i][0], boxes[i][1])
      (w, h) = (boxes[i][2], boxes[i][3])
      
      # draw a bounding box rectangle and label on the image
      color = [int(c) for c in COLORS[classIDs[i]]]
      cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)
      text = ": :.4f".format(LABELS[classIDs[i]], confidences[i])
      cv2.putText(image, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX,
      0.5, color, 2)
      
    • 最后将生成的检测结果保存到返回,或输出到硬盘中

      #cv2.imshow("Image", image)
      if return_type == "path":
          outpath = image_path[0:image_path.rfind('.')] + "_out" + image_path[image_path.rfind('.'):]
          #print(outpath)
          cv2.imwrite(outpath, image)
          return outpath
      elif return_type == "img":
          return image
      
  • 对视频文件中的行人目标进行识别

    • 使用 cv2.VideoCapture 方法,加载待处理的视频对象,并使用 vs.read() 方法,逐帧获取图像内容

    • 初始化视频写入对象

      fourcc = cv2.VideoWriter_fourcc(*"mp4v")
      writer = cv2.VideoWriter(args["output"], fourcc, 30,(frame.shape[1],frame.shape[0]), True)
      
    • 处理完成一帧之后,将帧内容写入视频文件当中

      writer.write(frame)
      print(f"[Process] frame id: frameid")
      elap = (end - start)
      print("[INFO] single frame took :.4f seconds".format(elap))
      frameid += 1
      
  • 对流媒体内容进行处理和分析

    • 使用 cv2.VideoCapture 进行流媒体输入的读取

      rtscap = RTSCapture.create("rtsp://127.0.0.1:8554/live1.h264")
          rtscap.start_read()  # 启动子线程并改变 read_latest_frame 的指向
      
          while rtscap.isStarted():
              ok, frame = rtscap.read_latest_frame()  # read_latest_frame() 替代 read()
              if not ok:
                  if cv2.waitKey(100) & 0xFF == ord('q'): break
                  continue
      
              # 帧处理代码
              yolo.detection_person_img(frame, tiny=True)
              cv2.imshow("cam", frame)
      
              if cv2.waitKey(100) & 0xFF == ord('q'):
                  break
      
    • 经过测试 cv2.VideoCaptureread 函数并不能获取实时流的最新帧,而是按照内部缓冲区中顺序逐帧的读取,opencv 会每过一段时间清空一次缓冲区。但是清空的时机并不是我们能够控制的,因此如果对视频帧的处理速度如果跟不上接受速度那么每过一段时间,在播放时时会看到画面突然花屏,甚至程序直接崩溃

    • 因此,本项目使用一个临时变量作为缓存,然后开启一个线程读取最新帧保存到缓存里,读取的时候只返回最新的一帧。读取时自动丢弃一些视频帧,防止处理速度跟不上输入速度。而导致程序崩溃或者后续视频画面花屏。

      rtscap = RTSCapture(url)
              rtscap.frame_receiver = threading.Thread(target=rtscap.recv_frame, daemon=True)
              rtscap.schemes.extend(schemes)
              if isinstance(url, str) and url.startswith(tuple(rtscap.schemes)):
                  rtscap._reading = True
      

开发和运行环境

  • 开发环境:PyCharm 2019.3.4 (Professional Edition)
  • 操作系统:Linux 4.15.0-30deepin-generic #31 SMP Fri Nov 30 04:29:02 UTC 2018 x86_64 GNU/Linux
  • python 版本:Python 3.7.7 (default, Mar 26 2020, 15:48:22) [GCC 7.3.0] :: Anaconda, Inc. on Linux

软件截图

  • 对静态图像中的行人进行检测和标识

  • 对摄像头捕获的视频流数据进行实时处理

资源下载地址:https://download.csdn.net/download/sheziqiong/85772186
资源下载地址:https://download.csdn.net/download/sheziqiong/85772186

基于pp-yoloe的雾天行人车辆目标检测(代码片段)

1.项目说明随着计算机视觉算法的快速发展,目标检测作为视觉感知的基础任务,在诸多场景中得到了广泛应用。常见的公开数据集和方法大多针对能见度良好条件下的目标检测任务而建立。然而现实应用场景却面临诸如... 查看详情

基于pp-yoloe的雾天行人车辆目标检测(代码片段)

1.项目说明随着计算机视觉算法的快速发展,目标检测作为视觉感知的基础任务,在诸多场景中得到了广泛应用。常见的公开数据集和方法大多针对能见度良好条件下的目标检测任务而建立。然而现实应用场景却面临诸如... 查看详情

基于python的智能视频分析之人数统计的多种实现(代码片段)

目录摘要11理论基础21.1传统的人群计数算法[1]31.1.1基于检测的方法31.1.2基于轨迹聚类的方法31.1.3基于回归的方法31.2基于深度学习的人群计数算法41.2.1YOLOv3目标检测算法[2]41.2.2MCNN人群计数算法[3]51.2.3LSC-CNN人群计数算法[4]51.2.4视觉... 查看详情

无人驾驶(三)行人跟踪算法

...工程学院【嵌牛导读】本文主要介绍了无人驾驶中所需的行人跟踪算法【嵌牛鼻子】无人驾驶环境感知计算机视觉卡尔曼滤波粒子滤波均值漂移【嵌牛提问】无人驾驶中所用到的行人跟踪算法有哪些【嵌牛正文】行人跟踪一直是... 查看详情

目标检测基于matlabgui背景差分算法视频运动物体跟踪含matlab源码1915期(代码片段)

一、背景差分法和帧间差分法的车辆运动目标检测简介1引言运动目标检测是从图像序列中检测运动目标.通过运动目标检测可以得到图像中的运动目标,获取图像中的运动信息.运动目标检测在医学辅助诊断、航天航空、军事导弹... 查看详情

实时车辆行人多目标检测与跟踪系统-上篇(ui界面清新版,python代码)

...以通过电脑自带的摄像头进行实时处理,可选择训练好的YOLOv3/v4等模型参数。该系统界面优美、检测精度高,功能强大,设计有多目标实时检测、跟踪、计数功能,可自由选择感兴趣的跟踪目标。博文提供了完整的 查看详情

目标检测算法是啥?

...向量机、神经网络、AdaptiveBoosting5、运动矢量场法,包含基于运动矢量场的方法参考技术A目标检测算法是计算机视觉领域的一种重要技术,它能够自动地从图像或视频中检测出特定的目标,并给出它们在图像中的位置和大小等信... 查看详情

行人车辆检测与计数系统(python+yolov5深度学习模型+清新界面)(代码片段)

行人车辆检测与计数系统用于交通路口行人及车辆检测计数,道路人流量、车流量智能监测,方便记录、显示、查看和保存检测结果。本文详细介绍行人车辆检测,在介绍算法原理的同时,给出Python的实现代码、PyQt的UI界面以及... 查看详情

探究“黑科技”:自动驾驶中的对象追踪技术丨曼孚科技

...中,有两种常见的形式:视频跟踪和图像跟踪。视频跟踪基于计算机对连续帧之间的运动进行分析和处理,比如视频中的行人、汽车和自行车等。而图像跟踪则是基于静止的图片,通过对目标的特征进行提取和匹配来实现目标的... 查看详情

目标检测知识集锦

1.写在前面目标识别算法是所有目标检测算法的核心。目标识别算法是指在一张给定的图像中识别出给定的物体。将整张图像作为输入,然后输出类别的标签并给出图像中出现物体的概率。目标检测任务不仅仅要返回图像中... 查看详情

pytorch深度学习实战|基于yolov3的安全帽佩戴检测

...示计算机视觉中的目标识别问题的一般流程。目标检测是基于图片分类的计算机视觉任务,既包含了分类,又包含了定位。给出一张图片,目标检测系统要能够识别出图片的目标并给出其位置。由于图片中目标数是不确定的,且... 查看详情

视频行人重识别系统(ui界面,python源码,可下载)(代码片段)

...重识别,考虑到兼顾实时性和准确性,这里采用基于YOLO模型进行目标检测,MGN算法进行行人重识别,都是比较经典的算法,在各个公开数据集上都取得了不错的性能。  网上开源的检测和重识别算法的代码... 查看详情

从零开始学习目标检测:yolo算法详解(代码片段)

...详解1.🌟什么是目标检测?2.🌟传统的目标检测与基于深度学习的目标检测3.🌟目标检测算法的工作流程4.🌟目标检测可以干什么?5.🌟什么是YOLO在过去的十年中,深度学习技术的发展引起了极大的关... 查看详情

yolo算法是啥?

...的中心位置(x,y)、宽(w)、高(h)以及其类别。Yolo的预测基于整个图片,一次性输出所有检测到的目标信号,包括其类别和位置。Yolo首先将图片分割为sxs个相同大小的grid。介绍Yolo只要求grid中识别的物体的中心必须在这个grid内... 查看详情

基于人体部件小边特征的多行人检测和跟踪算法

基于人体部件小边特征的多行人检测和跟踪算法detectiontrackingedgeletfeaturemultipleoccludedhumanBayesiancombination读"B.Wu,R.Nevatia.Detectionandtrackingofmultiple,partiallyoccludedhumansbyBayesiancombinationofedgeletbasedp 查看详情

目标检测yolo系列——yolov1

...得了很大的突破。比较流行的算法可以分为两类,一类是基于RegionProposal的R-CNN系算法(R-CNN,FastR-CNN,FasterR-CNN),它们是two-stage的,需要先使用启发式方法(selectivesearch)或者CNN网络(RPN)产生RegionProposal,然后再在RegionProposal... 查看详情

r-cnnfastr-cnnfasterr-cnn

...测概述:行人检测主要有两种:传统检测算法和基于深度学习检测算法。传统检测算法的典型代表有Haar算法+Adaboost算法,Hog特征+SVM算法,DPM算法。而基于深度学习的行人检测典型代表有RCNN系列,SDD系列... 查看详情

行人识别预警系统组成及其工作原理是啥?

...参考技术A针对重特大交通事故中的行人保护问题,提出了基于侧面行人特征的实时行人检测预警系统(PDWS)。系统由检测模块和预警模块两部分组成,其中检测模块使用Haar与HOG特征和AdaBoost与SVM分类器,通过侧面行人样本库完成行人... 查看详情