cal_bin_diff.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. from quantization import *
  2. import os, argparse, math, torch
  3. import numpy as np
  4. from yolo import non_max_suppression
  5. PROJECT_NAME = os.environ['PROJECT_NAME']
  6. qk_file = PROJECT_NAME+'/model_quantization/checkpoint_quan.qk'
  7. # qk_file = '/root/eeasy/eeasy_quan/yolov8toezb_ygy/model_quantization/checkpoint_quan.qk'
  8. def make_anchor(input_shape=(640, 640), grid_cell_offset=0.5):
  9. anchor_points = []
  10. for i in [32]:
  11. h, w = input_shape[0] // i, input_shape[1] // i
  12. sx = np.arange(w) + grid_cell_offset
  13. sy = np.arange(h) + grid_cell_offset
  14. sy, sx = np.meshgrid(sy, sx)
  15. anchor_points.append(np.stack((sy, sx), -1).reshape((-1, 2)))
  16. return np.transpose(np.concatenate(anchor_points), axes=[1, 0])
  17. def yololayer(res):
  18. n, c = res[0].shape[:2]
  19. res = np.concatenate([xi.reshape((n, c, -1)) for xi in res], 2)
  20. strides = np.load('py/tensor.npy', allow_pickle=True)
  21. anchor_points = make_anchor()
  22. x1y1 = anchor_points - res[:, :2]
  23. x2y2 = anchor_points + res[:, 2:4]
  24. res[:, :4] = np.concatenate((x1y1, x2y2), axis=1) * strides[:, 6400+1600:]
  25. return res
  26. def parse_opt():
  27. parser = argparse.ArgumentParser()
  28. parser.add_argument('--bin_path1', type=str, required=True, help='bin file 1 path')
  29. parser.add_argument('--bin_path2', type=str, required=True, help='bin file 2 path')
  30. parser.add_argument('--name', type=str, required=True, help='tensor name')
  31. opt = parser.parse_known_args()[0]
  32. return opt
  33. if __name__ == '__main__':
  34. opt = parse_opt()
  35. shapes = Helper.get_caffe_output_shapes(qk_file)
  36. sim_res1 = np.fromfile(opt.bin_path1, dtype=np.int8 if Helper.get_quantize_out_bw(qk_file, opt.name) == 8 else np.int16) # /model.0/conv/Conv
  37. bin_res1 = Helper.hw_data_to_caffe_int_data(sim_res1, shapes[opt.name])
  38. sim_res2 = np.fromfile(opt.bin_path2, dtype=np.int8 if Helper.get_quantize_out_bw(qk_file, opt.name) == 8 else np.int16) # /model.0/conv/Conv
  39. bin_res2 = Helper.hw_data_to_caffe_int_data(sim_res2, shapes[opt.name])
  40. # # ( 1, c, w, h)
  41. # '/model.22/Concat': (1, 6, 80, 80)
  42. res = []
  43. for i in range(bin_res1.shape[2]):
  44. for j in range(bin_res1.shape[3]):
  45. res.append(bin_res1[0, :, j, i])
  46. res = np.stack(res) / (2 ** 3) # 6400,6
  47. res = np.transpose(res, axes=[1, 0]) # 6,6400
  48. res = res[None]
  49. # print(res.shape)
  50. res = yololayer([res]) # 1,6,6400
  51. res = np.transpose(res[0], axes=[1, 0])
  52. print(res.shape)
  53. proposals = res.tolist()
  54. print(proposals[0])
  55. print(proposals[1])
  56. print('-------排序后--------')
  57. proposals.sort()
  58. print(proposals[0])
  59. print(proposals[1])
  60. print(proposals[2])
  61. print(proposals[-1])
  62. print(proposals[-2])
  63. print(proposals[-3])
  64. # break
  65. # print('-------------------------------')
  66. # aaa = 0
  67. # for i in range(0, sim_res1.shape[0], 16):
  68. # print(sim_res1[i:i+6])
  69. # aaa+=1
  70. # if (aaa > 30):
  71. # break
  72. print(f'bin diff:{np.sum(np.abs(bin_res1 - bin_res2)):.8f}')