Сравнение и обработка фотографии OpenCV3 в приложение PicTrace.
Сравнение и обработка фотографии OpenCV3 в приложение PicTrace.

В современном мире, где количество визуальной информации растет с каждым днем, умение быстро и точно находить аналогичные изображения становится все более важным. Представьте, что вы можете загрузить изображение, и в считанные секунды получить список самых похожих на него картинок из большой базы данных. Звучит интересно? Именно этого я добиваюсь достичь в своём веб‑приложение — PicTrace.

Что же такое PicTrace и как эта платформа помогает решать такие задачи? Каким образом она использует мощь OpenCV и TensorFlow для обработки изображений? Почему сочетание структурного сравнения и ключевых точек делает мой подход интересным?

В первую очередь, PicTrace — это платформа для поиска и сравнения изображений, основанная на технологиях компьютерного зрения и глубокого обучения. Изначальная цель это быстрая и точная идентификация похожих изображений в большой базе данных. На момент написания статьи я использую объектное хранилище, совместимое с S3, что обеспечивает безопасное и масштабируемое хранение изображений. А асинхронные операции значительно повышают производительность и снижают задержку при выполнении запросов, делая работу с платформой быстрее и удобнее.

Поиск дублирующихся или схожих изображений становится всё более актуальной задачей для многих областей — от управления контентом и защиты авторских прав до маркетинговых исследований и развлекательных приложений.

Эта задача заинтересовала меня в основном из‑за её актуальности в рабочей среде. Работая в крупном маркетплейсе, я задавался вопросом: «Как же люди будут находить похожие товары?» На тот момент я только начинал полностью погружаться в программирование на Python, а через какое‑то время я уже обучал модель нейронной сети на данных о товарах.

Пример работы.
Пример работы.

Самые главные технологии, лежащие в основе моего приложения это:

  • OpenCV: Мощная библиотека компьютерного зрения, используемая для продвинутой обработки изображений, включая загрузку, изменение размеров и сравнение изображений, что делает её важным компонентом для задач, связанных с изображениями без которой я не смог бы обойтись. Подробнее

Ниже я привел пример использования "Компьютерного зрения" в реальной жизни, где я использовал веб-камеру для анализа объектов и пример кода.

Анализ объектов в пространстве в реальном времени.
Анализ объектов в пространстве в реальном времени.
    def update_frame(self):
        while not self.stop_event.is_set():
            ret, frame = self.cap.read()
            if not ret:
                messagebox.showerror("Error", "Cannot read frame.")
                self.window.destroy()
                return

            blob = cv2.dnn.blobFromImage(frame, 1/255.0, (416, 416), swapRB=True, crop=False)
            self.net.setInput(blob)
            layer_names = self.net.getLayerNames()
            output_layers = [layer_names[i - 1] for i in self.net.getUnconnectedOutLayers()]
            detections = self.net.forward(output_layers)

            h, w = frame.shape[:2]
            boxes, confidences, class_ids = [], [], []
            for output in detections:
                for detection in output:
                    scores = detection[5:]
                    class_id = np.argmax(scores)
                    confidence = scores[class_id]
                    if confidence > 0.5:
                        box = detection[0:4] * np.array([w, h, w, h])
                        (centerX, centerY, width, height) = box.astype("int")
                        x = int(centerX - (width / 2))
                        y = int(centerY - (height / 2))
                        boxes.append([x, y, int(width), int(height)])
                        confidences.append(float(confidence))
                        class_ids.append(class_id)

            indices = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)

            if len(indices) > 0:
                for i in indices.flatten():
                    (x, y) = (boxes[i][0], boxes[i][1])
                    (w, h) = (boxes[i][2], boxes[i][3])
                    color = (0, 255, 0)
                    label = f"{self.classNames[class_ids[i]]}: {confidences[i]:.2f}"
                    cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2)
                    cv2.putText(frame, label, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)

            if self.is_recording and self.output:
                self.output.write(frame)

            cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            img = Image.fromarray(cv2image)
            imgtk = ImageTk.PhotoImage(image=img)
            self.display.imgtk = imgtk
            self.display.configure(image=imgtk)
  • TensorFlow и ResNet50: Глубокое обучение и модель ResNet50 применяются для извлечения характеристик изображений.

    Визуализация остаточных связей, критически важных для ResNet архитектуры.
    Визуализация остаточных связей, критически важных для ResNet архитектуры.
  • FastAPI: Высокопроизводительный веб-фреймворк для создания веб-приложений и обработки HTTP-запросов.

  • aiohttp: Библиотека для асинхронных HTTP-запросов, обеспечивающая быструю и эффективную обработку данных.

