نحوه استقرار مدل یادگیری ماشینی (ML) در اندروید
در این مطلب، ما یاد خواهیم گرفت که چگونه میتوانید یک مسئله یادگیری ماشین را به یک برنامه اندروید تبدیل کنید.
گردش کار پروژه یادگیری ماشین در اندروید
هنگامی که یادگیری ماشین را در یک وب سایت توسعه میدهیم، گردش کار اصلی پیاده سازی مدل در هر IDE پایتون، استخراج آن با استفاده از یک ماژول pickle، و با کمک هر فریمورک flask یا استریم لیت برای استقرار در قالب برنامه وب است. در اینجا پیاده سازی کامل از frontend به backend با پایتون صورت میگیرد.
اکنون هنگام استقرار یادگیری ماشینی در اندروید، اندکی تغییر در گردش کار بالا وجود دارد. اول یک مدل اصلاح می کنیم. برای پیاده سازی برنامه های اندروید جاوا محبوب است. و کار با اندروید استودیو جاوا بیشتر ترجیح داده می شود، بنابراین در اینجا فرانت اند ما به جاوا بستگی دارد. و در بخش میانی باید یک Flask API را پیاده سازی کنیم که مدل یادگیری ماشین ما است که خروجی آن با فرمت JSON خواهد بود (JSON یک فرمت جهانی که هر زبان برنامه نویسی می تواند آن را درک کند) و از طریق برنامه android جاوا به API Flask میرسیم که پاسخ آن در JSON است و ما این JSON را تجزیه کرده و آن را در android frontend چاپ خواهیم کرد.
پیش نیاز پیاده سازی گردش کار ماشین یادگیری در اندروید
گردش کار بالا در حین خواندن کمی دشوار به نظر می رسد. در عین حال امیدوارم از طریق نمودار واضح باشد.
اولین چیزی که باید بدانید اصول اولیه flask است. برای آشنایی بیشتر این لینک را مطالعه کنید.
اگر اصول اندروید را بدانید خیلی خوب است. در غیر این صورت لطفا از این آموزش دیدن کنید تا با برنامه نویسی اندروید آشنا شوید.
اجرای عملی یادگیری ماشینی در اندروید
در اینجا هدف اصلی ما این است که یاد بگیریم چگونه از یادگیری ماشینی در اندروید استفاده کنیم. شما میتوانید یک مجموعه داده را در اینجا پیدا کنید. نمونه مجموعه داده مانند چارچوب داده زیر است.
ساخت یک مدل یادگیری ماشین
این قسمت سرراست است. ابتدا یک مجموعه داده را بارگذاری می کنیم.سپس با کمی پیش پردازش از یک الگوریتم جنگل تصادفی برای آموزش داده ها استفاده می کنیم و مدل را در قالب pickle ذخیره می کنیم.
import numpy as np import pandas as pd df = pd.read_csv('students_placement.csv') df.sample(5) X = df.drop(columns=['placed']) y = df['placed'] from sklearn.model_selection import train_test_split X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=2) #train the model from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score rf = RandomForestClassifier() rf.fit(X_train,y_train) y_pred = rf.predict(X_test) print(accuracy_score(y_test,y_pred)) #save the model in pickle format import pickle pickle.dump(knn,open('model.pkl','wb'))
ساخت Flask API
کاربر اطلاعاتی را در فرم وارد می کند. و هنگام ارسال فرم درخواست POST را دریافت می کند. و در هنگام ارسال درخواست، Flask API دادههای وارد شده توسط کاربر را میپذیرد و آن را به مدل یادگیری ماشینی ارسال میکند که کلاس خروجی را پیشبینی میکند. کلاس پیش بینی شده ای را که به صورت JSON به برنامه اندروید منتقل می کنیم.
from flask import Flask,request,jsonify import numpy as np import pickle model = pickle.load(open('model.pkl','rb')) app = Flask(__name__) @app.route('/') def index(): return "Hello world" @app.route('/predict',methods=['POST']) def predict(): cgpa = request.form.get('cgpa') iq = request.form.get('iq') profile_score = request.form.get('profile_score') input_query = np.array([[cgpa,iq,profile_score]]) result = model.predict(input_query)[0] return jsonify({'placement':str(result)}) if __name__ == '__main__': app.run(debug=True)
تست برنامه با استفاده از Postman
Postman یک ابزار خودکار و تعاملی است که برای تأیید APIهای پروژه شما استفاده می شود.این برنامه گوگل کروم است که با HTTP API متصل میشود.در باطن کار می کند و به شما امکان می دهد بررسی کنید که API شما مطابق با نیازهای ما به خوبی کار می کند. با فراهم کردن نشانی اینترنتی API و قرار دادن داده در بخش کلید شما میتوانید API را بزنید. و پاسخ مورد نظر را دریافت کنید.
با استفاده از این لینک می توانید Postman را دانلود و نصب کنید. پس از نصب، آن را باز کنید و URL برنامه Flask را وارد کنید. در بخش کلید و مقدار، نامی را وارد کنید که از طریق آن به مقداری که میخواهید ارائه کنید دسترسی پیدا میکنیم.
ایجاد اپلیکیشن اندروید
پروژه اندروید را نصب و راه اندازی کنید.
برای کار با برنامه نویسی اندروید ابتدا به اندروید استودیو نیاز دارید.
پس از نصب آن را راه اندازی کنید و گزینه ای از یک پروژه جدید خواهید داشت. روی پروژه جدید کلیک کنید و باید هر فعالیتی را انتخاب کنید. فعالیت خالی را انتخاب کنید و به قسمت بعدی بروید، جایی که باید نام و پوشه ذخیره سازی پروژه خود را تعریف کنید. برای هر گونه سوال در مورد انتخاب، به تصاویر زیر نگاه کنید.
پس از تغییر نام پروژه، بقیه موارد را به صورت پیش فرض نگه دارید و تیک finish را بزنید. از آنجایی که اندروید استودیو کمی کند است، بنابراین برای راه اندازی پروژه شما کمی زمان می برد، بنابراین لطفاً صبور باشید تا تمام فایل های پروژه را مطابق تصویر زیر تنظیم کند.
ایجاد رابط کاربری اندروید
می دانیم که UI همیشه در یک فایل XML ایجاد می شود. فایل XML با نام Activity main را باز کنید. و در اینجا یک رابط کاربری frontend کامل می سازیم. می توانید از قطعه کد زیر استفاده کنید. ابتدا عنوان پروژه، سه فیلد ورودی برای ستون های مربوطه، و یک دکمه برای ارسال و دریافت نتیجه داده ایم.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Student Placement Predictor" android:textSize="30dp" android:textAlignment="center" android:layout_marginTop="30dp"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="CGPA" android:id="@+id/cgpa" android:layout_marginTop="20dp" > <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="IQ" android:id="@+id/iq" android:layout_marginTop="20dp" <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="profile_score" android:id="@+id/profile_score" android:layout_marginTop="20dp" > <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Predict" android:layout_marginTop="30dp" android:id="@+id/predict"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="" android:textSize="50dp" android:textAlignment="center" android:layout_marginTop="80dp" android:id="@+id/result">
توضیح – ما از یک چیدمان خطی پروژه استفاده کردهایم. برای عنوان پروژه، از TextView استفاده میکنیم که برای نمایش هر متن استفاده میشود. ما میتوانیم آن را مثل HTML، CSS به این شکل تنظیم کنیم تا اندازه قلم، حاشیه، عرض، ارتفاع و غیره را تنظیم کنیم. بعد از آن برای حوزه ورودی در اندروید، ما از EditText استفاده میکنیم که در آن id را برای ستون مربوطه تنظیم کردیم. بعد از آن، ما از دکمه برای ارسال فرم و روی کلیک استفاده میکنیم، به دادههای فرم دسترسی خواهیم داشت. سرانجام برای نمایش نتایجی که از یک فلاسک بدستآمده دوباره از TextView استفاده میکنیم. در سطح ابتدایی، ما هیچ متنی را در نمایش متن نمایش نخواهیم داد، و پس از دریافت نتیجهای که در یک app web داریم، نمایش داده خواهد شد.
رابط کاربری خود را با استفاده از AVD اجرا کنید
AVD مخفف Android Virtual device است. که با استفاده از آن می توانید برنامه خود را در اندروید اجرا کنید. که ظاهری شبیه به تلفن همراه شما دارد. در گوشه سمت راست بالا به بخش AVD مراجعه کرده و pixel-5 را انتخاب کنید. Next را کلیک کنید و دستگاه مجازی که از طریق آن اجرا می شود را انتخاب کنید. می توانید Android-Q را دانلود کرده و روی Next کلیک کنید. پنجره ای برای نام گذاری یک دستگاه نمایش داده می شود و روی finish کلیک می کنید. در نهایت هنگامی که می توانید دستگاه شما آن را با استفاده از دکمه پخش اجرا کند و یک AVD راه اندازی می کند که در آن رابط کاربری شما اجرا می شود. پس از آن فایلی را که در آن کدگذاری کردیم را اجرا کنید و تغییرات را در AVD مشاهده کنید.
اتصال API به برنامه اندروید
اکنون باید آن را بنویسید که در جاوا کار می کند. منطقی که ما باید پیاده سازی کنیم این است که شما ورودی ها را از برنامه اندروید دریافت می کنید، API را ضربه می زنید و پاسخ را از صفحه نمایش API در برنامه اندروید برمی گردانید. بنابراین، یک مشکل وجود دارد که API که ما پیادهسازی کردهایم به صورت محلی روی سیستم شما اجرا میشود که برنامه اندروید نمیتواند آن را شناسایی کند. بنابراین ما باید API خود را به صورت آنلاین مستقر کنیم و از Heroku برای این کار استفاده خواهیم کرد.
API را در Heroku توسعه دهید
به Heroku وارد شوید و با دادن یک نام منحصر به فرد برنامه جدید ایجاد کنید. می توانید رابط کاربری گرافیکی خود را با استفاده از Heroku CLI یا GitHub توسعه دهید. شما به نیازمندی ها و مشخصات نیاز دارید. محتوای این فایل را می توانید از قطعه های زیر کپی کنید.
در فایل متنی نیازمندی ها، باید چهار کتابخانه زیر را نصب کنید.
flask
public class MainActivity extends AppCompatActivity { EditText cgpa,iq,profile_score; Button predict; TextView result; String url = "https://student-placement-app.herokuapp.com/predict"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); cgpa = findViewById(R.id.cgpa); iq = findViewById(R.id.iq); profile_score = findViewById(R.id.profile_score); predict = findViewById(R.id.predict); result = findViewById(R.id.result); predict.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // hit the API -> Volley StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener() { @Override public void onResponse(String response) { try { JSONObject jsonObject = new JSONObject(response); String data = jsonObject.getString("placement"); if(data.equals("1")){ result.setText("Placement Hoga"); }else{ result.setText("Placement Nahi Hoga"); } } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show(); } }){ @Override protected Map getParams(){ Map params = new HashMap(); params.put("cgpa",cgpa.getText().toString()); params.put("iq",iq.getText().toString()); params.put("profile_score",profile_score.getText().toString()); return params; } }; RequestQueue queue = Volley.newRequestQueue(MainActivity.this); queue.add(stringRequest); } }); } }
numpy
sklearn
gunicorn
Procfile تنها حاوی یک کد خطی برای مقداردهی اولیه برنامه وب است.
web: gunicorn app:app
پس از ایجاد فایل ها، با ایجاد یک مخزن جدید و اتصال آن به Heroku و استقرار یک پروژه در شعبه اصلی، در Github آپلود کنید. پس از آن، یک URL آنلاین دریافت خواهید کرد.
اگر نیاز دارید API خود را بررسی کنید، میتوانید این کار را با Postman با ارائه یک داده و URL برنامه Heroku انجام دهید.
API را به اینترنت وصل کنید
برای ضربه زدن به API ما به یک کتابخانه به نام volley نیاز داریم. بنابراین برای نصب volley در scripts Gradle در دایرکتوری پروژه خود، فایل Gradle را باز کنید و زیر یک خط کد بنویسید که کتابخانه مورد نیاز را نصب خواهد کرد. همانطور که در حال حاضر بر روی همگامسازی صحیح کلیک میکنید، نصب کتابخانههای مورد نیاز در دایرکتوری پروژه را آغاز خواهد کرد.
اکنون برای زدن API که در Heroku است، برای باز کردن فایل Manifest و گنجاندن خط کد زیر به مجوز اینترنت نیز نیاز دارید.
اکنون باید آخرین بیت کد را در جایی که از Volley برای ضربه زدن به API خود استفاده می کنیم، قرار دهیم. ابتدا باید یک شی درخواست رشته ایجاد کنید و یک درخواست POST در URL Heroku تعریف کنید.
منطق را در جاوا بنویسید
ما رابط کاربری خود را طراحی کردهایم، اکنون باید منطق را بنویسیم تا دادهها را از فرانتاند در یک فایل جاوا بپذیریم. جریان جایی است که ما باید هر سه مقدار را از برنامه اندروید بپذیریم و وقتی روی دکمه پیش بینی کلیک می کند باید API را زده و پاسخ JSON را مجدداً بازیابی کنیم. با نگه داشتن تمام importها به همان شکلی که هست، می توانید کد زیر را از کلاس در فایل java Activity اصلی دنبال کنید.
public class MainActivity extends AppCompatActivity { EditText cgpa,iq,profile_score; Button predict; TextView result; String url = "https://student-placement-app.herokuapp.com/predict"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); cgpa = findViewById(R.id.cgpa); iq = findViewById(R.id.iq); profile_score = findViewById(R.id.profile_score); predict = findViewById(R.id.predict); result = findViewById(R.id.result); predict.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // hit the API -> Volley StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener() { @Override public void onResponse(String response) { try { JSONObject jsonObject = new JSONObject(response); String data = jsonObject.getString("placement"); if(data.equals("1")){ result.setText("Placement Hoga"); }else{ result.setText("Placement Nahi Hoga"); } } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show(); } }){ @Override protected Map getParams(){ Map params = new HashMap(); params.put("cgpa",cgpa.getText().toString()); params.put("iq",iq.getText().toString()); params.put("profile_score",profile_score.getText().toString()); return params; } }; RequestQueue queue = Volley.newRequestQueue(MainActivity.this); queue.add(stringRequest); } }); } }
توضیح – اول ما متغیرهایی را برای قبول ارزشها ایجاد میکنیم. برای ردیابی دکمه کلیک شده، ما به یک رویداد Listener نیاز داریم. بنابراین از یک شنونده ماهر استفاده میکنیم. در روی تابع کلیک، یک شی درخواست رشتهای را ایجاد کردیم تا درخواست پس پردازش را بر روی نشانی اینترنتی Heroku ایجاد کنیم.
ما همچنین باید دو چیز را فراهم کنیم، که در بین آنها اول شنونده است که وقتی API را به درستی زدیم، احضار میشود. بعد از آن ما یک شنونده دیگر ایجاد کردیم وقتی که خطایی در طرف API مانند کارگزار، اتصال و غیره وجود دارد. بعد از آن، ما یک hashmap برای تجزیه تمام پارامترها ایجاد کردیم. کلید و ارزش هر دو به شکل یک رشته هستند. سرانجام، ما یک صف درخواست برای اجرا کد بالا ایجاد کردیم. اگر همه چیز درست باشد، در اولین شنونده، در پاسخ، ما از هدف JSON عبور کرده و نتیجه پیشبینیشده را قبول میکنیم.
حالا اگر برنامه خود را روی AVD اجرا کنید، در اندروید به خوبی اجرا می شود.
دیدگاهتان را بنویسید