Closed pcktm closed 1 year ago
@router.post("/find")
async def find_place(file: UploadFile = File(...), db: Session = Depends(get_db)):
image = cv2.imdecode(np.fromstring(await file.read(), np.uint8), cv2.IMREAD_UNCHANGED)
places = best_match(image, db)
Coś takiego chyba działa, tylko wszędzie trzeba zmienić cv2.imread na po prostu cv2.cvtcolor i przekazywać to samo zdjęcie głębiej
Okay, dziękuję, poprawię jak najszybciej.
Co do bovw z faiss-em wydaje mi się, że poprawnie tam trenuję
with open('VPR/data/descriptors.pkl', 'rb') as fp:
files = pickle.load(fp)
descriptors = np.concatenate([f['descriptors'] for f in files],
axis=0).astype(np.float32)
kmeans_ = faiss_kmeans(descriptors)
kmeans_.train(descriptors)
w descriptors znajdują się deskryptory z danych wejściowych.
Hmm faktycznie chyba tak, musiałem się przeoczyć, przepraszam.
Możesz zrobić to kmeans tylko na startupie albo jeszcze lepiej całkowicie offline, podczas tego extract keypoints? W sensie bo przy kazdym request-cie to wydaje sie troche wasteful...
I wiesz jak dostaniesz z tego faiss-owego KMeans centroidy to potem już łatwo, bo wystarczy znaleźć najbliższy dla każdego punktu, tak jak tutaj:
Ale w gruncie rzeczy mam wyjebane, moze sie liczyć na całym datasecie przy startupie serwera no biggie i będzie Ci łatwiej bo nie trzeba nic robić manualnie wtedy.
Chyba przerzucę się na tę wersję z zapisywaniem go do pliku i potem odczytywaniem tylko, bo jak użytkownik doda nowy budynek do bazy to pasuje zaktualizować kmeans (no i fajnie jakby to szybkie było) i do keypointów, deskryptorów dodać dane z nowego zdjęcia, więc to tam jeszcze będzie poprawiane. Plus tak sobie myślałam, że w tym przypadku chyba pasuje jednak zdjęcie zapisać na dysku, bo ono wtedy będzie tym zdjęciem reprezentującym to miejsce, które będziesz chciał wyświetlać w przypadku rozpoznania tego budynku. Tylko wtedy tam muszę ujednolicić ścieżki zapisania tych zdjęć.
To znaczy, pewnie - zapisuj do pliku, ale podczas requesta nie ładuj go 3 razy z dysku tylko żongluj tym jednym.
Jasne jasne, wtedy to zdjęcie będzie tylko potrzebne do przekazania Ci go na front w razie rozpoznania miejsca. A to w sumi pytanko, w jakiej formie przekazywać Ci zdjęcie reprezentacyjne budynku?
Ja chcę URL do pliku, który serwujesz z serwera
cv2.imdecode
a potem tylko przerzucać tym jednym obrazkiem po całym kodzie, a nie ładować go kilka razy z dysku (np. wread_image
i jeszcze raz wbag_of_vwords_search
)cv2.imdecode
powinien coś zwrócić albo sie wywalić jak nie jest i zwróć jakiś kod błędu np. http 415)