Skip to content

Commit b54fc77

Browse files
Merge pull request #23 from smartscanapp/refactor/structure
Refactor file structure
2 parents ab11663 + 3f2b38a commit b54fc77

File tree

37 files changed

+150
-233
lines changed

37 files changed

+150
-233
lines changed

core/src/androidTest/kotlin/com/fpf/smartscansdk/core/data/images/Entity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.fpf.smartscansdk.core.data.images
22

33
import androidx.room.*
4-
import com.fpf.smartscansdk.core.data.Embedding
4+
import com.fpf.smartscansdk.core.embeddings.Embedding
55

66
@Entity(tableName = "image_embeddings")
77
data class ImageEmbeddingEntity(

core/src/main/java/com/fpf/smartscansdk/core/data/Classification.kt

Lines changed: 0 additions & 9 deletions
This file was deleted.

core/src/main/java/com/fpf/smartscansdk/core/data/Processors.kt

Lines changed: 0 additions & 20 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
package com.fpf.smartscansdk.ml.models.providers.embeddings
1+
package com.fpf.smartscansdk.core.embeddings
22

3-
import com.fpf.smartscansdk.core.data.ClassificationError
4-
import com.fpf.smartscansdk.core.data.ClassificationResult
5-
import com.fpf.smartscansdk.core.data.PrototypeEmbedding
6-
import com.fpf.smartscansdk.core.embeddings.getSimilarities
7-
import com.fpf.smartscansdk.core.embeddings.getTopN
3+
sealed class ClassificationResult {
4+
data class Success(val classId: String, val similarity: Float ): ClassificationResult()
5+
data class Failure(val error: ClassificationError ): ClassificationResult()
6+
}
87

8+
enum class ClassificationError{MINIMUM_CLASS_SIZE, THRESHOLD, CONFIDENCE_MARGIN}
99

10-
fun classify(embedding: FloatArray, classPrototypes: List<PrototypeEmbedding>, threshold: Float = 0.4f, confidenceMargin: Float = 0.05f ): ClassificationResult{
10+
fun fewShotClassify(embedding: FloatArray, classPrototypes: List<PrototypeEmbedding>, threshold: Float = 0.4f, confidenceMargin: Float = 0.05f ): ClassificationResult{
1111
if(classPrototypes.size < 2) return ClassificationResult.Failure(error= ClassificationError.MINIMUM_CLASS_SIZE) // Using a single class prototype leads to many false positives
1212

1313
// No threshold filter applied here to allow confidence check by comparing top 2 matches
@@ -24,6 +24,4 @@ fun classify(embedding: FloatArray, classPrototypes: List<PrototypeEmbedding>, t
2424

2525
val classId = classPrototypes[bestIndex].id
2626
return ClassificationResult.Success(classId=classId, similarity = bestSim)
27-
}
28-
29-
27+
}

core/src/main/java/com/fpf/smartscansdk/core/embeddings/EmbeddingUtils.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,7 @@ fun unflattenEmbeddings(flattened: FloatArray, embeddingDim: Int): List<FloatArr
5656
}
5757
return embeddings
5858
}
59+
60+
61+
62+

core/src/main/java/com/fpf/smartscansdk/core/data/Embedings.kt renamed to core/src/main/java/com/fpf/smartscansdk/core/embeddings/Embeddings.kt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
package com.fpf.smartscansdk.core.data
2-
1+
package com.fpf.smartscansdk.core.embeddings
32

