title: OpenCV+YOLO+IP摄像头实现目标检测

前言

学习OpenCV、YOLO到现在我实现了调用本地摄像头使用自己训练的模型进行目标识别,然后想着能不能远程获取视频数据,然后再PC端处理,最后将结果返回给视频流端。然后发现旧手机下载IP摄像头之后可以当做一个远程摄像头使用,并且它还支持rstp网络视频流协议(海康、大华的摄像头也是用这个协议,还可以兼容未来硬件的升级)

代码

import time
import torch
import cv2 as cvclass MultipleTarget:def __init__(self, url):"""初始化"""# 加载训练模型self.model = torch.hub.load('./yolov5', 'custom', path='./weight/yolov5s.pt', source='local')# 设置阈值self.model.conf = 0.52  # confidence threshold (0-1)self.model.iou = 0.45  # NMS IoU threshold (0-1)# 加载摄像头self.url = urlself.cap = cv.VideoCapture(self.url)self.cap.set(cv.CAP_PROP_FOURCC, cv.VideoWriter_fourcc('M', 'J', 'P', 'G'))if not self.cap.isOpened():print("Cannot open camera")exit()def draw(self, list_temp, image_temp):for temp in list_temp:name = temp[6]  # 取出标签名temp = temp[:4].astype('int')  # 转成int加快计算cv.rectangle(image_temp, (temp[0], temp[1]), (temp[2], temp[3]), (0, 0, 255), 3)  # 框出识别物体cv.putText(image_temp, name, (int(temp[0] - 10), int(temp[1] - 10)), cv.FONT_ITALIC, 1, (0, 255, 0), 2)def detect(self):"""目标检测"""while True:ret, frame = self.cap.read()# 如果正确读取帧,ret为Trueif not ret:print("Can't receive frame (stream end?). Exiting ...")break# frame = cv.flip(frame, 1)# FPS计算time.startstart_time = time.time()# Inferenceresults = self.model(frame)pd = results.pandas().xyxy[0]  # tensor-->pandas的DataFrame# 取出对应标签的listperson_list = pd[pd['name'] == 'person'].to_numpy()bus_list = pd[pd['name'] == 'bus'].to_numpy()# 框出物体self.draw(person_list, frame)self.draw(bus_list, frame)# end_timeend_time = time.time()fps = 1 / (end_time - start_time)# 控制台显示# results.print()  # or .show(), .save(), .crop(), .pandas(), etc.# print(results.xyxy[0])  # img1 predictions (tensor)# print('----------------')# print(results.pandas().xyxy[0])  # img1 predictions (pandas)# FPS显示cv.putText(frame, 'FPS:' + str(int(fps)), (30, 50), cv.FONT_ITALIC, 1, (0, 255, 0), 2)cv.imshow('results', frame)cv.waitKey(10)if cv.waitKey(10) & 0xFF == ord('q'):breakself.cap.release()cv.destroyAllWindows()url = 'rtsp://admin:admin@192.168.43.229:8554/live'
test = MultipleTarget(url)
test.detect()

存在问题

在不进行目标检测的时候,读到的视频流很流畅,进行目标检测后就非常卡几乎不能用。
经过几天的学习和查找,感觉这个问题出在这里:
CPU和内存在读视频流和处理视频的时候爆了
我在运行程序的时候看了任务管理器果然如此
然后我就根据网上的说法使用多进程来解决这个问题,但是结果还是一个样
我现在在怀疑是不是我的电脑配置不够(ps:我的电脑配置确实垃圾)


有搞了几天没有丝毫进展!!!!!!!!!
躺了,试了很多方法还是卡的一批,延迟还贼高,无奈
配置不够(ps:我的电脑配置确实垃圾)


有搞了几天没有丝毫进展!!!!!!!!!
躺了,试了很多方法还是卡的一批,延迟还贼高,无奈

已解决(使用多进程)

