Open5

指定されたフォルダ内のすべてのYOLOフォーマットアノテーションのテキストファイルを走査し、ラベル番号が0のアノテーションの数をカウントするためのPythonスクリプト

PINTOPINTO
import os

# 指定されたフォルダのパス
folder_path = './obj_train_data'

# ラベル番号0のアノテーションの数をカウントする変数
total_label_zero_count = 0
target_file_list = []

# 指定されたフォルダ内の全てのファイルを走査
for filename in sorted(os.listdir(folder_path)):
    file_label_zero_count = 0
    # ファイルがテキストファイルであることを確認
    if filename.endswith('.txt'):
        file_path = os.path.join(folder_path, filename)

        # ファイルを開いて内容を読み込む
        with open(file_path, 'r') as file:
            for line in file:
                # 各行を空白で分割して最初の要素(ラベル番号)を取得
                label = line.split()[0]

                # ラベル番号が0であればカウントアップ
                if label == '0':
                    file_label_zero_count += 1
                    total_label_zero_count += 1
        if file_label_zero_count > 0:
            target_file_list.append(filename)

print(f"ラベル番号0のアノテーションは合計で{total_label_zero_count}件あります。")
for fn in target_file_list:
    print(fn)
PINTOPINTO

下記のようなファイルが数千枚ある。
000000000036.txt
000000000037.txt
000000000038.txt
frame_0000.txt
frame2_0000.txt
frame3_0000.txt
dist_000000000036.txt
dist_000000000037.txt
dist_000000000038.txt
各ファイルは YOLO フォーマットのアノテーションが記録されたテキストファイルです。具体的には、0から3までの連番でラベル付けされたアノテーションデータ。
0 0.488281 0.653583 0.123104 0.151444
2 0.488281 0.653583 0.123104 0.151444
1 0.956385 0.970417 0.087229 0.055833
3 0.956385 0.970417 0.087229 0.055833
3 0.956385 0.970417 0.087229 0.055833
その前提において、任意のフォルダの配下にある同様の全てのテキストファイルの中身を走査し、ラベル番号2の行を全て削除したうえで、ラベル番号3をラベル番号2に更新する

import glob
import os

# 対象のフォルダパスを設定 (このパスは例です。実際のパスに置き換えてください)
folder_path = '/path/to/your/folder'

# フォルダ内の全てのテキストファイルにマッチするパターン
file_pattern = os.path.join(folder_path, '*.txt')

# マッチする全てのファイルを取得
file_list = glob.glob(file_pattern)

# 各ファイルに対して処理を実行
for file_path in sorted(file_list):
    with open(file_path, 'r') as file:
        lines = file.readlines()

    with open(file_path, 'w') as file:
        for line in lines:
            parts = line.strip().split(' ')
            if parts[0] == '2':  # ラベル番号2の行は削除
                continue
            if parts[0] == '3':  # ラベル番号3をラベル番号2に更新
                parts[0] = '2'
            file.write(' '.join(parts) + '\n')
PINTOPINTO

下記のようなファイルが数千枚あります。
000000000036.txt
000000000037.txt
000000000038.txt
frame_0000.txt
frame2_0000.txt
frame3_0000.txt
dist_000000000036.txt
dist_000000000037.txt
dist_000000000038.txt
各ファイルは YOLO フォーマットのアノテーションが記録されたテキストファイルです。具体的には、1から2までの連番でラベル付けされたアノテーションデータです。
2 0.488281 0.653583 0.123104 0.151444
1 0.956385 0.970417 0.087229 0.055833
その前提において、任意のフォルダの配下にある同様の全てのテキストファイルの中身を走査し、ラベル番号1とラベル番号2の行を全てコピーしたうえで、ラベル番号0の行を追加する実装を教えてください。ラベル番号のみを0に置き換えた同じ値を持つ行を複写して生成したいです。

import glob
import os

# 対象のフォルダパスを設定します(このパスは例です。実際のパスに置き換えてください)
folder_path = '/path/to/your/folder'

# フォルダ内の全てのテキストファイルにマッチするパターン
file_pattern = os.path.join(folder_path, '*.txt')

