Saltar al contenido

¿Cómo reducir el tamaño del modelo Tflite o descargarlo y configurarlo mediante programación?

No olvides que en las ciencias cualquier problema suele tener más de una resoluciones, de igual modo nosotros te mostramos lo más óptimo y eficiente.

Bueno, no puedo pensar en ninguna solución para reducir el tamaño de su archivo de modelo, pero al observar su clase, puedo decir que, después de todo, está devolviendo un búfer de bytes mapeado de la secuencia de entrada de su archivo, así que para obtener el archivo del almacenamiento, simplemente coloque su archivo en facenet en el almacenamiento externo y luego obtenga un bytebuffer mapeado en el flujo de entrada de su archivo aquí hay una solución en kotlin.

class FaceNetStorage @Throws(IOException::class)
constructor() 
    private val intValues = IntArray(IMAGE_HEIGHT * IMAGE_WIDTH)
    private var imgData: ByteBuffer? = null

    private var tfliteModel: MappedByteBuffer? = null
    private var tflite: Interpreter? = null
    private val tfliteOptions = Interpreter.Options()

    init 
        val str = Environment.getExternalStorageDirectory().toString()+"/Facenet"
        val sd_main = File(str)
        var success = true
        if (!sd_main.exists()) 
            success = sd_main.mkdir()
        
        if (success) 
            val sd = File(str+"/"+MODEL_PATH)
            tfliteModel = loadModelFile(sd)
            tflite = Interpreter(tfliteModel!!, tfliteOptions)
            imgData = ByteBuffer.allocateDirect(
                    BATCH_SIZE
                            * IMAGE_HEIGHT
                            * IMAGE_WIDTH
                            * NUM_CHANNELS
                            * NUM_BYTES_PER_CHANNEL)
            imgData!!.order(ByteOrder.nativeOrder())
        
    

    @Throws(IOException::class)
    private fun loadModelFile(file: File): MappedByteBuffer 
        val inputStream = FileInputStream(file)
        val fileChannel = inputStream.channel
        return fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel.size())
    

    private fun convertBitmapToByteBuffer(bitmap: Bitmap) 
        if (imgData == null) 
            return
        
        imgData!!.rewind()
        bitmap.getPixels(intValues, 0, bitmap.width, 0, 0, bitmap.width, bitmap.height)
        // Convert the image to floating point.
        var pixel = 0
        for (i in 0 until IMAGE_HEIGHT) 
            for (j in 0 until IMAGE_WIDTH) 
                val `val` = intValues[pixel++]
                addPixelValue(`val`)
            
        
    

    private fun addPixelValue(pixelValue: Int) 
        imgData!!.putFloat((pixelValue shr 16 and 0xFF) / 255.0f)
        imgData!!.putFloat((pixelValue shr 8 and 0xFF) / 255.0f)
        imgData!!.putFloat((pixelValue and 0xFF) / 255.0f)
    

    fun inspectModel() 
        val tag = "Model Inspection"
        Log.i(tag, "Number of input tensors: " + tflite!!.inputTensorCount.toString())
        Log.i(tag, "Number of output tensors: " + tflite!!.outputTensorCount.toString())

        Log.i(tag, tflite!!.getInputTensor(0).toString())
        Log.i(tag, "Input tensor data type: " + tflite!!.getInputTensor(0).dataType())
        Log.i(tag, "Input tensor shape: " + Arrays.toString(tflite!!.getInputTensor(0).shape()))
        Log.i(tag, "Output tensor 0 shape: " + Arrays.toString(tflite!!.getOutputTensor(0).shape()))
    

    private fun resizedBitmap(bitmap: Bitmap, height: Int, width: Int): Bitmap 
        return Bitmap.createScaledBitmap(bitmap, width, height, true)
    

    private fun croppedBitmap(bitmap: Bitmap, upperCornerX: Int, upperCornerY: Int, height: Int, width: Int): Bitmap 
        return Bitmap.createBitmap(bitmap, upperCornerX, upperCornerY, width, height)
    

    private fun run(bitmap: Bitmap): Array 
        var bitmap = bitmap
        bitmap = resizedBitmap(bitmap, IMAGE_HEIGHT, IMAGE_WIDTH)
        convertBitmapToByteBuffer(bitmap)

        val embeddings = Array(1)  FloatArray(512) 
        tflite!!.run(imgData, embeddings)

        return embeddings
    

    fun getSimilarityScore(face1: Bitmap, face2: Bitmap): Double 
        val face1_embedding = run(face1)
        val face2_embedding = run(face2)

        var distance = 0.0
        for (i in 0 until EMBEDDING_SIZE) 
            distance += ((face1_embedding[0][i] - face2_embedding[0][i]) * (face1_embedding[0][i] - face2_embedding[0][i])).toDouble()
        
        distance = Math.sqrt(distance)

        return distance
    

    fun close() 
        if (tflite != null) 
            tflite!!.close()
            tflite = null
        
        tfliteModel = null
    

    companion object 
        private val MODEL_PATH = "facenet.tflite"

        private val IMAGE_MEAN = 127.5f
        private val IMAGE_STD = 127.5f

        private val BATCH_SIZE = 1
        private val IMAGE_HEIGHT = 160
        private val IMAGE_WIDTH = 160
        private val NUM_CHANNELS = 3
        private val NUM_BYTES_PER_CHANNEL = 4
        private val EMBEDDING_SIZE = 512
    


Tienes la opción de añadir valor a nuestra información añadiendo tu veteranía en las críticas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *