В современном мире, где количество визуальной информации растет с каждым днем, умение быстро и точно находить аналогичные изображения становится все более важным. Представьте, что вы можете загрузить изображение, и в считанные секунды получить список самых похожих на него картинок из большой базы данных. Звучит интересно? Именно этого я добиваюсь достичь в своём веб‑приложение — 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 применяются для извлечения характеристик изображений.
-
FastAPI: Высокопроизводительный веб-фреймворк для создания веб-приложений и обработки HTTP-запросов.
-
aiohttp: Библиотека для асинхронных HTTP-запросов, обеспечивающая быструю и эффективную обработку данных.
Процесс работы PicTrace довольно прост:
-
Загрузка изображения: Пользователь загружает изображение непосредственно или перетаскивая его через свой рабочий стол.
-
Извлечение характеристик: Система анализирует загруженное изображение и извлекает его особенные характеристики с помощью модели ResNet50.
-
Сравнение изображений: На основе структурного сравнения (SSIM) и ключевых точек (ORB) PicTrace находит и сравнивает изображения из базы данных.
-
Результаты: Система возвращает список наиболее схожих изображений.
Пример кода для поиска похожих изображений с коментариями:
# Загрузка данных из БД, содержащей информацию об изображениях. 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/
Добавить комментарий