import os import pdb import urllib import traceback import time import sys import numpy as np import cv2 from rknn.api import RKNN import yaml with open('../configs/transform.yml', 'r') as f: conf = yaml.load(f, Loader=yaml.FullLoader) # ONNX_MODEL = 'resnet50v2.onnx' # RKNN_MODEL = 'resnet50v2.rknn' ONNX_MODEL = conf['models']['onnx_model'] RKNN_MODEL = conf['models']['rknn_model'] # ONNX_MODEL = 'v3_small_0424.onnx' # RKNN_MODEL = 'v3_small_0424.rknn' def show_outputs(outputs): # print('***************outputs', outputs) output = outputs[0][0] # print('len(outputs)',len(output), output) output_sorted = sorted(output, reverse=True) top5_str = 'resnet50v2\n-----TOP 5-----\n' for i in range(5): value = output_sorted[i] index = np.where(output == value) for j in range(len(index)): if (i + j) >= 5: break if value > 0: topi = '{}: {}\n'.format(index[j], value) else: topi = '-1: 0.0\n' top5_str += topi # pdb.set_trace() print(top5_str) def readable_speed(speed): speed_bytes = float(speed) speed_kbytes = speed_bytes / 1024 if speed_kbytes > 1024: speed_mbytes = speed_kbytes / 1024 if speed_mbytes > 1024: speed_gbytes = speed_mbytes / 1024 return "{:.2f} GB/s".format(speed_gbytes) else: return "{:.2f} MB/s".format(speed_mbytes) else: return "{:.2f} KB/s".format(speed_kbytes) def show_progress(blocknum, blocksize, totalsize): speed = (blocknum * blocksize) / (time.time() - start_time) speed_str = " Speed: {}".format(readable_speed(speed)) recv_size = blocknum * blocksize f = sys.stdout progress = (recv_size / totalsize) progress_str = "{:.2f}%".format(progress * 100) n = round(progress * 50) s = ('#' * n).ljust(50, '-') f.write(progress_str.ljust(8, ' ') + '[' + s + ']' + speed_str) f.flush() f.write('\r\n') if __name__ == '__main__': # Create RKNN object rknn = RKNN(verbose=True) # If resnet50v2 does not exist, download it. # Download address: # https://s3.amazonaws.com/onnx-model-zoo/resnet/resnet50v2/resnet50v2.onnx if not os.path.exists(ONNX_MODEL): print('--> Download {}'.format(ONNX_MODEL)) url = 'https://s3.amazonaws.com/onnx-model-zoo/resnet/resnet50v2/resnet50v2.onnx' download_file = ONNX_MODEL try: start_time = time.time() urllib.request.urlretrieve(url, download_file, show_progress) except: print('Download {} failed.'.format(download_file)) print(traceback.format_exc()) exit(-1) print('done') # pre-process config print('--> config model') # rknn.config(mean_values=[123.675, 116.28, 103.53], std_values=[58.82, 58.82, 58.82]) rknn.config( mean_values=[[127.5, 127.5, 127.5]], std_values=[[127.5, 127.5, 127.5]], target_platform='rk3566', model_pruning=False, compress_weight=False, single_core_mode=True, enable_flash_attention=True) # rknn.config( # mean_values=[[127.5, 127.5, 127.5]], # 对于单通道图像,可以设置为 [[127.5]] # std_values=[[127.5, 127.5, 127.5]], # 对于单通道图像,可以设置为 [[127.5]] # target_platform='rk3588', # 设置目标平台 # # quantize_dtype='int8', # # quantize_algo='normal', # # output_optimize=False, # # output_format='rknnb' # ) print('done') # Load model print('--> Loading model') ret = rknn.load_onnx(model=ONNX_MODEL) if ret != 0: print('Load model failed!') exit(ret) print('done') # Build model print('--> Building model') ret = rknn.build(do_quantization=False, # True dataset='./dataset.txt', rknn_batch_size=conf['models']['rknn_batch_size']) # ret = rknn.build(do_quantization=False, dataset='./dataset.txt') if ret != 0: print('Build model failed!') exit(ret) print('done') # Export rknn model print('--> Export rknn model') ret = rknn.export_rknn(RKNN_MODEL) if ret != 0: print('Export rknn model failed!') exit(ret) print('done') # Set inputs img = cv2.imread('./dog_224x224.jpg') # img = cv2.imread('./data/gift_test/Havegift/20241213-161415-cb8e0762-f376-45d1-8f36-7dc070990fa5/subimg/cam1_9_tid2_fid(18, 33250169482).png') # print('img', img) # with open('pixel_values.txt', 'w') as file: # for y in range(img.shape[0]): # for x in range(img.shape[1]): # b, g, r = img[y, x] # file.write(f'{r},{g},{b}\n') # img = cv2.imread('./810115161912_810115161912_20240131-145622_0da14e4d-a3da-499f-b512-2d4168ab1c87_front_addGood_70f75407b7ae_29_01.jpg') img = cv2.resize(img, (224, 224)) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # img = conf.test_transform(img) # img = img.numpy() # img = img.transpose(1, 2, 0) # Init runtime environment print('--> Init runtime environment') ret = rknn.init_runtime() # ret = rknn.init_runtime('rk3588') if ret != 0: print('Init runtime environment failed!') exit(ret) print('done') # Inference print('--> Running model') T1 = time.time() outputs = rknn.inference(inputs=[img]) # outputs = rknn.inference(inputs=img) T2 = time.time() print('消耗时间 >>> {}'.format(T2 - T1)) with open('result_0415_128.txt', 'a') as f: f.write(str(outputs)) # pdb.set_trace() print('***outputs', outputs) np.save('./onnx_resnet50v2_0.npy', outputs[0]) x = outputs[0] output = np.exp(x) / np.sum(np.exp(x)) outputs = [output] show_outputs(outputs) print('done') rknn.release()