🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

2回答

1035閲覧

Python 画像のrenameがうまくいきません

SuzuAya

総合スコア71

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

1クリップ

投稿2021/03/18 13:46

前提・実現したいこと

物体検出のモデル作成の前処理として、画像の名前の変更とアノテーションラベルの作成を行いたいと考えています。
以下は画像の名前や画像に含まれる疾患番号、疾患部分の座標番号などが記載されたエクセルです。
画像情報
このエクセルを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')

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/03/18 13:53

3個くらいでも十分ですのでダミー画像とダミーテキストも掲載できますか?
nanoseeing

2021/03/19 09:13 編集

「class_idとrad_idが正しくない」とありますが、正しくないというのはどのような状況かわからないので、答えにくいです。
guest

回答2

0

何をやりたいのかが良くわかりませんが、データフレームの各行に対して何らかの処理を行いたいのであれば、以下のコードが参考になるかもしれません。

python

1>>> print(df) 2 image_id class_id rad_id x_min y_min x_max y_max 30 000434271f63a053c4128a0ba6352c7f 14 R6 0 0 1 1 41 000434271f63a053c4128a0ba6352c7f 14 R2 0 0 1 1 52 000434271f63a053c4128a0ba6352c7f 14 R3 0 0 1 1 63 00053190460d56c53ccc3e57321387478 14 R11 0 0 1 1 74 00053190460d56c53ccc3e57321387478 14 R2 0 0 1 1 85 00053190460d56c53ccc3e57321387478 14 R7 0 0 1 1 96 0005e8e3701dfb1dd93d53e2ff537b6e 7 R10 900 587 1205 888 107 0005e8e3701dfb1dd93d53e2ff537b6e 8 R8 932 567 1197 896 118 0005e8e3701dfb1dd93d53e2ff537b6e 6 R10 900 587 1205 888 129 0005e8e3701dfb1dd93d53e2ff537b6e 7 R9 905 583 1203 890 1310 0005e8e3701dfb1dd93d53e2ff537b6e 4 R8 932 567 1197 896 14>>> dir_originalImage = '/org_images' 15>>> dir_newImage = '/new_images' 16>>> dir_text = '/new_text' 17>>> def test(r): 18... path_image_original = f'{dir_originalImage}/{r["image_id"]}.png' 19... path_image_new = f'{dir_newImage}/{r["image_id"]}_{r["class_id"]}_{r["rad_id"]}.png' 20... path_txt = f'{dir_text}/{r["image_id"]}_{r["class_id"]}_{r["rad_id"]}.txt' 21... BBox = f'{r["class_id"]} {r["x_min"]} {r["y_min"]} {r["x_max"]} {r["y_max"]}' 22... print('path_image_original:', path_image_original) 23... print('path_image_new :', path_image_new) 24... print('path_txt :', path_txt) 25... print('BBox :', BBox) 26... 27>>> x = df.apply(test, axis=1) 28path_image_original: /org_images/000434271f63a053c4128a0ba6352c7f.png 29path_image_new : /new_images/000434271f63a053c4128a0ba6352c7f_14_R6.png 30path_txt : /new_text/000434271f63a053c4128a0ba6352c7f_14_R6.txt 31BBox : 14 0 0 1 1 32path_image_original: /org_images/000434271f63a053c4128a0ba6352c7f.png 33path_image_new : /new_images/000434271f63a053c4128a0ba6352c7f_14_R2.png 34path_txt : /new_text/000434271f63a053c4128a0ba6352c7f_14_R2.txt 35BBox : 14 0 0 1 1 36path_image_original: /org_images/000434271f63a053c4128a0ba6352c7f.png 37path_image_new : /new_images/000434271f63a053c4128a0ba6352c7f_14_R3.png 38path_txt : /new_text/000434271f63a053c4128a0ba6352c7f_14_R3.txt 39BBox : 14 0 0 1 1 40path_image_original: /org_images/00053190460d56c53ccc3e57321387478.png 41path_image_new : /new_images/00053190460d56c53ccc3e57321387478_14_R11.png 42path_txt : /new_text/00053190460d56c53ccc3e57321387478_14_R11.txt 43BBox : 14 0 0 1 1 44path_image_original: /org_images/00053190460d56c53ccc3e57321387478.png 45path_image_new : /new_images/00053190460d56c53ccc3e57321387478_14_R2.png 46path_txt : /new_text/00053190460d56c53ccc3e57321387478_14_R2.txt 47BBox : 14 0 0 1 1 48path_image_original: /org_images/00053190460d56c53ccc3e57321387478.png 49path_image_new : /new_images/00053190460d56c53ccc3e57321387478_14_R7.png 50path_txt : /new_text/00053190460d56c53ccc3e57321387478_14_R7.txt 51BBox : 14 0 0 1 1 52path_image_original: /org_images/0005e8e3701dfb1dd93d53e2ff537b6e.png 53path_image_new : /new_images/0005e8e3701dfb1dd93d53e2ff537b6e_7_R10.png 54path_txt : /new_text/0005e8e3701dfb1dd93d53e2ff537b6e_7_R10.txt 55BBox : 7 900 587 1205 888 56path_image_original: /org_images/0005e8e3701dfb1dd93d53e2ff537b6e.png 57path_image_new : /new_images/0005e8e3701dfb1dd93d53e2ff537b6e_8_R8.png 58path_txt : /new_text/0005e8e3701dfb1dd93d53e2ff537b6e_8_R8.txt 59BBox : 8 932 567 1197 896 60path_image_original: /org_images/0005e8e3701dfb1dd93d53e2ff537b6e.png 61path_image_new : /new_images/0005e8e3701dfb1dd93d53e2ff537b6e_6_R10.png 62path_txt : /new_text/0005e8e3701dfb1dd93d53e2ff537b6e_6_R10.txt 63BBox : 6 900 587 1205 888 64path_image_original: /org_images/0005e8e3701dfb1dd93d53e2ff537b6e.png 65path_image_new : /new_images/0005e8e3701dfb1dd93d53e2ff537b6e_7_R9.png 66path_txt : /new_text/0005e8e3701dfb1dd93d53e2ff537b6e_7_R9.txt 67BBox : 7 905 583 1203 890 68path_image_original: /org_images/0005e8e3701dfb1dd93d53e2ff537b6e.png 69path_image_new : /new_images/0005e8e3701dfb1dd93d53e2ff537b6e_4_R8.png 70path_txt : /new_text/0005e8e3701dfb1dd93d53e2ff537b6e_4_R8.txt 71BBox : 4 932 567 1197 896

投稿2021/03/22 01:49

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

存在しないclass_idとrad_idの組み合わせを持ったtxtファイル名が出力されるという話でしょうか?

それならば、radとdiseaseに対して2重ループを回しているため、全パターンを探索しているせいではないかと思ったのですが。

投稿2021/03/19 09:14

編集2021/03/19 09:33
nanoseeing

総合スコア133

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問