FC2カウンター FPGAの部屋 2023年12月07日
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

ZUBoard 1CG の PYNQ v3.0.1 で自作の 10 個のフィルタを動作させる4

ZUBoard 1CG の PYNQ v3.0.1 で自作の 10 個のフィルタを動作させる3”の続き。

今まで Vitis HLS で作成したすべてのフィルタを実装したいということで、前回は、ZUBoard 1CG の Pynq Linux を起動して、Jupyter Notebook の i5filters ディレクトリのファイルを Jupyter Notebook 経由でコピーしようとしたら、 エラーになったので、ターミナルのコマンドでコピーを行った。次に i10filters_wrapper.bit と i10filters.hwh ファイルをアップロードし、i10filters_wrapper.bit は i10filters.bit に名前を変更した。今回は、Jupyter Notebook のファイル i10filters.ipynb を編集して、average_axis_RGB24, edge_enhancement_axis_RGB24, laplacian_axis_RGB24, min_max_axis_RGB24, unsharp_masking_axis_RGB24 ディレクトリを作成し、average_axis_RGB24, edge_enhancement_axis_RGB24, laplacian_axis_RGB24, min_max_axis_RGB24, unsharp_masking_axis_RGB24 の各 IP の Python コードを追加した。平均化フィルタ(average_axis_RGB24)のみをアクティブにした。

平均化フィルタ(average_axis_RGB24)をアクティブにした i10filters.ipynb のコードを貼っておく。
なお、使用する場合は、スペース 4 個を TAB に変換する。
(2023/12/09:追記) unsharp_masking フィルタの k の値を追加した。

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
get_ipython().run_line_magic('matplotlib', 'inline')
from pynq import allocate, Overlay

i10filters = Overlay("./i10filters.bit")

dma = i10filters.axi_dma_0
median = i10filters.median_axis_RGB24_0
sobel = i10filters.sobel_axis_RGB24_0
gaussian = i10filters.gaussian_axis_RGB24_0
color_conv = i10filters.color_converter_RGB24_0
rgb2hsv = i10filters.RGB24toHSV_0
hsvconv = i10filters.HSVConverter_0
hsv2rgb = i10filters.HSVtoRGB24_0
average = i10filters.average_axis_RGB24_0
edge_enhancement = i10filters.edge_enhancement_axi_0
laplacian = i10filters.laplacian_axis_RGB24_0
min_max = i10filters.min_max_axis_RGB24_0
unsharp_masking = i10filters.unsharp_masking_axis_0

image_path = "./test2.jpg"
#image_path = "./blue.bmp"
#image_path = "./green.bmp"
#image_path = "./red.bmp"
original_image = Image.open(image_path)

canvas = plt.gcf()
size = canvas.get_size_inches()
canvas.set_size_inches(size*2)

width, height = original_image.size
print("Image size: {}x{} pixels.".format(width, height))
plt.figure(figsize=(12, 10));
_ = plt.imshow(original_image)

in_buffer = allocate(shape=(height, width, 3), 
                           dtype=np.uint8, cacheable=1)
