Распознавание изображений в Laravel без использования сторонней библиотеки или API может быть довольно сложной задачей, поскольку для этого требуются знания в области компьютерного зрения и машинного обучения. Однако можно реализовать базовое распознавание изображений с помощью некоторых встроенных функций и библиотек PHP.

В этой статье мы обсудим основные этапы создания системы распознавания изображений в Laravel. Ну, я бы попытался охватить это за 3 основных шага.

  1. Предварительная обработка изображения
  2. Извлечение признаков
  3. Интеграция с Laravel

Шаг 1. Предварительная обработка изображения

Первым шагом в распознавании изображений является предварительная обработка изображений для извлечения их характеристик. Для этого мы будем использовать встроенную в PHP библиотеку GD. Библиотека GD предоставляет функции для обработки изображений, такие как изменение размера, обрезка и фильтрация.

Чтобы изменить размер изображения, мы можем использовать функцию imagecopyresampled:

// Load the image
$image = imagecreatefromjpeg('image.jpg');
 // Get the original dimensions
$width = imagesx($image);
$height = imagesy($image);
 // Calculate the new dimensions
$newWidth = 100;
$newHeight = $height * ($newWidth / $width);
// Create a new image with the new dimensions
$newImage = imagecreatetruecolor($newWidth, $newHeight);
// Copy and resize the original image to the new image
imagecopyresampled($newImage, $image, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
// Save the new image
imagejpeg($newImage, 'resized-image.jpg');

Точно так же мы можем использовать другие функции для обрезки, фильтрации и обработки изображений по мере необходимости.

Шаг 2. Извлечение функций

Следующим шагом является извлечение признаков из предварительно обработанных изображений. Для этого мы будем использовать алгоритмы машинного обучения, такие как k ближайших соседей (KNN) или машины опорных векторов (SVM).

Допустим, мы хотим классифицировать изображения как «кошки» или «собаки» на основе их характеристик. Мы можем извлекать из изображений такие функции, как цвет, текстура и форма, и использовать их для обучения модели KNN или SVM

// Load the training data
$trainingData = [
    ['image1.jpg', 'cat', [0.5, 0.2, 0.3]],
    ['image2.jpg', 'dog', [0.2, 0.4, 0.4]],
    ['image3.jpg', 'cat', [0.3, 0.6, 0.1]],
    ['image4.jpg', 'dog', [0.1, 0.8, 0.1]],
];
// Extract the features from the training data
$features = [];
$labels = [];
foreach ($trainingData as $data) {
    // Load the image
    $image = imagecreatefromjpeg($data[0]);

// Extract the features
    $color = extract_color_feature($image);
    $texture = extract_texture_feature($image);
    $shape = extract_shape_feature($image);
    $feature = array_merge($color, $texture, $shape);
    
    // Add the feature and label to the arrays
    $features[] = $feature;
    $labels[] = $data[1];
}
// Train the KNN model
$knn = new KNearestNeighbors(3);
$knn->train($features, $labels);
 // Classify a new image
$newImage = imagecreatefromjpeg('new-image.jpg');
$color = extract_color_feature($newImage);
$texture = extract_texture_feature($newImage);
$shape = extract_shape_feature($newImage);
$feature = array_merge($color, $texture, $shape);
$label = $knn->predict($feature);
echo $label;

Шаг 3. Интеграция с Laravel

Теперь, когда мы реализовали распознавание изображений с помощью PHP и алгоритмов машинного обучения, мы можем интегрировать его с Laravel для создания полноценного веб-приложения.

На этом этапе мы создадим контроллер Laravel, который будет обрабатывать запросы на распознавание изображений от пользователя. Контроллер будет использовать функции PHP и алгоритмы машинного обучения, которые мы реализовали на предыдущих шагах.

Во-первых, давайте создадим новый контроллер, используя следующую команду:

$ php artisan make: controller ImageRecognitionController

Это создаст новый файл контроллера с именем ImageRecognitionController.php в каталоге app/Http/Controllers.

Напишите следующий код:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ImageRecognitionController extends Controller
{
    public function index()
    {
        return view('image-recognition');
    }

public function recognize(Request $request)
    {
        // Load the uploaded image
        $image = imagecreatefromstring(file_get_contents($request->file('image')->path()));
        
        // Extract the features
        $color = extract_color_feature($image);
        $texture = extract_texture_feature($image);
        $shape = extract_shape_feature($image);
        $feature = array_merge($color, $texture, $shape);
        
        // Classify the image
        $label = classify_image($feature);
        
        // Return the label to the user
        return response()->json(['label' => $label]);
    }
}

В приведенном выше коде мы создали два метода: index и recognize. Метод index возвращает представление, позволяющее пользователю загрузить изображение, а метод recognize обрабатывает запрос на распознавание изображения и возвращает пользователю метку.

Наконец создайте представление, позволяющее пользователю загружать изображения. Создайте новый файл с именем image-recognition.blade.php в каталоге resources/views и добавьте следующий код:

<!DOCTYPE html>
<html>
<head>
    <title>Image Recognition</title>
</head>
<body>
    <form action="{{ route('image.recognize') }}" method="post" enctype="multipart/form-data">
        @csrf
        <input type="file" name="image">
        <button type="submit">Recognize Image</button>
    </form> 
    <div id="result"></div> 
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script>
        $(function() {
            $('form').on('submit', function(e) {
                e.preventDefault(); 
                var formData = new FormData(this); 
                $.ajax({
                    url: $(this).attr('action'),
                    method: 'post',
                    processData: false,
                    contentType: false,
                    data: formData,
                    success: function(response) {
                        $('#result').text(response.label);
                    }
                });
            });
        });
    </script>
</body>
</html>

В приведенном выше коде мы создали форму, которая позволяет пользователю загружать изображение, и функцию JavaScript, которая обрабатывает отправку формы с помощью AJAX. При отправке формы функция JavaScript отправляет запрос AJAX методу recognize элемента ImageRecognitionController и отображает метку, возвращенную контроллером.