视频分帧【截取图片】(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)
解决方法:
给OPENCV_FFMPEG_READ_ATTEMPTS 设置一个和视频大小一样的value值,然后重启电脑,再来执行,就解决了。在这里插入图片描述

抽出来的图片,接下来用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/47191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 小白菜鸟从入门到精通教程

前言 Android一词最早出现于法国作家利尔亚当(Auguste Villiers de l’Isle-Adam)在1886年发表的科幻小说《未来的夏娃》(L’ve future)中。他将外表像人的机器起名为Android。从初学者的角度出发,通过通俗易懂的语言…

Delphi 11.2 配置Android SDK 环境

打开 Delphi 11 点击 Tools–Options… 然后点击 Deployment–SDK Manager–Add… 这里如果配置64位就选 Android 64-bit,如果配置32位就选 Android 32-bit 点击 Select an SDK version–Add New… 有警告图标的就是有问题的项,需要手动更新一下&#xf…

【开源库学习】libodb库学习(二)

使用持久对象 前面的章节为我们提供了ODB的高级概述,并展示了如何使用它在数据库中存储C对象。在本章中,我们将更详细地研究ODB对象持久性模型以及核心数据库API。我们将从第1节和第3节中的基本概念和术语开始,并继续讨论第4节中的odb:&#…

【BUG】已解决:ModuleNotFoundError: No module named ‘paddle‘

已解决:ModuleNotFoundError: No module named ‘paddle‘ 目录 已解决:ModuleNotFoundError: No module named ‘paddle‘ 【常见模块错误】 错误原因: 解决办法: 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎…

libcurl下载的文件内容保存到内存缓存区

文心一言 使用libcurl进行数据上传和下载时,完全可以将下载的文件内容保存到内存缓存区中,而不是直接保存到磁盘上。libcurl提供了灵活的回调函数机制,允许你在数据接收时自定义处理逻辑,包括将数据存储在内存中。 要实现这一功…

【Elasticsearch】Elasticsearch 中的节点角色

Elasticsearch 中的节点角色 1.主节点(master)1.1 专用候选主节点(dedicated master-eligible node)1.2 仅投票主节点(voting-only master-eligible node) 2.数据节点(data)2.1 内容…

OCC 创建点线面体

目录 一、利用封装已有算法实现 1、盒子建模算法封装 2、可视化 二、利用OCC 点线面实现 1、实现过程 2、实现一个面 3、拉伸面生成体 4、旋转面生成体 三、总结 一、利用封装已有算法实现 1、盒子建模算法封装 BRepPrimAPI_MakeBox box(2, 2, 2); 2、可视化 void VTK…

SSM之Mybatis

SSM之Mybatis 一、MyBatis简介1、MyBatis特性2、MyBatis的下载3、MyBatis和其他持久化层技术对比 二、MyBatis框架搭建三、MyBatis基础功能1、MyBatis核心配置文件2、MyBatis映射文件3、MyBatis实现增删改查4、MyBatis获取参数值的两种方式5、MyBatis查询功能6、MyBatis自定义映…

如何判断自己的数据格式适合使用json还是Excel的形式存入neo4j数据库

判断自己的数据格式适合使用JSON还是Excel的形式存入Neo4j数据库,主要取决于数据的复杂性、规模、结构、以及你或你的团队对这两种格式的熟悉程度。以下是一些关键因素,可以帮助你做出决策: 数据的复杂性: 如果你的数据包含大量的…

Django 入门指南:从环境设置到创建第一个应用程序

简介 Django 是一个流行的 Python Web 框架,用于快速开发强大的 Web 应用程序。本指南将带你从安装 Django 开始,逐步学习如何创建一个简单的 Django 项目和应用程序。 步骤 1: 准备环境 首先,确保你的开发环境中安装了 Python&#xff0c…

【python】OpenCV—Shape Detection

文章目录 1、需求描述2、代码实现3、涉及到的库函数cv2.arcLengthcv2.approxPolyDP 4、案例5、参考 1、需求描述 给出图像,找出其轮廓,近似确认其为几变形图像 输入 输出 2、代码实现 # 导入必要的包 import cv2 import argparse import imutils imp…

3.1、matlab双目相机标定实验

1、双目相机标定原理及流程 双目相机标定是将双目相机系统的内外参数计算出来,从而实现双目视觉中的立体测量和深度感知。标定的目的是确定各个摄像头的内部参数(如焦距、主点、畸变等)和外部参数(如相机位置、朝向等&#xff09…

SVN分支管理基本原理

原文全文详见个人博客: SVN分支管理基本原理学习完svn和git的版本管理理念上的差异后,自然的我们再进一步对比svn和git在分支管理上的原理差异,这种差异正是由二者版本管理理念和存储方式差异造成的,今天我们先研究一下svn的分支…

力扣1942.最小未被占据椅子的编号

力扣1942.最小未被占据椅子的编号 用两个对组数组存到达的离开时间及其编号 遍历到达时间 同时处理之前所有离开时间离开就把座位清空 再给当前到达的安排座位 class Solution {public:int smallestChair(vector<vector<int>>& times, int targetFriend) {i…

ICMP 和 IGMP 的区别

ICMP 和 IGMP 协议 IP 层分支图 ICMP&#xff08;Internet Control Message Protocol&#xff0c;因特网控制信息协议&#xff09; 用于补充 IP 传输数据报的过程中&#xff0c;发送主机无法确定数据报是否到达目标主机。 ICMP 报文分为出错报告报文和查询报文两种。 若数据…

科技云报道:将技术普惠进行到底,百度智能云云原生数据库GaiaDB来啦!

科技云报道原创。 OpenAI再度扔出重磅炸弹。 近期&#xff0c;OpenAI公司在社交平台上宣布&#xff0c;其收购了领先实时分析数据库公司Rockset。 OpenAI强调&#xff0c;OpenAI将在其产品中整合Rockset技术&#xff0c;基于Rockset提供的数据索引和查询功能&#xff0c;使公…

pytorch学习(十三)torch维度变换

包含了flatten、view reshape transpose permute squeeze unsqueeze cat stack&#xff1b;在琢磨一遍之后就比较好理解了。 1.代码 import torch import numpy as np#生成一个2组3行4列的数据 data torch.randn((2,3,4)) print("data.shape:\n",data.shape) prin…

昇思25天学习打卡营第11天|基于 MindSpore 实现 BERT 对话情绪识别

BERT是一种先进的语言模型&#xff0c;由Google在2018年推出。它通过双向编码器Transformer的Encoder部分&#xff0c;捕捉词语和句子的深层含义。BERT的创新之处在于其预训练方法&#xff0c;特别是Masked Language Model和Next Sentence Prediction&#xff0c;这使得它在问答…

spring boot(学习笔记第十四课)

spring boot(学习笔记第十四课) Spring Security的密码加密&#xff0c;基于数据库认证 学习内容&#xff1a; Spring Security的密码加密基于数据库认证 1. Spring Security的密码加密 如果用户的密码保存在数据库中是以明文保存&#xff0c;对于公司的安全将是灾难性的&…

基于上下文自适应可变长熵编码 CAVLC 原理详细分析

CAVLC CAVLC&#xff0c;即Context-Adaptive Variable-Length Coding&#xff0c;是一种用于视频压缩的编码技术&#xff0c;特别是在MPEG-4视频编码标准中使用。CAVLC是一种熵编码方法&#xff0c;它根据视频数据的上下文信息来调整编码长度&#xff0c;以实现更有效的数据压…