优化向量查询,替换新模型

This commit is contained in:
2026-03-10 13:33:31 +08:00
parent 1206ecd575
commit 1cc2358d72
6 changed files with 83 additions and 76 deletions
Binary file not shown.
+69 -66
View File
@@ -25,7 +25,6 @@
"松花蛋",
"松茸菌WP2025120100016",
"沙葱",
"洋葱(鲜)[葱头]WP2026022800612",
"海带(浸)[江白菜,昆布]WP2026022800035",
"牛腩WP2025110700043",
"猪五花肉WP2026020300048",
@@ -40,6 +39,7 @@
"红心萝卜[心里美]WP2026022800368",
"红提子WP2025111900006",
"红椒WP2026030300055",
"红洋葱WP2026030600054",
"红美人椒WP2026020300049",
"红薯",
"红薯粉条(袋)",
@@ -68,19 +68,20 @@
"辣椒(红,小)WP2025111000066",
"辣椒(青,尖)WP2026022800504",
"醪糟",
"金针菇WP2025111900010",
"金针菇[(鲜)[智力菇]WP2026030600051",
"青线椒WP2026013000031",
"韭菜WP2026020200044",
"韭黄",
"馒头(代表值)WP2026030600056",
"香椿[香椿芽]WP2026022801086",
"香菇",
"香菇(鲜)[香蕈,冬菇]WP2026030600050",
"香菜WP2026013000030",
"马铃薯[土豆、洋芋]WP2026012900001",
"鸡全腿(带骨)",
"鸡翅(带骨)",
"鸡腿肉WP2025110700048",
"鸡腿(带骨)",
"鸡蛋(代表值)WP2026013000039",
"鸡蛋WP2026013000039",
"麦芹",
"黄瓜(鲜)[胡瓜]WP2025110700031",
"黄豆芽WP2026020200042",
@@ -113,21 +114,21 @@
"松花蛋": 22,
"松茸菌WP2025120100016": 23,
"沙葱": 24,
"洋葱(鲜)[葱头]WP2026022800612": 25,
"海带(浸)[江白菜,昆布]WP2026022800035": 26,
"牛腩WP2025110700043": 27,
"猪五花肉WP2026020300048": 28,
"猪腿肉WP2025110700040": 29,
"玉米WP2025120100017": 30,
"玉米糁(黄)WP2026022800038": 31,
"番茄[西红柿]WP2026021000028": 32,
"白吉饼WP2026013000024": 33,
"": 34,
"粉丝": 35,
"紫甘蓝": 36,
"红心萝卜[心里美]WP2026022800368": 37,
"红提子WP2025111900006": 38,
"红WP2026030300055": 39,
"海带(浸)[江白菜,昆布]WP2026022800035": 25,
"牛腩WP2025110700043": 26,
"猪五花肉WP2026020300048": 27,
"猪肉WP2025110700040": 28,
"玉米WP2025120100017": 29,
"玉米糁(黄)WP2026022800038": 30,
"番茄[西红柿]WP2026021000028": 31,
"白吉饼WP2026013000024": 32,
"": 33,
"粉丝": 34,
"紫甘蓝": 35,
"红心萝卜[心里美]WP2026022800368": 36,
"红提子WP2025111900006": 37,
"红WP2026030300055": 38,
"红洋葱WP2026030600054": 39,
"红美人椒WP2026020300049": 40,
"红薯": 41,
"红薯粉条(袋)": 42,
@@ -156,24 +157,25 @@
"辣椒(红,小)WP2025111000066": 65,
"辣椒(青,尖)WP2026022800504": 66,
"醪糟": 67,
"金针菇WP2025111900010": 68,
"金针菇[(鲜)[智力菇]WP2026030600051": 68,
"青线椒WP2026013000031": 69,
"韭菜WP2026020200044": 70,
"韭黄": 71,
"香椿[香椿芽]WP2026022801086": 72,
"香": 73,
"香WP2026013000030": 74,
"马铃薯[土豆、洋芋]WP2026012900001": 75,
"鸡全腿(带骨)": 76,
"鸡(带骨)": 77,
"鸡腿肉WP2025110700048": 78,
"鸡腿(带骨)": 79,
"鸡蛋(代表值)WP2026013000039": 80,
"麦芹": 81,
"黄瓜(鲜)[胡瓜]WP2025110700031": 82,
"黄豆芽WP2026020200042": 83,
"黑袋子": 84,
"黑鱼(整条鱼)WP2025110600012": 85
"馒头(代表值)WP2026030600056": 72,
"香椿[香椿芽]WP2026022801086": 73,
"香菇(鲜)[香蕈,冬菇]WP2026030600050": 74,
"香菜WP2026013000030": 75,
"马铃薯[土豆、洋芋]WP2026012900001": 76,
"鸡全腿(带骨)": 77,
"鸡翅(带骨)": 78,
"鸡腿肉WP2025110700048": 79,
"鸡腿(带骨)": 80,
"鸡蛋WP2026013000039": 81,
"麦芹": 82,
"黄瓜(鲜)[胡瓜]WP2025110700031": 83,
"黄豆芽WP2026020200042": 84,
"黑袋子": 85,
"黑鱼(整条鱼)WP2025110600012": 86
},
"idx_to_class": {
"0": "三黄鸡",
@@ -201,21 +203,21 @@
"22": "松花蛋",
"23": "松茸菌WP2025120100016",
"24": "沙葱",
"25": "洋葱(鲜)[葱头]WP2026022800612",
"26": "海带(浸)[江白菜,昆布]WP2026022800035",
"27": "牛腩WP2025110700043",
"28": "猪五花肉WP2026020300048",
"29": "猪腿肉WP2025110700040",
"30": "玉米WP2025120100017",
"31": "玉米糁(黄)WP2026022800038",
"32": "番茄[西红柿]WP2026021000028",
"33": "白吉饼WP2026013000024",
"34": "",
"35": "粉丝",
"36": "紫甘蓝",
"37": "红心萝卜[心里美]WP2026022800368",
"38": "红提子WP2025111900006",
"39": "红WP2026030300055",
"25": "海带(浸)[江白菜,昆布]WP2026022800035",
"26": "牛腩WP2025110700043",
"27": "猪五花肉WP2026020300048",
"28": "猪肉WP2025110700040",
"29": "玉米WP2025120100017",
"30": "玉米糁(黄)WP2026022800038",
"31": "番茄[西红柿]WP2026021000028",
"32": "白吉饼WP2026013000024",
"33": "",
"34": "粉丝",
"35": "紫甘蓝",
"36": "红心萝卜[心里美]WP2026022800368",
"37": "红提子WP2025111900006",
"38": "红WP2026030300055",
"39": "红洋葱WP2026030600054",
"40": "红美人椒WP2026020300049",
"41": "红薯",
"42": "红薯粉条(袋)",
@@ -244,26 +246,27 @@
"65": "辣椒(红,小)WP2025111000066",
"66": "辣椒(青,尖)WP2026022800504",
"67": "醪糟",
"68": "金针菇WP2025111900010",
"68": "金针菇[(鲜)[智力菇]WP2026030600051",
"69": "青线椒WP2026013000031",
"70": "韭菜WP2026020200044",
"71": "韭黄",
"72": "香椿[香椿芽]WP2026022801086",
"73": "香",
"74": "香WP2026013000030",
"75": "马铃薯[土豆、洋芋]WP2026012900001",
"76": "鸡全腿(带骨)",
"77": "鸡(带骨)",
"78": "鸡腿肉WP2025110700048",
"79": "鸡腿(带骨)",
"80": "鸡蛋(代表值)WP2026013000039",
"81": "麦芹",
"82": "黄瓜(鲜)[胡瓜]WP2025110700031",
"83": "黄豆芽WP2026020200042",
"84": "黑袋子",
"85": "黑鱼(整条鱼)WP2025110600012"
"72": "馒头(代表值)WP2026030600056",
"73": "香椿[香椿芽]WP2026022801086",
"74": "香菇(鲜)[香蕈,冬菇]WP2026030600050",
"75": "香菜WP2026013000030",
"76": "马铃薯[土豆、洋芋]WP2026012900001",
"77": "鸡全腿(带骨)",
"78": "鸡翅(带骨)",
"79": "鸡腿肉WP2025110700048",
"80": "鸡腿(带骨)",
"81": "鸡蛋WP2026013000039",
"82": "麦芹",
"83": "黄瓜(鲜)[胡瓜]WP2025110700031",
"84": "黄豆芽WP2026020200042",
"85": "黑袋子",
"86": "黑鱼(整条鱼)WP2025110600012"
},
"embedding_dim": 512,
"total_images": 2070,
"build_time": "2026-03-06T09:38:05.028631"
"total_images": 2093,
"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 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_STD_RGB = floatArrayOf(1.0f, 1.0f, 1.0f)
@@ -135,9 +131,11 @@ object FoodModule {
logInfo("queryFood向量:${floatArray.slice(0 until 50).toJsonString()}")
val idScoreList = ObjectBox.query(floatArray, queryCount)
// 批量加载所有实体,一次DB操作替代循环单条查询
val foodMap = ObjectBox.getByIds(idScoreList.map { it.id }).associateBy { it.id }
val nameScoreList = mutableListOf<IdNameScore>()
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))
}
logInfo("queryFood数据:${nameScoreList.toJsonString()}")
@@ -203,10 +201,10 @@ object FoodModule {
val labelsJson = AssetsTool.readAssetsFile(context, "data/labels.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)
labelsList = Gson().fromJson(labelsJson, IntArray::class.java)
classInfo =
val labelsList: IntArray = Gson().fromJson(labelsJson, IntArray::class.java)
val classInfo: FoodClassInfo =
Gson().fromJson(classInfoJson, FoodClassInfo::class.java)
val foodMap = classInfo.idx_to_class
@@ -172,6 +172,12 @@ object ObjectBox {
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 {
getBox<Food>()?.put(entity)
}