如何在python中使用pymongo将128d向量插入到mongodb数据库中

时间:2017-09-13 13:19:50

标签: python mongodb vector pymongo

我正在尝试将包含多个面的图像中的面部生成的128d矢量插入到MongoDB集合(矢量)中。我正在使用着名的dlib库来生成128d向量。当我尝试将此向量插入mongodb集合时,我得到“无法编码对象错误”。错误如下。

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

我确实尝试将这个128d矢量转换为list,np数组,但没有帮助。

有没有办法在MongoDB中使用pymongo插入128d向量,因为我想稍后比较128d向量的相似性。

我试图将矢量插入mongodb的代码部分如下所示。

{{1}}

非常感谢您的帮助。感谢。

2 个答案:

答案 0 :(得分:1)

我刚将其转换为列表以保存在DB中。

AdvisorSearchOptions passedSearchOptions = null;
_repositoryMock
     .Setup(x => x.SearchAdvisors(filter.CID.Value, It.IsAny<AdvisorSearchOptions>()))
     .Returns(Task.FromResult<SearchResults<Advisor>>(
        new SearchResults<Advisor>()
        {
            Count = 1,
            Limit = 0,
            Skip = 0,
            ResultItems = new List<SearchResultItem<Advisor>>() {
                //some initialize here
            }
        })
    )
    .Callback<int, AdvisorSearchOptions>((id, opt) => passedSearchOptions = opt);

//  Action
//  ...

Assert.IsNotNull(passedSearchOptions);
Assert.AreEqual(filter.SearchKey, passedSearchOptions.SearchKey);
Assert.AreEqual(filter.AdvisorId, passedSearchOptions.AdvisorId);
// Check all other fields here
// ...

检索:

从DB获取后,转换回dlib vector

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

答案 1 :(得分: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> }

正如您所看到的,有多种方法可以设计架构,可以使用不同的设计,看看哪种方式最适合您的应用。