Pracuję z Pythonem, scikit-learn i keras. Mam 3000 tysięcy zdjęć zegarków z przednią twarzą, takich jak: Watch_1 , Watch_2 , Watch_3 .
Chcę napisać program, który odbierze jako wejście zdjęcie prawdziwego zegarka, który może być zrobiony w mniej idealnych warunkach niż powyższe zdjęcia (inny kolor tła, ciemniejsze błyskawice itp.) I znajdę najbardziej podobne zegarki spośród 3000. Przez podobieństwo rozumiem, że jeśli podam jako zdjęcie zdjęcie okrągłego, brązowego zegarka z cienką koronką, to spodziewam się jako wyjściowych zegarków o okrągłym kształcie, ciemnego koloru i cienkiej koronki.
Jaki jest najbardziej wydajny algorytm uczenia maszynowego?
Na przykład, klikając ten link, mam na myśli dwa różne rozwiązania:
1) Używając CNN jako ekstraktora funkcji i porównaj odległości między tymi cechami dla każdej pary obrazów w odniesieniu do obrazu wejściowego.
2) Używanie dwóch CNN w syjamskiej sieci neuronowej do porównywania obrazów.
Czy te dwie opcje są najlepsze dla tego zadania, czy może zaproponowałbyś coś innego?
Czy znasz wcześniej przeszkoloną sieć neuronową (z wcześniej ustalonymi hiperparametrami) do tego zadania?
Znalazłem kilka interesujących postów na StackOverflow na ten temat, ale są one dość stare: Post_1 , Post_2 , Post_3 .
źródło
Odpowiedzi:
Nie sądzę, że architektura wysokiego poziomu jako taka jest najlepsza, ale zależy raczej od wielu czynników i szczegółów. Z tego, co wiem o pierwszym podejściu, jest obiecujące, zwłaszcza gdy zostanie rozszerzone o dodatkowe kroki, jak w TiefVision :
Ta praca jest znacznie nowsza (2016/17) niż to, co napisałeś i zawiera ładny zestaw narzędzi i bardziej szczegółowy artykuł .
Dlaczego warto korzystać z trojaczków zwanych Deep Ranking?
Jak stwierdzono w komentarzach: Dlaczego należy wykorzystywać trojaczki dla podobieństwa obrazów zamiast uczyć się wektorów cech i obliczać ich odległość? Trojaczki są sposobem sformułowania pytania o podobieństwo jako problemu uczenia się zamiast uczenia się wektorów cech, które zasadniczo nie dbają o podobieństwo. Takie podejście ma szczególnie sens w przypadkach, w których ważne jest podobieństwo postrzegane przez ludzi, które może różnić się od postrzegania maszynowego.
Trojaczki działają w ten sposób: Zapewniasz 3 obrazy. Jeden do porównania, jeden podobny (blisko) i jeden nie tak podobny (daleki) obraz. To są twoje dane treningowe / testowe / walidacyjne. Uczenie sieci na tych próbkach i przewidywanie prawidłowej kolejności (klasyfikuj obrazy podobne z nie podobnych) ogólnie pozwala sieci dowiedzieć się, jak zamawiać obrazy na podstawie ich podobieństwa.
Podsumowując, to podejście jest stosunkowo złożone. Może to być nadinżynieria, ale poprosiłeś także o najlepszy sposób, aby to zrobić, a Deep Ranking osiąga bardzo wysokie wartości precyzji.
źródło
Wybrałbym klasyfikator, taki jak VGG-16, który działa dobrze na klasach imagenet. Następnie przeprowadź przez nią obrazy zegarka. Na pewno można oczekiwać, że wyjście będzie w większości „obserwowane” z dużym prawdopodobieństwem.
Otrzymasz jednak dodatkowe funkcje: poziom aktywacji wszystkich innych kategorii. To daje wektor tysiąca wartości od 0 do 1.
Możesz także wyodrębnić aktywację w różnych punktach sieci. Następnie podobieństwo tych aktywacji i wyników powinno być podobne między dwoma przypadkami, tylko jeśli obrazy są podobne.
źródło
Najpierw skupiłbym się na powiększaniu danych. Ponieważ twoje zdjęcia mają białe tło, masz je trochę łatwiej. Zmień białe tło w przezroczyste tło, zmniejsz obraz, obróć go i umieść w tle podobnym do danych docelowych.
Zrób to kilka razy z inną kombinacją i przypisz etykietę do każdego zegarka. Następnie zasugerowałbym, aby do klasyfikacji użyć regularnej splotowej sieci neuronowej. Każda etykieta będzie miała wynik, wybierz tę z najwyższą pewnością i ta powinna być najbardziej podobna .
Załóżmy na przykład, że uruchamiasz klasyfikator z obrazem i otrzymujesz ten wynik:
CNN mówi, że ma 51% pewności, że Watch1 jest zegarkiem na obrazie wejściowym. Ale prawdą jest również to, że wydaje się, że wygląda bardziej podobnie, Watch2 byłby następny bardziej podobny i tak dalej.
Jeśli nie uzyskasz dobrych wyników, zrób to, co zwykle. Eksperymentuj z parametrami i / lub dodaj więcej warstw. Spróbuj dowiedzieć się, gdzie zawodzi. Po uzyskaniu tego wglądu możesz użyć go do wybrania bardziej wyspecjalizowanego typu sieci splotowej dla konkretnego problemu. Poszukiwanie tego bez wcześniejszej wiedzy o tym, jak by to się odbyło, nie jest właściwym podejściem. Sugerowałbym, aby zacząć od podstawowego modelu splotowego, a następnie zacząć od tego.
źródło