视频分帧【截取图片】(YOLO目标检测【生成数据集】)
高效率制作数据集【按这个流程走,速度很顶】
本次制作,1059张图片【马路上流动车辆】
几乎就是全自动了,只要视频拍得好,YOLO辅助制作数据集就效率极高
视频中的图片抽取:
【由于视频内存过大,遇到报错执行失败,解决方法已附加在代码下面】
import cv2
import os
import pdb
import numpy as np
#from glob2 import globvideos_src_path = 'F:\\testkk\\vivivi\\' # 提取图片的视频文件夹# 筛选文件夹下MP4格式的文件
# videos = os.listdir(videos_src_path) # 用于返回指定的文件夹包含的文件或文件夹的名字的列表。
# videos = filter(lambda x: x.endswith('mp4'), videos)
dirs = os.listdir(videos_src_path) # 获取指定路径下的文件
count = 0
# 写入txt
f = "F:\\testkk\\images\\data.txt"
with open(f, "w+") as file:file.write("-----start-----\n")# 循环读取路径下的文件并操作
for video_name in dirs:outputPath = "F:\\testkk\\images\\"+video_name[:-4] + "\\"# os.mkdir(outputPath)print("start\n")print(videos_src_path + video_name)vc = cv2.VideoCapture(videos_src_path + video_name)# 初始化,并读取第一帧# rval表示是否成功获取帧# frame是捕获到的图像rval, frame = vc.read()# 获取视频fpsfps = vc.get(cv2.CAP_PROP_FPS)# 获取每个视频帧数frame_all = vc.get(cv2.CAP_PROP_FRAME_COUNT)print("[INFO] 视频FPS: {}".format(fps))print("[INFO] 视频总帧数: {}".format(frame_all))# 每隔n帧保存一张图片frame_interval = 30# 统计当前帧frame_count = 1# count=0while rval:rval, frame = vc.read()# 隔n帧保存一张图片if frame_count % frame_interval == 0:# 当前帧不为None,能读取到图片时if frame is not None:filename = outputPath + "Kidney_tumors_{}.jpg".format(count)# 水平、垂直翻转frame = cv2.flip(frame, 0)frame = cv2.flip(frame, 1)# 旋转180°frame = np.rot90(frame)frame = np.rot90(frame)cv2.imwrite(filename, frame)count += 1print("保存图片:{}".format(filename))frame_count += 1# 将成功抽帧的视频名称写入txt文件,方便检查file = open(f, "a")file.write(video_name + "\n")# 关闭视频文件vc.release()print("[INFO] 总共保存:{}张图片\n".format(count))
遇到问题:
global cap_ffmpeg_impl.hpp:1541 grabFrame packet read max attempts exceeded, if your video have multiple streams (video, audio) try to increase attempt limit by setting environment variable OPENCV_FFMPEG_READ_ATTEMPTS (current value is 4096)
解决方法:
Windows:给OPENCV_FFMPEG_READ_ATTEMPTS 设置一个和视频大小一样的value值,然后重启电脑,再来执行,就解决了。
Linux:终端执行
$ export OPENCV_FFMPEG_READ_ATTEMPTS=4001989068
抽出来的图片,接下来用YOLO的目标检测模型预测,得到坐标文件
from ultralytics import YOLO# 读取模型,这里传入训练好的模型
model = YOLO('yolov8m.pt')# 模型预测,save=True 的时候表示直接保存yolov8的预测结果
metrics = model.predict(source='F:\\testkk\\images\\GH040001',imgsz=640,project='runs/detect',save=True)

