mirror of
https://github.com/3x4byte/StreetsignRecognition.git
synced 2025-12-21 09:25:52 +00:00
97 lines
2.1 KiB
Python
97 lines
2.1 KiB
Python
from typing import Any, Self
|
|
import numpy as np
|
|
import os
|
|
import pickle
|
|
|
|
from classes.concept import Concept
|
|
from classes.feature import Feature
|
|
|
|
|
|
class FeatureVector:
|
|
|
|
def __init__(self, concept: Concept, features: dict = {}, features_list: list = None, loaded: bool = False) -> None:
|
|
if loaded == False:
|
|
self.loaded: bool = False
|
|
self.features: dict = features
|
|
self.concept: Concept = concept
|
|
else:
|
|
self.loaded: bool = True
|
|
self.concept: Concept = concept
|
|
self.features_list: list = features_list
|
|
|
|
|
|
def _get_values_of_feature(self, feature: Feature) -> list[int]:
|
|
try:
|
|
feature_data = self.features[feature]
|
|
except KeyError:
|
|
print("missing key: ", feature)
|
|
return [-1]
|
|
|
|
ret = []
|
|
if feature == Feature.OVERALL_COLOR_PERCENTAGE:
|
|
feature_data: dict
|
|
for val in feature_data.values():
|
|
ret.append(val)
|
|
return ret
|
|
|
|
elif feature == Feature.RASTER_COLOR_PERCENTAGE:
|
|
feature_data: list[list[dict]]
|
|
|
|
for feature_data1d in feature_data:
|
|
for data in feature_data1d:
|
|
for val in data.values():
|
|
ret.append(val)
|
|
return ret
|
|
|
|
elif feature == Feature.CORNERS:
|
|
ret.append(feature_data)
|
|
return ret
|
|
elif feature == Feature.EDGES:
|
|
ret.append(feature_data)
|
|
return ret
|
|
elif feature == Feature.COUNTOURS:
|
|
ret.append(feature_data)
|
|
return ret
|
|
|
|
|
|
def add_feature(self, key: Feature, value: Any) -> None:
|
|
self.features.update({key: value})
|
|
|
|
|
|
def get_vector(self) -> list:
|
|
if self.loaded:
|
|
return self.features_list
|
|
|
|
ret = []
|
|
for feature in Feature:
|
|
ret = ret + self._get_values_of_feature(feature)
|
|
return ret
|
|
|
|
|
|
def get_concept(self) -> Concept:
|
|
return self.concept
|
|
|
|
|
|
def get_num_features(self) -> int:
|
|
return len(self.features)
|
|
|
|
|
|
def get_feature_value(self, key: str) -> Any:
|
|
return self.features[key]
|
|
|
|
|
|
def get_features(self) -> Any:
|
|
return self.features
|
|
|
|
|
|
def save(self, path: os.path) -> None:
|
|
with open(path, "wb") as write:
|
|
pickle.dump(self, write, pickle.HIGHEST_PROTOCOL)
|
|
|
|
|
|
def load(path: os.path) -> Self:
|
|
with open(path, "rb") as read:
|
|
self: FeatureVector = pickle.load(read)
|
|
return self
|
|
|