charlie880624 7716a0060f
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
feat: add golf dataset, kneron configs, and tools
- 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>
2026-03-18 13:14:30 +08:00

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