"""
多进程对rstp视频流进行图像处理
现存在问题:笔记本算力不够,cpu爆了,结果能流畅运行一段时间,延时也低(已解决)进程一:读取rtsp视频流
视频流保存使用Manager.list
进程二:使用yolo处理视频流局域网内实现rtsp协议视频推流
获取rtsp视频流,并用yolo对其进行处理。实现目标检测@author Yuzzz
"""import os
import cv2 as cv
import gc
from multiprocessing import Process, Manager
import torch
import time# 向共享缓冲栈中写入数据,rtsp视频流
def write(stack, cam, top: int) -> None:""":param cam: 摄像头参数:param stack: Manager.list对象:param top: 缓冲栈容量:return: None"""print('Process to write: %s' % os.getpid())  # write子进程IDcap = cv.VideoCapture(cam)while True:_, img = cap.read()if _:stack.append(img)# 每到一定容量清空一次缓冲栈# 利用gc库,手动清理内存垃圾,防止内存溢出if len(stack) >= top:del stack[:]gc.collect()def img_resize(image):"""更改图片尺寸"""height, width = image.shape[0], image.shape[1]# 设置新的图片分辨率框架 640x369 1280×720 1920×1080width_new = 1280height_new = 720# 判断图片的长宽比率if width / height >= width_new / height_new:img_new = cv.resize(image, (width_new, int(height * width_new / width)))else:img_new = cv.resize(image, (int(width * height_new / height), height_new))return img_new# def save_img(yolo_img, pic_number):
#     cv.imwrite(r'E:/Pytorch_learning/SaveImg/%d.jpg' % pic_number, yolo_img)
#     # cv2.imwrite('File_SavePath/%d.bmp' % (i), reImage)  # 保存图片路径
#     passdef draw(list_temp, image_temp):for temp in list_temp:name = temp[6]  # 取出labeltemp = temp[:4].astype('int')cv.rectangle(image_temp, (temp[0], temp[1]), (temp[2], temp[3]), (0, 0, 255), 3)  # 框出识别物体cv.putText(image_temp, name, (int(temp[0] - 10), int(temp[1] - 10)), cv.FONT_ITALIC, 1, (0, 255, 0), 2)# 在缓冲栈中读取数据:
def read(stack) -> None:print('Process to read: %s' % os.getpid())  # read子进程ID# 初始化yolomodel = torch.hub.load('./yolov5', 'custom', path='./weight/yolov5s.pt', source='local')# 超参数设置model.conf = 0.52  # confidence threshold (0-1)model.iou = 0.45  # NMS IoU threshold (0-1)while True:if len(stack) != 0:value = stack.pop()  # 出栈# 对获取的视频帧分辨率重处理img_new = img_resize(value)# 使用yolo模型处理视频帧# yolo_img = yolo_deal(img_new)# FPS计算time.startstart_time = time.time()# Inferenceresults = model(img_new)pd = results.pandas().xyxy[0]  # tensor-->pandas的DataFrame# 取出对应标签的listperson_list = pd[pd['name'] == 'person'].to_numpy()bus_list = pd[pd['name'] == 'bus'].to_numpy()# 框出物体draw(person_list, img_new)draw(bus_list, img_new)# end_timeend_time = time.time()fps = 1 / (end_time - start_time)# FPS显示cv.putText(img_new, 'FPS:' + str(int(fps)), (30, 50), cv.FONT_ITALIC, 1, (0, 255, 0), 2)cv.imshow('results', img_new)# 将处理的视频帧存放在文件夹里# pic_number = 0  # 图像数量# pic_number += 1# save_img(img_new, pic_number)key = cv.waitKey(1) & 0xFFif key == ord('q'):breakif __name__ == '__main__':# 父进程创建缓冲栈,并传给各个子进程:q = Manager().list()url = 'rtsp://admin:admin@192.168.43.229:8554/live'     # 改成自己的urlpw = Process(target=write, args=(q, url, 100))pr = Process(target=read, args=(q,))# 启动子进程pw,写入:pw.start()# 启动子进程pr,读取:pr.start()# 等待pr结束:pr.join()# pw进程里是死循环,无法等待其结束,只能强行终止:pw.terminate()