【预测结果已经还OK了,几乎不用咋修改标注文件了】
然后:【txt转json】
import os
import json
import base64
import cv2def read_txt_file(txt_file):with open(txt_file, 'r') as f:lines = f.readlines()data = []for line in lines:line = line.strip().split()class_name = line[0]bbox = [coord for coord in line[1:]]data.append({'class_name': class_name, 'bbox': bbox})return datadef convert_to_labelme(data, image_path, image_size):labelme_data = {'version': '4.5.6','flags': {},'shapes': [],'imagePath': json_image_path,'imageData': None,'imageHeight': image_size[0],'imageWidth': image_size[1]}for obj in data:dx = obj['bbox'][0]dy = obj['bbox'][1]dw = obj['bbox'][2]dh = obj['bbox'][3]w = eval(dw) * image_size[1]h = eval(dh) * image_size[0]center_x = eval(dx) * image_size[1]center_y = eval(dy) * image_size[0]x1 = center_x - w/2y1 = center_y - h/2x2 = center_x + w/2y2 = center_y + h/2# x1 = eval(obj['bbox'][0]) * image_size[1]# y1 = eval(obj['bbox'][1]) * image_size[0]# x2 = eval(obj['bbox'][2]) * image_size[1]# y2 = eval(obj['bbox'][3]) * image_size[0]if obj['class_name'] == '0': #判断对应的标签名称,写入json文件中label = str('person')elif obj['class_name'] == '2':label = str('car')else:continueshape_data = {'label': label,'points': [[x1, y1], [x2, y2]],'group_id': None,'shape_type': 'rectangle','flags': {}}labelme_data['shapes'].append(shape_data)return labelme_datadef save_labelme_json(labelme_data, image_path, output_file):with open(image_path, 'rb') as f:image_data = f.read()labelme_data['imageData'] = base64.b64encode(image_data).decode('utf-8')with open(output_file, 'w') as f:json.dump(labelme_data, f, indent=4)# 设置文件夹路径和输出文件夹路径
txt_folder = "D:\\yoloProject\\ultralytics-registry\\runs\\detect\\predict5\\labels" # 存放LabelImg标注的txt文件的文件夹路径
output_folder = "F:\\testkk\\images\\GH040001_json" # 输出LabelMe标注的json文件的文件夹路径
img_folder = "F:\\testkk\\images\\GH040001" #存放对应标签的图片文件夹路径# 创建输出文件夹
if not os.path.exists(output_folder):os.makedirs(output_folder)# 遍历txt文件夹中的所有文件
for filename in os.listdir(txt_folder):if filename.endswith('.txt'):# 生成对应的输出文件名output_filename = os.path.splitext(filename)[0] + '.json'# 读取txt文件txt_file = os.path.join(txt_folder, filename)data = read_txt_file(txt_file)# 设置图片路径和尺寸image_filename = os.path.splitext(filename)[0] + '.jpg' # 图片文件名与txt文件名相同,后缀为.jpgimage_path = os.path.join(img_folder, image_filename)# image_size = (1280, 720) # 根据实际情况修改json_image_path = image_path.split('\\')[-1]image_size = cv2.imread(image_path).shape# 转化为LabelMe格式labelme_data = convert_to_labelme(data, image_path, image_size)# 保存为LabelMe JSON文件output_file = os.path.join(output_folder, output_filename)save_labelme_json(labelme_data, image_path, output_file)

