feat: HSAP platform v2 — modular navigation, quality review, audit log, world model simulation
Major changes: - New frontend (platform/web/): Vite + React 18 + TypeScript + Tailwind - 4-module navigation: 数据送标 / 模型管理 / 车队管理 / 系统管理 - Data catalog with charts (DMS/ADAS/Lane 3-tab view) - Quality review workflow (标注质检): Good/Fine/Bad scoring with auto-advance - Audit enhancements: batch operations, rejection categories, Feishu notifications - Operation audit log (操作日志) - World model simulation studio (仿真工坊) - Dataset version management with snapshots and diff - ADAS 7-class dataset integration (138K images organized + compressed) - User management with Feishu integration and pagination - CRUD/search/filter on all pages, card layout redesign - PIL-optimized image overlay rendering - Auto-snapshot on build, in_review workflow stage - Removed embedded algorithm code (now in workspace)
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
import inspect
|
||||
|
||||
import six
|
||||
|
||||
# borrow from mmdetection
|
||||
|
||||
|
||||
def is_str(x):
|
||||
"""Whether the input is an string instance."""
|
||||
return isinstance(x, six.string_types)
|
||||
|
||||
|
||||
class Registry(object):
|
||||
def __init__(self, name):
|
||||
self._name = name
|
||||
self._module_dict = dict()
|
||||
|
||||
def __repr__(self):
|
||||
format_str = self.__class__.__name__ + '(name={}, items={})'.format(
|
||||
self._name, list(self._module_dict.keys()))
|
||||
return format_str
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def module_dict(self):
|
||||
return self._module_dict
|
||||
|
||||
def get(self, key):
|
||||
return self._module_dict.get(key, None)
|
||||
|
||||
def _register_module(self, module_class):
|
||||
"""Register a module.
|
||||
|
||||
Args:
|
||||
module (:obj:`nn.Module`): Module to be registered.
|
||||
"""
|
||||
if not inspect.isclass(module_class):
|
||||
raise TypeError('module must be a class, but got {}'.format(
|
||||
type(module_class)))
|
||||
module_name = module_class.__name__
|
||||
if module_name in self._module_dict:
|
||||
raise KeyError('{} is already registered in {}'.format(
|
||||
module_name, self.name))
|
||||
self._module_dict[module_name] = module_class
|
||||
|
||||
def register_module(self, cls):
|
||||
self._register_module(cls)
|
||||
return cls
|
||||
|
||||
|
||||
def build_from_cfg(cfg, registry, default_args=None):
|
||||
"""Build a module from config dict.
|
||||
|
||||
Args:
|
||||
cfg (dict): Config dict. It should at least contain the key "type".
|
||||
registry (:obj:`Registry`): The registry to search the type from.
|
||||
default_args (dict, optional): Default initialization arguments.
|
||||
|
||||
Returns:
|
||||
obj: The constructed object.
|
||||
"""
|
||||
assert isinstance(cfg, dict) and 'type' in cfg
|
||||
assert isinstance(default_args, dict) or default_args is None
|
||||
args = cfg.copy()
|
||||
obj_type = args.pop('type')
|
||||
if is_str(obj_type):
|
||||
obj_cls = registry.get(obj_type)
|
||||
if obj_cls is None:
|
||||
raise KeyError('{} is not in the {} registry'.format(
|
||||
obj_type, registry.name))
|
||||
elif inspect.isclass(obj_type):
|
||||
obj_cls = obj_type
|
||||
else:
|
||||
raise TypeError('type must be a str or valid type, but got {}'.format(
|
||||
type(obj_type)))
|
||||
if default_args is not None:
|
||||
for name, value in default_args.items():
|
||||
args.setdefault(name, value)
|
||||
return obj_cls(**args)
|
||||
Reference in New Issue
Block a user