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 함수를 돌려봤을 때 예시
여러 이미지를 돌려보고 속도가 어느 정도 나오는지 확인해보기
Vitis-AI
를 통해 만들어 본 것처럼 해당 예제에서는 .xmodel
파일과 Vivado
를 사용해 만들어본 .bit
파일들을 사용하여 Yolov3라는 CNN
을 돌려 보았다.
다음 목표
- Vitis-AI를 통해서 만든 dpu나 xmodel 파일등을 사용하여 나가려는 대회에 맞는 딥러닝 네트워크를 돌려보기
- 카메라 등을 통해서 실시간으로 YOLOv3 네트워크를 돌려보기