我正在尝试将包含多个面的图像中的面部生成的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}}
非常感谢您的帮助。感谢。
答案 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> }
正如您所看到的,有多种方法可以设计架构,可以使用不同的设计,看看哪种方式最适合您的应用。