yolov3检测和平精英视频中人物及物体【附源码+数据】
目录
- 一、实现效果与数据下载链接
- 二、相应代码
- 三、yolo原理讲解
一、实现效果与数据下载链接
视频识别效果,链接如下:
https://www.bilibili.com/video/BV1fa4y1p7eg
数据下载链接:https://pan.baidu.com/s/1nm72db7e9GbBR-vQ5bWNAg
提取码:cng5
–>解压后
二、相应代码
video_detection.py
import numpy as np
import cv2
import os
import time
import matplotlib.pyplot as plt
import randomplt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号# 参数
yolo_dir = r'D:\python_project_file\video_recognition\yolov3\data' # YOLO文件路径
CONFIDENCE = 0.5 # 过滤弱检测的最小概率
THRESHOLD = 0.4 # 非最大值抑制阈值def yolov3_vedio(img, yolo_dir, CONFIDENCE, THRESHOLD):weightsPath = os.path.join(yolo_dir, 'yolov3.weights') # 权重文件configPath = os.path.join(yolo_dir, 'yolov3.cfg') # 配置文件labelsPath = os.path.join(yolo_dir, 'coco.names') # label名称# 加载网络、配置权重net = cv2.dnn.readNetFromDarknet(configPath, weightsPath) # 利用下载的文件print("[INFO] loading YOLO from disk...") # 可以打印下信息blobImg = cv2.dnn.blobFromImage(img, 1.0 / 255.0, (416, 416), None, True,False) # net需要的输入是blob格式的,用blobFromImage这个函数来转格式net.setInput(blobImg) # 调用setInput函数将图片送入输入层# 获取网络输出层信息(所有输出层的名字),设定并前向传播outInfo = net.getUnconnectedOutLayersNames() # 前面的yolov3架构也讲了,yolo在每个scale都有输出,outInfo是每个scale的名字信息,供net.forward使用start = time.time()layerOutputs = net.forward(outInfo) # 得到各个输出层的、各个检测框等信息,是二维结构。end = time.time()print("[INFO] YOLO took {:.6f} seconds".format(end - start)) # 可以打印下信息# 拿到图片尺寸(H, W) = img.shape[:2]# 过滤layerOutputs# layerOutputs的第1维的元素内容: [center_x, center_y, width, height, objectness, N-class score data]# 过滤后的结果放入:boxes = [] # 所有边界框(各层结果放一起)confidences = [] # 所有置信度classIDs = [] # 所有分类ID# 1)过滤掉置信度低的框框for out in layerOutputs: # 各个输出层for detection in out: # 各个框框# 拿到置信度scores = detection[5:] # 各个类别的置信度classID = np.argmax(scores) # 最高置信度的id即为分类idconfidence = scores[classID] # 拿到置信度# 根据置信度筛查if confidence > CONFIDENCE:box = detection[0:4] * np.array([W, H, W, H]) # 将边界框放会图片尺寸(centerX, centerY, width, height) = box.astype("int")x = int(centerX - (width / 2))y = int(centerY - (height / 2))boxes.append([x, y, int(width), int(height)])confidences.append(float(confidence))classIDs.append(classID)# 2)应用非最大值抑制(non-maxima suppression,nms)进一步筛掉idxs = cv2.dnn.NMSBoxes(boxes, confidences, CONFIDENCE, THRESHOLD) # boxes中,保留的box的索引index存入idxs# 得到labels列表with open(labelsPath, 'rt') as f:labels = f.read().rstrip('\n').split('\n')# 应用检测结果np.random.seed(42)COLORS = np.random.randint(0, 255, size=(len(labels), 3),dtype="uint8") # 框框显示颜色,每一类有不同的颜色,每种颜色都是由RGB三个值组成的,所以size为(len(labels), 3)if len(idxs) > 0:for i in idxs.flatten(): # indxs是二维的,第0维是输出层,所以这里把它展平成1维(x, y) = (boxes[i][0], boxes[i][1])(w, h) = (boxes[i][2], boxes[i][3])color = [int(c) for c in COLORS[classIDs[i]]]cv2.rectangle(img, (x, y), (x + w, y + h), color, 2) # 线条粗细为2pxtext = "{}: {:.4f}".format(labels[classIDs[i]], confidences[i])print("[INFO] predect result is: ", text)(text_w, text_h), baseline = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 2)cv2.rectangle(img, (x, y - text_h - baseline), (x + text_w, y), color, -1)cv2.putText(img, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0),2) # cv.FONT_HERSHEY_SIMPLEX字体风格、0.5字体大小、粗细2pxreturn img# 视频路径
video_path = r"D:\python_project_file\video_recognition\yolov3\data\video\test_video.mp4"
# 读取视频
videoCapture = cv2.VideoCapture(video_path)# 获取视频的帧率(FPS,pictures per second)
fps = videoCapture.get(cv2.CAP_PROP_FPS)# 获取视频的帧宽(frame width)和帧高(frame height)size = (int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)), int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
# 为了保存视频,要先指定FourCC编码,该编码可从fourcc.org查到
fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')# 创建一个videoWriter对象
videoWriter = cv2.VideoWriter('out_%d.avi' % (random.randint(1, 10)), fourcc, fps, size)# 通过read读取视频中的每一帧,每一帧是一副基于BGR格式的图像,然后通过write将图像一帧帧写入要保存的视频。可以理解成,读取的每一帧图片存到一列表中,最后一张存完就返回一个False
success, frame = videoCapture.read()
yolov3_vedio(frame, yolo_dir, CONFIDENCE, THRESHOLD)while (True):videoWriter.write(frame)success, frame = videoCapture.read()if success == False:breakyolov3_vedio(frame, yolo_dir, CONFIDENCE, THRESHOLD)videoCapture.release()
videoWriter.release()
三、yolo原理讲解
1、详细原理可以看我的另一篇博客:https://blog.csdn.net/weixin_39615182/article/details/109752498
2、该博主同时在b站进行了讲解,讲的很好,我在他基础上进行归纳总结的:
https://www.bilibili.com/video/BV1XJ411D7wF?p=3
yolov3检测和平精英视频中人物及物体【附源码+数据】相关推荐
- 和平精英吃鸡助手微信小程序源码一键设置灵敏度键位捏脸
这是一款吃鸡小助手类型的微信小程序源码 该小程序由键位,灵敏度,捏脸一键设置组合 小程序内的键位设置,灵敏度设置代码是由各大主播和职业选手那些分享的 然后改小程序通过全网采集而来 另外里面还有捏脸数据 ...
- 美!视差滚动在图片滑块中的应用【附源码下载】
视差滚动(Parallax Scrolling)已经被广泛应用于网页设计中,这种技术能够让原本平面的网页界面产生动感的立体效果.下面分享的这个图片滑块效果是难得一见的结合视差滚动的例子,之前的文章给大 ...
- 美!视差滚动特效在图片滑块中的应用【附源码下载】
视差滚动(Parallax Scrolling)已经被广泛应用于网页设计中,这种技术能够让原本平面的网页界面产生动感的立体效果.下面分享的这个图片滑块效果是难得一见的结合视差滚动的例子,之前的文章给大 ...
- 图像sobel梯度详细计算过程_视频处理之Sobel【附源码】
边缘检测是检测图像中的一些像素点,它们周围的像素点的灰度发生了急剧的变化,我们认为在这过程中,图像中的物体不同导致了这一变化,因此可以将这些像素点作为一个集合,可以用来标注图像中不同物体的边界.边缘区 ...
- 视频处理之Sobel【附源码】
欲观原文,请君移步 边缘检测是检测图像中的一些像素点,它们周围的像素点的灰度发生了急剧的变化,我们认为在这过程中,图像中的物体不同导致了这一变化,因此可以将这些像素点作为一个集合,可以用来标注图像中不 ...
- b站学python_Python爬虫学习教程 bilibili网站视频爬取!【附源码】
python爬虫学习教程,万物皆可爬!每个技术大牛都是从基础慢慢的提升上去的,基础知识越深以后的发展越牛!学好python,才能玩转python,那到底怎么才能学好python? 通过爬取b站案例带领 ...
- Android 毕业设计高仿抖音(视频类App)(内附源码)
背景 抖音这么火,我就想着要不自己也做一个吧,于是就有了我的自制抖音.喜欢的可以点个star或关注一下,以后会保持维护和优化. 主要效果演示 安装包: 整体设计 由于没有接口获取数据,使用的方式是将图 ...
- python3网络爬虫--爬取b站视频评论用户信息(附源码)
文章目录 一.准备工作 1.工具 二.思路 1.整体思路 2.爬虫思路 三.分析网页 1.分析网页加载方式 2.分析数据接口 3.获取oid 四.撰写爬虫 五.存储数据 六.总结 你爱我,我爱你,蜜雪 ...
- Silverlight4中右键菜单实现-附源码下载
在发布Silverlight4 Beta版本和RC时 增加不少新的特性和控件. 类似在WinForm实现右键菜单ContentMenu功能. 在Silverlight 4中也有所体现. 当初在Silv ...
最新文章
- Visual Studio插件
- Ubuntu常用终端快捷键
- boost::coroutine2模块实现协程的测试程序
- BOOST_TEST_GT和BOOST_TEST_GE的用法
- CentOS7 系统基于Vim8搭建Go语言开发环境
- Java多线程之Semaphore用法
- 芯片巨头们2019年的AI芯片之争会如何?
- 视网膜脱落相关知识(持续更新中)
- python_线程、进程和协程
- SQLServer 条件查询语句大全
- 学习3D图形引擎中使用的基本数学
- 如何学会阅读源码,看这篇就够了!
- Apple pay 论述
- cesium之深圳区域行政图
- VB代码窗口鼠标滚轮的使用
- redis搭建哨兵模式(哨兵模式原理)
- 2021年度训练联盟热身训练赛第三场——C,G,I
- 水果店圈子:水果店开业宣传文字怎么发,水果店准备开业怎么发朋友圈
- 超融合市场火爆,新华三因何蝉联第一?
- 第十七届全国大学生智能车竞赛全国总决赛参赛队伍