在 Realm 中存储 [MLMultiArray]?
Storing [MLMultiArray] in Realm?
对于上下文,我正在制作一个人脸识别模型,它将拍摄 student/user 的 120 张图像并将它们转换为 MLMultiArray,这是一个 Float32 1 x 120 矩阵。我面临的问题是我不能在 Realm 中使用 store/persist 120 MLMultiArray,因为它不符合协议 'RealmCollectionValue'
供参考,这是我要存储在 Realm 中的学生对象。
class Student: Object {
@objc dynamic var regNo : String = ""
@objc dynamic var faceMatrix = List<MLMultiArray>()
}
我必须将这个矩阵存储在 Realm 中,然后通过检查新矩阵与存储在 Realm 中的矩阵之间的距离来使用它来识别人脸。
模型生成的每个 MLMultiArray 将如下所示。
Float32 1 x 128 matrix
[4.476562,1.179688,0.07141113,6.976562,-0.2858887,-7.378906,0.6445312,3.695312,1.399414,2.486328,-3.988281,-0.2636719,1.000977,-4.480469,-7.832031,1.59082,0.8515625,-1.296875,-1.435547,7.839844,5.851562,0.3701172,-2.492188,7.273438,2.404297,-3.3125,-5.699219,-0.6816406,0.2807617,-3.882812,-3.982422,5.339844,4.125,-3.871094,0.6225586,1.712891,-10.02344,0.7119141,4.472656,3.566406,-0.559082,-1.049805,-4.679688,10.07812,-1.459961,4.707031,-6.078125,1.675781,-0.6259766,2.519531,3.472656,-3.400391,-6.714844,-4.933594,-1.733398,1.095703,-6.15625,9.234375,3.693359,-9.492188,0.8637695,0.8203125,-2.814453,-4.4375,-1.092773,3.332031,0.1623535,3.583984,-11.25781,-0.9941406,-0.3491211,1.464844,-1.579102,4.558594,2.703125,4.601562,5.914062,-2.402344,-5.46875,-0.355957,11.39062,2.070312,-7.289062,-0.4470215,-0.1595459,9.148438,1.833008,-2.097656,-3.9375,6.699219,-4.347656,-6.835938,-1.179688,3.910156,-13.07812,-1.947266,-0.9238281,-0.949707,-4.398438,2.363281,4.421875,4.632812,2.607422,8.773438,0.9106445,9.21875,-14.0625,-1.301758,-4.875,0.6054688,6.496094,-2.021484,3.898438,-4.644531,0.9853516,7.253906,3.066406,-1.051758,-8.09375,-6.527344,3.890625,5.175781,0.3701172,-0.5683594,-1.341797,0.1497803,4.074219,0.5932617]
如有任何帮助,我们将不胜感激 <3
您可以在 Realm 中存储一个基元数组,并从中重建您的 MLMultiArray
。
class Student: Object {
@objc dynamic var regNo : String = ""
let faceMatrixValues = List<Float>()
// Computed property
var faceMatrix: MLMultiArray {
try! MLMultiArray(faceMatrixValues.map { [=10=] })
}
}
添加到@rbaldwin 答案中,您可以通过将 MLMultiArray 转换为一个大小为 1x15360 而不是 120 [1x128] 矩阵的浮点数组来存储它。这将是一长串 Float 值,但您可以以 [[Float]].
的形式检索相同的列表
class Student: Object {
@objc dynamic var regNo : String = ""
@objc dynamic var name: String = ""
let faceMatrixValues = List<Float>()
var floatArray: [[Float]] {
var resultArray = [Float]()
for vector in faceMatrixValues {
resultArray.append(vector)
}
return resultArray.chunked(into: 128)
}
}
要从领域检索它,请使用以下代码。
let student = realm.objects(Student.self)
print("Loading [[Float]] from Realm...")
for res in student[0].floatArray {
print(res)
}
resultArray.chunked(into: 128)
会将单个 15360 长度的数组拆分为 128 个长度的浮点数组。使用以下扩展,可以为任何数组类型执行此功能。
extension Array {
func chunked(into size: Int) -> [[Element]] {
return stride(from: 0, to: count, by: size).map {
Array(self[[=12=] ..< Swift.min([=12=] + size, count)])
}
}
}
为了将 [MLMultiArray] 转换为 [[Float]],我们可以使用我之前提出的这个问题 。
对于上下文,我正在制作一个人脸识别模型,它将拍摄 student/user 的 120 张图像并将它们转换为 MLMultiArray,这是一个 Float32 1 x 120 矩阵。我面临的问题是我不能在 Realm 中使用 store/persist 120 MLMultiArray,因为它不符合协议 'RealmCollectionValue'
供参考,这是我要存储在 Realm 中的学生对象。
class Student: Object {
@objc dynamic var regNo : String = ""
@objc dynamic var faceMatrix = List<MLMultiArray>()
}
我必须将这个矩阵存储在 Realm 中,然后通过检查新矩阵与存储在 Realm 中的矩阵之间的距离来使用它来识别人脸。
模型生成的每个 MLMultiArray 将如下所示。
Float32 1 x 128 matrix
[4.476562,1.179688,0.07141113,6.976562,-0.2858887,-7.378906,0.6445312,3.695312,1.399414,2.486328,-3.988281,-0.2636719,1.000977,-4.480469,-7.832031,1.59082,0.8515625,-1.296875,-1.435547,7.839844,5.851562,0.3701172,-2.492188,7.273438,2.404297,-3.3125,-5.699219,-0.6816406,0.2807617,-3.882812,-3.982422,5.339844,4.125,-3.871094,0.6225586,1.712891,-10.02344,0.7119141,4.472656,3.566406,-0.559082,-1.049805,-4.679688,10.07812,-1.459961,4.707031,-6.078125,1.675781,-0.6259766,2.519531,3.472656,-3.400391,-6.714844,-4.933594,-1.733398,1.095703,-6.15625,9.234375,3.693359,-9.492188,0.8637695,0.8203125,-2.814453,-4.4375,-1.092773,3.332031,0.1623535,3.583984,-11.25781,-0.9941406,-0.3491211,1.464844,-1.579102,4.558594,2.703125,4.601562,5.914062,-2.402344,-5.46875,-0.355957,11.39062,2.070312,-7.289062,-0.4470215,-0.1595459,9.148438,1.833008,-2.097656,-3.9375,6.699219,-4.347656,-6.835938,-1.179688,3.910156,-13.07812,-1.947266,-0.9238281,-0.949707,-4.398438,2.363281,4.421875,4.632812,2.607422,8.773438,0.9106445,9.21875,-14.0625,-1.301758,-4.875,0.6054688,6.496094,-2.021484,3.898438,-4.644531,0.9853516,7.253906,3.066406,-1.051758,-8.09375,-6.527344,3.890625,5.175781,0.3701172,-0.5683594,-1.341797,0.1497803,4.074219,0.5932617]
如有任何帮助,我们将不胜感激 <3
您可以在 Realm 中存储一个基元数组,并从中重建您的 MLMultiArray
。
class Student: Object {
@objc dynamic var regNo : String = ""
let faceMatrixValues = List<Float>()
// Computed property
var faceMatrix: MLMultiArray {
try! MLMultiArray(faceMatrixValues.map { [=10=] })
}
}
添加到@rbaldwin 答案中,您可以通过将 MLMultiArray 转换为一个大小为 1x15360 而不是 120 [1x128] 矩阵的浮点数组来存储它。这将是一长串 Float 值,但您可以以 [[Float]].
的形式检索相同的列表class Student: Object {
@objc dynamic var regNo : String = ""
@objc dynamic var name: String = ""
let faceMatrixValues = List<Float>()
var floatArray: [[Float]] {
var resultArray = [Float]()
for vector in faceMatrixValues {
resultArray.append(vector)
}
return resultArray.chunked(into: 128)
}
}
要从领域检索它,请使用以下代码。
let student = realm.objects(Student.self)
print("Loading [[Float]] from Realm...")
for res in student[0].floatArray {
print(res)
}
resultArray.chunked(into: 128)
会将单个 15360 长度的数组拆分为 128 个长度的浮点数组。使用以下扩展,可以为任何数组类型执行此功能。
extension Array {
func chunked(into size: Int) -> [[Element]] {
return stride(from: 0, to: count, by: size).map {
Array(self[[=12=] ..< Swift.min([=12=] + size, count)])
}
}
}
为了将 [MLMultiArray] 转换为 [[Float]],我们可以使用我之前提出的这个问题