【yolov8分类任务-全流程】【公开数据白内障-101:101例白内障手术的视频数据集】

文章目录

  • 1.公开数据集
    • 1.1.白内障-101:数据集文件结构
      • 1.1.1.视频文件
      • 1.1.2.注释文件
        • (1)videos.csv
        • (2) phases.csv
        • (3)annotations.csv
    • 1.2. 数据处理
      • 1.2.1.抽帧脚本全部代码(每行都有注释)
      • 1.2.2.分类任务划分数据集脚本
  • 2.yolov8分类任务训练
    • 2.1.配环境
    • 2.2.训练命令:
    • 2.3.训练结果

1.公开数据集

白内障-101:101例白内障手术的视频数据集

摘要
白内障手术是眼科领域最常进行的显微手术之一。这种手术背后的目标是用人造晶状体代替人眼晶状体,这是由于衰老而经常需要的干预。整个手术是在显微镜下进行的,但共同安装的摄像机可以记录和存档手术过程。目前,录制的视频以术后方式用于记录和培训。录制白内障视频的另一个好处是,它们能够进行视频分析(即手动和/或自动视频内容分析),以调查与医学相关的研究问题(例如,并发症的原因)。然而,这需要一个医疗多媒体信息系统,该系统根据现有数据进行训练和评估,而这些数据目前尚未公开。在这项工作中,我们提供了一个公共视频数据集,其中包含 101 例白内障手术,这些手术由四位不同的外科医生在 9 个月内进行。这些外科医生分为中等经验和经验丰富的外科医生(助理医生与高级医生),为基于经验的视频分析提供了基础。所有视频均由高级眼科医生用准标准化操作阶段进行注释。

1.1.白内障-101:数据集文件结构

在这里插入图片描述

1.1.1.视频文件

在这里插入图片描述

视频文件存储在 videos 子目录中,文件名遵循以下模式:

case_videoID.mp4

例如,视频 269 的文件名为 case_269.mp4

视频文件使用 H.264/AVC 编解码器编码,帧率为 25 帧每秒,分辨率为 720x540 像素。提供的视频的平均持续时间约为 12500 帧(8.3 分钟)。

1.1.2.注释文件

注释以三个以分号分隔的值文件提供,每个文件都包含描述字段的标题行。

(1)videos.csv

在这里插入图片描述

包含有关整个视频文件的元数据,包括所有整数字段:

  • 视频 ID
  • 视频帧数
  • 帧率(25)
  • 手术医生 ID(1-4)
  • 手术医生的经验水平(1 = 低,2 = 高)

下表显示了每位手术医生的视频分布以及每个经验水平的视频数量。

手术医生 ID视频
125
224
332
420
经验水平视频
1(低)45
2(高)56
(2) phases.csv

在这里插入图片描述

描述白内障手术的十个准标准操作阶段(更多信息请参阅上述引用的论文)。这两个字段是:

  • 阶段 ID(1-10 的整数)
  • 阶段名称(字符串)
(3)annotations.csv

在这里插入图片描述

包含所有提供视频的操作阶段边界的专家注释。由于注释工具的使用,仅注释了操作阶段的起始点,手动选择时间点的准确性不超过 +/- 1 秒(+/- 25 帧)。尽管如此,注释以帧分辨率提供,以便使用该数据集进行基于帧的评估时进行比较。

CSV 文件的每一行(除了标题行)描述了一个操作阶段注释的起始点,具有以下所有整数字段:

  • 视频 ID(与 videos.csv 中的 ID 匹配)
  • 表示操作阶段起始点的帧编号(从零开始),该帧延伸到下一个注释或同一视频的结束
  • 阶段 ID(与 phases.csv 中的 ID 匹配)

CSV 文件中的行按(视频 ID,帧编号)的词典顺序排序。

请注意所选择的注释过程的以下后果:

  1. 给定视频的第一个注释(第一个操作阶段的开始)之前的视频段实际上未被注释,即未分配给任何操作阶段。
  2. 给定视频的最后一个注释开始的视频段实际上延伸到视频的结束,尽管注释的操作阶段实际上可能会提前结束。然而,视频获取过程表明,手术末期的这段“超出阶段”的时间通常只有几秒钟。
  3. 同一视频中可能会连续出现相同操作阶段的注释,因为同一阶段可能会重复或分成也由医学专家注释的子阶段。事后已整合子阶段以符合 phases.csv 中描述的准标准阶段。

最后,请注意,phases.csv 中定义的操作阶段的线性顺序通常在手术中不严格遵循,主要有两个原因:

  • 第2阶段(注入粘性剂)通常在每次白内障手术中发生两次,并且两个视频片段与相同的阶段 ID 进行了注释,因为从视觉角度通常无法区分它们。
  • 手术医生(特别是经验较少的医生)有时可能不得不重复某些阶段或阶段序列。

