Pets Search

Project Screenshot

Pets Search - Дипломный проект, реализующий сервис для поиска пропавших животных с использованием технологий машинного обучения и распознавания изображений. Приложение предназначено для устройств на платформе Android и помогает находить потерянных питомцев, сравнивая загруженные фотографии с базой найденных животных. В ходе разработки проекта был написан плагин на Java для возможности выбора фотографий на устройстве пользователя
Основные функции:
Загрузка фотографий - Пользователь может загружать фото потерянного животного и подстраивать его положение в рамке для более точного анализа.
Поиск по фото - Приложение отправляет изображение на сервер, где алгоритм машинного обучения ML.NET анализирует его и сопоставляет с базой найденных животных.
История поиска - Возможность повторного просмотра и использования последнего загруженного изображения.
Pets Search демонстрирует интеграцию современных технологий машинного обучения с разработкой мобильных приложений, предоставляя пользователям простой и эффективный инструмент для поиска пропавших животных.

Пример исполнения класса:

        using System.Net;
using System.Net.Sockets;
using System;
using UnityEngine;
using System.Text;
using UnityEngine.UI;
using System.IO;
using System.Collections.Generic;
using System.Drawing;
using System.Configuration;

public class Server : MonoBehaviour
{
    // адрес и порт сервера, к которому будем подключаться
    private readonly int _portTCP = 48654; // порт сервера
    private readonly string _address = "192.168.1.4"; // IP адрес локальной сети
    //private readonly string _address = "46.48.106.199"; // IP адрес сервера
    private Socket _socket;
    private bool _isConnect = false;
    private bool _isPet = false;
    private DisplaySearchScene _scene;

    [SerializeField] private GameObject _content;
    [SerializeField] private GameObject _prefab;
    [SerializeField] private Text _textMessage;

    [SerializeField] private Texture2D[] _texture;

    /// <summary>
    /// Отправка данных по TCP 
    /// </summary>
    public void SendData()
    {
        //Включаем окно загрузки
        _scene = GetComponent<DisplaySearchScene>();
        _scene.OnExpectation();
        try
        {
            _isConnect = true;
            IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse(_address), _portTCP);
            _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            // подключаемся к удаленному хосту
            _socket.Connect(ipPoint);
            // отправка фото
            _socket.Send(Data.imageData);
        }
        catch (Exception ex)
        {
            CloseSocket(_socket, true);
        } 
    }

    private void GetMessage()
    {
        // получаем ответ
        byte[] data = new byte[2048]; // хранилище данных
        int bytes;
        StringBuilder builder = new StringBuilder();
        do
        {
            bytes = _socket.Receive(data, data.Length, 0);
            builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
        }
        while (_socket.Available > 0);


        //Загрузка полученных данных в текстуру.
        RawImage image = Instantiate(_prefab, _content.transform).GetComponent<RawImage>();
        string number = builder.ToString();
        Debug.Log(number);

        /*Texture2D tex = new Texture2D(800, 800);
        tex.LoadImage(str);
        image.texture = tex;*/
        image.texture = _texture[Convert.ToInt32(number) - 1];


        CloseSocket(_socket, false);
        _scene.OnResult();
    }

    /// <summary>
    /// Получаем ответ о прохождении проверки на то, что находится на фото.
    /// </summary>
    private void Chek()
    {
        //Получаем ответ
        byte[] data = new byte[125]; //буфер для ответа максимальный объем 1мб
        StringBuilder builder = new StringBuilder();
        do
        {
            int bytes = _socket.Receive(data, data.Length, 0);
            builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
        }
        while (_socket.Available > 0);

        if (builder.ToString() == "true")
        {
            _isPet = true;
            GetMessage();
        }

        if (builder.ToString() == "false")
        {
            _isPet = false;
            _textMessage.text = "Не обнаружено питомца. Попробуйте другое фото";
            CloseSocket(_socket, false);
            _scene.OffExpectation();
        }
    }


    private void Update()
    {
        if (_isConnect)
        {
            if (_isPet == false && _socket.Available > 0)
            {
                Chek();
            }

            if (_isPet && _socket.Available > 0)
            {
                GetMessage();
            }
        }

    }

    private void CloseSocket(Socket socket, bool ex)
    {
        _isPet = false;
        _isConnect = false;
        socket.Shutdown(SocketShutdown.Both);
        socket.Close();

        if (ex)
        {
            _textMessage.text = "Не удалось подключиться к серверу";
            _scene.OffExpectation();

            Debug.Log("Закрыто");
        }
    }
}
    
Перейти на GitHub