前提・実現したいこと
物体検出のモデル作成の前処理として、画像の名前の変更とアノテーションラベルの作成を行いたいと考えています。
以下は画像の名前や画像に含まれる疾患番号、疾患部分の座標番号などが記載されたエクセルです。
このエクセルを1行ずつ読み込み、画像に対し、新たな画像ファイル名=(元の画像ファイル名)(class_id)(rad_id).pngと名付けて保存するのと、新たな画像ファイルに対応するtxtファイルを出力することを実現したいのですが、条件設定がうまくできていないようで、コードは動くものの、class_idとrad_idが正しくないファイルまで余計に作成されてしまう状態です。
大変お手数ですが、コードをどのように修正すれば良いかご教示いただけないでしょうか。
該当のソースコード
Python
1import pandas as pd 2import numpy as np 3import os 4import shutil 5 6 7def yolov5_make_trainCsv_and_renameImage(dataFrame, dir_txt=os.getcwd(), dir_newImage=os.getcwd(), dir_originalImage=os.getcwd()): 8 #path_trainCsv = train.csvのpath 9 #dir_txt = txtファイルの保存先dirのpath 10 #dir_newImage = 新しい画像を保存するdirのpath 11 #dir_originalImage = 元の画像が保存されているdirのpath 12 13 #train.csvの内容を読み込み、pandasのDataFrameに格納 14 df = dataFrame 15 16 #dfに新たな列'BBox'を加え、BBoxの情報を格納する 17 df.fillna(9999, inplace=True) #まずnullを9999に変えておく(nullのままだと次の行を実行できないため) 18 df['BBox'] = df.class_id.astype(str) + ' ' + df.x_min.astype(str) + ' ' + df.y_min.astype(str) + ' ' + df.x_max.astype(str) + ' ' + df.y_max.astype(str) 19 df.loc[df.class_id==14, 'BBox'] = '14 0 0 1 1' #疾患の無い画像の'BBox'は、左記のように指定する 20 21 #重複を排除したリストの作成 22 image_id_unique = df.image_id.unique() #重複したimage_idを排除したimage_idリスト作成 23 rad_id_unique = df.rad_id.unique() #重複したrad_idを排除したrad_idリスト作成 24 class_id_unique = df.class_id.unique() #重複したclass_idを排除したclass_idリスト作成 25 26 #画像1枚に対し疾患1種類のアノテーション結果をまとめたtxtファイルを作る 27 for image in image_id_unique: 28 29 df2 = df.loc[df.image_id==image] 30 for rad in df2.rad_id.unique(): 31 for disease in df2.class_id.unique(): # classという単語はpythonでは別の意味を持っておりここでは使えないため、diseaseとした 32 33 #画像imageに対し、新たな画像ファイル名=(元の画像ファイル名)_(class_id)_(rad_id).pngと名付けて保存する 34 path_image_original = dir_originalImage + '/' + image + '.png' 35 path_image_new = dir_newImage + '/' + image + '_' + disease.astype(str) + '_' + rad + '.png' 36 shutil.copyfile(path_image_original,path_image_new) 37 38 #新たな画像ファイルに対応するtxtファイルを出力する 39 path_txt = dir_txt + '/' + image + '_' + disease.astype(str) + '_' + rad + '.txt' #←新たな画像に対するtxtファイルの名前 40 41 df2.loc[df2.rad_id==rad, 'BBox'].to_csv(path_txt, index=None, header=None,sep=",") #←新たな画像に対するtxtファイルを出力() 42 43 44# 出力ファイルの格納フォルダを作成し、上記の関数を呼び出す 45os.makedirs('./vinbigdata/labels/train', exist_ok = True) 46os.makedirs('./vinbigdata/labels/val', exist_ok = True) 47os.makedirs('./vinbigdata/images/train', exist_ok = True) 48os.makedirs('./vinbigdata/images/val', exist_ok = True) 49label_dir = './dir_txt' 50 51yolov5_make_trainCsv_and_renameImage(train_df[train_df.fold_number!=fold], dir_txt= './vinbigdata/labels/train', dir_newImage= './vinbigdata/images/train', dir_originalImage='./train') 52yolov5_make_trainCsv_and_renameImage(train_df[train_df.fold_number==fold], dir_txt= './vinbigdata/labels/val', dir_newImage= './vinbigdata/images/val', dir_originalImage='./train')