FC2カウンター FPGAの部屋 KV260 の PYNQ で自作のメディアン・フィルタとソーベル・フィルタを動作させる2
fc2ブログ

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

FPGAの部屋

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

KV260 の PYNQ で自作のメディアン・フィルタとソーベル・フィルタを動作させる2

KV260 の PYNQ で自作のメディアン・フィルタとソーベル・フィルタを動作させる1”の続き。

前回は、”KV260 の PYNQ で自作のソーベル・フィルタを動作させる5”のブロック・デザインに”RGB 24 ビット・データ入出力対応のメディアン・フィルタを Vitis HLS 2021.2 で作成する2”で作成した median_axis_RGB24 IP を追加して、論理合成、インプリメンテーション、ビットストリームの生成を行った。今回は、生成されたビット・ファイルと hwh ファイルを KV260 上の Jupyter Notebook にアップロードし、img_filt.ipynb ファイルを作成して、動作を確認したところ動作した。

KV260 の Jupyter Notebook の my_notebooks ディレクトリの下に img_filt ディレクトリを作成した。

前回の Vivado の論理合成、インプリメンテーション、ビットストリームの生成で img_filt/img_filt.gen/sources_1/bd/img_filt/hw_handoff/img_filt.hwh ファイルと img_filt/img_filt.runs/impl_1/img_filt_wrapper.bit ファイルが生成された。
2 つのファイルを KV260 の Jupyter Notebook にアップロードし、img_filt_wrapper.bit の名前を img_filt.bit に変更した。

RGB 24 ビット・データ入出力対応のメディアン・フィルタを Vitis HLS 2021.2 で作成する1”に貼ったノイズ入りの画像 test2.jpg を KV260 の Jupyter Notebook にアップロードした。
median_axis_RGB24_4_220403.jpg

KV260 の Jupyter Notebook 上に作成した img_filt.ipynb ファイルを示す。

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from pynq import allocate, Overlay

img_filter = Overlay("./img_filt.bit")

dma = img_filter.axi_dma_0
median = img_filter.median_axis_RGB24_0
sobel = img_filter.sobel_axis_RGB24_0

image_path = "./test2.jpg"
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), 
                            dtype=np.uint8, cacheable=1)

in_buffer[:] = np.array(original_image)

def run_kernel():
    dma.sendchannel.transfer(in_buffer)
    dma.recvchannel.transfer(out_buffer) 
    median.write(0x00,0x01) # start
    sobel.write(0x00,0x01) # start
    dma.sendchannel.wait()
    dma.recvchannel.wait()

print(height)
print(width)

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

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

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


最初に

median.register_map.function_r = 3 # MEDIANwAxiDma

sobel.register_map.function_r = 3 # SOBELwAxiDma

でやってみた結果を示す。
つまり、メディアン・フィルタでノイズを除去しながら、ソーベル・フィルタでエッジを抽出する。
median_axis_RGB24_21_220406.jpg
median_axis_RGB24_22_220406.jpg
median_axis_RGB24_23_220406.jpg

成功した。

次に、

median.register_map.function_r = 2 # ORG_IMGwAxiDma

sobel.register_map.function_r = 3 # SOBELwAxiDma

でやってみた結果を示す。
つまり、メディアン・フィルタを掛けずにソーベル・フィルタでエッジを抽出する。
median_axis_RGB24_24_220406.jpg

すると、ノイズもエッジを抽出されているのが分かる。
  1. 2022年04月06日 04:27 |
  2. KRIA KV260 Vision AI Starter Kit
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/5550-eb0258e8
この記事にトラックバックする(FC2ブログユーザー)