機械学習の画像分野を勉強しており、その中で画像をリサイズし、分割する部分の関数の理解が難しかったため、その処理内容について教えていただきたいです。
以下コードのslice_image関数とresize_pad_image関数では、「画像を三分割にして、三つのタイルと画像全体の4つのベクトルを取得」しているみたいなのですが、この部分の処理がコード内のどこで行われているのかわからず、詰まっております。
該当のソースコード
python
1def slice_image(im, desired_size): 2 ''' 3 Resize and slice image 4 ''' 5 old_size = im.size 6 ratio = float(desired_size)/min(old_size) 7 new_size = tuple([int(x*ratio) for x in old_size]) 8 im = im.resize(new_size, Image.ANTIALIAS) 9 ar = np.array(im) 10 images = [] 11 if ar.shape[0] < ar.shape[1]: 12 middle = ar.shape[1] // 2 13 half = desired_size // 2 14 15 images.append(Image.fromarray(ar[:, :desired_size])) 16 images.append(Image.fromarray(ar[:, middle-half:middle+half])) 17 images.append(Image.fromarray(ar[:, ar.shape[1]-desired_size:ar.shape[1]])) 18 else: 19 middle = ar.shape[0] // 2 20 half = desired_size // 2 21 22 images.append(Image.fromarray(ar[:desired_size, :])) 23 images.append(Image.fromarray(ar[middle-half:middle+half, :])) 24 images.append(Image.fromarray(ar[ar.shape[0]-desired_size:ar.shape[0], :])) 25 26 return images 27 28 def resize_pad_image(im, desired_size): 29 ''' 30 Resize and pad image to a desired size 31 ''' 32 old_size = im.size 33 ratio = float(desired_size)/max(old_size) 34 new_size = tuple([int(x*ratio) for x in old_size]) 35 im = im.resize(new_size, Image.ANTIALIAS) 36 37 # create a new image and paste the resized on it 38 new_im = Image.new("RGB", (desired_size, desired_size)) 39 new_im.paste(im, ((desired_size-new_size[0])//2, 40 (desired_size-new_size[1])//2)) 41 42 return new_im
試したこと
「//2」の部分で画像を分割しているように見えたのですが、なぜ三分割なのに2で割っているのか理解できなかった。
補足情報(FW/ツールのバージョンなど)
この記事からコードを抜粋しました。
https://towardsdatascience.com/how-to-get-high-score-using-mmbt-and-clip-in-hateful-memes-competition-90bfa65cb117
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/11/13 14:27
2022/11/13 14:30
2022/11/13 14:46
2022/11/13 14:58
2022/11/13 15:31