Newer
Older
Dataset-Refixer / auto-fix.py
import os
import cv2
import pandas as pd
import re

class ImageProcessor:
    def __init__(self):
        self.output_dir = "images-fix"
        os.makedirs(self.output_dir, exist_ok=True)
        # pos番号の変換マップを定義
        self.pos_map = {
            '3': '4',
            '4': '3',
            '7': '8',
            '8': '7'
        }
        
    def get_new_filename(self, original_filename):
        """ファイル名のpos番号を必要に応じて変更する"""
        pattern = r'(.*pos)(\d+)(.*)'
        match = re.match(pattern, original_filename)
        if match:
            pos_num = match.group(2)
            if pos_num in self.pos_map:
                return re.sub(pattern, f'\\g<1>{self.pos_map[pos_num]}\\g<3>', original_filename)
        return original_filename
    
    def check_duplicate_filename(self, filename):
        """出力ディレクトリで重複をチェック"""
        return os.path.exists(os.path.join(self.output_dir, filename))
    
    def process_folder(self, folder_path):
        results_csv = os.path.join(folder_path, "results.csv")
        images_folder = os.path.join(folder_path, "images")
        
        if not os.path.exists(results_csv):
            print(f"結果ファイルが見つかりません: {results_csv}")
            return
        
        df = pd.read_csv(results_csv)
        
        for _, row in df.iterrows():
            image_file_name = row["image_file_name"]
            image_path = os.path.join(images_folder, image_file_name)
            
            if not os.path.exists(image_path):
                print(f"画像ファイルが見つかりません: {image_path}")
                continue
                
            image = cv2.imread(image_path)
            if image is None:
                print(f"画像の読み込みに失敗しました: {image_path}")
                continue
            
            # 新しいファイル名を取得
            new_filename = self.get_new_filename(image_file_name)
            output_path = os.path.join(self.output_dir, new_filename)
            
            # ファイルを保存
            cv2.imwrite(output_path, image)
            print(f"保存完了: {output_path}")

def get_numeric_folders(base_dir="data"):
    """
    dataディレクトリ���の数字名フォルダを取得する
    """
    folders = []
    if os.path.exists(base_dir):
        for item in os.listdir(base_dir):
            if os.path.isdir(os.path.join(base_dir, item)) and item.isdigit():
                folders.append(item)
    return sorted(folders, key=lambda x: int(x))

def main():
    processor = ImageProcessor()
    
    # dataディレクトリ内の数字フォルダを取得
    numeric_folders = get_numeric_folders()
    if not numeric_folders:
        print("処理対象のフォルダが見つかりません")
        return
    
    print("処理するフォルダを選択してください:")
    for i, folder in enumerate(numeric_folders, 1):
        print(f"{i}: {folder}")
    print("0: 全てのフォルダを処理")
    
    while True:
        try:
            choice = input("番号を入力してください: ").strip()
            if not choice:
                continue
                
            choice = int(choice)
            if choice == 0:
                # 全てのフォルダを処理
                folders_to_process = numeric_folders
                break
            elif 1 <= choice <= len(numeric_folders):
                # 選択されたフォルダのみ処理
                folders_to_process = [numeric_folders[choice-1]]
                break
            else:
                print(f"1から{len(numeric_folders)}までの数字、または0を入力してください")
        except ValueError:
            print("有効な数字を入力してください")
    
    # 選択されたフォルダを処理
    for folder in folders_to_process:
        folder_path = os.path.join("data", folder.zfill(2))
        print(f"\n=== フォルダ {folder} の処理を開始 ===")
        processor.process_folder(folder_path)
    
    print("\n処理が完了しました")

if __name__ == "__main__":
    main()