2017-09-13 53 views
0

我試圖插入一個128d向量,我在包含多個面向MongoDB集合(向量)的圖像中生成了一張臉。我使用着名的dlib庫來生成128d向量。當我嘗試將這個向量插入到mongodb集合中時,我得到了「無法編碼對象錯誤」。錯誤如下。如何在Python中使用pymongo插入128d向量到MongoDB數據庫

File "/usr/local/lib/python2.7/dist-packages/pymongo/pool.py", line 610, in _raise_connection_failure 
    raise error 
bson.errors.InvalidDocument: Cannot encode object: dlib.vector([-0.078586, 0.0277601, 0.02961, 0.0263595, -0.0423636, -0.0593996, -0.0353243, -0.157486, 0.169706, -0.0115421, 0.215085, 0.0998522, -0.230498, -0.0380571, -0.0662888, 0.0504411, -0.0678306, -0.0943572, -0.123836, -0.0879753, -0.0753862, 0.000870723, 0.0786572, 0.0651935, -0.0732055, -0.294396, -0.108001, -0.122248, 0.0798309, -0.0558914, -0.00326786, -0.00399151, -0.2, -0.0997921, 0.0628334, -0.0214193, -0.0168998, -0.00545083, 0.260324, -0.0224971, -0.137103, 0.0410911, 0.0381873, 0.228159, 0.101016, 0.0886697, 0.0711474, -0.12792, 0.0942142, -0.139165, 0.0716797, 0.147697, 0.0957785, -0.00807651, 0.0464634, -0.18575, 0.00923027, 0.0976636, -0.24552, 0.145688, 0.0765331, -0.0418556, -0.0641425, 0.00440269, 0.181549, 0.134916, -0.0709987, -0.182558, 0.168222, -0.238072, 0.041242, 0.10536, -0.0684752, -0.199106, -0.233173, 0.00511742, 0.417584, 0.176161, -0.11886, 0.0600367, -0.16006, -0.0130243, 0.0705707, -0.0569518, -0.136003, 0.0180192, -0.0785295, -0.00361975, 0.212427, 0.0941055, -0.064303, 0.178207, 0.00868456, 0.0107785, 0.0646739, 0.0319019, -0.11788, -0.046726, -0.129802, 0.00561518, -0.0292626, -0.0468726, 0.132234, 0.00913511, -0.159603, 0.0933984, -0.0159525, -0.0224207, 0.00211018, 0.119351, -0.154814, -0.0764414, 0.170755, -0.303818, 0.304808, 0.111342, 0.066825, 0.12282, 0.0600208, 0.0596608, -0.0402757, -0.017425, -0.0706421, -0.102285, 0.0109511, -0.0790169, 0.18963, 0.0300883]) 

我曾嘗試將此128d向量轉換爲列表,np數組但沒有幫助。

有沒有辦法插入128d向量,因爲它是在MongoDB中使用pymongo,因爲我想比較128d向量的相似度以後。

我試圖向mongodb插入向量的代碼部分如下。

face_descriptor = facerec.compute_face_descriptor(img, shape) 
     print(face_descriptor) 
     result = db.vectors.insert_one({"image": face_descriptor, "paths" : f}) 

你的幫助真的很感謝。謝謝。

回答

0

PyMongo方法insert_one()不接受任意對象。請參閱PyMongo Tutorial: Inserting a Document

您應該將矢量對象轉換爲文檔。請參閱MongoDB Data Modelling Introduction作爲入門指南。 例如,你可以設計如下:

doc = { '0': [-0.078586, 0.0277601, 0.02961, 0.0263595], 
     '1': [-0.078586, 0.0277601, 0.02961, 0.0263595] } 

確保考慮到你如何去以後查詢。以後可以用來檢索數據的領域是什麼?另請參閱MongoDB Indexes

替代方案也可以存儲對象的Python pickle。例如:

doc = { 'queryable_value': <pickle> } 

正如你可以看到有各種方式來設計架構,玩不同的設計,看看有什麼最適合你的應用程序。

+0

我首先轉化所述載體引入numpy的數組,然後到一個python列表。它解決了這個問題。是的,我稍後再詢問它們,以檢查它們的相似性,並且完全符合我的要求。感謝您的建議/鏈接。 –

0

我只是將它轉換爲一個列表以保存在數據庫中。

face_descriptor_list = list(facerec.compute_face_descriptor(img, shape)) 
db.vectors.insert_one({"image": face_descriptor_list, "paths" : f}) 

檢索:

從DB獲取它之後,轉換回DLIB矢量

img_data = db.vectors.find_one({...}) 
face_descriptor = dlib.vector(img_data['image']) 
相關問題