![Сравнение и обработка фотографии OpenCV3 в приложение PicTrace. Сравнение и обработка фотографии OpenCV3 в приложение PicTrace.](https://habrastorage.org/getpro/habr/upload_files/63c/351/07b/63c35107b74ae98060471c45986aa3e0.jpg)
В современном мире, где количество визуальной информации растет с каждым днем, умение быстро и точно находить аналогичные изображения становится все более важным. Представьте, что вы можете загрузить изображение, и в считанные секунды получить список самых похожих на него картинок из большой базы данных. Звучит интересно? Именно этого я добиваюсь достичь в своём веб‑приложение — PicTrace.
Что же такое PicTrace и как эта платформа помогает решать такие задачи? Каким образом она использует мощь OpenCV и TensorFlow для обработки изображений? Почему сочетание структурного сравнения и ключевых точек делает мой подход интересным?
В первую очередь, PicTrace — это платформа для поиска и сравнения изображений, основанная на технологиях компьютерного зрения и глубокого обучения. Изначальная цель это быстрая и точная идентификация похожих изображений в большой базе данных. На момент написания статьи я использую объектное хранилище, совместимое с S3, что обеспечивает безопасное и масштабируемое хранение изображений. А асинхронные операции значительно повышают производительность и снижают задержку при выполнении запросов, делая работу с платформой быстрее и удобнее.
Поиск дублирующихся или схожих изображений становится всё более актуальной задачей для многих областей — от управления контентом и защиты авторских прав до маркетинговых исследований и развлекательных приложений.
Эта задача заинтересовала меня в основном из‑за её актуальности в рабочей среде. Работая в крупном маркетплейсе, я задавался вопросом: «Как же люди будут находить похожие товары?» На тот момент я только начинал полностью погружаться в программирование на Python, а через какое‑то время я уже обучал модель нейронной сети на данных о товарах.
![Пример работы. Пример работы.](https://habrastorage.org/getpro/habr/upload_files/ec7/44b/c8c/ec744bc8c9be8bc24534bcd0f54dc72e.gif)
Самые главные технологии, лежащие в основе моего приложения это:
OpenCV: Мощная библиотека компьютерного зрения, используемая для продвинутой обработки изображений, включая загрузку, изменение размеров и сравнение изображений, что делает её важным компонентом для задач, связанных с изображениями без которой я не смог бы обойтись. Подробнее
Ниже я привел пример использования "Компьютерного зрения" в реальной жизни, где я использовал веб-камеру для анализа объектов и пример кода.
![Анализ объектов в пространстве в реальном времени. Анализ объектов в пространстве в реальном времени.](https://habrastorage.org/getpro/habr/upload_files/85c/44f/bb9/85c44fbb98d92a0f2d8d49a3940bfa58.gif)
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 архитектуры. 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 за их вклад в развитие цифрового зрения, а также, выражаю глубокую признательность вам за интерес к моей работе и время, потраченное на прочтение этой статьи.