Files
2026-07-13 13:33:03 +08:00

151 lines
5.1 KiB
Python
Executable File

#!/usr/bin/python3
#-- coding:utf8 --
import sys
import os
import re
import json
total_num = 0
def run_cmd(args):
cmd = args[0]
for i in range(1, len(args)):
cmd += ' ' + args[i]
print(cmd)
stdout = os.popen(cmd).read()
return stdout
def parseRes(res):
pattern = re.compile(r'(\d+, \d+\.\d+)\s')
idxs = set()
avgp = 0
items = pattern.findall(res)
for item in items:
splitIdx = item.find(',')
idx = int(item[:splitIdx])
point = float(item[splitIdx+1:])
idxs.add(idx)
avgp += point
avgp /= len(items)
return idxs, avgp
def compare(origin, quant, jsonFile):
img_dir = '../resource/images'
for name in os.listdir(img_dir):
origin_res = run_cmd(['./pictureRecognition_module.out', origin, jsonFile, img_dir + '/' + name])
quant_res = run_cmd(['./pictureRecognition_module.out', quant, jsonFile, img_dir + '/' + name])
originIdx, originPoint = parseRes(origin_res)
quantIdx, quantPoint = parseRes(quant_res)
print(originIdx, originPoint)
print(quantIdx, quantPoint)
idxRate = len(originIdx & quantIdx) / max(len(originIdx), len(quantIdx))
pointRate = quantPoint / originPoint
print(name, idxRate, pointRate)
if idxRate < 0.5:
print('False')
return False
return True
def compareAcc(origin, quant, imagepath, labelpath, quantized_json):
# img_dir = '../resource/batchimgs'
img_dir = imagepath
groundtruth = labelpath
batchsize, totalimgs = "5", "50"
origin_res = run_cmd(['./pictureRecognition_batch.out', origin, img_dir + '/', groundtruth, quantized_json, batchsize, totalimgs])
quant_res = run_cmd(['./pictureRecognition_batch.out', quant, img_dir + '/', groundtruth, quantized_json, batchsize, totalimgs])
pattern = re.compile(r"\d+\.?\d*")
acc_origin = float(pattern.findall(origin_res.split("acc: ")[1])[0])
acc_quant = float(pattern.findall(quant_res.split("acc: ")[1])[0])
print("Original model accuracy: ", acc_origin)
print("Quantized model accuracy: ", acc_quant)
if acc_origin - acc_quant > 10.0:
print("Accuracy lose too much...")
return False
return True
def test(modelpath, path):
global total_num
total_num += 1
jsonFile = path + '/test.json'
jsonObj = {}
with open(jsonFile) as f:
jsonObj = json.loads(f.read())
originModel = modelpath + jsonObj['model']
quantModel = './__quantModel.mnn'
message = run_cmd(['./quantized.out', originModel, quantModel, path + '/test.json'])
res = True
try:
res = compare(originModel, quantModel, jsonFile)
except:
print('Quant Error!')
res = False
message = run_cmd(['rm -f ' + quantModel])
return res
def testacc(modelpath, imagepath, path, labelpath):
res = True
jsonFile = path + '/quantized.json'
jsonObj = {}
with open(jsonFile) as f:
jsonObj = json.loads(f.read())
originModel = modelpath + jsonObj['model']
jsonObj['path'] = imagepath
jsonFile = './__quantized.json'
with open(jsonFile, 'w', encoding='utf-8') as fp:
json.dump(jsonObj, fp, ensure_ascii=False, indent=4)
quantModel = './__quantModel.mnn'
message = run_cmd(['./quantized.out', originModel, quantModel, jsonFile])
res = True
try:
res = compareAcc(originModel, quantModel, imagepath, labelpath, jsonFile)
except:
print('Quant Error!')
res = False
message = run_cmd(['rm -f ' + quantModel])
return res
if __name__ == '__main__':
model_root_dir = sys.argv[1]
root_dir = os.path.join(model_root_dir, 'TestPTQ')
print('root: ' + root_dir + '\n')
gWrong = []
for name in os.listdir(root_dir + '/json'):
if '.DS_Store' in name:
continue
print(name)
res = test(root_dir + '/model/', root_dir + '/json/' + name)
if not res:
gWrong.append(name)
print('Single picture test wrong: %d' %len(gWrong))
for w in gWrong:
print(w)
print('TEST_NAME_PTQ: PTQ测试\nTEST_CASE_AMOUNT_PTQ: {\"blocked\":0,\"failed\":%d,\"passed\":%d,\"skipped\":0}\n'%(len(gWrong), total_num - len(gWrong)))
print('TEST_CASE={\"name\":\"PTQ测试\",\"failed\":%d,\"passed\":%d}\n'%(len(gWrong), total_num - len(gWrong)))
if len(gWrong) > 0:
exit(1)
gWrong = []
print("Batch pictures test...")
for name in os.listdir(root_dir + '/json'):
if '.DS_Store' in name:
continue
print(name)
res = testacc(root_dir + '/model/', root_dir + '/batchimgs', root_dir + '/json/' + name, root_dir + '/trueval.txt')
if not res:
gWrong.append(name)
print('Batch pictures test wrong: %d' %len(gWrong))
for w in gWrong:
print(w)
print('BATCH_TEST_NAME_PTQ: PTQ测试\nTEST_CASE_AMOUNT_PTQ: {\"blocked\":0,\"failed\":%d,\"passed\":%d,\"skipped\":0}\n'%(len(gWrong), total_num - len(gWrong)))
print('TEST_CASE={\"name\":\"BATCH-PTQ测试\",\"failed\":%d,\"passed\":%d}\n'%(len(gWrong), total_num - len(gWrong)))
if len(gWrong) > 0:
exit(1)