1.2. 数据处理

1.2.1.抽帧脚本全部代码(每行都有注释)

  • 对101例白内障手术的视频数据集视频进行处理,根据提供的标签CSV文件中的分类信息,从每个视频中抽取帧,并将这些帧按照YOLO分类任务的不同类别进行分类。每个类别将被放置在不同的文件夹中,并且每个帧的文件名将包含相关信息。

  • 鉴于从视频中每秒抽取25帧会导致数据重复过多,并且产生的数据量超过一百万张图片,因此决定调整抽帧策略,每秒仅抽取2帧。这样既可以有效减少数据量,也有助于降低重复数据的比例。

  • 抽帧结果示例:
    在这里插入图片描述
    在这里插入图片描述

脚本名Script.py

import os
import cv2
import pandas as pd# 设置 CSV 文件路径和视频文件目录
annotations_csv_path = 'annotations.csv'  # 您的 CSV 文件路径
phases_csv_path = 'phases.csv'  # phases.csv 文件路径
video_dir = 'videos'  # 视频文件所在的目录# 设置输出文件夹路径
output_dir = 'output_frames10'# 如果输出文件夹不存在,创建它
if not os.path.exists(output_dir):os.makedirs(output_dir)# 读取 phases.csv 文件,创建阶段 ID 到含义的字典
phases_df = pd.read_csv(phases_csv_path, sep=';')
phases_dict = dict(zip(phases_df['Phase'], phases_df['Meaning']))# 读取 annotations.csv 文件
df = pd.read_csv(annotations_csv_path, sep=';')# 遍历 annotations.csv 文件中的每一行
for index, row in df.iterrows():video_id = row['VideoID']start_frame_no = row['FrameNo']phase_id = row['Phase']phase_meaning = phases_dict.get(phase_id, f'Phase_{phase_id}')print(phase_meaning)# 查找下一个阶段的帧编号if index + 1 < len(df) and df.iloc[index + 1]['VideoID'] == video_id:end_frame_no = df.iloc[index + 1]['FrameNo']else:# 如果没有下一个阶段,则将结束帧设置为视频的最后一帧video_cap = cv2.VideoCapture(os.path.join(video_dir, f'case_{video_id}.mp4'))end_frame_no = int(video_cap.get(cv2.CAP_PROP_FRAME_COUNT))video_cap.release()# 构建视频文件路径video_file_path = os.path.join(video_dir, f'case_{video_id}.mp4')# 检查视频文件是否存在if not os.path.exists(video_file_path):print(f'Video file not found: {video_file_path}')continue# 打开视频文件video_cap = cv2.VideoCapture(video_file_path)# 从起始帧到结束帧的范围读取帧for current_frame_no in range(int(start_frame_no), int(end_frame_no),12):# 设置视频的位置到指定的帧编号video_cap.set(cv2.CAP_PROP_POS_FRAMES, current_frame_no)# 读取帧success, frame = video_cap.read()# 如果读取成功if success:# 创建输出文件夹,按 phase_meaning 创建子目录phase_folder = os.path.join(output_dir, phase_meaning)# video_folder = os.path.join(phase_folder, f'video_{video_id}')if not os.path.exists(phase_folder):os.makedirs(phase_folder)# 构建输出文件路径output_file_path = os.path.join(phase_folder, f'case_{video_id}_frame_{current_frame_no}_phase_{phase_meaning}.jpg')# 保存帧到输出文件cv2.imwrite(output_file_path, frame)print(f'Saved frame: {output_file_path}')else:print(f'Failed to read frame: {current_frame_no} from video: {video_file_path}')# 关闭视频文件video_cap.release()print('Finished extracting frames.')

1.2.2.分类任务划分数据集脚本

脚本名:cla_split.py

