@@ -35,6 +35,31 @@ class OpenVinoEngine(
3535 private const val CONF_THRESHOLD = 0.35f
3636 private const val IOU_THRESHOLD = 0.45f
3737 private const val MAX_DETECTIONS = 300
38+
39+ fun getOptimalModelPath (context : Context ): String {
40+ // val forcedModel = System.getProperty("YOLO_MODEL_NUMBER")
41+ val forcedModel = " 10"
42+ return when (forcedModel) {
43+ " 26" -> " models/yolo26n_openvino_model/yolo26n.xml"
44+ " 10" -> " models/yolov10n_openvino_model/yolov10n.xml"
45+ else -> {
46+ val coreCount = Runtime .getRuntime().availableProcessors()
47+ val totalRam = getTotalRamMB(context)
48+ if (coreCount >= 4 && totalRam >= 2048 ) {
49+ " models/yolo26n_openvino_model/yolo26n.xml"
50+ } else {
51+ " models/yolov10n_openvino_model/yolov10n.xml"
52+ }
53+ }
54+ }
55+ }
56+
57+ private fun getTotalRamMB (context1 : Context ): Long {
58+ val activityManager = context1.getSystemService(Context .ACTIVITY_SERVICE ) as ActivityManager
59+ val memInfo = ActivityManager .MemoryInfo ()
60+ activityManager.getMemoryInfo(memInfo)
61+ return memInfo.totalMem / (1024 * 1024 )
62+ }
3863 }
3964
4065 private var core: Core ? = null
@@ -123,25 +148,6 @@ class OpenVinoEngine(
123148 }
124149 }
125150
126- @Suppress(" UnusedPrivateMember" )
127- private fun getOptimalModelPath (): String {
128- val coreCount = Runtime .getRuntime().availableProcessors()
129- val totalRam = getTotalRamMB()
130-
131- return if (coreCount >= 4 && totalRam >= 2048 ) {
132- " models/yolo26n_openvino_model/yolo26n.xml"
133- } else {
134- " models/yolov10n_openvino_model/yolov10n.xml"
135- }
136- }
137-
138- private fun getTotalRamMB (): Long {
139- val activityManager = context.getSystemService(Context .ACTIVITY_SERVICE ) as ActivityManager
140- val memInfo = ActivityManager .MemoryInfo ()
141- activityManager.getMemoryInfo(memInfo)
142- return memInfo.totalMem / (1024 * 1024 )
143- }
144-
145151 private fun loadClassNames (): List <String > =
146152 try {
147153 val names = mutableListOf<String >()
@@ -349,17 +355,34 @@ class OpenVinoEngine(
349355 }
350356
351357 private fun resolveModelXmlPath (): String? {
358+ // Если путь задан явно и существует — сразу возвращаем
359+ if (modelXmlPath.isNotBlank()) {
360+ return if (File (modelXmlPath).exists()) {
361+ modelXmlPath
362+ } else {
363+ // Пробуем скопировать из assets
364+ val relativePath = modelXmlPath.substringAfter(" files/" )
365+ val targetFile = File (context.filesDir, relativePath)
366+ val assetDir = relativePath.substringBeforeLast(" /" )
367+
368+ if (copyAssetDirectory(assetDir, targetFile.parentFile ? : context.filesDir)) {
369+ targetFile.absolutePath
370+ } else {
371+ Log .e(TAG , " Custom model not found and cannot be copied: $modelXmlPath " )
372+ null
373+ }
374+ }
375+ }
376+
377+ // Дефолт — yolo26n
352378 val modelDir = File (context.filesDir, DEFAULT_MODEL_ASSET_DIR )
353379 val modelXml = File (modelDir, DEFAULT_MODEL_XML )
354380
355- return when {
356- modelXmlPath.isNotBlank() -> modelXmlPath
357- modelXml.exists() -> modelXml.absolutePath
358- copyAssetDirectory(DEFAULT_MODEL_ASSET_DIR , modelDir) -> modelXml.absolutePath
359- else -> {
360- Log .e(TAG , " Bundled model assets are missing: $DEFAULT_MODEL_ASSET_DIR " )
361- null
362- }
381+ return if (modelXml.exists() || copyAssetDirectory(DEFAULT_MODEL_ASSET_DIR , modelDir)) {
382+ modelXml.absolutePath
383+ } else {
384+ Log .e(TAG , " Bundled model assets are missing: $DEFAULT_MODEL_ASSET_DIR " )
385+ null
363386 }
364387 }
365388
0 commit comments