টেনসরফ্লো মডেলকে CoreML এ কনভার্ট করে iOS অ্যাপে ব্যবহার

মেশিন লার্নিং মডেলকে আমরা যদি iOS অ্যাপে ব্যবহার করতে চাই, তাহলে সবচেয়ে উত্তম পদ্ধতি হচ্ছে প্রথমে ঐ মডেলকে CoreML মডেলে কনভার্ট করে নেওয়া। কোরএমএল মডেলে কনভার্ট করার জন্য এপলের Core ML Tools রয়েছে। যা ব্যবহার করে আমরা আমাদের মডেলকে CoreML মডেলে কনভার্ট করে অ্যাপে সরাসরি ব্যবহার করতে পারব।

সাধারণত মেশিন লার্নিং মডেল গুলো সার্ভারে রান হয়। আমরা মোবাইল থেকে এপিআই এর মাধ্যমে মডেল ব্যবহার করি। অন-ডিভাইসে মডেল রান করার জন্যই হচ্ছে CoreML। অনলাইনে বিভিন্ন বিষয়ের উপর প্রচুর ওপেনসোর্স মডেল পাওয়া যায়। যেগুলো আমরা চাইলে প্রয়োজন মত ব্যবহার করতে পারি। অ্যাপে যদি মডেল ইন্ট্রিগ্রেট করতে চাই, তাহলে CoreML এ কনভার্ট করে নিতে হবে মডেল গুলো।

আমি এখানে খুব সিম্পল লিনিয়ার রিগ্রেশন মডেল ব্যবহার করব। যেন মূল কনসেফট সহজে বুঝতে পারেন। এখানে যে মডেলটি ব্যবহার করব, তা টেনসরফ্লো ব্যবহার করে নিউরাল নেটওয়ার্ক ট্রেনিং এবং প্রিডিকশন লেখাটিতে বিস্তারিত বর্ণনা করা আছে। এই যে, এই সিম্পল মডেল ব্যবহার করবঃ

import tensorflow as tf 
from tensorflow import keras
from keras import layers, models
import numpy as np
  
# training data
celsius = np.array([-40, -10, 0, 8, 15, 22, 38], dtype=float)
fahrenheit = np.array([-40, 14, 32, 46.4, 59, 71.6, 100.4], dtype=float)
  
# model creation
model = keras.Sequential([
layers.Dense(units=1, input_shape=[1])
])
  
# model compilation
model.compile(loss='mean_squared_error',
optimizer=tf.keras.optimizers.Adam(0.1))
# model training
model.fit(celsius, fahrenheit, epochs=500, verbose=False)
print("Finished training the model")
  
# predict
print(model.predict(np.array([100.0])))

এখানে সেলসিয়াস থেকে ফারেনহাইট ভ্যালু প্রিডিক্ট করার একটা মডেল তৈরি করেছি। এই মডেলটি আমরা CoreML এ কনভার্ট করব এবং এরপর একটা সিম্পল iOS অ্যাপ তৈরি করব। যেখানে সেলসিয়াস ইনপুট দিলে আউটপুট হিসেবে প্রিডিক্টেড ফারেনহাইট ভ্যালু দিবে।

CoreML Tools এ টেনসরসফ্লো এর লেটেস্ট ভার্সন গুলো সাপোর্ট করে না। তাই আমরা পূর্বের একটা ভার্সন ব্যবহার করব। আর প্রোগ্রাম লিখব গুগল কোল্যাবে।

# Install necessary libraries
!pip install tensorflow==2.10.0
!pip install coremltools==7.0b1  
import tensorflow as tf 
from tensorflow import keras
from keras import layers, models
import numpy as np

# training data 
celsius    = np.array([-40, -10,  0,  8, 15, 22,  38],  dtype=float)
fahrenheit = np.array([-40,  14, 32, 46.4, 59, 71.6, 100.4],  dtype=float)
 

# Build a simple model using TensorFlow (Sequential API)
model = tf.keras.Sequential([
    tf.keras.layers.Dense(units=1, input_shape=[1])  
])

# Compile the model
model.compile(optimizer=tf.optimizers.Adam(learning_rate=0.1), loss='mean_squared_error')

# Train the model
history = model.fit(celsius, fahrenheit, epochs=50, verbose=0)

# Test the model on a value
print(model.predict(np.array([100])))

মডেল এরপর আমরা সেভ করবঃ

# Save the trained model
model.save('celsius_to_fahrenheit.h5')

