BYU-YOLO数据格式准备

BYU - Locating Bacterial Flagellar Motors 2025(在3D断层扫描图像中定位细菌鞭毛马达)

一、数据介绍

1.竞赛介绍

在本次竞赛中,您的任务是在3D断层扫描图像中找到鞭毛马达的中心位置。断层扫描图像是物体的三维体积表示。每个断层扫描图像作为一个独立的目录提供,其中包含一系列2D图像切片(JPEG格式)。您需要预测存在鞭毛马达时其在三维空间中的位置点。

2.文件和目录说明

  • train/:包含多个子目录,每个子目录对应一个用于训练的断层扫描图像。每个断层扫描子目录包含多个JPEG文件,每个JPEG文件是该断层扫描图像的一个2D切片。

  • train_labels.csv:训练数据标签。每一行代表一个唯一的马达位置,而不是一个唯一的断层扫描图像。列包括:

    • row_id:行索引
    • tomo_id:断层扫描图像的唯一标识符。某些断层扫描图像包含多个马达。
    • Motor axis 0:马达的z坐标,即所在的切片编号
    • Motor axis 1:马达的y坐标
    • Motor axis 2:马达的x坐标
    • Array shape axis 0:z轴长度,即断层扫描图像的切片数量
    • Array shape axis 1:y轴长度,即每个切片的高度
    • Array shape axis 2:x轴长度,即每个切片的宽度
    • Voxel spacing:体素间距,即每个体素的埃(Å)数
    • Number of motors:断层扫描图像中的马达数量。注意,每一行代表一个马达,因此包含多个马达的断层扫描图像将有多个行来定位每个马达。
  • test/:包含三个测试断层扫描图像的目录;重新运行的测试数据集包含大约900个断层扫描图像。测试数据仅包含具有一个或零个马达的断层扫描图像。

  • sample_submission.csv:正确格式的示例提交文件。(如果您预测某个断层扫描图像中不存在马达,请将Motor axis 0Motor axis 1Motor axis 2设置为-1)。

3.提交格式

提交文件应遵循sample_submission.csv文件的格式。对于每个断层扫描图像,您需要预测:

  • Motor axis 0(z坐标)
  • Motor axis 1(y坐标)
  • Motor axis 2(x坐标)

如果断层扫描图像中未检测到马达,请将所有三个坐标设置为-1

二、YOLO数据准备

在目标检测任务中,准备高质量的训练数据是模型成功的关键。本文将详细讲解一段用于准备 YOLO(You Only Look Once)目标检测模型训练数据的 Python 脚本。该脚本从 3D 断层扫描图像(tomograms)中提取包含电机(motors)的切片,并将其转换为 YOLO 数据集格式。

代码详解

1. 导入模块

import os
import numpy as np
import pandas as pd
from PIL import Image
import shutil
import time
import yaml
from pathlib import Path
from tqdm.notebook import tqdm  # Use tqdm.notebook for Jupyter/Kaggle environments
import concurrent.futures  # 导入多线程模块
  • os:用于文件和目录操作。
  • numpy (np):用于数值计算和数组操作。
  • pandas (pd):用于数据处理和分析。
  • PIL.Image:用于图像处理。
  • shutil:用于文件复制和移动。
  • time:用于时间相关操作。
  • yaml:用于读写 YAML 格式文件。
  • Path:用于路径操作。
  • tqdm.notebook:用于在 Jupyter Notebook 或 Kaggle 环境中显示进度条。
  • concurrent.futures:用于实现多线程处理。

2. 设置随机种子

np.random.seed(42)

设置随机种子为 42,确保每次运行代码时随机操作的结果是可重复的。

3. 定义路径

data_path = "/kaggle/input/byu-locating-bacterial-flagellar-motors-2025/"
train_dir = os.path.join(data_path, "train")yolo_dataset_dir = "/kaggle/working/yolo_dataset"
yolo_images_train = os.path.join(yolo_dataset_dir, "images", "train")
yolo_images_val = os.path.join(yolo_dataset_dir, "images", "val")
yolo_labels_train = os.path.join(yolo_dataset_dir, "labels", "train")
yolo_labels_val = os.path.join(yolo_dataset_dir, "labels", "val")
  • data_path:原始数据集的路径。
  • train_dir:包含训练数据的目录。
  • yolo_dataset_dir:YOLO 数据集的根目录。
  • yolo_images_trainyolo_images_val:分别是训练集和验证集的图像目录。
  • yolo_labels_trainyolo_labels_val:分别是训练集和验证集的标注目录。

4. 创建目录

