①EC2をCUDA用に作成する
②Anaconda Promptを開いて環境構築
新しい環境を作成
conda create -n cuda_env python=3.8
conda activate cuda_env
必要なパッケージをインストール
conda install numpy
conda install -c conda-forge numba
conda install -c conda-forge pillow
③CUDAを利用して画像を白黒(グレースケール)に変換するソースコード。フィル名「convert_to_grayscale.py」
from PIL import Image
from numba import cuda
import numpy as np
from tkinter import Tk, filedialog
@cuda.jit
def rgb_to_grayscale_kernel(d_input, d_output, width, height):
x, y = cuda.grid(2)
if x < width and y < height:
r = d_input[y, x, 0]
g = d_input[y, x, 1]
b = d_input[y, x, 2]
gray = 0.299 * r + 0.587 * g + 0.114 * b
d_output[y, x] = gray
def rgb_to_grayscale(image_array):
height, width, _ = image_array.shape
d_input = cuda.to_device(image_array)
d_output = cuda.device_array((height, width), dtype=np.float32)
threads_per_block = (16, 16)
blocks_per_grid_x = (width + threads_per_block[0] - 1) // threads_per_block[0]
blocks_per_grid_y = (height + threads_per_block[1] - 1) // threads_per_block[1]
blocks_per_grid = (blocks_per_grid_x, blocks_per_grid_y)
rgb_to_grayscale_kernel[blocks_per_grid, threads_per_block](d_input, d_output, width, height)
return d_output.copy_to_host()
def main():
# ファイルダイアログを使用して画像ファイルを選択
root = Tk()
root.withdraw() # Tkinterウィンドウを表示しない
input_image_path = filedialog.askopenfilename(title='Select an image file', filetypes=[('Image Files', '*.jpg;*.jpeg;*.png')])
if not input_image_path:
print("No file selected")
return
output_image_path = 'output.jpg'
image = Image.open(input_image_path)
image_array = np.array(image)
gray_image_array = rgb_to_grayscale(image_array)
gray_image = Image.fromarray(np.uint8(gray_image_array))
gray_image.save(output_image_path)
print(f'Gray image saved to {output_image_path}')
if __name__ == '__main__':
main()
④画像を選択する(私のデスクトップにあるサンプル画像)
⑤CUDAの情報を確認
⑥白黒にするPythonファイルを実行
python convert_to_grayscale.py
⑦ output.jpgという白黒画像が生成される。
以上