Rozpoznawanie typu i rozmiarów przedmiotów na obrazach

1

W ogóle nie mam żadnego doświadczenia w dziedzinie rozpoznawania obrazów, a z tego co widzę w necie, to większość materiałów dotyczy rozpoznawania liter przy użyciu sieci neuronowej, a mi chodzi o coś trochę innego.

Załóżmy, że mam zrobione zdjęcie pomarańczy, chciałbym wykryć, że:

  1. to jest pomarańcza, a nie np. brzoskwinia (czy tym bardziej banan);
  2. jej wymiary.
    Po prostu tak jak człowiek być w stanie stwierdzić, że widzę pomarańczę, która ma 10 cm średnicy.

Domyślam się, że 1 jest łatwiejsze niż 2, bo rozpoznanie wymiaru pewno wymaga jakiegoś punktu odniesienia, który nie koniecznie istnieje.

Bawił się ktoś czymś takim? Ma ktoś jakiś pomysł?

1

Nie podawaj abstrakcyjnych przykładów, tylko powiedz co konkretnie chcesz zrobić. Mało jest uniwersalnych algorytmów wykrywania czegokolwiek w każdych warunkach.

Przede wszystkim musisz wyodrębnić interesujący Cię obiekt. Do tego posłużą Ci różne operacje, ale zależy to od tła. Jeżeli zrobiłeś zdjęcie pomarańczy na tle kwiecistej łąki i drzew owocowych to raczej będzie ciężko, dlatego musisz określić jakie są warunki wykonywania tego zdjęcia. Zapewne przyda się kwantyzacja barwy i segmentacja. Jeżeli masz szczęście może wystarczyć tylko progowanie i operacje morfologiczne. Poza tym należy zbadać użyteczność różnych przestrzeni barw.

Kiedy już będziesz miał obiekt, tudzież będziesz wiedział gdzie on jest, będziesz mógł określić jego cechy. Mogą to być zarówno jakieś liczby: pole, średnica, obwód, współczynniki kształtu itd, albo jakieś cechy szczególne, ale to zależy od tego co konkretnie chcesz wykrywać i czy to ma te cechy.

0
Endrju napisał(a):

Nie podawaj abstrakcyjnych przykładów, tylko powiedz co konkretnie chcesz zrobić. Mało jest uniwersalnych algorytmów wykrywania czegokolwiek w każdych warunkach.

Ta pomarańcza, to jest konkretnie to, co chcę zrobić. Mogą to być też ziemniaki albo schabowy, ogólnie w zasadzie dowolne jedzenie. Co do warunków - załóżmy, że możemy je częściowo wymóc. Jakie powinny być, żeby wykrycie było w miarę proste?

4

Kontrastowe tło (białe zapewne będzie dobre), dobre oświetlenie, brak cienia i stała odległość aparatu od obiektów no i dobrze odseparowane obiekty. Jeżeli tak będzie, to znalezienie obiektu/obiektów będzie proste - powinno wystarczyć progowanie i jakieś operacje morfologiczne. Potem możesz rozróżniać za pomocą tych różnych liczb opisujących obiekty no i np. koloru, faktury czy tam czegoś.

Jeżeli uda Ci się opisać poszczególne klasy obiektów za pomocą tych wskaźników liczbowych, to można to wykorzystać. Tzn. pomarańcza jest w miarę duża, ładnie okrągła itd, te same cechy dla ziemniaka będą inne - jest raczej mniejszy i raczej bardziej eliptyczny. Z tych liczb buduje się dla każdego obiektu wektor cech i potem określa się, do jakiej klasy należy np. za pomocą k-nearest neighbor.

Raczej rzadko jest tak różowo i trzeba po prostu kombinować...

1

Ad1. Jeżeli tło będzie jednego koloru, to można spróbować na surowych pikselach użyć PCA + SVM. Tylko odo takiego rozwiązania potrzebne jest sporo danych(próbek pozytywnych i negatywnych). Istnieje kilka sposobów na zwiększanie ilości danych(np. obracanie już istniejących). Zwykle przy takich rozwiązaniach stosuje się kilka okien(np. 20x20, 50x50, 100x100px) które "przechodzą" po obrazie - ale to pewnie wyczytałeś przy okazji rozpoznawania pisma.

1

Gdzieś kiedyś czytałem, że w Japonii ktoś zrobił coś takiego, do obsługi ludzi w supermarketach. Klient kaładzie na wadze owoc, a kamera rozpoznaje: co to za owoc, jakiej odmiany, a nastepnie drukuje odpowiednią etykietę z ceną.
Poszukaj, może link jest, w ciekawych linkach.

edit:
zacznij wpisywać w googla: "automatic fruit recognition" a zaraz zacznie ci uzupełniać " a survey and new results using range attenuation images"

0