import os
import random
import shutil
from shutil import copy2def data_set_split(src_data_folder, target_data_folder, train_scale=0.8, val_scale=0.1, test_scale=0.1):#读取源数据文件夹,生成划分好的文件夹,分为trian、val、test三个文件夹print("开始数据集划分")class_names = os.listdir(src_data_folder)split_names = ['train', 'val', 'test']for split_name in split_names:split_path = os.path.join(target_data_folder, split_name)if os.path.isdir(split_path):passelse:os.mkdir(split_path)for class_name in class_names:class_split_path = os.path.join(split_path, class_name)if os.path.isdir(class_split_path):passelse:os.mkdir(class_split_path)for class_name in class_names:current_class_data_path = os.path.join(src_data_folder, class_name)current_all_data = os.listdir(current_class_data_path)current_data_length = len(current_all_data)current_data_index_list = list(range(current_data_length))random.shuffle(current_data_index_list)train_folder = os.path.join(os.path.join(target_data_folder, 'train'), class_name)val_folder = os.path.join(os.path.join(target_data_folder, 'val'), class_name)test_folder = os.path.join(os.path.join(target_data_folder, 'test'), class_name)train_stop_flag = current_data_length * train_scaleval_stop_flag = current_data_length * (train_scale + val_scale)current_idx = 0train_num = 0val_num = 0test_num = 0for i in current_data_index_list:src_img_path = os.path.join(current_class_data_path, current_all_data[i])if current_idx <= train_stop_flag:copy2(src_img_path, train_folder)train_num = train_num + 1elif (current_idx > train_stop_flag) and (current_idx <= val_stop_flag):copy2(src_img_path, val_folder)val_num = val_num + 1else:copy2(src_img_path, test_folder)test_num = test_num + 1current_idx = current_idx + 1print("*********************************{}*************************************".format(class_name))print("{}类按照{}:{}:{}的比例划分完成,一共{}张图片".format(class_name, train_scale, val_scale, test_scale, current_data_length))print("训练集{}:{}张".format(train_folder, train_num))print("验证集{}:{}张".format(val_folder, val_num))print("测试集{}:{}张".format(test_folder, test_num))if __name__ == '__main__':src_data_folder = "/home/hadoop/output_frames10/"target_data_folder = "/home/hadoop/splitData_frames10/"data_set_split(src_data_folder, target_data_folder)

划分结果示例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.yolov8分类任务训练

2.1.配环境

就不赘述了。
在这里插入图片描述

2.2.训练命令:

yolo classify train data="splitData_frames10" model=yolov8s-cls.pt epochs=100 device=0,1,2,3 batch = 128

开始训练
在这里插入图片描述

2.3.训练结果

示例图:
在这里插入图片描述
推理示例图:
在这里插入图片描述

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

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

相关文章

代码技巧: 类中同一个函数可以同时存在常函数版本和普通函数版本(c++)

在类中如果我们希望在常函数中修改某属性的值可以使用mutable来实现。 如果有下面的场景&#xff0c;假设我们有一个函数hobby()需要在非const的对象调用的时候&#xff0c;应该去修改内部的属性&#xff0c;在const修饰的对象调用的时候可以满足不修改内部的属性。 鉴于上面的…

effective python学习笔记_列表与字典

学习对序列做切片 实现了__getitem__类即可支持切片&#xff0c;实现了__setitem__类可支持切片赋值 切片时下标索引可以越界&#xff0c;但按下标访问元素不可以越界&#xff0c;会IndexError 可以通过切片赋值不相等数量元素实现元素添加或赋值 切片不建议同时提供起始下…

【Shell】Shell编程之函数

目录 1.Shell函数定义 2.Shell函数的作用 3.函数返回值 4.函数传参 5.函数变量的作用范围 案例 1.Shell函数定义 格式1 function 函数名 { 命令序列 } 格式2 函数名() { 命令序列 } 2.Shell函数的作用 使用函数可以避免代码重复 使用函数可以将大的工程分割为若…

2024OD机试卷-素数之积 (java\python\c++)

题目:素数之积 题目描述 RSA加密算法 在网络安全世界中无处不在,它利用了极大整数因数分解的困难度,数据越大,安全系数越高,给定一个 32 位正整数,请对其进行因数分解,找出是哪两个素数的乘积。 输入描述 一个正整数 num 0 < num < 2147483647 输出描述 如果…

供水设备数据采集

随着城市化进程的加快&#xff0c;供水系统作为城市基础设施的重要组成部分&#xff0c;其运行效率和稳定性直接关系到市民的日常生活。在这个信息化、智能化的时代&#xff0c;如何利用先进技术提升供水系统的管理水平&#xff0c;成为了摆在我们面前的重要课题。HiWoo Cloud平…

java+jsp+sql server 医院住院管理系统论文(二)

⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️ ➡️点击免费下载全套资料:源码、数据库、部署教程、论文、答辩ppt一条龙服务 ➡️有部署问题可私信联系 ⬆️⬆️⬆️​​​​​​​⬆️…

vue+cesium项目demo

使用turf时在index.html中引用 <!-- 使用unpkg --> <script src"https://unpkg.com/turf/turf/turf.min.js"></script> <template><div class"cesium_box" id"cesiumContatiner"></div><button class&q…

【保姆级教程】VMware Workstation Pro的虚拟机导入vritualbox详细教程

解决方案 1、OVF格式2、VMX格式 1、OVF格式 选定需要导出的虚拟机&#xff08;关闭或者挂起状态下&#xff09;依次选择文件-导出为ovf 在Vritualbox导入刚刚导出的.ovf文件 更改路径&#xff0c;按实际需要修改 成功导入 2、VMX格式 如果在VMware Workstation Pro导出的…