out_buffer = allocate(shape=(height, width, 3), 

in_buffer[:] = np.array(original_image)

def run_kernel():
    dma.sendchannel.transfer(in_buffer)
    dma.recvchannel.transfer(out_buffer) 
    gaussian.write(0x00,0x01) # start
    median.write(0x00,0x01) # start
    average.write(0x00,0x01) # start
    min_max.write(0x00,0x01) # start
    edge_enhancement.write(0x00,0x01) # start
    unsharp_masking.write(0x00,0x01) # start
    rgb2hsv.write(0x00,0x01) # start
    hsvconv.write(0x00,0x01) #start
    hsv2rgb.write(0x00,0x01) #start
    color_conv.write(0x00,0x01) #start
    sobel.write(0x00,0x01) # start
    laplacian.write(0x00,0x01) # start
    dma.sendchannel.wait()
    dma.recvchannel.wait()

print(height)
print(width)

gaussian.register_map.row_size = height
gaussian.register_map.col_size = width
gaussian.register_map.function_r = 2 # ORG_IMGwAxiDma
#gaussian.register_map.function_r = 3 # GAUSSIANwAxiDma

median.register_map.row_size = height
median.register_map.col_size = width
median.register_map.function_r = 2 # ORG_IMGwAxiDma
#median.register_map.function_r = 3 # MEDIANwAxiDma

average.register_map.row_size = height
average.register_map.col_size = width
#average.register_map.function_r = 2 # ORG_IMGwAxiDma
average.register_map.function_r = 3 # AVERAGEwAxiDma

min_max.register_map.row_size = height
min_max.register_map.col_size = width
min_max.register_map.function_r = 3 # ORG_IMGwAxiDma
#min_max.register_map.function_r = 4 # MINwAxiDma
#min_max.register_map.function_r = 5 # MAXwAxiDma

edge_enhancement.register_map.row_size = height
edge_enhancement.register_map.col_size = width
edge_enhancement.register_map.function_r = 2 # ORG_IMGwAxiDma
#edge_enhancement.register_map.function_r = 3 # EDGE_ENHANCEMENTwAxiDma

unsharp_masking.register_map.row_size = height
unsharp_masking.register_map.col_size = width
unsharp_masking.register_map.k = 0x00000400 # k = 4.0, ap_fixed<24, 16, AP_TRN_ZERO, AP_SAT>
unsharp_masking.register_map.function_r = 2 # ORG_IMGwAxiDma
#unsharp_masking.register_map.function_r = 3 # UNSHARP_MASKINGwAxiDma

rgb2hsv.register_map.row_size = height
rgb2hsv.register_map.col_size = width
rgb2hsv.register_map.function_r = 1 # ForAXIDma

hsvconv.register_map.row_size = height
hsvconv.register_map.col_size = width
#hsvconv.register_map.function_r = 2 # ORG_IMGwAxiDma
hsvconv.register_map.function_r = 3 # HSV_CONVwAxiDma
hsvconv.register_map.h_add = 0
hsvconv.register_map.s_mult = 0x0100 # 1.0, ap_ufixed<16, 8, AP_TRN_ZERO, AP_SAT> 
hsvconv.register_map.s_add = 0
hsvconv.register_map.v_mult = 0x0100 # 1.0, ap_ufixed<16, 8, AP_TRN_ZERO, AP_SAT> 
hsvconv.register_map.v_add = 0

hsv2rgb.register_map.row_size = height
hsv2rgb.register_map.col_size = width
hsv2rgb.register_map.function_r = 1 # ForAXIDma

color_conv.register_map.row_size = height
color_conv.register_map.col_size = width
color_conv.register_map.function_r = 2 # ORG_IMGwAxiDma
#color_conv.register_map.function_r = 3 # COLOR_CONVwAxiDma
color_conv.register_map.red_mag = 0x0100 # 1.0, ap_ufixed<16, 8, AP_TRN_ZERO, AP_SAT>
color_conv.register_map.green_mag = 0x0100 # 1.0, ap_ufixed<16, 8, AP_TRN_ZERO, AP_SAT> 
color_conv.register_map.blue_mag = 0x0100 # 1.0, ap_ufixed<16, 8, AP_TRN_ZERO, AP_SAT> 

sobel.register_map.row_size = height
sobel.register_map.col_size = width
sobel.register_map.function_r = 2 # ORG_IMGwAxiDma
#sobel.register_map.function_r = 3 # SOBELwAxiDma

laplacian.register_map.row_size = height
laplacian.register_map.col_size = width
laplacian.register_map.function_r = 2 # ORG_IMGwAxiDma
#laplacian.register_map.function_r = 3 # LAPLACIANwAxiDma

run_kernel()
sobel_image = Image.fromarray(out_buffer)

print("Image size: {}x{} pixels.".format(width, height))
plt.figure(figsize=(12, 10));
_ = plt.imshow(sobel_image)

del in_buffer
del out_buffer


Jupyter Notebook で動作させた結果を示す。
i10filters_24_231207.jpg
i10filters_25_231207.jpg
i10filters_26_231207.jpg
i10filters_27_231207.jpg
i10filters_28_231207.jpg
  1. 2023年12月07日 04:38 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0