优化向量查询,替换新模型
This commit is contained in:
Binary file not shown.
@@ -25,7 +25,6 @@
|
|||||||
"松花蛋",
|
"松花蛋",
|
||||||
"松茸菌WP2025120100016",
|
"松茸菌WP2025120100016",
|
||||||
"沙葱",
|
"沙葱",
|
||||||
"洋葱(鲜)[葱头]WP2026022800612",
|
|
||||||
"海带(浸)[江白菜,昆布]WP2026022800035",
|
"海带(浸)[江白菜,昆布]WP2026022800035",
|
||||||
"牛腩WP2025110700043",
|
"牛腩WP2025110700043",
|
||||||
"猪五花肉WP2026020300048",
|
"猪五花肉WP2026020300048",
|
||||||
@@ -40,6 +39,7 @@
|
|||||||
"红心萝卜[心里美]WP2026022800368",
|
"红心萝卜[心里美]WP2026022800368",
|
||||||
"红提子WP2025111900006",
|
"红提子WP2025111900006",
|
||||||
"红椒WP2026030300055",
|
"红椒WP2026030300055",
|
||||||
|
"红洋葱WP2026030600054",
|
||||||
"红美人椒WP2026020300049",
|
"红美人椒WP2026020300049",
|
||||||
"红薯",
|
"红薯",
|
||||||
"红薯粉条(袋)",
|
"红薯粉条(袋)",
|
||||||
@@ -68,19 +68,20 @@
|
|||||||
"辣椒(红,小)WP2025111000066",
|
"辣椒(红,小)WP2025111000066",
|
||||||
"辣椒(青,尖)WP2026022800504",
|
"辣椒(青,尖)WP2026022800504",
|
||||||
"醪糟",
|
"醪糟",
|
||||||
"金针菇WP2025111900010",
|
"金针菇[(鲜)[智力菇]WP2026030600051",
|
||||||
"青线椒WP2026013000031",
|
"青线椒WP2026013000031",
|
||||||
"韭菜WP2026020200044",
|
"韭菜WP2026020200044",
|
||||||
"韭黄",
|
"韭黄",
|
||||||
|
"馒头(代表值)WP2026030600056",
|
||||||
"香椿[香椿芽]WP2026022801086",
|
"香椿[香椿芽]WP2026022801086",
|
||||||
"香菇",
|
"香菇(鲜)[香蕈,冬菇]WP2026030600050",
|
||||||
"香菜WP2026013000030",
|
"香菜WP2026013000030",
|
||||||
"马铃薯[土豆、洋芋]WP2026012900001",
|
"马铃薯[土豆、洋芋]WP2026012900001",
|
||||||
"鸡全腿(带骨)",
|
"鸡全腿(带骨)",
|
||||||
"鸡翅(带骨)",
|
"鸡翅(带骨)",
|
||||||
"鸡腿肉WP2025110700048",
|
"鸡腿肉WP2025110700048",
|
||||||
"鸡腿(带骨)",
|
"鸡腿(带骨)",
|
||||||
"鸡蛋(代表值)WP2026013000039",
|
"鸡蛋WP2026013000039",
|
||||||
"麦芹",
|
"麦芹",
|
||||||
"黄瓜(鲜)[胡瓜]WP2025110700031",
|
"黄瓜(鲜)[胡瓜]WP2025110700031",
|
||||||
"黄豆芽WP2026020200042",
|
"黄豆芽WP2026020200042",
|
||||||
@@ -113,21 +114,21 @@
|
|||||||
"松花蛋": 22,
|
"松花蛋": 22,
|
||||||
"松茸菌WP2025120100016": 23,
|
"松茸菌WP2025120100016": 23,
|
||||||
"沙葱": 24,
|
"沙葱": 24,
|
||||||
"洋葱(鲜)[葱头]WP2026022800612": 25,
|
"海带(浸)[江白菜,昆布]WP2026022800035": 25,
|
||||||
"海带(浸)[江白菜,昆布]WP2026022800035": 26,
|
"牛腩WP2025110700043": 26,
|
||||||
"牛腩WP2025110700043": 27,
|
"猪五花肉WP2026020300048": 27,
|
||||||
"猪五花肉WP2026020300048": 28,
|
"猪腿肉WP2025110700040": 28,
|
||||||
"猪腿肉WP2025110700040": 29,
|
"玉米WP2025120100017": 29,
|
||||||
"玉米WP2025120100017": 30,
|
"玉米糁(黄)WP2026022800038": 30,
|
||||||
"玉米糁(黄)WP2026022800038": 31,
|
"番茄[西红柿]WP2026021000028": 31,
|
||||||
"番茄[西红柿]WP2026021000028": 32,
|
"白吉饼WP2026013000024": 32,
|
||||||
"白吉饼WP2026013000024": 33,
|
"笋": 33,
|
||||||
"笋": 34,
|
"粉丝": 34,
|
||||||
"粉丝": 35,
|
"紫甘蓝": 35,
|
||||||
"紫甘蓝": 36,
|
"红心萝卜[心里美]WP2026022800368": 36,
|
||||||
"红心萝卜[心里美]WP2026022800368": 37,
|
"红提子WP2025111900006": 37,
|
||||||
"红提子WP2025111900006": 38,
|
"红椒WP2026030300055": 38,
|
||||||
"红椒WP2026030300055": 39,
|
"红洋葱WP2026030600054": 39,
|
||||||
"红美人椒WP2026020300049": 40,
|
"红美人椒WP2026020300049": 40,
|
||||||
"红薯": 41,
|
"红薯": 41,
|
||||||
"红薯粉条(袋)": 42,
|
"红薯粉条(袋)": 42,
|
||||||
@@ -156,24 +157,25 @@
|
|||||||
"辣椒(红,小)WP2025111000066": 65,
|
"辣椒(红,小)WP2025111000066": 65,
|
||||||
"辣椒(青,尖)WP2026022800504": 66,
|
"辣椒(青,尖)WP2026022800504": 66,
|
||||||
"醪糟": 67,
|
"醪糟": 67,
|
||||||
"金针菇WP2025111900010": 68,
|
"金针菇[(鲜)[智力菇]WP2026030600051": 68,
|
||||||
"青线椒WP2026013000031": 69,
|
"青线椒WP2026013000031": 69,
|
||||||
"韭菜WP2026020200044": 70,
|
"韭菜WP2026020200044": 70,
|
||||||
"韭黄": 71,
|
"韭黄": 71,
|
||||||
"香椿[香椿芽]WP2026022801086": 72,
|
"馒头(代表值)WP2026030600056": 72,
|
||||||
"香菇": 73,
|
"香椿[香椿芽]WP2026022801086": 73,
|
||||||
"香菜WP2026013000030": 74,
|
"香菇(鲜)[香蕈,冬菇]WP2026030600050": 74,
|
||||||
"马铃薯[土豆、洋芋]WP2026012900001": 75,
|
"香菜WP2026013000030": 75,
|
||||||
"鸡全腿(带骨)": 76,
|
"马铃薯[土豆、洋芋]WP2026012900001": 76,
|
||||||
"鸡翅(带骨)": 77,
|
"鸡全腿(带骨)": 77,
|
||||||
"鸡腿肉WP2025110700048": 78,
|
"鸡翅(带骨)": 78,
|
||||||
"鸡腿(带骨)": 79,
|
"鸡腿肉WP2025110700048": 79,
|
||||||
"鸡蛋(代表值)WP2026013000039": 80,
|
"鸡腿(带骨)": 80,
|
||||||
"麦芹": 81,
|
"鸡蛋WP2026013000039": 81,
|
||||||
"黄瓜(鲜)[胡瓜]WP2025110700031": 82,
|
"麦芹": 82,
|
||||||
"黄豆芽WP2026020200042": 83,
|
"黄瓜(鲜)[胡瓜]WP2025110700031": 83,
|
||||||
"黑袋子": 84,
|
"黄豆芽WP2026020200042": 84,
|
||||||
"黑鱼(整条鱼)WP2025110600012": 85
|
"黑袋子": 85,
|
||||||
|
"黑鱼(整条鱼)WP2025110600012": 86
|
||||||
},
|
},
|
||||||
"idx_to_class": {
|
"idx_to_class": {
|
||||||
"0": "三黄鸡",
|
"0": "三黄鸡",
|
||||||
@@ -201,21 +203,21 @@
|
|||||||
"22": "松花蛋",
|
"22": "松花蛋",
|
||||||
"23": "松茸菌WP2025120100016",
|
"23": "松茸菌WP2025120100016",
|
||||||
"24": "沙葱",
|
"24": "沙葱",
|
||||||
"25": "洋葱(鲜)[葱头]WP2026022800612",
|
"25": "海带(浸)[江白菜,昆布]WP2026022800035",
|
||||||
"26": "海带(浸)[江白菜,昆布]WP2026022800035",
|
"26": "牛腩WP2025110700043",
|
||||||
"27": "牛腩WP2025110700043",
|
"27": "猪五花肉WP2026020300048",
|
||||||
"28": "猪五花肉WP2026020300048",
|
"28": "猪腿肉WP2025110700040",
|
||||||
"29": "猪腿肉WP2025110700040",
|
"29": "玉米WP2025120100017",
|
||||||
"30": "玉米WP2025120100017",
|
"30": "玉米糁(黄)WP2026022800038",
|
||||||
"31": "玉米糁(黄)WP2026022800038",
|
"31": "番茄[西红柿]WP2026021000028",
|
||||||
"32": "番茄[西红柿]WP2026021000028",
|
"32": "白吉饼WP2026013000024",
|
||||||
"33": "白吉饼WP2026013000024",
|
"33": "笋",
|
||||||
"34": "笋",
|
"34": "粉丝",
|
||||||
"35": "粉丝",
|
"35": "紫甘蓝",
|
||||||
"36": "紫甘蓝",
|
"36": "红心萝卜[心里美]WP2026022800368",
|
||||||
"37": "红心萝卜[心里美]WP2026022800368",
|
"37": "红提子WP2025111900006",
|
||||||
"38": "红提子WP2025111900006",
|
"38": "红椒WP2026030300055",
|
||||||
"39": "红椒WP2026030300055",
|
"39": "红洋葱WP2026030600054",
|
||||||
"40": "红美人椒WP2026020300049",
|
"40": "红美人椒WP2026020300049",
|
||||||
"41": "红薯",
|
"41": "红薯",
|
||||||
"42": "红薯粉条(袋)",
|
"42": "红薯粉条(袋)",
|
||||||
@@ -244,26 +246,27 @@
|
|||||||
"65": "辣椒(红,小)WP2025111000066",
|
"65": "辣椒(红,小)WP2025111000066",
|
||||||
"66": "辣椒(青,尖)WP2026022800504",
|
"66": "辣椒(青,尖)WP2026022800504",
|
||||||
"67": "醪糟",
|
"67": "醪糟",
|
||||||
"68": "金针菇WP2025111900010",
|
"68": "金针菇[(鲜)[智力菇]WP2026030600051",
|
||||||
"69": "青线椒WP2026013000031",
|
"69": "青线椒WP2026013000031",
|
||||||
"70": "韭菜WP2026020200044",
|
"70": "韭菜WP2026020200044",
|
||||||
"71": "韭黄",
|
"71": "韭黄",
|
||||||
"72": "香椿[香椿芽]WP2026022801086",
|
"72": "馒头(代表值)WP2026030600056",
|
||||||
"73": "香菇",
|
"73": "香椿[香椿芽]WP2026022801086",
|
||||||
"74": "香菜WP2026013000030",
|
"74": "香菇(鲜)[香蕈,冬菇]WP2026030600050",
|
||||||
"75": "马铃薯[土豆、洋芋]WP2026012900001",
|
"75": "香菜WP2026013000030",
|
||||||
"76": "鸡全腿(带骨)",
|
"76": "马铃薯[土豆、洋芋]WP2026012900001",
|
||||||
"77": "鸡翅(带骨)",
|
"77": "鸡全腿(带骨)",
|
||||||
"78": "鸡腿肉WP2025110700048",
|
"78": "鸡翅(带骨)",
|
||||||
"79": "鸡腿(带骨)",
|
"79": "鸡腿肉WP2025110700048",
|
||||||
"80": "鸡蛋(代表值)WP2026013000039",
|
"80": "鸡腿(带骨)",
|
||||||
"81": "麦芹",
|
"81": "鸡蛋WP2026013000039",
|
||||||
"82": "黄瓜(鲜)[胡瓜]WP2025110700031",
|
"82": "麦芹",
|
||||||
"83": "黄豆芽WP2026020200042",
|
"83": "黄瓜(鲜)[胡瓜]WP2025110700031",
|
||||||
"84": "黑袋子",
|
"84": "黄豆芽WP2026020200042",
|
||||||
"85": "黑鱼(整条鱼)WP2025110600012"
|
"85": "黑袋子",
|
||||||
|
"86": "黑鱼(整条鱼)WP2025110600012"
|
||||||
},
|
},
|
||||||
"embedding_dim": 512,
|
"embedding_dim": 512,
|
||||||
"total_images": 2070,
|
"total_images": 2093,
|
||||||
"build_time": "2026-03-06T09:38:05.028631"
|
"build_time": "2026-03-10T10:33:47.104848"
|
||||||
}
|
}
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -36,10 +36,6 @@ object FoodModule {
|
|||||||
|
|
||||||
private lateinit var module_mobile: Module
|
private lateinit var module_mobile: Module
|
||||||
|
|
||||||
// private lateinit var box: Box<Food>
|
|
||||||
private lateinit var embeddingsList: List<List<Float>>
|
|
||||||
private lateinit var labelsList: IntArray
|
|
||||||
private lateinit var classInfo: FoodClassInfo
|
|
||||||
private val NO_MEAN_RGB = floatArrayOf(0.0f, 0.0f, 0.0f)
|
private val NO_MEAN_RGB = floatArrayOf(0.0f, 0.0f, 0.0f)
|
||||||
private val NO_STD_RGB = floatArrayOf(1.0f, 1.0f, 1.0f)
|
private val NO_STD_RGB = floatArrayOf(1.0f, 1.0f, 1.0f)
|
||||||
|
|
||||||
@@ -135,9 +131,11 @@ object FoodModule {
|
|||||||
|
|
||||||
logInfo("queryFood向量:${floatArray.slice(0 until 50).toJsonString()}")
|
logInfo("queryFood向量:${floatArray.slice(0 until 50).toJsonString()}")
|
||||||
val idScoreList = ObjectBox.query(floatArray, queryCount)
|
val idScoreList = ObjectBox.query(floatArray, queryCount)
|
||||||
|
// 批量加载所有实体,一次DB操作替代循环单条查询
|
||||||
|
val foodMap = ObjectBox.getByIds(idScoreList.map { it.id }).associateBy { it.id }
|
||||||
val nameScoreList = mutableListOf<IdNameScore>()
|
val nameScoreList = mutableListOf<IdNameScore>()
|
||||||
idScoreList.forEach {
|
idScoreList.forEach {
|
||||||
val name = ObjectBox.get(it.id)?.name ?: ""
|
val name = foodMap[it.id]?.name ?: ""
|
||||||
nameScoreList.add(IdNameScore(id = it.id, name = name, score = it.score))
|
nameScoreList.add(IdNameScore(id = it.id, name = name, score = it.score))
|
||||||
}
|
}
|
||||||
logInfo("queryFood数据:${nameScoreList.toJsonString()}")
|
logInfo("queryFood数据:${nameScoreList.toJsonString()}")
|
||||||
@@ -203,10 +201,10 @@ object FoodModule {
|
|||||||
val labelsJson = AssetsTool.readAssetsFile(context, "data/labels.json")
|
val labelsJson = AssetsTool.readAssetsFile(context, "data/labels.json")
|
||||||
val classInfoJson = AssetsTool.readAssetsFile(context, "data/class_info.json")
|
val classInfoJson = AssetsTool.readAssetsFile(context, "data/class_info.json")
|
||||||
|
|
||||||
embeddingsList =
|
val embeddingsList: List<List<Float>> =
|
||||||
Gson().fromJson(embeddingsJson, object : TypeToken<List<List<Float>>>() {}.type)
|
Gson().fromJson(embeddingsJson, object : TypeToken<List<List<Float>>>() {}.type)
|
||||||
labelsList = Gson().fromJson(labelsJson, IntArray::class.java)
|
val labelsList: IntArray = Gson().fromJson(labelsJson, IntArray::class.java)
|
||||||
classInfo =
|
val classInfo: FoodClassInfo =
|
||||||
Gson().fromJson(classInfoJson, FoodClassInfo::class.java)
|
Gson().fromJson(classInfoJson, FoodClassInfo::class.java)
|
||||||
|
|
||||||
val foodMap = classInfo.idx_to_class
|
val foodMap = classInfo.idx_to_class
|
||||||
|
|||||||
@@ -172,6 +172,12 @@ object ObjectBox {
|
|||||||
getBox<Food>()?.get(id)
|
getBox<Food>()?.get(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 批量按ID加载,一次DB事务替代循环单条查询
|
||||||
|
suspend fun getByIds(ids: List<Long>): List<Food> = safeDbOp {
|
||||||
|
if (ids.isEmpty()) return@safeDbOp emptyList<Food>()
|
||||||
|
getBox<Food>()?.get(ids.toLongArray()) ?: emptyList<Food>()
|
||||||
|
} ?: emptyList()
|
||||||
|
|
||||||
suspend fun put(entity: Food) = safeDbOp {
|
suspend fun put(entity: Food) = safeDbOp {
|
||||||
getBox<Food>()?.put(entity)
|
getBox<Food>()?.put(entity)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user