এবার আমরা সেভ করা মডেল CoreML মডেলে কনভার্ট করবঃ

import coremltools as ct
import tensorflow as tf

# Load the TensorFlow model (Keras Sequential model)
loaded_model = tf.keras.models.load_model('celsius_to_fahrenheit.h5')

# Convert the model to Core ML format using the correct input placeholder
coreml_model = ct.convert(
    loaded_model,
    source="tensorflow",
    inputs=[ct.TensorType(shape=(1, 1), name="dense_input")]
)

# Save the Core ML model
coreml_model.save('CelsiusToFahrenheit.mlmodel')

উপরে আমরা প্রথমে একটা মডেল তৈরি করে এরপর CoreML মডেলে কনভার্ট করেছি। একই ভাবে আমরা অন্য যে কোন মডেল কোরএমএল এ কনভার্ট করতে পারব।

কোল্যাবের ফোল্ডার আইকনে ক্লিক করলে প্রজেক্টের ফাইল গুলো দেখা যাবে। এখানে CelsiusToFahrenheit.mlmodel মডেল সেভ হবে। রাইট ক্লিক করে ডাউনলোড করে নেওয়া যাবে। এরপর এই মডেল আমাদের প্রজেক্টে কপি করব। গুগল কোল্যাবে উপরের প্রজেক্ট পাওয়া যাবে।

আইওএস পার্টঃ

মডেল এক্সকোডে ওপেন করে প্রিডিকশন ট্যাব থেকে এর ইনপুট এবং আউটপুট ভ্যারিয়েবল দেখা যাবে। এই ভ্যারিয়েবল গুলো গুরুত্বপূর্ণ। এই নাম গুলো ব্যবহার করেই আমরা মডেল ব্যবহার করব।

সিম্পল একটা ইউআই তৈরি করব, যেখানে ইনপুট হিসেবে সেলসিয়াস ভ্যালু নিব। একটা বাটন থাকবে। আর রেজাল্ট একটা টেক্সট ভিউতে দেখাবো। সম্পূর্ণ প্রোগ্রামঃ

import SwiftUI
import CoreML

struct ContentView: View {
    @State private var celsius: String = ""
    @State private var fahrenheit: String = "Fahrenheit value will appear here"

    var body: some View {
        VStack {
            TextField("Enter Celsius", text: $celsius)
                .keyboardType(.decimalPad)
                .padding()
                .textFieldStyle(RoundedBorderTextFieldStyle())

            Button("Get Fahrenheit value ") {
                if let celciusValue = Double(celsius) {
                    fahrenheit = infarFahrenheit(celsius: celciusValue)
                }
       
            }
            .padding()

            Text(fahrenheit)
                .padding()
        }
        .padding()
    }

 
    // Function to use the Core ML model to convert Celsius to Fahrenheit
    func infarFahrenheit(celsius: Double) -> String {
        do {
            let model = try CelsiusToFahrenheit(configuration: MLModelConfiguration())
            
            // Create an MLMultiArray to hold the input
            let inputArray = try MLMultiArray(shape: [1, 1], dataType: .float32)
            inputArray[0] = NSNumber(value: celsius) // Set the value

            // Prepare the input for the model
            let input = CelsiusToFahrenheitInput(dense_input: inputArray)
            
            // Get the prediction from the model
            let output = try model.prediction(input: input)
            
            // Check the output properties
            // Use the actual name found in Xcode (e.g., `Identity`)
            let fahrenheit = output.Identity[0].floatValue // Adjust this to the correct property name

            return "\(fahrenheit) °F"
        } catch {
            return "Error converting temperature."
        }
    }
}
#Preview{
    ContentView()
}

অ্যাপ রান করলে আমরা যে কোন সেলসিয়াস ভ্যালু দিলে তার ফারেনহাইট ভ্যালু কত হতে পারে, তা প্রিডিক্ট করে দিবে। কনগ্রেটস। ডীপ লার্নিং ব্যবহার করে একটা অ্যাপ তৈরি করতে ফেরেছেন। দারুণ না?

আর্টিফিশিয়াল ইন্টিলিজেন্স এবং মেশিন লার্নিং নিয়ে এই ওয়েব সাইটে বেশ কিছু লেখা রয়েছে। উপরের প্রজেক্ট পাওয়া যাবে গিটহাবে। iOS + Python দুইটাই আপলোড করে দিয়েছি।

Leave a Reply