优化向量查询结果数据

This commit is contained in:
2026-03-10 13:00:45 +08:00
parent f53669d048
commit 1206ecd575
@@ -47,6 +47,7 @@ object FoodModule {
private const val MODEL_INPUT_WIDTH = 300 private const val MODEL_INPUT_WIDTH = 300
private const val MODEL_INPUT_HEIGHT = 300 private const val MODEL_INPUT_HEIGHT = 300
const val DEFAULT_FOOD_INDEX = -1 const val DEFAULT_FOOD_INDEX = -1
const val DEFAULT_QUERY_COUNT = 50
const val BAG_RATE = 0.05 const val BAG_RATE = 0.05
@@ -94,7 +95,7 @@ object FoodModule {
return null return null
} }
// fun queryFood(uri: Uri, queryCount: Int = 15): List<String>? { // fun queryFood(uri: Uri, queryCount: Int = DEFAULT_QUERY_COUNT): List<String>? {
// return uri2FloatArray(uri)?.let { // return uri2FloatArray(uri)?.let {
// queryFood(it, queryCount) // queryFood(it, queryCount)
// } // }
@@ -103,7 +104,7 @@ object FoodModule {
// /** // /**
// * 返回识别物品名称列表 // * 返回识别物品名称列表
// */ // */
// fun queryFood(bitmap: Bitmap, queryCount: Int = 15): List<String> { // fun queryFood(bitmap: Bitmap, queryCount: Int = DEFAULT_QUERY_COUNT): List<String> {
// val floatArray = bitmap2FloatArray(bitmap) // val floatArray = bitmap2FloatArray(bitmap)
// return queryFood(floatArray, queryCount) // return queryFood(floatArray, queryCount)
// } // }
@@ -111,14 +112,14 @@ object FoodModule {
// /** // /**
// * 返回识别物品IdNameScore对象列表 // * 返回识别物品IdNameScore对象列表
// */ // */
// fun queryFoodNameScore(bitmap: Bitmap, queryCount: Int = 15): List<IdNameScore> { // fun queryFoodNameScore(bitmap: Bitmap, queryCount: Int = DEFAULT_QUERY_COUNT): List<IdNameScore> {
// val floatArray = bitmap2FloatArray(bitmap) // val floatArray = bitmap2FloatArray(bitmap)
// return queryFoodNameScore(floatArray, queryCount) // return queryFoodNameScore(floatArray, queryCount)
// } // }
suspend fun queryFoodNameScore( suspend fun queryFoodNameScore(
floatArray: FloatArray?, floatArray: FloatArray?,
queryCount: Int = 15 queryCount: Int = DEFAULT_QUERY_COUNT
): List<IdNameScore> { ): List<IdNameScore> {
if (floatArray == null) return emptyList() if (floatArray == null) return emptyList()
// val query: Query<Food> = box.query(Food_.foodVector.nearestNeighbors(floatArray, queryCount)).build() // val query: Query<Food> = box.query(Food_.foodVector.nearestNeighbors(floatArray, queryCount)).build()
@@ -143,7 +144,7 @@ object FoodModule {
return nameScoreList return nameScoreList
} }
suspend fun getFoodScoreList(bitmap: Bitmap, queryCount: Int = 15): List<IdNameScore> { suspend fun getFoodScoreList(bitmap: Bitmap, queryCount: Int = DEFAULT_QUERY_COUNT): List<IdNameScore> {
val floatArray = bitmap2FloatArray(bitmap, false) ?: return emptyList() val floatArray = bitmap2FloatArray(bitmap, false) ?: return emptyList()
logInfo("getFoodScoreList向量:${floatArray.toJsonString()}") logInfo("getFoodScoreList向量:${floatArray.toJsonString()}")
val nameScoreList = queryFoodNameScore(floatArray, queryCount) val nameScoreList = queryFoodNameScore(floatArray, queryCount)
@@ -156,34 +157,35 @@ object FoodModule {
.groupBy { it.name } .groupBy { it.name }
.map { (_, value) -> value.minByOrNull { it.score }!! } .map { (_, value) -> value.minByOrNull { it.score }!! }
.toMutableList() .toMutableList()
val map = mutableMapOf<String, Int>() // val map = mutableMapOf<String, Int>()
nameScoreList.forEach { // nameScoreList.forEach {
val key = it.name // val key = it.name
val count = map[key] ?: 0 // val count = map[key] ?: 0
map[key] = count + 1 // map[key] = count + 1
} // }
val orderList = map.entries.sortedByDescending { it.value }.map { it.key }.toMutableList() // val orderList = map.entries.sortedByDescending { it.value }.map { it.key }.toMutableList()
val firstFood = nameScoreList[0].name // val firstFood = nameScoreList[0].name
orderList.remove(firstFood) // orderList.remove(firstFood)
orderList.add(0, firstFood) // orderList.add(0, firstFood)
//
val sortedScoreList = maxScoreList.sortedWith(compareBy { // val sortedScoreList = maxScoreList.sortedWith(compareBy {
orderList.indexOf(it.name) // orderList.indexOf(it.name)
}) // })
val sortedScoreList = maxScoreList.sortedBy { it.score }
logInfo("getFoodScoreList数据:${sortedScoreList.toJsonString()}") logInfo("getFoodScoreList数据:${sortedScoreList.toJsonString()}")
return sortedScoreList return sortedScoreList
} }
suspend fun queryFood(floatArray: FloatArray, queryCount: Int = 15): List<String> { // suspend fun queryFood(floatArray: FloatArray, queryCount: Int = DEFAULT_QUERY_COUNT): List<String> {
val map = mutableMapOf<String, Int>() // val map = mutableMapOf<String, Int>()
val nameScoreList = queryFoodNameScore(floatArray, queryCount) // val nameScoreList = queryFoodNameScore(floatArray, queryCount)
nameScoreList.filter { it.score < 0.05 }.forEach { // nameScoreList.filter { it.score < 0.05 }.forEach {
val count = map[it.name] ?: 0 // val count = map[it.name] ?: 0
map[it.name] = count + 1 // map[it.name] = count + 1
} // }
val list = map.entries.sortedByDescending { it.value }.map { it.key } // val list = map.entries.sortedByDescending { it.value }.map { it.key }
return list // return list
} // }
data class IdNameScore( data class IdNameScore(
val id: Long, val id: Long,