Some checks failed
deploy / build-n-publish (push) Has been cancelled
lint / lint (push) Has been cancelled
build / build_cpu (3.7, 1.5.1, torch1.5, 0.6.1) (push) Has been cancelled
build / build_cpu (3.7, 1.6.0, torch1.6, 0.7.0) (push) Has been cancelled
build / build_cpu (3.7, 1.7.0, torch1.7, 0.8.1) (push) Has been cancelled
build / build_cpu (3.7, 1.8.0, torch1.8, 0.9.0) (push) Has been cancelled
build / build_cpu (3.7, 1.9.0, torch1.9, 0.10.0) (push) Has been cancelled
build / build_cuda101 (3.7, 1.5.1+cu101, torch1.5, 0.6.1+cu101) (push) Has been cancelled
build / build_cuda101 (3.7, 1.6.0+cu101, torch1.6, 0.7.0+cu101) (push) Has been cancelled
build / build_cuda101 (3.7, 1.7.0+cu101, torch1.7, 0.8.1+cu101) (push) Has been cancelled
build / build_cuda101 (3.7, 1.8.0+cu101, torch1.8, 0.9.0+cu101) (push) Has been cancelled
build / build_cuda102 (3.6, 1.9.0+cu102, torch1.9, 0.10.0+cu102) (push) Has been cancelled
build / build_cuda102 (3.7, 1.9.0+cu102, torch1.9, 0.10.0+cu102) (push) Has been cancelled
build / build_cuda102 (3.8, 1.9.0+cu102, torch1.9, 0.10.0+cu102) (push) Has been cancelled
build / build_cuda102 (3.9, 1.9.0+cu102, torch1.9, 0.10.0+cu102) (push) Has been cancelled
build / test_windows (windows-2022, cpu, 3.8) (push) Has been cancelled
build / test_windows (windows-2022, cu111, 3.8) (push) Has been cancelled
- Add golf1/2/4/7/8 dataset classes for semantic segmentation - Add kneron-specific configs (meconfig series, kn_stdc1_golf4class) - Organize scripts into tools/check/ and tools/kneron/ - Add kneron_preprocessing module - Update README with quick-start guide - Update .gitignore to exclude data dirs, onnx, nef outputs Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
186 lines
7.0 KiB
Python
186 lines
7.0 KiB
Python
import numpy as np
|
|
from .utils import str2bool, str2int, str2float, clip_ary
|
|
|
|
class runner(object):
|
|
def __init__(self):
|
|
self.set = {
|
|
'general': {
|
|
'print_info':'no',
|
|
'model_size':[0,0],
|
|
'numerical_type':'floating',
|
|
'type': 'kneron'
|
|
},
|
|
'floating':{
|
|
"scale": 1,
|
|
"bias": 0,
|
|
"mean": "",
|
|
"std": "",
|
|
},
|
|
'hw':{
|
|
"radix":8,
|
|
"shift":"",
|
|
"sub":""
|
|
}
|
|
}
|
|
return
|
|
|
|
def update(self, **kwargs):
|
|
#
|
|
self.set.update(kwargs)
|
|
|
|
#
|
|
if self.set['general']['numerical_type'] == '520':
|
|
if self.set['general']['type'].lower() in ['TF', 'Tf', 'tf']:
|
|
self.fun_normalize = self._chen_520
|
|
self.shift = 7 - self.set['hw']['radix']
|
|
self.sub = 128
|
|
elif self.set['general']['type'].lower() in ['YOLO', 'Yolo', 'yolo']:
|
|
self.fun_normalize = self._chen_520
|
|
self.shift = 8 - self.set['hw']['radix']
|
|
self.sub = 0
|
|
elif self.set['general']['type'].lower() in ['KNERON', 'Kneron', 'kneron']:
|
|
self.fun_normalize = self._chen_520
|
|
self.shift = 8 - self.set['hw']['radix']
|
|
self.sub = 128
|
|
else:
|
|
self.fun_normalize = self._chen_520
|
|
self.shift = 0
|
|
self.sub = 0
|
|
elif self.set['general']['numerical_type'] == '720':
|
|
self.fun_normalize = self._chen_720
|
|
self.shift = 0
|
|
self.sub = 0
|
|
else:
|
|
if self.set['general']['type'].lower() in ['TORCH', 'Torch', 'torch']:
|
|
self.fun_normalize = self._normalize_torch
|
|
self.set['floating']['scale'] = 255.
|
|
self.set['floating']['mean'] = [0.485, 0.456, 0.406]
|
|
self.set['floating']['std'] = [0.229, 0.224, 0.225]
|
|
elif self.set['general']['type'].lower() in ['TF', 'Tf', 'tf']:
|
|
self.fun_normalize = self._normalize_tf
|
|
self.set['floating']['scale'] = 127.5
|
|
self.set['floating']['bias'] = -1.
|
|
elif self.set['general']['type'].lower() in ['CAFFE', 'Caffe', 'caffe']:
|
|
self.fun_normalize = self._normalize_caffe
|
|
self.set['floating']['mean'] = [103.939, 116.779, 123.68]
|
|
elif self.set['general']['type'].lower() in ['YOLO', 'Yolo', 'yolo']:
|
|
self.fun_normalize = self._normalize_yolo
|
|
self.set['floating']['scale'] = 255.
|
|
elif self.set['general']['type'].lower() in ['KNERON', 'Kneron', 'kneron']:
|
|
self.fun_normalize = self._normalize_kneron
|
|
self.set['floating']['scale'] = 256.
|
|
self.set['floating']['bias'] = -0.5
|
|
else:
|
|
self.fun_normalize = self._normalize_customized
|
|
self.set['floating']['scale'] = str2float(self.set['floating']['scale'])
|
|
self.set['floating']['bias'] = str2float(self.set['floating']['bias'])
|
|
if self.set['floating']['mean'] != None:
|
|
if len(self.set['floating']['mean']) != 3:
|
|
self.set['floating']['mean'] = None
|
|
if self.set['floating']['std'] != None:
|
|
if len(self.set['floating']['std']) != 3:
|
|
self.set['floating']['std'] = None
|
|
|
|
|
|
def print_info(self):
|
|
if self.set['general']['numerical_type'] == '520':
|
|
print("<normalize>",
|
|
'numerical_type', self.set['general']['numerical_type'],
|
|
", type:", self.set['general']['type'],
|
|
', shift:',self.shift,
|
|
', sub:', self.sub)
|
|
else:
|
|
print("<normalize>",
|
|
'numerical_type', self.set['general']['numerical_type'],
|
|
", type:", self.set['general']['type'],
|
|
', scale:',self.set['floating']['scale'],
|
|
', bias:', self.set['floating']['bias'],
|
|
', mean:', self.set['floating']['mean'],
|
|
', std:',self.set['floating']['std'])
|
|
|
|
def run(self, image_data):
|
|
# print info
|
|
if str2bool(self.set['general']['print_info']):
|
|
self.print_info()
|
|
|
|
# norm
|
|
image_data = self.fun_normalize(image_data)
|
|
|
|
# output
|
|
info = {}
|
|
return image_data, info
|
|
|
|
def _normalize_torch(self, x):
|
|
if len(x.shape) != 3:
|
|
return x
|
|
x = x.astype('float')
|
|
x = x / self.set['floating']['scale']
|
|
x[..., 0] -= self.set['floating']['mean'][0]
|
|
x[..., 1] -= self.set['floating']['mean'][1]
|
|
x[..., 2] -= self.set['floating']['mean'][2]
|
|
x[..., 0] /= self.set['floating']['std'][0]
|
|
x[..., 1] /= self.set['floating']['std'][1]
|
|
x[..., 2] /= self.set['floating']['std'][2]
|
|
return x
|
|
|
|
def _normalize_tf(self, x):
|
|
# print('_normalize_tf')
|
|
x = x.astype('float')
|
|
x = x / self.set['floating']['scale']
|
|
x = x + self.set['floating']['bias']
|
|
return x
|
|
|
|
def _normalize_caffe(self, x):
|
|
if len(x.shape) != 3:
|
|
return x
|
|
x = x.astype('float')
|
|
x = x[..., ::-1]
|
|
x[..., 0] -= self.set['floating']['mean'][0]
|
|
x[..., 1] -= self.set['floating']['mean'][1]
|
|
x[..., 2] -= self.set['floating']['mean'][2]
|
|
return x
|
|
|
|
def _normalize_yolo(self, x):
|
|
# print('_normalize_yolo')
|
|
x = x.astype('float')
|
|
x = x / self.set['floating']['scale']
|
|
return x
|
|
|
|
def _normalize_kneron(self, x):
|
|
# print('_normalize_kneron')
|
|
x = x.astype('float')
|
|
x = x/self.set['floating']['scale']
|
|
x = x + self.set['floating']['bias']
|
|
return x
|
|
|
|
def _normalize_customized(self, x):
|
|
# print('_normalize_customized')
|
|
x = x.astype('float')
|
|
if self.set['floating']['scale'] != 0:
|
|
x = x/ self.set['floating']['scale']
|
|
x = x + self.set['floating']['bias']
|
|
if self.set['floating']['mean'] is not None:
|
|
x[..., 0] -= self.set['floating']['mean'][0]
|
|
x[..., 1] -= self.set['floating']['mean'][1]
|
|
x[..., 2] -= self.set['floating']['mean'][2]
|
|
if self.set['floating']['std'] is not None:
|
|
x[..., 0] /= self.set['floating']['std'][0]
|
|
x[..., 1] /= self.set['floating']['std'][1]
|
|
x[..., 2] /= self.set['floating']['std'][2]
|
|
|
|
return x
|
|
|
|
def _chen_520(self, x):
|
|
# print('_chen_520')
|
|
x = (x - self.sub).astype('uint8')
|
|
x = (np.right_shift(x,self.shift))
|
|
x=x.astype('uint8')
|
|
return x
|
|
|
|
def _chen_720(self, x):
|
|
# print('_chen_720')
|
|
if self.shift == 1:
|
|
x = x + np.array([[self.sub], [self.sub], [self.sub]])
|
|
else:
|
|
x = x + np.array([[self.sub], [self.sub], [self.sub]])
|
|
return x |