2012-04-04 13 views
10

Próbuję wyodrębnić litery z planszy do projektu. Obecnie mogę wykryć planszę gry, posegmentować ją na poszczególne kwadraty i wyodrębnić obrazy z każdego kwadratu.Dokładna klasyfikacja obrazu binarnego

Wejście Dostaję jest tak (są to poszczególne litery):

enter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description here

Początkowo byłem licząc liczbę czarnych pikseli na obrazie i przy użyciu tego jako sposób na identyfikację różnych liter, które działały nieco dobrze dla kontrolowanych obrazów wejściowych. Problem jednak polega na tym, że nie mogę zrobić tego dla obrazów, które różnią się od nich nieznacznie.

Mam około 5 próbek z każdej litery do pracy na szkolenia, które powinny być wystarczająco dobre.

Czy ktoś wie, jaki byłby dobry algorytm do tego celu?

Moje pomysły były (po normalizacji obrazu):

  • Liczenie różnicę między obrazem a każda litera obrazek, aby zobaczyć, który produkuje najmniejszą ilość błędów. Nie będzie to jednak działać w przypadku dużych zestawów danych.
  • Wykrywanie narożników i porównywanie względnych lokalizacji.
  • ???

Każda pomoc zostanie doceniona!

+2

Witamy w OCR. – delnan

+0

Heh, wypróbowałem Tessearact na testowych obrazach po ich rozszerzeniu, ale nie udało się to marnie (nawet po ustawieniu trybu segmentacji na "jedno słowo"). OCR wydaje się przesadą dla tego konkretnego przypadku, IMO, ponieważ obrazy są bardzo podobne w każdym przypadku. – Blender

+1

co z niezmiennością skali i rotacji? – moooeeeep

Odpowiedz

13

Myślę, że jest to coś w rodzaju nadzorowanej nauki. Musisz wykonać pewne wyodrębnianie funkcji na obrazach, a następnie dokonać klasyfikacji na podstawie wektora cech, który obliczyłeś dla każdego obrazu.

ekstrakcji cech

Na pierwszy rzut oka, że ​​część Feature Extraction wygląda dobrego scenariusza Hu-Moments. Po prostu obliczyć image moments, a następnie obliczyć cv::HuMoments z tych. Następnie masz 7-wymiarową, realnie cenioną przestrzeń cech (jeden wektor cech na obraz). Ewentualnie możesz pominąć ten krok i użyć każdej wartości piksela jako osobnej funkcji. Myślę, że sugestia w this answer idzie w tym kierunku, ale dodaje kompresję PCA, aby zmniejszyć wymiarowość przestrzeni obiektów.

Klasyfikacja

Co do części klasyfikacji, można użyć niemal każdy algorytm klasyfikacyjny chcesz. Możesz użyć SVM dla każdej litery (binarna klasyfikacja tak-nie), możesz użyć NaiveBayes (jaka jest maksymalna prawdopodobna litera) lub możesz użyć podejścia k-NearestNeighbor (kNN, minimalna odległość przestrzenna w przestrzeni obiektowej), na przykład flann.

W szczególności w przypadku klasyfikatorów opartych na odległości (np. KNN) należy rozważyć normalizację przestrzeni cech (np. Skalować wszystkie wartości wymiarów do pewnego zakresu dla odległości euklidesowej lub użyć rzeczy takich jak odległość mahalanobis). Ma to na celu uniknięcie nadreprezentacji funkcji z dużymi różnicami wartości w procesie klasyfikacji.

ocena

Oczywiście trzeba dane treningowe, czyli funkcja wektory Images' podano właściwą literę. I proces, aby ocenić swój proces, np. sprawdzanie poprawności krzyżowej.


W takim przypadku możesz również chcieć rzucić okiem na template matching. W takim przypadku można zawęzić obraz kandydata z dostępnymi wzorcami w zbiorze treningowym. Wysokie wartości na obrazie wyjściowym wskazują na dobre prawdopodobieństwo, że wzór znajduje się w tej pozycji.

+0

