Arhn - архитектура программирования

Разделите изображение на отдельные объекты (монеты) для машинного обучения

Я хочу автоматически разделить изображение нескольких монет на отдельные монеты, чтобы впоследствии отдельные монеты можно было поместить в модель, которая классифицирует монеты (с помощью Tensorflow/Keras).

Входные изображения выглядят примерно так

И они должны выглядеть так (извините, что я не могу интегрировать изображения напрямую, поскольку я м новичок в StackOverflow).

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

Я уже пробовал модель обнаружения объектов, но она не обнаружила монеты (https://towardsdatascience.com/object-detection-with-10-lines-of-code-d6cb4d86f606). Поскольку я уже знаю, что все объекты на изображении — это монеты, я подумал, что, может быть, есть более простой способ разделить изображение?

Заранее спасибо.


  • Правильный путь — использовать модель обнаружения объектов для определения границ монеты. Насколько я знаю, нет более простого способа. Однако есть ряд хороших библиотек обнаружения объектов, которые сделают это за вас (например: API обнаружения объектов Tensorflow. Можете ли вы поделиться тем, что вы уже пробовали? 05.09.2018
  • Вы хотите использовать метод преобразования расстояния + водораздела. См., например, stackoverflow.com/questions/25789278/ или stackoverflow.com/questions/19385264 / 06.09.2018

Ответы:


1

Я бы попробовал цветовую сегментацию, аналогичную этому учебнику, в качестве первого шага для разделения монеты с фона. Вот моя быстрая попытка в Python с использованием OpenCV:

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread("coins.jpg")

lower = np.array([0,40,5])
upper = np.array([255,255,255])
mask = cv2.inRange(hsv, lower, upper)

cv2.imshow(img)
plt.show()
plt.imshow(mask)

Это приводит нас к входному изображению

введите здесь описание изображения

к этой маске:

введите здесь описание изображения

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

05.09.2018
  • Интересный подход, попробую. Спасибо! 05.09.2018

  • 2

    введите здесь описание изображения

    import cv2
    import imutils
    import numpy as np
    import matplotlib.pyplot as plt
    
    def display(img,count,cmap="gray"):
        f_image = cv2.imread("coins.jpg")
        f, axs = plt.subplots(1,2,figsize=(12,5))
        axs[0].imshow(f_image,cmap="gray")
        axs[1].imshow(img,cmap="gray")
        axs[1].set_title("Total Money Count = {}".format(count))
    
    
    image = cv2.imread("coins.jpg")
    image_blur = cv2.medianBlur(image,25)
    image_blur_gray = cv2.cvtColor(image_blur, cv2.COLOR_BGR2GRAY)
    image_res ,image_thresh = cv2.threshold(image_blur_gray,240,255,cv2.THRESH_BINARY_INV)
    kernel = np.ones((3,3),np.uint8)
    opening = cv2.morphologyEx(image_thresh,cv2.MORPH_OPEN,kernel)
    dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
    ret, last_image =  cv2.threshold(dist_transform, 0.3*dist_transform.max(),255,0)
    last_image = np.uint8(last_image)
    
    cnts = cv2.findContours(last_image.copy(), cv2.RETR_EXTERNAL,
        cv2.CHAIN_APPROX_SIMPLE)
    cnts = imutils.grab_contours(cnts)
    
    
    for (i, c) in enumerate(cnts):
        ((x, y), _) = cv2.minEnclosingCircle(c)
        cv2.putText(image, "#{}".format(i + 1), (int(x) - 45, int(y)+20),
            cv2.FONT_HERSHEY_SIMPLEX, 2, (255, 0, 0), 5)
        cv2.drawContours(image, [c], -1, (0, 255, 0), 2)
    
    display(image,len(cnts))
    
    29.05.2020
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..