43
// `Embedding` represents a raw vector for a single media item, with `id` corresponding to its `MediaStoreId`.
54
data class Embedding(
@@ -14,7 +13,3 @@ data class PrototypeEmbedding(
1413
val date: Long,
1514
val embeddings: FloatArray
1615
)
17-
18-
19-
20-

core/src/main/java/com/fpf/smartscansdk/core/embeddings/FileEmbeddingStore.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.fpf.smartscansdk.core.embeddings
22

33
import android.util.Log
4-
import com.fpf.smartscansdk.core.data.Embedding
54
import kotlinx.coroutines.Dispatchers
65
import kotlinx.coroutines.withContext
76
import java.io.File

core/src/main/java/com/fpf/smartscansdk/core/embeddings/IEmbeddingStore.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.fpf.smartscansdk.core.embeddings
22

3-
import com.fpf.smartscansdk.core.data.Embedding
4-
53
interface IEmbeddingStore {
64
val exists: Boolean
75
suspend fun add(newEmbeddings: List<Embedding>)

core/src/main/java/com/fpf/smartscansdk/core/indexers/ImageIndexer.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ package com.fpf.smartscansdk.core.indexers
33
import android.content.ContentUris
44
import android.content.Context
55
import android.provider.MediaStore
6-
import com.fpf.smartscansdk.core.data.Embedding
7-
import com.fpf.smartscansdk.core.data.ProcessOptions
6+
import com.fpf.smartscansdk.core.embeddings.Embedding
87
import com.fpf.smartscansdk.core.embeddings.IEmbeddingStore
98
import com.fpf.smartscansdk.core.embeddings.ImageEmbeddingProvider
109
import com.fpf.smartscansdk.core.media.getBitmapFromUri
1110
import com.fpf.smartscansdk.core.processors.BatchProcessor
1211
import com.fpf.smartscansdk.core.processors.IProcessorListener
12+
import com.fpf.smartscansdk.core.processors.MemoryOptions
1313
import kotlinx.coroutines.NonCancellable
1414
import kotlinx.coroutines.withContext
1515

@@ -24,8 +24,9 @@ class ImageIndexer(
2424
private val maxImageSize: Int = 225,
2525
context: Context,
2626
listener: IProcessorListener<Long, Embedding>? = null,
27-
options: ProcessOptions = ProcessOptions(),
28-
): BatchProcessor<Long, Embedding>(context, listener, options){
27+
memoryOptions: MemoryOptions = MemoryOptions(),
28+
batchSize: Int = 10,
29+
): BatchProcessor<Long, Embedding>(context, listener, memoryOptions, batchSize){
2930

3031
companion object {
3132
const val INDEX_FILENAME = "image_index.bin"

core/src/main/java/com/fpf/smartscansdk/core/indexers/VideoIndexer.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
package com.fpf.smartscansdk.core.indexers
22

3-
import android.app.Application
43
import android.content.ContentUris
54
import android.content.Context
65
import android.provider.MediaStore
7-
import com.fpf.smartscansdk.core.data.Embedding
8-
import com.fpf.smartscansdk.core.data.ProcessOptions
6+
import com.fpf.smartscansdk.core.embeddings.Embedding
97
import com.fpf.smartscansdk.core.embeddings.IEmbeddingStore
108
import com.fpf.smartscansdk.core.embeddings.ImageEmbeddingProvider
119
import com.fpf.smartscansdk.core.embeddings.generatePrototypeEmbedding
1210
import com.fpf.smartscansdk.core.processors.BatchProcessor
1311
import com.fpf.smartscansdk.core.media.extractFramesFromVideo
1412
import com.fpf.smartscansdk.core.processors.IProcessorListener
13+
import com.fpf.smartscansdk.core.processors.MemoryOptions
1514

1615
// ** Design Constraint**: For on-device vector search, the full index needs to be loaded in-memory (or make an Android native VectorDB)
1716
// File-based EmbeddingStore is used over a Room version due to significant faster index loading
@@ -26,9 +25,10 @@ class VideoIndexer(
2625
private val height: Int,
2726
context: Context,
2827
listener: IProcessorListener<Long, Embedding>? = null,
29-
options: ProcessOptions = ProcessOptions(),
28+
batchSize: Int = 10,
29+
memoryOptions: MemoryOptions = MemoryOptions(),
3030
private val store: IEmbeddingStore,
31-
): BatchProcessor<Long, Embedding>(context, listener, options){
31+
): BatchProcessor<Long, Embedding>(context, listener, memoryOptions, batchSize){
3232

3333
companion object {
3434
const val INDEX_FILENAME = "video_index.bin"

0 commit comments

Comments
 (0)