التعرف على الاشياء في الاندرويد image labeliing من مكتبة ML kit

بشعار ان قالوا لك لن تصل اجعل  في الاذنين اصابعك 😂😂
هذا الدرس الثاني من سلسلة دروس شرح مكتبة ML Kit حسنا لم اكن اعلم ان الامر بهذه السهولة الامر فهي ابسط  من التعامل مع كل المكتبات الاخرى على الفايربيز و اليوم هو يوم الحديث عن  خاصية التعرف على الاشياء بالمعالجة على الهاتف يستطيع هاتفك المحمول التعرف على ازيد من 400 شيء كالاشخاص حيوان نبات الملامح الاماكن و غيرها و يمكنك ايجاد تفاصيل اكثر من الموقع الرسمي .
التعلم الالي على الاندرويد خاصية image labeliing من مكتبة ML kit

الصفر  : المشروع موجود على github .
اولا :اضافة الخاصية الى مشروعك ←
  1-يجب عليك ربط  التطبيق بالفايربيز .
   2-اضف الكود التالي الى ملف build.gradle ↓
implementation 'com.google.firebase:firebase-ml-vision:15.0.0'
     3-نقوم باضافة الكود التالي الى ملف Manifest
<meta-data android:name="com.google.firebase.ml.vision.DEPENDENCIES" android:value="label"/>
  دور هذا الكود هو تحميل الملفات التي يحتاجها تطبيقك اثناء التنصيب كي لا تحدث معك اي مشكلة .اما ان لم تضفه فلا مشكلة فسيتم تحميل الملفات المرغوب فيها عند اول تشغيل لتطبيقك على هاتف المستخدم لكن لا ينصح بهذا .
4-اضف الكود التالي الى ملف manifest ان كنت ستستخدم الكاميرا↓

<manifest //..>
//...
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />

</manifest>
وفي حال واجهة مشكلة اضف الكود التالي الى ملف build.gradle ↓
 build.gradle -> Project

    repositories {
        //...
        maven { url 'https://jitpack.io' }
    }

ثانيا : الواجهة ←
لدينا واجهة بسيطة و يمكنك القول انها غبية
نتائج استعمال مكتبة Ml kit Image Labeling نتائج استعمال مكتبة Ml kit Image Labeling

حسنا هذه هي الواجهة اذن و الكود سيكون على الشكل التالي :

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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"
    android:background="#efefef">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

    </android.support.design.widget.AppBarLayout>

    <io.fotoapparat.view.CameraView
        android:id="@+id/camera_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <!-- Adding bottom sheet after main content -->
    <include layout="@layout/bottom_sheet" />
    <android.support.design.widget.FloatingActionButton
        android:id="@+id/takePic"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_anchor="@+id/bottom_sheet"
        app:srcCompat="@drawable/ic_camera"
        android:layout_margin="10dp"
        app:fabSize="normal"
        app:layout_anchorGravity="top|start" />
    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fromDevice"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_anchor="@+id/bottom_sheet"
        app:srcCompat="@drawable/ic_upload"
        android:layout_margin="10dp"
        app:fabSize="normal"
        app:layout_anchorGravity="top|center" />

</android.support.design.widget.CoordinatorLayout>
ثم ملف xml اخر لل bottomsheet .

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/bottom_sheet"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="100dp"
    android:background="#fff"
    android:orientation="vertical"
    app:behavior_hideable="false"
    app:behavior_peekHeight="56dp"
    app:layout_behavior="android.support.design.widget.BottomSheetBehavior">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="دعني احزر هذه الصورة بها"
        android:textColor="#444"
        android:textSize="18dp"
        android:textStyle="bold" />

    <LinearLayout
        android:id="@+id/itemsList"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

    </LinearLayout>


</LinearLayout>

ثالثا : الحصول على labels ←
الان الى الكود :
1-بما ان api الكاميرا في الاندرويد كانه برمج في اخر الشارع لذا فانا ساستعمل هذه المكتبة fotoapparat .
2- اضافة كود اخد الاذن للوصول للكاميرا اليك الطريقة .
3-الان يمكنك الموت بسلام او اضافة الكود :
class Mlearing:AppCompatActivity(){
 lateinit var sheetBehavior:BottomSheetBehavior
 override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.image_labeling)
  //الواجهة
  setSupportActionBar(toolbar)
  sheetBehavior = BottomSheetBehavior.from(bottom_sheet)
  //الكاميرا
  val fotoapparat = Fotoapparat(context = this, view = camera_view)
  fotoapparat.start()
  //اخد صورة
  takePic.setOnClickListener {
   val photoResult =fotoapparat.takePicture()
   photoResult
     .toBitmap()
     .whenAvailable { bitmapPhoto ->
      getLabelsFromDevice(bitmapPhoto!!.bitmap)
     }
  }
  //اخد الصورة من الهاتف
  fromDevice.setOnClickListener {
   val photoPickerIntent = Intent(Intent.ACTION_GET_CONTENT)
   photoPickerIntent.type = "image/*"
   startActivityForResult(photoPickerIntent, 1)
  }
 }

 private fun getLabelsFromDevice(bitmap: Bitmap) {
  val image : FirebaseVisionImage = FirebaseVisionImage.fromBitmap(bitmap)
  val detector : FirebaseVisionLabelDetector = FirebaseVision.getInstance().visionLabelDetector
  detector.detectInImage(image)
    .addOnSuccessListener {
     // انتهى بنجاح
     itemsList.removeAllViews()
     for(firebaseVision : FirebaseVisionLabel in it){
      // اخد اسم الشى مع نسبة الثقة
      val item=TextView(this)
      item.text="${firebaseVision.label} : ${firebaseVision.confidence}"
      when{
       firebaseVision.confidence in 0.4..0.7->{item.setTextColor(Color.BLUE)}
       firebaseVision.confidence >= .7->{item.setTextColor(Color.GREEN)}
       firebaseVision.confidence <= 0.4->{item.setTextColor(Color.RED)}
      }
      itemsList.addView(item)
     }
    }
    .addOnFailureListener {
     // خطا ما وقع
     Toast.makeText(baseContext,"Sorry, something went wrong!",Toast.LENGTH_SHORT).show()
    }
 }

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
  super.onActivityResult(requestCode, resultCode, data)
  if (resultCode == RESULT_OK) {
   val chosenImageUri = data.data

   val mBitmap= MediaStore.Images.Media.getBitmap(this.contentResolver, chosenImageUri)
   getLabelsFromDevice(mBitmap)
  }
 }
}
وهنا نصل الى النهاية و ان شاء الله سيتم تحديث الموضوع مستقبلا بالنسبة للكلاود الى ذلكم الحين تابعونا على فايسبوك
المصادر :
هل ترغب في مثل هذه التدوينات

اسماعيل ايت بلا

ببساطة ارغب في تجربة جديدة من التعلم من خلال مشاركة ما تعلمه يجبرني ذلك على البحث لمدة طويلة مما يجعل الموقع جديرا بالثقة

اترك لنا تعليقا

الاشتراك بالقائمة البريدية

توصل باحدث مواضيعنا و كن على اطلاع باخر اخبار وتقنيات الاندرويد