Dziękuję bardzo za pomoc! Zająłem się obliczaniem momentów Hu dla poszczególnych obrazów, ale potem klasyfikacja zaskoczyła mnie mnóstwem błędów. Mam nadzieję, że uda mi się go uruchomić w ciągu następnego dnia i zobaczyć, jak działa! – Blender

+0

Właśnie dostałem klasyfikatora do pracy! Jest w 100% dokładny dla moich danych treningowych (duh), ale ma problemy z nowym wprowadzeniem. Zamierzam trenować to jeszcze bardziej za pomocą dokładniejszych próbek. – Blender

+0

@Blender - cieszę się, że pomogło! – moooeeeep

5

To jest problem z rozpoznawaniem. Osobiście użyłbym kombinacji PCA i techniki uczenia maszynowego (prawdopodobnie SVM). Są dość duże tematy więc obawiam się, że nie da się wypracować zbyt wiele, ale tutaj jest bardzo prosty proces:

  1. Zbierz obrazy szkoleniowe (ponad jeden na piśmie, ale nie zwariować)
  2. Wytwórnia je (może oznaczać wiele rzeczy, w tym przypadku oznacza to pogrupowanie liter w logiczne grupy - Wszystkie zdj -> 1, wszystkie obrazy B -> 2 itd)
  3. wytresować klasyfikator
    • Uruchom wszystko przez dekompozycję PCA
    • Prześlij wszystkie swoje obrazy treningowe PCA przestrzeń
    • Run prognozowane zdjęć poprzez cewkę SVM (jeśli jest to klasyfikator jedna klasa, zrób je po jednym na raz, inaczej zrobić je wszystkie naraz.)
    • Zapisz swoje PCA wektor własny i SVM dane treningowe
  4. uznanie Run
    • obciążenia w przestrzeni PCA
    • obciążenia w danych treningowych SVM
    • dla każdego nowego obrazu, projektowych go do przestrzeni PCA i poproś go zaklasyfikować do SVM.
    • Jeśli otrzymasz odpowiedź (numer), zamień ją z powrotem na literę (1 -> A, 2 -> B itd.).
+0

Dziękujemy! Teraz czytam na PCA. Wreszcie wykorzystanie dla Linear Algebra ... – Blender

4
+0

Przeczytałem drugi i wydaje mi się, że już to robię (porównując różne piksele i znajdując obraz, który minimalizuje ten błąd). Ten pierwszy jest nieco tajny i nie wyjaśnia, co się dzieje bardzo dobrze, ale dziękuję za linki! Zrobię kilka badań na temat działania pierwszego. – Blender

2

Miałem podobny problem kilka dni temu. Ale to było rozpoznawanie cyfr. Nie dla alfabetów.

I zaimplementowałem prosty OCR do tego przy pomocy kNearestNeighbour w OpenCV.

Poniżej znajduje się link i kod:

Simple Digit Recognition OCR in OpenCV-Python

wdrożyć go do alfabetów. Nadzieje, że to działa.

+0

Ta odpowiedź była * naprawdę * pomocna, kiedy faktycznie kodowałem algorytmy. Dziękuję Ci! – Blender

0

Można spróbować budowy modelu, przesyłając swoje dane treningowe (~ 50 obrazów 1S, 2S, 3S .... 9s) do demo.nanonets.ai (bezpłatny do użytku)

1) Dodaj dane treningowe tutaj:

demo.nanonets.ai

2) Następnie zapytanie API stosując następujące (Pythonie):

import requests 
import json 
import urllib 
model_name = "Enter-Your-Model-Name-Here" 
url = "http://images.clipartpanda.com/number-one-clipart-847-blue-number-one-clip-art.png" 
files = {'uploadfile': urllib.urlopen(url).read()} 
url = "http://demo.nanonets.ai/classify/?appId="+model_name 
r = requests.post(url, files=files) 
print json.loads(r.content) 

3) odpowiedź wygląda następująco:

{ 
    "message": "Model trained", 
    "result": [ 
    { 
     "label": "1", 
     "probability": 0.95 
    }, 
    { 
     "label": "2", 
     "probability": 0.01 
    }, 

    .... 

    { 
     "label": "9", 
     "probability": 0.005 
    } 
    ] 
} 
Powiązane problemy