for dir_path in [yolo_images_train, yolo_images_val, yolo_labels_train, yolo_labels_val]:os.makedirs(dir_path, exist_ok=True)

创建 YOLO 数据集所需的目录结构,如果目录已存在,则不会重复创建。

5. 定义常量

TRUST = 4  # 定义了在中心切片上下各取多少切片。具体来说,它决定了从中心切片(z_center)向上和向下各扩展多少个切片,总共处理的切片数量为 2 * TRUST + 1
BOX_SIZE = 24  # 标注框的大小(以像素为单位)。这个值用于确定每个电机在图像中的标注框的宽度和高度。
TRAIN_SPLIT = 0.8  # 80% for training, 20% for validation
  • TRUST:定义了在中心切片上下各取多少切片(总共 2 * TRUST + 1 个切片)。
  • BOX_SIZE:定义了标注框的大小(以像素为单位)。
  • TRAIN_SPLIT:定义了训练集和验证集的划分比例(80% 用于训练,20% 用于验证)。

在代码中,BOX_SIZE 是一个非常重要的常量,它定义了标注框(bounding box)的大小,用于目标检测任务。具体来说,BOX_SIZE 的作用如下:

5.1. 标注框的大小

在目标检测任务中,每个目标(例如电机)的位置通常用一个矩形框(标注框)来表示。BOX_SIZE 定义了这个矩形框的宽度和高度(假设标注框是正方形)。例如,如果 BOX_SIZE = 24,则标注框的宽度和高度均为 24 个像素。

5.2. 在代码中的具体应用

在代码的 process_motor 函数中,BOX_SIZE 被用于计算标注框的归一化坐标。以下是相关代码片段:

box_width_norm = BOX_SIZE / img_width
box_height_norm = BOX_SIZE / img_height
  • img_widthimg_height 分别是图像的宽度和高度。
  • box_width_normbox_height_norm 是标注框的宽度和高度归一化到 [0, 1] 范围内的值。
  • 这些归一化后的值是 YOLO 模型所需的标注格式。
5.3. YOLO 标注格式

YOLO 模型的标注文件格式要求标注框的中心点坐标和宽度、高度都归一化到 [0, 1] 范围内。标注文件的每一行表示一个目标,格式如下:

<class> <x_center> <y_center> <width> <height>
  • <class> 是目标的类别(在本例中为 0,表示电机)。
  • <x_center><y_center> 是标注框中心点的归一化坐标。
  • <width><height> 是标注框的归一化宽度和高度。

BOX_SIZE 的值直接影响标注框的大小,从而决定了模型在训练和推理时对目标的检测范围。例如,如果 BOX_SIZE 设置得过大,标注框可能会覆盖多个目标;如果设置得过小,可能会无法完全覆盖目标。

6. 图像归一化函数

def normalize_slice(slice_data):"""Normalize slice data using 2nd and 98th percentiles"""p2 = np.percentile(slice_data, 2)p98 = np.percentile(slice_data, 98)clipped_data = np.clip(slice_data, p2, p98)normalized = 255 * (clipped_data - p2) / (p98 - p2)return np.uint8(normalized)

使用 2% 和 98% 的百分位数对图像数据进行裁剪,以去除异常值。将裁剪后的数据归一化到 [0, 255] 范围内,并转换为 8 位无符号整数。

7. 处理单个电机的函数

def process_motor(tomo_id, z_center, y_center, x_center, z_max, images_dir, labels_dir, trust=TRUST):"""Process a single motor and save the slices and labels""""""这两个变量定义了以 z_center 为中心,向上和向下扩展 trust 个切片的范围。这样可以确保在处理电机时,不仅包括中心切片,还包括其周围的切片,从而捕捉到更多的上下文信息,有助于提高模型的检测准确性。"""z_min = max(0, z_center - trust) # 确保了在 z 轴上不会低于 0z_max = min(z_max - 1, z_center + trust) # 确保了在 z 轴上不会超过断层扫描图像的最大切片数减一processed_slices = 0for z in range(z_min, z_max + 1):slice_filename = f"slice_{z:04d}.jpg" # 根据当前切片编号 z 生成一个格式化的文件名,确保文件名是 4 位数字,不足 4 位时用前导零填充。src_path = os.path.join(train_dir, tomo_id, slice_filename) # 加载图片if not os.path.exists(src_path):print(f"Warning: {src_path} does not exist, skipping.")continueimg = Image.open(src_path)img_array = np.array(img)normalized_img = normalize_slice(img_array) # 归一化处理图片dest_filename = f"{tomo_id}_z{z:04d}_y{y_center:04d}_x{x_center:04d}.jpg" # 保存的图片dest_path = os.path.join(images_dir, dest_filename) # 保存图像的地址Image.fromarray(normalized_img).save(dest_path)"""这里是yolo数据格式的计算方法,这里做了归一化处理"""img_width, img_height = img.sizex_center_norm = x_center / img_widthy_center_norm = y_center / img_heightbox_width_norm = BOX_SIZE / img_widthbox_height_norm = BOX_SIZE / img_heightlabel_path = os.path.join(labels_dir, dest_filename.replace('.jpg', '.txt'))with open(label_path, 'w') as f:f.write(f"0 {x_center_norm} {y_center_norm} {box_width_norm} {box_height_norm}\n")processed_slices += 1return processed_slices

