cal_caffe_qkqb_diff.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import os, torch, cv2, math, tqdm, time, caffe, shutil, argparse
  2. import numpy as np
  3. from quantization import *
  4. from config import image_base_path, label_base_path
  5. from sklearn.preprocessing import normalize
  6. PROJECT_NAME = os.environ['PROJECT_NAME']
  7. def get_caffe_name():
  8. with open(f'{PROJECT_NAME}/model_caffe/model_0.prototxt') as f:
  9. data = list(map(lambda x:x.strip(), f.readlines()))
  10. data = [i.split(':')[1] for i in data if 'top' in i]
  11. data = [i for i in data if 'output_0' in i][1:]
  12. data = [i for i in data if 'crop' not in i]
  13. data = [i[2:-1] for i in data]
  14. return data + ['output0', 'output1', 'output2']
  15. def get_qkqb_name():
  16. with open(f'{PROJECT_NAME}/model_caffe/model_0.prototxt') as f:
  17. data = list(map(lambda x:x.strip(), f.readlines()))
  18. data = [i.split(':')[1] for i in data if 'name' in i]
  19. data = [i for i in data if 'output' not in i][1:]
  20. data = [i for i in data if 'crop' not in i]
  21. data = [i[2:-1] for i in data]
  22. return data
  23. class CustomDataset(BaseDataset):
  24. def __init__(self, image_path_list):
  25. super().__init__()
  26. self.image_path_list = image_path_list
  27. def __getitem__(self, item):
  28. print(item, end=' ')
  29. # read image
  30. ori_image = cv2.imdecode(np.fromfile(self.image_path_list[item], np.uint8), cv2.IMREAD_COLOR)
  31. # letterbox
  32. process_image, ratio, (dw, dh) = letterbox(ori_image, auto=False)
  33. # process_image = cv2.resize(ori_image, (640, 640))
  34. srcnp = cv2.cvtColor(process_image, cv2.COLOR_BGR2RGB)
  35. srcnp = srcnp.astype(np.float32) / 256
  36. srcnp = np.array(srcnp)
  37. srcnp = np.transpose(srcnp, [2,0,1])
  38. return srcnp
  39. def __len__(self):
  40. return len(self.image_path_list)
  41. def get_result_from_caffe(image_path_list, im_shape=(640, 640)):
  42. prototxt_file = f'{PROJECT_NAME}/model_caffe/model_0.prototxt'
  43. caffemodel_file = f'{PROJECT_NAME}/model_caffe/model_0.caffemodel'
  44. dataset = CustomDataset(image_path_list)
  45. print('begin caffe_forward....')
  46. since = time.time()
  47. pred = net.src_forward(prototxt_file, caffemodel_file, dataset, 64, get_caffe_name())
  48. print(f'src_forward finish. using time:{time.time() - since:.5f}.')
  49. return pred
  50. def get_result_from_qkqb(image_path_list, im_shape=(640, 640)):
  51. qk_file = f'{PROJECT_NAME}/model_quantization/checkpoint_quan.qk'
  52. qb_file = f'{PROJECT_NAME}/model_quantization/checkpoint_quan.qb'
  53. dataset = CustomDataset(image_path_list)
  54. print('begin easy_forward....')
  55. since = time.time()
  56. pred = net.easy_forward(qk_file, qb_file, dataset, 1, get_qkqb_name())
  57. print(f'easy_forward finish. using time:{time.time() - since:.5f}.')
  58. return pred
  59. if __name__ == '__main__':
  60. name_list = [os.path.splitext(i) for i in os.listdir(image_base_path)]
  61. image_listdir = [f'{image_base_path}/{i[0]}{i[1]}' for i in name_list][:20]
  62. label_listdir = [f'{label_base_path}/{i[0]}.txt' for i in name_list]
  63. net = Net(1)
  64. caffe_preds = get_result_from_caffe(image_listdir, (640, 640))
  65. # print(caffe_preds.keys())
  66. net.release()
  67. net = Net(1)
  68. qkqb_preds = get_result_from_qkqb(image_listdir, (640, 640))
  69. # print(qkqb_preds.keys())
  70. net.release()
  71. arr = []
  72. for i in caffe_preds:
  73. if i[:-9] in qkqb_preds:
  74. print(i, i[:-9])
  75. arr.append([i[:-9], np.mean(np.abs(caffe_preds[i] - qkqb_preds[i[:-9]]))])
  76. arr = sorted(arr, key=lambda x:x[-1])
  77. for i in arr:
  78. print(f'{i[0]} {i[1]}')
  79. print(f'output0 diff:{np.mean(np.abs(caffe_preds["output0"] - qkqb_preds["/model.22/Concat"])):.5f}')
  80. print(f'output1 diff:{np.mean(np.abs(caffe_preds["output1"] - qkqb_preds["/model.22/Concat_1"])):.5f}')
  81. print(f'output2 diff:{np.mean(np.abs(caffe_preds["output2"] - qkqb_preds["/model.22/Concat_2"])):.5f}')
  82. # caffe_out, qkqb_out = caffe_preds["output0"], qkqb_preds["/model.22/Concat_4"]
  83. # n = caffe_out.shape[0]
  84. # similarity = 0.0
  85. # similarity += (normalize(caffe_preds["output0"].reshape((n, -1))[:, :4]) - normalize(qkqb_preds["/model.22/Concat_4"].reshape((n, -1))[:, :4])).sum(1).mean() * 0.6
  86. # similarity += (normalize(caffe_preds["output0"].reshape((n, -1))[:, 4:]) - normalize(qkqb_preds["/model.22/Concat_4"].reshape((n, -1))[:, 4:])).sum(1).mean() * 0.4
  87. # print(f'output similarity:{similarity:.5f}')