Załóżmy, że potrzebuję czegoś, co na podstawie zdjęcia talerza z jedzeniem powie, czy są to ziemniaki ze schabowym, czy ryż z kurczakiem, czy zupa wiśniowa. Powiedzmy, że chodzi o zbiór 500 najpopularniejszych potraw/produktów spożywczych.

Endrju napisał(a):

Kontrastowe tło (białe zapewne będzie dobre), dobre oświetlenie, brak cienia i stała odległość aparatu od obiektów no i dobrze odseparowane obiekty.

To raczej niemożliwe, zdjęcia mogą być robione w różnych miejscach, i przy różnych warunkach, wymusić można odległość
Biały talerz może być kontrastowy dla ziemniaków, ale dla ryżu już nie bardzo, ryż też nie jest dobrze odseparowanym obiektem.

Tak czy siak rozumiem, że potrzebuję jakiegoś zbioru uczącego, czyli różnych zdjęć wszystkich potraw, na podstawie którego zbuduję klasyfikator przy użyciu jakichś algorytmów, którego będę mógł potem użyć. Pytanie - czy budowę i uczenie klasyfikatora trzeba robić od zera, czy są jakieś sprawdzone rozwiązania/biblioteki do tego?
No i zbiór uczący - sam go muszę zbudować korzystając ze zdjęć różnych produktów w różnych warunkach, czyli przy moich potrzebach stworzenie go zajmie mi z rok? :D

Czy są jakieś dobre książki po polsku traktujące o tej tematyce? W necie znalazłem kilka tytułów, ale żadnych recenzji.

0

Budujesz robota czy co? :D

1

Co do bibliotek to OpenCV ma zaimplementowane klasyfikowanie obrazów. W sieci można znaleźć paczki z różnymi zestawami danych za darmo. Trzeba się liczyć z tym, że dane w tych paczkach mogą być kiepskie - tj. 30x30px w skali szarości.

1

@somekind przeczytaj uwaznie - programista mag nr.1, tam jest artykul o rozpoznawaniu obrazow i jak dobrze poszukasz to jeden z autorow o C++ udostepnia linka do swojej biblioteki AI nie podam strony, bo nie mam przed soba tego ebooka


peace ChS

0

No i zbiór uczący - sam go muszę zbudować korzystając ze zdjęć różnych produktów w różnych warunkach, czyli przy moich potrzebach stworzenie go zajmie mi z rok?

Jak już będziesz miał odpowiednią ilość obrazów to możesz łatwo dogenerować sobie próbki uczące dokładając szum do obrazów, zmieniając kontrast etc. Ale oczywiście jakąś bazę musisz mieć na wstępie co pewnie będzie dosyć cięzkie do znalezienia ;)

0

a może puknij w np. Omron'a, robią to rutynowo (obrzydliwe słowo) ale robią. akurat ta firma to pierwsze co mi na myśl przyszło, ale jak miałbym zgadywać to wymieniłbym jeszcze kilka.

4

@somekind da się to rozwiązać. Nazywa się to klasyfikacja za pomocą niezmienników. Możesz to zrobić np. obliczając współczynniki kształtu lub momenty geometryczne. Jednak współczynniki kształtu nie są za dobre i lepiej jest użyć momentów geometrycznych. A więc robi się to tak:

  1. Piszesz funkcję (klasyfikator), która dla banana oblicza wektor cech.
    Do klasyfikatora wyznaczasz momenty zwykłe mpq, potem centralne i na końcu obliczasz niezmienniki.
    Klasyfikator działa tak, że dla podanego wektora cech oblicza numer klasy np. metodą euklidesową lub taxiodległością.
  2. Przygotowujesz bazę wzorców dla każdej klasy obiektów, które mają być rozpoznawane
    [nr_klasy_obiektu wektor_cech]
  3. Piszesz program do klasyfikacji:
    a) pobierasz obraz tła
    b) wykrywasz banana metodą odejmowania tła od obrazu z bananem
    c) wyznaczasz wektor cech banana za pomocą funkcji klasyfikatora z punktu 1. Klasyfikator zwróci obliczony numer_klasy_banana.
    d) dokonujesz klasyfikacji obiektu metodą najbliższego sąsiada lub metodą n najbliższych sąsiadów(bo jak banan w bazie wiedzy będzie krzywy a klasyfikowany będzie unijny (prosty) to numer_klasy_banana będą się nieznacznie różnić, a metoda najbliższego sąsiada wybierze najbliższy banan rozpoznawanemu).
    W rozdziale 6 "Analiza cech obiektów" masz opis wzorów do otrzymywania niezmienników.
    http://jmarnik.sd.prz.edu.pl/file/MjIsNjksMzE2LHdrX2xhYl9vcGlzdGVvcmV0eWN6bnkucGRm
    To tak pokrótce o problemie. Resztę wywnioskuj sam. Mam nadzieję, że pomogłem i życzę powodzenia w zabawie z tematem.
0

W OpenCV robili wykrywanie samochodów ;) -

Z jedzeniem pewnie też dałbyś radę :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1