KR260 PYNQ DPU tutorial

Loloh_the_great·2024년 4월 30일
1

AMD-DL

목록 보기
12/12
post-thumbnail

PYNQ DPU 튜토리얼

https://github.com/Xilinx/DPU-PYNQ

Vivado나 Vitis AI를 통해서 미리 설계된 DPU를 PYNQ(Python for ZYNQ)의 환경에서 KR260을 사용하여 PYNQ DPU 폴더에 있는 YOLOv3 코드를 분석해본다.

미리 만들어진 dpu를 .bit 파일로 만들어진 dpu.bit 파일로 사용할 dpu를 설정해준다.

환경설정용 라이브러리를 설정해준다.

전처리(preprocessing) 설정

'''resize image with unchanged aspect ratio using padding'''
def letterbox_image(image, size):
    ih, iw, _ = image.shape
    w, h = size
    scale = min(w/iw, h/ih)
    #print(scale)
    
    nw = int(iw*scale)
    nh = int(ih*scale)
    #print(nw)
    #print(nh)

    image = cv2.resize(image, (nw,nh), interpolation=cv2.INTER_LINEAR)
    new_image = np.ones((h,w,3), np.uint8) * 128
    h_start = (h-nh)//2
    w_start = (w-nw)//2
    new_image[h_start:h_start+nh, w_start:w_start+nw, :] = image
    return new_image


'''image preprocessing'''
def pre_process(image, model_image_size):
    image = image[...,::-1]
    image_h, image_w, _ = image.shape
 
    if model_image_size != (None, None):
        assert model_image_size[0]%32 == 0, 'Multiples of 32 required'
        assert model_image_size[1]%32 == 0, 'Multiples of 32 required'
        boxed_image = letterbox_image(image, tuple(reversed(model_image_size)))
    else:
        new_image_size = (image_w - (image_w % 32), image_h - (image_h % 32))
        boxed_image = letterbox_image(image, new_image_size)
    image_data = np.array(boxed_image, dtype='float32')
    image_data /= 255.
    image_data = np.expand_dims(image_data, 0) 	
    return image_data

박스를 만들어서 인식한 이미지 클라스를 detect하는 함수

입력 받은 이미지에 대해서 클라스를 정해주고 인식된 이미지 개수만큼 박스를 채우는 함수

실제로 run 함수를 돌려봤을 때 예시

여러 이미지를 돌려보고 속도가 어느 정도 나오는지 확인해보기

SUMMARY

Vitis-AI를 통해 만들어 본 것처럼 해당 예제에서는 .xmodel 파일과 Vivado를 사용해 만들어본 .bit 파일들을 사용하여 Yolov3라는 CNN을 돌려 보았다.
다음 목표

  1. Vitis-AI를 통해서 만든 dpu나 xmodel 파일등을 사용하여 나가려는 대회에 맞는 딥러닝 네트워크를 돌려보기
  2. 카메라 등을 통해서 실시간으로 YOLOv3 네트워크를 돌려보기
profile
병아리 전자공학부생

0개의 댓글