OpenCV+YOLO+IP摄像头实现目标检测相关推荐

  1. 独家 | 在树莓派+Movidius NCS上运用YOLO和Tiny-YOLO完成目标检测(附代码下载)

    作者:Adrian Rosebrock 翻译:吴振东 校对:郑滋 本文约5000字,建议阅读10+分钟 本文教你如何在树莓派和Movidius神经加速棒上运用Tiny-YOLO来实现近乎实时的目标检测 ...

  2. yolo3连接网络摄像头实现目标检测命令

    yolo3连接摄像头实现目标检测 yolo3使用较灵活,可以通过修改源码,来实现自己的一些功能.如果想要连接网络摄像头进行目标检测.针对目前我用的相机是海康或大华的,可以直接采用rtsp协议.测试连接 ...

  3. 深度学习 + OpenCV,Python实现实时视频目标检测

    选自PyimageSearch 机器之心编译 参与:路雪.李泽南 使用 OpenCV 和 Python 对实时视频流进行深度学习目标检测是非常简单的,我们只需要组合一些合适的代码,接入实时视频,随后加 ...

  4. 睿智的目标检测21——如何调用摄像头进行目标检测

    睿智的目标检测21--如何调用摄像头进行目标检测 学习前言 使用到的库 实现思路 实现代码 2020/4/26更新:FPS计算 FPS记录的原理 FPS实现代码 学习前言 好多人都想了解一下如何对摄像 ...

  5. 【yolov3】如何使用摄像头进行目标检测——yolov3-pytorch摄像头检测教程

    [yolov3]如何使用摄像头进行目标检测--yolov3-pytorch摄像头检测教程 原项目地址:https://github.com/eriklindernoren/PyTorch-YOLOv3 ...

  6. 【玩转Jetson TX2 NX】(七)TX2 NX YoLoV4环境搭建+板载摄像头实时目标检测(详细教程+错误解决)

    1 YoLoV4环境搭建 直接下载,然后解压,最后移动到Jetson TX2 NX,如图所示,darknet下载链接: https://github.com/AlexeyAB/darknet 将解压的 ...

  7. YOLO V1 实时的目标检测 论文翻译

    YOLO V1 实时的目标检测 论文翻译 注:学习记录用 摘要 我们提出了一种新的目标检测方法 YOLO.先前关于目标检测的工作重新使用分类器来执行检测. 相反,我们将目标检测框架作为一个回归问题,以 ...

  8. realsense D455深度相机+YOLO V5结合实现目标检测(二)

    realsense D455深度相机+YOLO V5结合实现目标检测(二) 1.代码来源 2.环境配置 3.代码分析: 3.1 主要展示在将detect.py转换为realsensedetect.py ...

  9. YOLO v2实现图像目标检测

    作者介绍 熊文博,男,西安工程大学电子信息学院,2020级硕士研究生,张宏伟人工智能课题组. 研究方向:机器视觉与人工智能 电子邮件:996270714@qq.com 师兄的CSDN主页: 欢迎关注和 ...

最新文章

  1. 利用sharding-jdbc分库分表
  2. ffpemg扩展 安装php_ThinkSwoole 教程(二)安装
  3. CF650C Table Compression
  4. JZOJ 3401 JZOJ 5673. 【GDOI2018Day1模拟4.20】爬山法
  5. HDU - 6621 K-th Closest Distance——主席树+二分
  6. Concept3D推出交互式3D地图平台
  7. 计算机专业汇报与接口,计算机接口设计实验总结.doc
  8. Proteus7.8 ISIS制图8个LED(针对初次使用者)
  9. 一元初始,森罗万象:5G角逐已被荣耀拉开序幕
  10. elasticsearch报错:exceeds the [index.highlight.max_analyzed_offset] limit [1000000]
  11. php 外包 上海,== | php外包与php技术服务商
  12. 2021-08-31 multisim14 电感电容滤波器的的幅频特性,输入方波,输出正弦波
  13. VS2010如何添加MSCOMM控件
  14. 教程丨一文入门图像预训练模型
  15. 基于Java+SSM+MySQL的高校就业创业信息管理系统
  16. Bitvise SSH Client目标计算机积极拒绝,无法连接
  17. jquery的toFixed方法的正确使用
  18. 意外断电confluence和jira的数据库挂了
  19. 新能源汽车与三电技术
  20. CentOS软件管理 - 编译安装

热门文章

  1. PAT 乙级 1040 有几个PAT (25分)
  2. 如何快速高效的清理虚拟机硬盘空间?
  3. 什么是 Batch normalization
  4. 红葡萄酒质量影响因素分析
  5. 亚马逊云科技的区域和可用区概念解释
  6. 微信公众号开发整理(五)--自定义菜单
  7. 算符优先分析法-java实现
  8. CentOS 6.5 安装使用iscsi
  9. 通过C#Microsoft.Office.Interop.Word理解互操作性
  10. 坐标系旋转与点旋转的变换公式