Исследуя мир изображений: PicTrace и искусственный интеллект в действии

от автора

Сравнение и обработка фотографии 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 за их вклад в развитие цифрового зрения, а также, выражаю глубокую признательность вам за интерес к моей работе и время, потраченное на прочтение этой статьи.


ссылка на оригинал статьи https://habr.com/ru/articles/829348/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *