最新推送

This commit is contained in:
琉璃月光
2026-03-10 13:58:21 +08:00
parent 032479f558
commit eb16eeada3
97 changed files with 16865 additions and 670 deletions

View File

@ -0,0 +1,50 @@
import os
# ======================
# 配置
# ======================
LABEL_DIR = "/media/hx/04e879fa-d697-4b02-ac7e-a4148876ebb0/dataset/detect/val" # 改成你的标签文件夹路径
BACKUP = False # 是否备份原文件
def convert_labels_to_zero(label_dir):
for filename in os.listdir(label_dir):
if not filename.endswith(".txt"):
continue
file_path = os.path.join(label_dir, filename)
with open(file_path, "r", encoding="utf-8") as f:
lines = f.readlines()
new_lines = []
for line in lines:
line = line.strip()
if not line:
continue
parts = line.split()
if len(parts) < 5:
# 非标准 yolo 行,原样保留
new_lines.append(line)
continue
# 强制类别改为 0
parts[0] = "0"
new_lines.append(" ".join(parts))
# 备份
if BACKUP:
backup_path = file_path + ".bak"
if not os.path.exists(backup_path):
os.rename(file_path, backup_path)
save_path = file_path
else:
save_path = file_path
with open(save_path, "w", encoding="utf-8") as f:
f.write("\n".join(new_lines) + "\n")
print(f"[OK] 已处理: {filename}")
if __name__ == "__main__":
convert_labels_to_zero(LABEL_DIR)

105
tool/d_n.py Normal file
View File

@ -0,0 +1,105 @@
import os
import shutil
import math
# ================= 配置区域 =================
# 【全局变量】在这里修改你要分成的份数
N_FOLDERS = 4
# 源文件夹名称 (相对于当前脚本运行目录)
SOURCE_DIR_NAME = "camera02_save"
# 支持的图片扩展名
VALID_EXTENSIONS = ('.jpg', '.jpeg', '.png', '.bmp', '.tif', '.tiff')
# ===========================================
def split_images_to_subfolders():
# 1. 获取当前脚本所在的绝对路径
base_dir = os.getcwd()
source_path = os.path.join(base_dir, SOURCE_DIR_NAME)
# 2. 检查源文件夹是否存在
if not os.path.exists(source_path):
print(f"❌ 错误: 找不到文件夹 '{source_path}'")
print("请确保脚本在包含 'camera02_save' 的目录下运行。")
return
# 3. 获取所有图片文件列表
all_files = os.listdir(source_path)
image_files = [
f for f in all_files
if f.lower().endswith(VALID_EXTENSIONS) and os.path.isfile(os.path.join(source_path, f))
]
# 按文件名排序,保证分配顺序一致(可选)
image_files.sort()
total_count = len(image_files)
if total_count == 0:
print(f"警告: '{source_path}' 中没有找到任何图片文件。")
return
print(f"发现图片总数: {total_count}")
print(f"计划分成: {N_FOLDERS}")
# 4. 计算分配逻辑
# 使用轮询方式分配,确保每个文件夹数量尽可能平均
# 例如10张图分3份 -> 4, 3, 3
created_folders = []
for index, filename in enumerate(image_files):
# 计算该图片应该去哪个子文件夹 (0 到 N_FOLDERS-1)
folder_index = index % N_FOLDERS
subfolder_name = f"part_{folder_index}"
# 构建子文件夹完整路径
dest_folder_path = os.path.join(source_path, subfolder_name)
# 如果文件夹不存在,则创建
if not os.path.exists(dest_folder_path):
os.makedirs(dest_folder_path)
created_folders.append(subfolder_name)
print(f"✅ 创建子文件夹: {subfolder_name}")
# 构建源文件和目标文件路径
src_file = os.path.join(source_path, filename)
dst_file = os.path.join(dest_folder_path, filename)
# 移动文件 (剪切)
try:
shutil.move(src_file, dst_file)
except Exception as e:
print(f"❌ 移动失败 {filename}: {e}")
# 5. 统计结果
print("\n" + "=" * 30)
print("分配完成!统计如下:")
print("=" * 30)
# 重新扫描统计每个文件夹的数量
final_counts = {}
for i in range(N_FOLDERS):
fname = f"part_{i}"
fpath = os.path.join(source_path, fname)
if os.path.exists(fpath):
count = len([f for f in os.listdir(fpath) if f.lower().endswith(VALID_EXTENSIONS)])
final_counts[fname] = count
print(f"{fname}: {count} 张图片")
print("=" * 30)
print(f"总计移动: {sum(final_counts.values())} 张图片")
if __name__ == "__main__":
# 提示用户确认
print(f"当前工作目录: {os.getcwd()}")
confirm = input(f"即将把 '{SOURCE_DIR_NAME}' 中的图片均分为 {N_FOLDERS} 份。\n是否继续?(y/n): ")
if confirm.lower() == 'y':
split_images_to_subfolders()
else:
print("操作已取消。")

View File

@ -98,11 +98,11 @@ if __name__ == "__main__":
# 修改为你自己的路径
#TRAIN_DIR = "/media/hx/04e879fa-d697-4b02-ac7e-a4148876ebb0/dataset/cls-new/19cc/train"
#VAL_DIR = "/media/hx/04e879fa-d697-4b02-ac7e-a4148876ebb0/dataset/cls-new/19cc/val"
TRAIN_DIR = "/media/hx/04e879fa-d697-4b02-ac7e-a4148876ebb0/dataset/point2/train"
VAL_DIR = "/media/hx/04e879fa-d697-4b02-ac7e-a4148876ebb0/dataset/point2/val1"
TRAIN_DIR = "/media/hx/04e879fa-d697-4b02-ac7e-a4148876ebb0/dataset/1/charge/train"
VAL_DIR = "/media/hx/04e879fa-d697-4b02-ac7e-a4148876ebb0/dataset/1/charge/val"
split_train_to_val(
train_dir=TRAIN_DIR,
val_dir=VAL_DIR,
ratio=0.1, # 抽取 10%
seed=42 # 随机种子
seed=58 # 随机种子al
)