前提・実現したいこと
既存のcsvファイルから4つの数値を取得し、それらを演算した結果をある条件分岐によって2行目か3行目に書き込みたいです。
実行するたびに更新されていくようにしたいです。
発生している問題・エラーメッセージ
パスについては問題無いです。
IndexError: list index out of range
該当のソースコード
Python
1import os 2import glob 3import sys 4import pathlib 5import csv 6 7from PIL import Image, ImageFilter 8from programs.utils import checker 9 10def _load_coord(path_datafolder): 11 """腫瘍の位置座標を取り出す 12 13 Args: 14 path_datafolder (pathlib.Path): データ1つのフォルダパス 15 16 Returns: 17 list: 座標. [(x1,y1, x2,y2), (...), ...] 18 座標が複数個あれば複数個取り出す 19 """ 20 path_datafolder = list(path_datafolder.glob('*roi.csv'))[0] 21 with path_datafolder.open('r', encoding='utf-8') as f: 22 reader = csv.reader(f) 23 return [ 24 tuple(map(int, it)) 25 for it in reader 26 ] 27 28def newROI_save(path_load, crop_range, size, target): 29 """ 30 調整したROIの座標をCSVファイルに保存する 31 32 Args: 33 path_load:元画像のある場所へのパス 34 target:test, train, validationのいずれか 35 """ 36 if not path_load.exists(): 37 raise FileNotFoundError(path_load) 38 39 path_img_list = path_load / 'list/dataset/{}.txt'.format(target) 40 if not path_img_list.exists(): 41 raise FileNotFoundError(path_img_list) 42 43 # CSVファイル1行目から元の座標を読み取り 44 with path_img_list.open('r', encoding='utf-8') as f: 45 reader = csv.reader(f) 46 for line in reader: 47 path_datafolder = path_load / line[0] # amed_abdomen/hcc/**を読み込む 48 coord = _load_coord(path_datafolder) 49 50 new_coord = [coord[0][0] + crop_range[0], coord[0][1] + crop_range[1], 51 coord[0][2] - crop_range[2], coord[0][3] - crop_range[3]] 52 53 # (64,64):2行目,(256,256):3行目 に更新した座標を書き込み 54 if size == (64,64): 55 path_savefolder = list(path_dactafolder.glob('*roi.csv'))[1] 56 with path_savefolder.open('w', encoding='utf-8') as f: 57 writer = csv.writer(f) 58 writer.writerows(new_coord) 59 elif size == (256,256): 60 path_savefolder = list(path_datafolder.glob('*roi.csv'))[2] 61 with path_savefolder.open('w', encoding='utf-8') as f: 62 writer = csv.writer(f) 63 writer.writerows(new_coord) 64 65def bring_expansion64(path_load, load_dir, save_path, save_folder, size, target): 66 """ 67 指定されたディレクトリ内のデータセットの拡大 68 69 Args: 70 path_load:元画像のある場所へのパス 71 load_dir:作成済データセットのあるディレクトリ名 72 save_path:調整後の画像を保存する場所へのパス 73 save_folder:保存するためのフォルダ名 74 size:リサイズ後のサイズ 75 """ 76 77 path_load = pathlib.Path(path_load) 78 save_path = pathlib.Path(save_path) 79 load_dir = pathlib.Path(load_dir) 80 save_folder = pathlib.Path(save_folder) 81 crop_range = 10, 10, 54, 54 82 83 path_save = save_path/save_folder 84 85 if not load_dir.exists(): 86 raise FileNotFoundError(load_dir) 87 88 try: 89 path_save.mkdir(parents=True) 90 except FileExistsError as e: 91 if not checker.overwrite(e): 92 sys.exit("stop running") 93 94 types = ['*.png', '*.jpg',] 95 img_list = [] 96 name_list = [] 97 ext_list = [] 98 99 for t in types: 100 img_list.extend(glob.glob(os.path.join(load_dir, t))) 101 102 for i in img_list: 103 file = os.path.basename(i) # 拡張子ありファイル名を取得 104 name, ext = os.path.splitext(file) # 拡張子なしファイル名と拡張子を取得 105 name_list.append(name) # 拡張子なしファイル名をリスト化 106 ext_list.append(ext) # 拡張子をリスト化 107 img = Image.open(i) 108 109 output_path = os.path.join(path_save, name + ext) 110 111 img_ = img.crop(crop_range) #切り抜き 112 113 image = img_.resize(size) 114 image.save(output_path) 115 116 newROI_save(path_load, list(crop_range), size, target) 117 print('save new ROI of 64,64 images coord.') 118 return 119 120def bring_expansion256(path_load, load_dir, save_path, save_folder, size, target): 121 """ 122 指定されたディレクトリ内のデータセットの拡大 123 124 Args: 125 path_load:元画像のある場所へのパス 126 load_dir:作成済データセットのあるディレクトリ名 127 save_path:調整後の画像を保存する場所へのパス 128 save_folder:保存するためのフォルダ名 129 size:リサイズ後のサイズ 130 """ 131 132 path_load = pathlib.Path(path_load) 133 save_path = pathlib.Path(save_path) 134 load_dir = pathlib.Path(load_dir) 135 save_folder = pathlib.Path(save_folder) 136 crop_range = 38, 38, 218, 218 137 138 path_save = save_path/save_folder 139 140 if not load_dir.exists(): 141 raise FileNotFoundError(load_dir) 142 143 try: 144 path_save.mkdir(parents=True) 145 except FileExistsError as e: 146 if not checker.overwrite(e): 147 sys.exit("stop running") 148 149 types = ['*.png', '*.jpg',] 150 img_list = [] 151 name_list = [] 152 ext_list = [] 153 154 for t in types: 155 img_list.extend(glob.glob(os.path.join(load_dir, t))) 156 157 for i in img_list: 158 file = os.path.basename(i) # 拡張子ありファイル名を取得 159 name, ext = os.path.splitext(file) # 拡張子なしファイル名と拡張子を取得 160 name_list.append(name) # 拡張子なしファイル名をリスト化 161 ext_list.append(ext) # 拡張子をリスト化 162 img = Image.open(i) 163 164 output_path = os.path.join(path_save, name + ext) 165 166 img_ = img.crop(crop_range) #切り抜き 167 168 image = img_.resize(size) 169 image.save(output_path) 170 171 newROI_save(path_load, list(crop_range), size, target) 172 return 173 174if __name__ == '__main__': 175 176 bring_expansion64('gpu/mkdata', './data/abdomen64/train/tumor', 177 './data/remake/abdomen64/train', 'exp_tumor', (64,64), 'train') 178 179 180 bring_expansion256('gpu/mkdata', './data/abdomen256/train/tumor', 181 './data/remake/abdomen256/train', 'exp_tumor', (256,256), 'train')
試したこと
ネットでpandasについて調べたのですが私の実現したいことが書かれていませんでした。
mode='a'とすると上書きできると思うのですが、末尾へ追記されるだけだと思うのでどうしようか、、という感じです。
if文の箇所を下記のように書き直してみました。しかしまだ上手く動いてくれません。
# (64,64):2行目,(256,256):3行目 に更新した座標を書き込み if size == (64,64): sf = pd.read_csv(path_datafolder.glob('*roi.csv')) sf = sf.drop(1) sf.loc[1] = new_coord elif size == (256,256): sf = pd.read_csv(path_datafolder.glob('*roi.csv')) sf = sf.drop(2) sf.loc[2] = new_coord
補足情報(FW/ツールのバージョンなど)
Python 3.6.9
VSCode
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。