Przedstawienie problemu
Mam zbiór 105 grafik wektorowych. Te grafiki są w formacie SVG(jakby to miało jakieś znaczenie). Te grafiki to na przykład: koło, trójkąt, kwadrat, prostokąt, grafika samolotu, grafika gwizdy, grafika czołgu, grafika tarczy oraz wiele innych. Ogólnie na potrzeby wyobrażenia jest to zbiór ikon/symboli.
Operacje jakie możemy wykonać na tych grafikach wektorowych są następujące:
- Przesuwanie- czyli po prostu przemieszczanie z miejsca na miejsce,
- Skalowanie - czyli zwiększanie lub zmniejszanie danego elementu,
- Transformacja - czyli możemy z kwadrata(kwadratu? nie jest dobry z języka polskiego) zrobić prostokąt. W skrócie manipulować osią x lub y danego elementu,
- Obracanie - czyli to co mówi nazwa obrócić dany element o ileś stopni,
Spośród 105 mogę wybrać tylko 40 grafik wektorowych! Nie mniej nie więcej! 40 wybranych grafik działa w systemie warstw. Taki system jest znany z różnych programów graficznych typu: Photoshop lub gimp i to co tutaj chcę opisać działa tak samo jak w tych nadmienionych programach. Takich warstw może być tylko 40! To znaczy, że na każdej warstwie może znajdować się tylko jedna grafika wektorowa! Grafika znajdująca się w najwyższej warstwie jest widoczna dla użytkownika jako pierwsza. Grafika znajdująca się na warstwie najniższej jest widziana jako ostatnia. Oczywiście, możemy bawić się warstwami. W skrócie zmieniać ich kolejność. Ostatnia może być pierwszą, a pierwsza ostatnią itd...
Grafiki są umieszczane na scenę o rozmiarach 966px na 966px. Jeżeli umieścimy grafikę na scenie i przesuniemy ją poza obszar sceny to taki element nie jest widoczny. W skrócie, widoczne jest tylko to co jest w granicach takiej sceny.
To co chce uzyskać
Ogólnie, chce wygenerować jak najbliższy obraz do oryginału używając tylko grafik wektorowych i to jest główny problem jaki chce rozwiązać. Brzmi prosto, ale jak jest w praktyce?
research na własną rękę
Kilkukrotnie pytałem chatGPT z dokładnym opisem zadania w jaki sposób ten problem rozwiązać. ChatGPT doszedł do następującej konkluzji:
Użyj algorytmu genetycznego na przykład gotowych bibliotek: pyGAD lub DEAP. Dobrze opisz metodę "fitness" w algorytmie genetycznym, używając SSIM(structural similarity index) lub MSE(mean squared error). Dopisał jeszcze użycie: Python3 oraz open-cv/PIL.
Ogólnie nie podoba mi się ta sugestia. z kilku powodów:
Skąd miałbym wiedzieć jaki zbiór 40 elementów da mi najbliższy wynik?
Tutaj ewidentnie potrzebne jest napisanie "małego" AI, który będzie wybierał najlepszy podzbiór 40 elementów. W skrócie, potrzebny jest program/AI do ewaluacji podzbioru na podstawie wygenerowanego przybliżenia/wyniku.
Skąd algorytm genetyczny ma pamiętać że przesunięto np grafikę kwadrat i nie utracono tej informacji?
Również ważna jest kolejność elementów oraz danie możliwości programowi do "tasowania" tych grafik, bo jak pamiętamy posiadamy system warstw. Z tego co sie dowiedzialem algorytm genetyczny akceptuje na wejście dane w postaci binarnej. Dokonuje operacji na całej reprezentacji wartości binarnej. W skrócie może dojść do mutacji bitów, które są odpowiedzialne za identyfikację danego kształtu.
pomoc
Ogolnie prosze o pomoc w nakierowaniu na dobrze tory. Jakie są możliwe podejścia rozwiązania tego problemu? Czy jest nim algorytm genetyczny? Czy jest nim sieć neuronowa? Może istnieją inne rozwiązania tego problemu? Dziekuje za pomoc z góry.