151 lines
5.1 KiB
Python
Executable File
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)
|