草庐IT

基于yolov3的行人目标检测算法在图像和视频中识别检测

biyezuopin 2023-09-05 原文

资源下载地址: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

有关基于yolov3的行人目标检测算法在图像和视频中识别检测的更多相关文章

  1. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  2. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  3. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  4. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  5. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  6. [Vuforia]二.3D物体识别 - 2

    之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能够使用这个扫描程序可以从高通官网上进行下载,是一个安卓程序。点到Tools往下滑,找到VuforiaObjectScanner下载后解压数据线连接手机,将apk文件拷入手机安装然后刚才解压文件中的Media文件夹打开,两个PDF图打印第一张A4-ObjectScanningTarget.pdf,主要是用来辅助扫描的。好了,接下来就是扫描三维物体。将瓶

  7. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  8. ruby-on-rails - 在 heroku 的 .fonts 文件夹中包含自定义字体,似乎无法识别它们 - 2

    Heroku支持人员告诉我,为了在我的Web应用程序中使用自定义字体(未安装在系统中,您可以在bash控制台中使用fc-list查看已安装的字体)我必须部署一个包含所有字体的.fonts文件夹里面的字体。问题是我不知道该怎么做。我的意思是,我不知道文件名是否必须遵循heroku的任何特殊模式,或者我必须在我的代码中做一些事情来考虑这种字体,或者如果我将它包含在文件夹中它是自动的......事实是,我尝试以不同的方式更改字体的文件名,但根本没有使用该字体。为了提供更多详细信息,我们使用字体的过程是将PDF转换为图像,更具体地说,使用rghostgem。并且最终图像根本不使用自定义字体。在

  9. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  10. ruby-on-rails - 在 Ruby (on Rails) 中使用 imgur API 获取图像 - 2

    我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path

随机推荐