YOLO 格式的标注文件要求标注框的中心坐标和尺寸都归一化到 [0, 1] 范围内。这样做的好处是:
模型鲁棒性:归一化使得模型对不同尺寸的输入图像具有更好的鲁棒性。<

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

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

相关文章

【AIGC前沿】MiniMax海螺AI视频——图片/文本生成高质量视频

目录 1.MiniMax海螺AI视频简介 2.使用教程 1.MiniMax海螺AI视频简介 海螺视频&#xff0c;作为 MiniMax 旗下海螺 AI 平台精心打造的 AI 视频生成工具&#xff0c;致力于助力用户产出高品质视频内容。该工具依托 abab-video-1 模型&#xff0c;具备强大的文生视频功能。用户…

Kubeasz工具快速部署K8Sv1.27版本集群(二进制方式)

文章目录 一、基本信息二、服务器初始化操作三、使用Kubeasz部署K8S集群四、验证集群 一、基本信息 1、部署需要满足前提条件&#xff1a; 注意1&#xff1a;确保各节点时区设置一致、时间同步&#xff1b;注意2&#xff1a;确保在干净的系统上开始安装&#xff1b;注意3&…

在VMware上部署【Ubuntu】

镜像下载 国内各镜像站点均可下载Ubuntu镜像&#xff0c;下面例举清华网站 清华镜像站点&#xff1a;清华大学开源软件镜像站 | Tsinghua Open Source Mirror 具体下载步骤如下&#xff1a; 创建虚拟机 准备&#xff1a;在其他空间大的盘中创建存储虚拟机的目录&#xff0c…

2025年Postman的五大替代工具

虽然Postman是一个广泛使用的API测试工具&#xff0c;但许多用户在使用过程中会遇到各种限制和不便。因此&#xff0c;可能需要探索替代解决方案。本文介绍了10款强大的替代工具&#xff0c;它们能够有效替代Postman&#xff0c;成为你API测试工具箱的一部分。 什么是Postman&…

wow-rag—task5:流式部署

我们希望做一个流式输出的后端&#xff0c;然后让前端去捕获这个流式输出&#xff0c;并且在聊天界面中流式输出。 首先构造流式输出引擎。 # 构造流式输出引擎 query_engine index.as_query_engine(streamingTrue, similarity_top_k3,llmllm)然后生成response_stream&#x…

投资日记_道氏理论技术分析

主要用于我自己参考&#xff0c;我感觉我做事情的时候容易上头&#xff0c;忘掉很多事情。 技术分析有很多方法&#xff0c;但是我个人相信并实践的还是以道氏理论为根本的方法。方法千千万万只有适合自己价值观&#xff0c;习惯&#xff0c;情绪&#xff0c;性格的方法才是好的…

LangChain4j入门指南:Java开发者的AI应用新起点

什么是LangChain和LangChain4j&#xff1f; LangChain是⼀个⼤模型的开发框架&#xff0c;使⽤ LangChain 框架&#xff0c;程序员可以更好的利⽤⼤模型的能⼒&#xff0c;⼤⼤提⾼编 程效率。如果你是⼀个 Java 程序员&#xff0c;那么对 LangChain 最简单直观的理解就是&…

【实测闭坑】LazyGraphRAG利用本地ollama提供Embedding model服务和火山引擎的deepseek API构建本地知识库

LazyGraphRAG 2024年4月&#xff0c;为解决传统RAG在全局性的查询总结任务上表现不佳&#xff0c;微软多部门联合提出Project GraphRAG&#xff08;大模型驱动的KG&#xff09;&#xff1b;2024年7月&#xff0c;微软正式开源GraphRAG项目&#xff0c;引起极大关注&#xff0c…

压力测试实战指南:JMeter 5.x深度解析与QPS/TPS性能优化

