プログラミング初心者で、今まではC言語くらいしかやってなかったので、pythonが全然わかりません。
このサイト(リンク内容)を参考にRandom Erasingを使い、画像内に矩形をいれ、データ拡張に使いたいと考えました。
別で使用した、ファイル内のすべての画像を読み込み、全部の画像に何かしらをするプログラムを利用して、組み合わせたのですがエラーが出てうまくいきません。
そもそもこのコードの書き方であっているのかもわかりません。pythonを1から勉強したいのはやまやまですが、使いながらなれないと時間がないので質問させていただきます。
さて、肝心のコードとエラーですが
コードは
python3.7
1import os 2import glob 3import cv2 4import numpy as np 5 6# glob.glob:条件に合致するすべてのファイルを取得 7files = glob.glob('C:/Users/〇〇/*.jpg') 8 9def random_erasing(img, p=1.0, sl=0.02, sh=0.4, r1=0.3, r2=3.3): 10 target_img = img.copy() 11 12 if p < np.random.rand(): 13 # RandomErasingを実行しない 14 return target_img 15 16 H, W, _ = target_img.shape 17 S = H * W 18 19 while True: 20 Se = np.random.uniform(sl, sh) * S # 画像に重畳する矩形の面積 21 re = np.random.uniform(r1, r2) # 画像に重畳する矩形のアスペクト比 22 23 He = int(np.sqrt(Se * re)) # 画像に重畳する矩形のHeight 24 We = int(np.sqrt(Se / re)) # 画像に重畳する矩形のWidth 25 26 xe = np.random.randint(0, W) # 画像に重畳する矩形のx座標 27 ye = np.random.randint(0, H) # 画像に重畳する矩形のy座標 28 29 if xe + We <= W and ye + He <= H: 30 # 画像に重畳する矩形が画像からはみ出していなければbreak 31 break 32 33 mask = np.random.randint(0, 255, (He, We, 3)) # 矩形がを生成 矩形内の値はランダム値 34 target_img[ye:ye + He, xe:xe + We, :] = mask # 画像に矩形を重畳 35 36 return target_img 37 38for file in files: 39 img = cv2.imread(file) 40 random_erasing(img) 41 title, ext = os.path.splitext(file) 42 43 cv2.imwrite(title + '_noise' + ext, img)
エラーは
File "C:\Users\〇〇.spyder-py3\タイトル無し0.py", line 47, in <module> random_erasing(img) File "C:\Users\〇〇.spyder-py3\タイトル無し0.py", line 17, in random_erasing target_img = img.copy() AttributeError: 'NoneType' object has no attribute 'copy'
と出ます。どうすれば解決するか教えてください。
よろしくお願いいたします。
#################################
追記です。エラーは出なくなったのですが、矩形が追加されません。どうすればよいでしょうか。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/24 05:18
2021/08/24 05:28