Я создаю приложение для компьютерного зрения в реальном времени, и для этого проекта я хочу использовать хорошо известный алгоритм KNN (K-Nearest Neighbours) довольно необычным способом. Мне нужно управлять входящим потоком данных (который можно описать как точки с метками), поэтому моя идея состоит в том, чтобы передать в KNN данные, которые у меня есть на данный момент, запросить классификацию некоторых неизвестных точек. И когда появятся новые данные, обновите KNN этими новыми данными и повторите снова и снова. В общем, я буду повторно тренировать KNN сотни раз, каждый раз на несколько (менее 5) баллов больше.
Я использую python (3.8.3) с OpenCV (4.1.3 ) для всего проекта, и в будущем мне нужно будет преобразовать все в C ++, поэтому я надеюсь найти решение с этими технологиями.
У меня проблемы с cv::ml::KNearest
, который позволяет Мне нужно обучить модель, но каждое обучение полностью игнорирует предыдущее обучение и забывает данные, поэтому я не могу «обновить KNN». Как я могу это решить?
- В OpenCV (2.4) был параметр, который я ищу, использовался для обновления модели:
updateBase
но в версии 4 он, кажется, исчез. - Эффективно ли хранить в коде за пределами всех точек, а затем постоянно кормить KNN целыми точками обучения?
- Я написал свою собственную версию KNN, чтобы прояснить, какова моя цель . Конечно, не оптимизирована, особенно функция
classify
, если нет решения двух предыдущих вопросов, как вы предлагаете улучшить эту реализацию?
class MyKNN:
def __init__(self):
self.knnPoints = []
self.knnLabels = []
def train(self, points, labels) -> None:
if len(points) != len(labels):
print("Error: len(points) != len(labels)")
else:
[ self.knnPoints.append(el) for el in points ]
[ self.knnLabels.append(el) for el in labels ]
def classify(self, query, k: int=5) -> "label":
distances = []
for point in self.knnPoints:
dist = spatial.distance.sqeuclidean(query, point)
distances.append(dist)
topK = heapq.nsmallest(k, zip(distances, self.knnLabels, self.knnPoints))
for (i, (score, label, point)) in enumerate(topK):
print("The {} match has score {:.3f} and label {}".format(i+1, score, str(label)))
print("")
return(topK)