一、压力测试基础概念 1.1 什么是压力测试&#xff1f; 定义&#xff1a;模拟极端负载场景验证系统性能极限 目的&#xff1a;发现性能瓶颈、评估系统可靠性、验证容错能力 常见类型&#xff1a;负载测试、压力测试、稳定性测试、峰值测试 1.2 核心性能指标解析 1.2.1 QP…

嵌入式4-Modbus

1.Modbus Modbus 是一种广泛应用于工业自动化领域的通信协议&#xff0c;用于在不同设备&#xff08;如传感器、PLC、变频器、仪表等&#xff09;之间交换数据。它支持串行通信&#xff08;如 RS232、RS485&#xff09;和以太网通信&#xff08;Modbus TCP&#xff09;&#x…

机器学习-手搓KNN算法

一、简介 K最近邻&#xff08;K-Nearest Neighbors, KNN&#xff09;​ 是一种简单且直观的监督学习算法&#xff0c;适用于分类和回归任务。其核心思想是&#xff1a;​相似的数据点在特征空间中彼此接近。KNN通过计算新样本与训练数据中各个样本的距离&#xff0c;找到最近的…

Linux|fork命令及其使用的写时拷贝技术

fork复制进程 fork通过以下步骤来复制进程&#xff1a; 分配新的进程控制块&#xff1a;内核为新进程分配一个新的进程控制块&#xff08;PCB&#xff09;&#xff0c;用于存储进程的相关信息&#xff0c;如进程 ID、状态、寄存器值、内存指针等。复制进程地址空间&#xff1…

Hoppscotch 开源API 开发工具

Hoppscotch 是一个开源的 API 开发工具&#xff0c;旨在为开发者提供一个轻量级、快速且功能丰富的 API 开发和调试平台。以下是对其主要特性和功能的详细介绍&#xff1a; 1. 轻量级与高效 Hoppscotch 采用简约的 UI 设计&#xff0c;注重易用性和高效性。它支持实时发送请求…

Datawhale大语言模型-Transformer以及模型详细配置

Datawhale大语言模型-Transformer以及模型详细配置 Transformer模型位置编码前馈层网络注意力机制多头自注意力编码器解码器 大语言模型的参数配置归一化激活函数位置编码旋转位置编码代码内容实现 注意力机制 参考资料 Transformer模型 当前主流的大语言模型都基于 Transform…

iPhone 16怎么编辑图片?图片编辑技巧、软件分享

在当今这个视觉信息爆炸的时代&#xff0c;一张经过精心编辑的图片往往能够瞬间抓住观众的眼球&#xff0c;而 iPhone 16凭借其卓越的硬件性能和丰富的软件生态&#xff0c;在图片编辑领域展现出了非凡的实力&#xff0c;成为众多摄影爱好者和创意工作者的得力助手。 一、编辑效…

代码随想录_动态规划

代码随想录 动态规划 509.斐波那契数 509. 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n…

【虚幻引擎UE5】SpawnActor生成Character实例不执行AI Move To,未初始化AIController的原因和解决方法

虚幻引擎版本&#xff1a;5.5.4 问题描述 刚创建的Third Person项目里&#xff0c;定义一个BP_Enemy蓝图&#xff0c;拖拽到场景中产生的实例会追随玩家&#xff0c;但SpawnActor产生的实例会固定不动。BP_Enemy蓝图具体设计如下&#xff1a; BP_Enemy的Event Graph ​​ 又定义…

论文笔记(七十三)Gemini Robotics: Bringing AI into the Physical World

Gemini Robotics: Bringing AI into the Physical World 文章概括1. 引言2. Gemini 2.0的具身推理2.1. 具身推理问答&#xff08;ERQA&#xff09;基准测试2.2. Gemini 2.0的具身推理能力2.3. Gemini 2.0支持零样本和少样本机器人控制 3. 使用 Gemini Robotics 执行机器人动作3…

汇能感知高品质的多光谱相机VSC02UA

VSC02UA概要 VSC02UA是一款高品质的200万像素的光谱相机&#xff0c;适用于工业检测、农业、医疗等领域。VSC02UA 包含 1600 行1200 列有源像素阵列、片上 10 位 ADC 和图像信号处理器。它带有 USB2.0 接口&#xff0c;配合专门的电脑上位机软件使用&#xff0c;可进行图像采集…

VSCode创建VUE项目(三)使用axios调用后台服务

1. 安装axios,执行命令 npm install axios 2. 在 main.ts 中引入并全局挂载 Axios 实例 修改后的 代码&#xff08;也可以单独建一个页面处理Axios相关信息等&#xff0c;然后全局进行挂载&#xff09; import { createApp } from vue import App from ./App.vue import rou…