Vue实战技巧 —— 企业开发实战中的常见疑难问题

Vue企业开发实战中的常见疑难问题 1. 解决Vue动态路由参数变化&#xff0c;页面数据不更新2. vue组件里定时器销毁问题3. vue实现按需加载组件的两种方式4. 组件之间&#xff0c;父子组件之间的通信方案5. Vue中获取当前父元素&#xff0c;子元素&#xff0c;兄弟元素6. 开发环…

安卓手机APP开发__支持不同的语言和文化

安卓手机APP开发__支持不同的语言和文化 目录 概述 创建本地的目录和资源文件 在你的app中使用资源 结构化消息中的文本 概述 APP包括了能被指定为一种特定的文件的资源。例如&#xff0c;一个APP能够包括 特定的文件的字符串&#xff0c;这个字符串能被翻译为本地的语言…

pg数据库的热备

Pg数据库主从复制 ​ 前言&#xff1a;公司的一台服务器因为断电导致系统损坏&#xff0c;经过3天的抢修&#xff0c;将服务器和数据恢复。为了避免数据的丢失&#xff0c;先将数据备份&#xff0c;并进行高可用。 ​ 采用技术&#xff1a;keepalivedpg ​ 后期并实现zabbix…

传说中的运维门户设计

在IT服务管理这片广阔天地中&#xff0c;运维门户如同一位技艺高超的魔术师&#xff0c;轻轻一挥手&#xff0c;便将纷繁复杂的运维世界化繁为简&#xff0c;编织成一张便捷高效、触手可及的网络。它不仅是ITSM系统中不可或缺的一环&#xff0c;更是连接用户与技术世界的桥梁&a…

Spring WebFlux:响应式编程

在软件开发领域&#xff0c;随着互联网应用的规模和复杂性不断增加&#xff0c;传统的编程模型逐渐暴露出一些局限性&#xff0c;尤其是在面对高并发、大规模数据流处理等场景时。为了应对这些挑战&#xff0c;响应式编程&#xff08;Reactive Programming&#xff09;应运而生…

Java字符串去除空格的方法

前言 在Java编程实践中&#xff0c;处理字符串中的空格是一项基本且频繁的操作。本文将深入探讨如何使用Java原生方法以及Apache Commons Lang库中的StringUtils类&#xff0c;全方位解决字符串去空格的需求&#xff0c;让你的代码更加健壮和高效。 1. Java原生方法 a. trim…

电商核心技术揭秘56:客户关系管理与忠诚度提升

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 文章目录 引言客户关系管理&#xff08;CRM&#xff09;的重要性提升顾客体验数据驱…

AWS之云种类与云服务模式

云种类分为3种&#xff1a; 公有云&#xff1a;任何个人或者企业都可以通过注册的方式直接使用的云。&#xff08;特点&#xff1a;使用简单&#xff1b;通过web界面快速购买。缺点&#xff1a;安全性低&#xff1b;使用资源是与其他用户共享。&#xff09; 私有云&#xff1…

Intel HDSLB 高性能四层负载均衡器 — 快速入门和应用场景

目录 文章目录 目录前言与背景传统 LB 技术的局限性HDSLB 的特点和优势HDSLB 的性能参数基准性能数据对标竞品 HDSLB 的应用场景HDSLB 的发展前景参考文档 前言与背景 在云计算、SDN、NFV 高速发展并普遍落地的今天&#xff0c;随着上云业务的用户数量越来越多、数据中心的规模…

umi项目配置之项目构建时配置umirc.ts

对于 umi 中能使用的自定义配置&#xff0c;你可以使用项目根目录的 .umirc.ts 文件或者 config/config.ts&#xff0c;值得注意的是这两个文件功能一致&#xff0c;仅仅是存在目录不同&#xff0c;2 选 1 &#xff0c;.umirc.ts 文件优先级较高 umi 的配置文件是一个正常的 n…

【vivado】 IBERT GT收发器误码率测试

一、前言 IBERT(Integrated Bit Error Ratio Tester),集成误码率测试仪。作为用户来说可以使用这个工具对自己设计的板子中的高速串行收发器进行简单测试&#xff0c;从而判断设计的接口是否有问题。因为这个工具是直接集成到FPGA上&#xff0c;这样一来直接使用这个工具来测试…

ubuntu下安装wireshark

1、安装wireshark 打开终端&#xff0c;输入安装命令 sudo apt-get install wireshark 2、启动 输入命令回车&#xff0c;一定要加上sudo sudo wireshark 3、看到有很多UDP、ARP、ICMP协议等的网络报文 4、以太网口抓取到的报文&#xff0c;列表属性分别为&#xff1a; 编号| 时…