Процесс работы PicTrace довольно прост:

  1. Загрузка изображения: Пользователь загружает изображение непосредственно или перетаскивая его через свой рабочий стол.

  2. Извлечение характеристик: Система анализирует загруженное изображение и извлекает его особенные характеристики с помощью модели ResNet50.

  3. Сравнение изображений: На основе структурного сравнения (SSIM) и ключевых точек (ORB) PicTrace находит и сравнивает изображения из базы данных.

  4. Результаты: Система возвращает список наиболее схожих изображений.

Пример кода для поиска похожих изображений с комментариями:

# Загрузка данных из БД, содержащей информацию об изображениях. db_data = load_db()
async def find_similar_images(file_path):
# Чтение целевого изображения из указанного пути.
target_image = cv2.imread(file_path)

# Извлечение характеристик из целевого изображения с использованием предварительно обученной модели.
target_features = extract_features(target_image)

# Создание асинхронной сессии aiohttp для обработки HTTP-запросов.
async with aiohttp.ClientSession() as session:
    # Создание асинхронных задач для функции compare_images для каждого изображения в базе данных.
    tasks = [
        compare_images(session, entry, target_features) 
        for entry in db_data if "url" in entry  # Выполнение сравнений только для записей, содержащих URL изображения.
    ]

    # Ожидание завершения всех задач и сбор результатов.
    results = await asyncio.gather(*tasks)

# Фильтрация результатов, оставляя только те, у которых оценка схожести выше 0.
valid_results = filter(lambda x: x[0] > 0, results)

# Сортировка отфильтрованных результатов по убыванию оценки схожести и выборка топ-5.
sorted_results = sorted(valid_results, key=lambda x: x[0], reverse=True)[:5]

# Создание списка для хранения URL-адресов схожих изображений.
similar_images = [result[1] for result in sorted_results if result[1]]

# Возврат списка URL-адресов схожих изображений.
return similar_images

В ходе разработки PicTrace я стремлюсь создать инструмент, который бы эффективно решал задачи поиска и сравнения изображений. Использование современных технологий, таких как OpenCV и TensorFlow, позволило мне достигнуть высоких показателей точности и скорости обработки данных. Я всё же надеюсь, что со временем мой продукт станет частью какого‑нибудь рабочего процесса, автоматизируя рутинные задачи и помогая решать сложные проблемы.

Вы можете посмотреть и поддержать мой проект на GitHub

P. S. Особую благодарность выражаю сообществу разработчиков OpenCV и TensorFlow за их вклад в развитие цифрового зрения, а также, выражаю глубокую признательность вам за интерес к моей работе и время, потраченное на прочтение этой статьи.

Комментарии (4)


  1. sgmilq7
    17.07.2024 11:03

    Нажимаю UPLOAD - но подобных не находит.


    1. Solrikk Автор
      17.07.2024 11:03

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

      Я старался представить в нынешней базе фотографии на различные тематики и стараюсь дополнять её, когда появляется время. Моя главная цель — в конечном итоге получить быстрый ответ с похожими фотографиями с хорошим качеством и чтобы ответ занимал меньше 5 секунд.

      Спасибо вам за то, что попробовали приложение и рассказали о проблеме!


  1. simple-user
    17.07.2024 11:03
    +1

    Поправьте, пожалуйста ссылку на проект.


    1. Solrikk Автор
      17.07.2024 11:03
      +1

      Большое спасибо за помощь в обнаружении неполной ссылки на проект, уже поправил.