اذهب إلى المحتوى
  • 0

كيفية إضافة ميزة البحث بواسطة الصور في تطبيق Laravel باستخدام Google Cloud Vision API أو Amazon Rekognition

تجربة تجربة

السؤال

هناك في مواقع التسوق الاكتروني ك امازون مثلا او كالموقع الشهير  pinterest  ميزة البحث بواسطة صورة حيث ان المستخدم يقوم بوضع صورة والموقع يبحث عن الصورة المتشابهة ويعرضها له

بحثت كثيرا حيث ظهر لي ان الادوات المستخدمة لذلك هي Google Cloud Vision API او Amazon Rekognition حيث انهم يقومون بتحليل الصورة وتخزين بياناتها في قاعدة البيانات

الى الان كل شيء ممتاز

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

مع العلم انني استخدم php laravel

ارجو الافادة وشكرا جزيلا لكم

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

في البداية ستحتاج بالطبع إلى إنشاء حساب مطور على Google Cloud Vision API أو 

Amazon Rekognition.

ثم ضبط إعدادات متغيرات البيئة في المشروع في ملف .env وأهما مفاتيح الـ API، عليك إضافة إعدادات Google Cloud Vision API أو Amazon Rekognition فقط، وإليك كلاهما:

GOOGLE_CLOUD_VISION_API_KEY=google_api_key
AWS_ACCESS_KEY_ID=aws_access_key
AWS_SECRET_ACCESS_KEY=aws_secret_key
AWS_REGION=aws_region

ثم أنشئ نموذج وقاعدة بيانات لتخزين بيانات الصور:

php artisan make:model Image -m

في ملف التهجير:

Schema::create('images', function (Blueprint $table) {
    $table->id();
    $table->string('image_path');
    $table->json('features'); // لتخزين بيانات الميزات (features)
    $table->timestamps();
});

أيضًا اعتمد على مكتبة مثل intervention/image لمعالجة الصور وضغط حجمها قبل إرسالها.

ثم استخدام مكتبة google/cloud-vision أو aws/aws-sdk-php للتواصل مع المنصة.

وإليك مثال لكلاهما اختر ما تريد:

// ImageController.php
use Illuminate\Http\Request;
use Intervention\Image\Facades\Image;
use Google\Cloud\Vision\V1\ImageAnnotatorClient; // or Aws\Rekognition\RekognitionClient;

public function uploadImage(Request $request)
{
    $image = $request->file('image');
    // Process and resize the image
    $image->resize(300, 300);
    // Analyze the image using Google Cloud Vision API or Amazon Rekognition
    $visionClient = new ImageAnnotatorClient(); // or $rekognitionClient = new RekognitionClient();
    $response = $visionClient->annotateImage(file_get_contents($image->getPathname()), ['LABEL_DETECTION']); // or $rekognitionClient->detectLabels(['Image' => ['Bytes' => file_get_contents($image->getPathname())]]);
    $features = $response->getLabelAnnotations(); // or $response->getLabels();
    // Store the features in the database
    $imageFeatures = new ImageFeatures();
    $imageFeatures->features = json_encode($features);
    $imageFeatures->save();
    return response()->json(['message' => 'Image uploaded and analyzed successfully']);
}

بعد ذلك اعتمد على مكتبة doctrine/dbal للتفاعل مع قاعدة البيانات، حيث تتوفر cosine similarity أو Euclidean distance لقياس التشابه بين ميزات الصور.

use App\ImageFeatures;
use Illuminate\Http\Request;

public function searchByImage(Request $request)
{
    $searchImage = $request->file('image');
    $searchFeatures = $this->analyzeImage($searchImage);
    
    // Query the database to find similar images
    $similarImages = ImageFeatures::all()->filter(function ($imageFeature) use ($searchFeatures) {
        $storedFeatures = json_decode($imageFeature->features, true);
        return $this->cosineSimilarity($searchFeatures, $storedFeatures) > 0.5;
    });

    return response()->json(['similar_images' => $similarImages]);
}

private function analyzeImage($image)
{
    // هنا يجب أن تضع الكود الخاص بتحليل الصورة والحصول على الميزات
    // سأضع مثال بسيط لتحليل الصورة
    return [/* array of features */];
}

private function cosineSimilarity($features1, $features2)
{
    $dotProduct = 0;
    $magnitude1 = 0;
    $magnitude2 = 0;
    foreach ($features1 as $index => $feature1) {
        $dotProduct += $feature1 * $features2[$index];
        $magnitude1 += $feature1 * $feature1;
        $magnitude2 += $features2[$index] * $features2[$index];
    }
    $magnitude1 = sqrt($magnitude1);
    $magnitude2 = sqrt($magnitude2);

    if ($magnitude1 * $magnitude2 == 0) {
        return 0;
    }

    return $dotProduct / ($magnitude1 * $magnitude2);
}

لتحسين الأداء، باستطاعتك استخدام تقنيات مثل الفهرسة المكانية أو مكتبات متخصصة في البحث عن الصور مثل Elasticsearch.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...