# マッチする全てのファイルを取得
file_list = glob.glob(file_pattern)

# 各ファイルに対して処理を実行
for file_path in file_list:
    with open(file_path, 'r') as file:
        lines = file.readlines()

    new_lines = []  # 新しい行を格納するリスト
    for line in lines:
        parts = line.strip().split(' ')
        if parts[0] in ['1', '2']:  # ラベル番号1または2の行を見つける
            new_line = line.replace(parts[0], '0', 1)  # ラベル番号を0に置き換える
            new_lines.append(new_line)  # 新しい行をリストに追加

    # 新しい行をファイルの末尾に追加
    with open(file_path, 'a') as file:
        for new_line in new_lines:
            file.write(new_line)
PINTOPINTO

下記のようなファイルが数千枚あります。
000000000036.txt
000000000037.txt
000000000038.txt
frame_0000.txt
frame2_0000.txt
frame3_0000.txt
dist_000000000036.txt
dist_000000000037.txt
dist_000000000038.txt
各ファイルは YOLO フォーマットのアノテーションが記録されたテキストファイルです。具体的には、0から2までの連番でラベル付けされたアノテーションデータです。
0 0.488281 0.653583 0.123104 0.151444
0 0.956385 0.970417 0.087229 0.055833
2 0.488281 0.653583 0.123104 0.151444
1 0.956385 0.970417 0.087229 0.055833
その前提において、任意のフォルダの配下にある同様の全てのテキストファイルの中身を走査し、すべてのラベル番号に3を加算してテキストファイルを更新したいです。

import glob
import os

# 対象のフォルダパスを設定します(このパスは例です。実際のパスに置き換えてください)
folder_path = '/path/to/your/folder'

# フォルダ内の全てのテキストファイルにマッチするパターン
file_pattern = os.path.join(folder_path, '*.txt')

# マッチする全てのファイルを取得
file_list = glob.glob(file_pattern)

# 各ファイルに対して処理を実行
for file_path in file_list:
    with open(file_path, 'r') as file:
        lines = file.readlines()

    with open(file_path, 'w') as file:
        for line in lines:
            parts = line.strip().split(' ')
            # ラベル番号に3を加算
            parts[0] = str(int(parts[0]) + 3)
            # 更新されたラインをファイルに書き込む
            file.write(' '.join(parts) + '\n')
PINTOPINTO

aというフォルダとbというフォルダにそれぞれ同じ名前のアノテーションファイルが存在するとき、aフォルダのアノテーションファイルに対して、bフォルダの同名のアノテーションファイルのすべての行を追記する方法を教えてください。

import glob
import os

# フォルダaとフォルダbのパスを設定します(これらのパスは例です。実際のパスに置き換えてください)
folder_a_path = './a'
folder_b_path = './b'

# フォルダb内の全てのアノテーションファイルにマッチするパターン
file_pattern = os.path.join(folder_b_path, '*.txt')

# マッチする全てのファイルを取得
file_list = glob.glob(file_pattern)

# 各ファイルに対して処理を実行
for b_file_path in file_list:
    file_name = os.path.basename(b_file_path)
    a_file_path = os.path.join(folder_a_path, file_name)
    a_dist_file_path = os.path.join(folder_a_path, f'dist_{file_name}')

    # フォルダaの同名のファイルが存在する場合、またはdist_プレフィックスが付いたファイルが存在する場合に処理を実行
    if os.path.exists(a_file_path):
        target_path = a_file_path

        with open(b_file_path, 'r') as b_file:
            b_lines = b_file.readlines()

        # フォルダaのファイルにフォルダbのファイルの内容を追記
        with open(target_path, 'a') as a_file:
            a_file.writelines(b_lines)

    if os.path.exists(a_dist_file_path):
        target_path = a_dist_file_path

        with open(b_file_path, 'r') as b_file:
            b_lines = b_file.readlines()

        # フォルダaのファイルにフォルダbのファイルの内容を追記
        with open(target_path, 'a') as a_file:
            a_file.writelines(b_lines)