1import os 2import urllib 3import traceback 4import time 5import sys 6import numpy as np 7import cv2 8from rknn.api import RKNN 9import urllib.request 10 11ONNX_MODEL = 'resnet50v2.onnx' 12RKNN_MODEL = 'resnet50v2.rknn' 13 14 15def show_outputs(outputs): 16 output = outputs 17 output_sorted = sorted(output, reverse=True) 18 top5_str = 'resnet50v2\n-----TOP 5-----\n' 19 for i in range(5): 20 value = output_sorted[i] 21 index = np.where(output == value) 22 for j in range(len(index)): 23 if (i + j) >= 5: 24 break 25 if value > 0: 26 topi = '{}: {}\n'.format(index[j], value) 27 else: 28 topi = '-1: 0.0\n' 29 top5_str += topi 30 print(top5_str) 31 32 33def readable_speed(speed): 34 speed_bytes = float(speed) 35 speed_kbytes = speed_bytes / 1024 36 if speed_kbytes > 1024: 37 speed_mbytes = speed_kbytes / 1024 38 if speed_mbytes > 1024: 39 speed_gbytes = speed_mbytes / 1024 40 return "{:.2f} GB/s".format(speed_gbytes) 41 else: 42 return "{:.2f} MB/s".format(speed_mbytes) 43 else: 44 return "{:.2f} KB/s".format(speed_kbytes) 45 46 47def show_progress(blocknum, blocksize, totalsize): 48 speed = (blocknum * blocksize) / (time.time() - start_time) 49 speed_str = " Speed: {}".format(readable_speed(speed)) 50 recv_size = blocknum * blocksize 51 52 f = sys.stdout 53 progress = (recv_size / totalsize) 54 progress_str = "{:.2f}%".format(progress * 100) 55 n = round(progress * 50) 56 s = ('#' * n).ljust(50, '-') 57 f.write(progress_str.ljust(8, ' ') + '[' + s + ']' + speed_str) 58 f.flush() 59 f.write('\r\n') 60 61 62if __name__ == '__main__': 63 64 # Create RKNN object 65 rknn = RKNN(verbose=True) 66 67 # If resnet50v2 does not exist, download it. 68 # Download address: 69 # https://s3.amazonaws.com/onnx-model-zoo/resnet/resnet50v2/resnet50v2.onnx 70 if not os.path.exists(ONNX_MODEL): 71 print('--> Download {}'.format(ONNX_MODEL)) 72 url = 'https://s3.amazonaws.com/onnx-model-zoo/resnet/resnet50v2/resnet50v2.onnx' 73 download_file = ONNX_MODEL 74 try: 75 start_time = time.time() 76 urllib.request.urlretrieve(url, download_file, show_progress) 77 except: 78 print('Download {} failed.'.format(download_file)) 79 print(traceback.format_exc()) 80 exit(-1) 81 print('done') 82 83 # Pre-process config 84 print('--> Config model') 85 rknn.config(mean_values=[123.68, 116.28, 103.53], std_values=[57.38, 57.38, 57.38]) 86 print('done') 87 88 # Load model 89 print('--> Loading model') 90 ret = rknn.load_onnx(model=ONNX_MODEL) 91 if ret != 0: 92 print('Load model failed!') 93 exit(ret) 94 print('done') 95 96 # Build model 97 print('--> Building model') 98 ret = rknn.build(do_quantization=True, dataset='./dataset.txt') 99 if ret != 0: 100 print('Build model failed!') 101 exit(ret) 102 print('done') 103 104 # Accuracy analysis 105 print('--> Accuracy analysis') 106 ret = rknn.accuracy_analysis(inputs=['./dog_224x224.jpg'], output_dir='./snapshot') 107 if ret != 0: 108 print('Accuracy analysis failed!') 109 exit(ret) 110 print('done') 111 112 print('float32:') 113 output = np.genfromtxt('./snapshot/golden/resnetv24_dense0_fwd.txt') 114 show_outputs(output) 115 116 print('quantized:') 117 output = np.genfromtxt('./snapshot/simulator/resnetv24_dense0_fwd.txt') 118 show_outputs(output) 119 120 rknn.release() 121