最后:修改OK后,再把JSON转TXT,作为样本数据集:
https://blog.csdn.net/weixin_43624549/article/details/139532142
相关文章:
视频分帧【截取图片】(YOLO目标检测【生成数据集】)
高效率制作数据集【按这个流程走,速度很顶】 本次制作,1059张图片【马路上流动车辆】 几乎就是全自动了,只要视频拍得好,YOLO辅助制作数据集就效率极高 视频中的图片抽取: 【由于视频内存过大,遇到报错执行…...
Redis7(二)Redis持久化双雄
持久化之RDB RDB的持久化方式是在指定时间间隔,执行数据集的时间点快照。也就是在指定的时间间隔将内存中的数据集快照写入磁盘,也就是Snapshot内存快照,它恢复时再将硬盘快照文件直接读回到内存里面。 RDB保存的是dump.rdb文件。 自动触发…...
发布支持TS的npm包
你现在有这么一个包,已经将他发布在npm上了,周下载量也还比较可观。美中不足的就是,这个包之前使用js写的,现在你想增加TS类型,提升用户使用体验,那么你现在可以做以下几个步骤 1.在你的包的根目录下创建一…...
计算机视觉9 全卷积网络
全卷积网络(Fully Convolutional Network,简称 FCN)在计算机视觉领域具有重要地位。 传统的卷积神经网络(CNN)在最后的输出层通常使用全连接层来进行分类任务。然而,全连接层会丢失空间信息,使得…...
02.C++入门基础(下)
1.函数重载 C支持在同一作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C函数调用就表现出了多态行为,使用更灵活。C语言是不支持同一作用域中出现同名函数的。 1、参数类型不同 2、参数个数不同…...
【数据结构】探索排序的奥秘
若有不懂地方,可查阅我之前文章哦! 个人主页:小八哥向前冲~_csdn博客 所属专栏:数据结构_专栏 目录 排序的概念 几种排序方法介绍 冒泡排序 选择排序 插入排序 堆排序 向上调整建堆排序 向下调整建堆排序 希尔排序 快速…...
数据结构面试知识点总结3
#来自ウルトラマンティガ(迪迦) 1 线性表 最基本、最简单、最常用的一种数据结构。一个线性表是 n 个具有相同特性的数据元素的有限序列。 特征:数据元素之间是一对一的逻辑关系。 第一个数据元素没有前驱,称为头结点࿱…...
python-爬虫实例(5):将进酒,杯莫停!
目录 前言 将进酒,杯莫停! 一、浇给 二、前摇 1.导入selenium库 2.下载浏览器驱动 三、爬虫四步走 1.UA伪装 2.获取url 3.发送请求 4.获取响应数据进行解析并保存 总结 前言 博主身为一个农批,当然要尝试爬取王者荣耀的东西啦。 将进…...
AGI 之 【Hugging Face】 的【从零训练Transformer模型】之二 [ 从零训练一个模型 ] 的简单整理
AGI 之 【Hugging Face】 的【从零训练Transformer模型】之二 [ 从零训练一个模型 ] 的简单整理 目录 AGI 之 【Hugging Face】 的【从零训练Transformer模型】之二 [ 从零训练一个模型 ] 的简单整理 一、简单介绍 二、Transformer 1、模型架构 2、应用场景 3、Hugging …...
十大排序的稳定性和时间复杂度
十大排序算法的稳定性和时间复杂度是数据结构和算法中的重要内容。 以下是对这些算法的稳定性和时间复杂度的详细分析: 稳定性 稳定性指的是排序算法在排序过程中是否能够保持相等元素的原始相对顺序。根据这个定义,我们可以将排序算法分为稳定排序和…...
【系列教程之】1、点亮一个LED灯
1、点亮一个LED灯 作者将狼才鲸创建日期2024-07-23 CSDN教程目录地址:【目录】8051汇编与C语言系列教程本Gitee仓库原始地址:才鲸嵌入式/8051_c51_单片机从汇编到C_从Boot到应用实践教程 本源码包含C语言和汇编工程,能直接在电脑中通过Keil…...
搜维尔科技:Manus Metagloves使用精确的量子跟踪技术捕捉手部每一个细节动作
Manus Metagloves使用精确的量子跟踪技术捕捉手部每一个细节动作 搜维尔科技:Manus Metagloves使用精确的量子跟踪技术捕捉手部每一个细节动作...
机器学习 | 阿里云安全恶意程序检测
目录 一、数据探索1.1 数据说明1.2 训练集数据探索1.2.1 数据特征类型1.2.2 数据分布1.2.3 缺失值1.2.4 异常值1.2.5 标签分布探索 1.3 测试集探索1.3.1 数据信息1.3.2 缺失值1.3.3 数据分布1.3.4 异常值 1.4 数据集联合分析1.4.1 file_id 分析1.4.2 API 分析 二、特征工程与基…...
python打包exe文件-实现记录
1、使用pyinstaller库 安装库: pip install pyinstaller打包命令标注主入库程序: pyinstaller -F.\程序入口文件.py 出现了一个问题就是我在打包运行之后会出现有一些插件没有被打包。 解决问题: 通过添加--hidden-importcomtypes.strea…...
基本的DQL语句-单表查询
一、DQL语言 DQL(Data Query Language 数据查询语言)。用途是查询数据库数据,如SELECT语句。是SQL语句 中最核心、最重要的语句,也是使用频率最高的语句。其中,可以根据表的结构和关系分为单表查询和多 表联查。 注意:所有的查询…...
Vue3 对比 Vue2
相关信息简介2020年9月18日,Vue.js发布3.0版本,代号:One Piece(海贼王) 2 年多开发, 100位贡献者, 2600次提交, 600次 PR、30个RFC Vue3 支持 vue2 的大多数特性 可以更好的支持 Typescript,提供了完整的…...
2024中国大学生算法设计超级联赛(1)
🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,彩笔ACMer一枚。 🏀所属专栏:杭电多校集训 本文用于记录回顾总结解题思路便于加深理解。 📢📢📢传送门 A - 循环位移解…...
offer题目51:数组中的逆序对
题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如,在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7…...
45、PHP 实现滑动窗口的最大值
题目: PHP 实现滑动窗口的最大值 描述: 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。 例如: 如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3, 那么一共存在6个滑动窗口, 他们的最大值…...
【计算机视觉】siamfc论文复现实现目标追踪
什么是目标跟踪 使用视频序列第一帧的图像(包括bounding box的位置),来找出目标出现在后序帧位置的一种方法。 什么是孪生网络结构 孪生网络结构其思想是将一个训练样本(已知类别)和一个测试样本(未知类别)输入到两个CNN(这两个CNN往往是权值共享的)中࿰…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...


