회사에서 캐릭터등을 그리는 작업을 AI가 작업해주고,
이를 수정하는 아티스트 인력만 사용한다면 인력을 줄일 수 있겠다고 생각하였다.
이를 메이플스토리에 접목해본다면, 다음과 같이 이미지가 있으면, 각 요소를 분할하고 메이플스토리 아이템들과 score를 계산하여, 가장 높은 score를 기록한 아이탬들을 기본 캐릭터에 융합하여 최종 캐릭터 결과를 낼 수 있다.
이에 있어서 저는 다음과 같은 기술들을 사용하여 해당 프로젝트를 풀고자 한다.
1. Segmentation을 통해 각 요소를 분할 한다.
2. 각 요소별로 타 치장 아이탬과 비교해서 비슷한 정도를 계산해야된다.
3. 해당으로 matching된 Image들을 아무것도 없는 charactor에 Concat하여 마지막 Charactor를 추출한다.
위를 기반은 무엇이 문제가 될까?
1. 치장 아이탬 리스트가 많이 없는 경우, score가 가장 높더라도 실제와 matching이 안될 수 있다.
2. 치장 아이탬 리스트가 굉장히 많을 경우, score 계산이 오래 걸린다.
이를 해결하기 위해서는?
해당에 있어서 저는, 이미 존재하는 아이탬과 score를 비교하여 최종 charactor를 생성하는 것이 아닌,
특정 domain (여기서는 메이플스토리) 스러운 아이탬을 직접 생성되게끔 하여 최종 charactor를 추출한다.
여기서, 이미지 생성 모델들을 깊이 공부해볼 필요가 있다.
Model Fine-Tuning
우선, 나는 머리 상의 하의 신발 4개의 class로 구분할 수 있는 detection or segmentation을 수행해야된다.
예시에는 SAM2를 사용한다고 했었는데, 나의 입맛대로 customizing이 쉬운 Yolov11을 사용하기로 하였다.
(추가적으로 SAM2를 돌리기에는 H/W 환경적으로 힘들기도 하였으며 속도도 너무 느렸다)
Fine tunning하지 않고 기존 yolov11의 결과는 다음과 같다. (detection)
하지만, 내가 원하는 것은 person class에 대한 detection or segmentation이 아닌,
머리, 상의, 하의, 신발 4개의 class에 대한 detection or segmentation입니다.
하지만 이는 pre-trained에서 지원하는 class는 아니기에, 추가적인 fine-tuning을 진행합니다.
여기서 Fine-Tuning을 어떻게 진행할까?는 2개의 방법이 있습니다.
1. multi label per one image
2. separating images for each class
저는 2번의 방법을 택하였고 왜냐하면, 첫 번째 방법으로 데이터셋을 구성할 수 있다면 효율적이겠으나,
원하는 5개의 class로 구성된 데이터셋을 직접 구성하기 어려우며 찾기 어렵다.
따라서 저는 "헤어", "상의" 등 각각의 클래스에 대해 다른 데이터셋을 가져와서 Fine-Tuning을 진행한다.
Dataset preparation
hair dataset : https://universe.roboflow.com/slz/hair-seg
top/bottom/shoes dataset :https://universe.roboflow.com/test-lnqdk/mainmodel
운이 좋게도 top/bottom/shoes는 한 번에 있는 데이터셋이 있었다.
추가적으로 dress까지 있으니 한벌옷도 처리가 가능해졌다!!
Train
우선 내 local 환경에서 학습하기 힘들어서 서버에서 50epoch으로 hair_seg먼저 학습 진행 후 clothes_detection 학습하고, weight 파일을 가져오는 과정을 진행한다.
1차 Architecture
따라서, 두 가지의 커스텀 모델을 만들어서 결과를 병합하는 하이브리드 구조로 만들기로 하였다.
아래의 그림같이 4개의 결과 또는 dress일 경우는 3개의 경우가 될 것이다.
3개의 결과에 대해서는 메이플스토리는 한벌옷으로 처리하고,
4개의 결과에 대해서는 상/하의 구분해서 처리하면 될 것 같다.
1차 결과
문제
신발에 대해 validation 결과가 좋지 않아서 신발을 잘 못잡고 있다. 아래는 validation set에 대한 성능지표입니다.
(test set을 따로 분리하지 않고 train, validation으로 분리하여 성능을 확인하였다.)
성능을 추가적으로 올려야할 필요가 충분히 있었다. (특히 신발)
hair는 단일 모델이니 우선 skip하고, multi label detection model의 학습 instance 개수를 살펴보면,
신발에 대한 개수는 충분히 있으나, 좋지못한 결과를 보인다.
문제 해결
우선 다른 데이터셋에 대해 다시 학습해볼 필요가 있다고 생각했으며, 다행히 다른 데이터셋이 있었다.
추가적으로, 해당 데이터셋은 segmentation dataset이라서, detection보다 item들과 score비교할 때 더욱 효과를 발휘할 수 있을 것으로 보인다.
추가적 문제
하지만, 상의/하의로 보다 더욱 많은 class가 담긴 dataset이므로 내가 후처리를 해줄 필요가 있었다.
따라서, 나는 class를 다음과 같이 다시 mapping하였다.
문제 해결
문제 해결 모델 결과
이제 모델에 대한 output이 내가 원하는 대로 수행되었기에, item들과 score를 비교하면 된다.
ITEM List
여기서, 어떻게 item들에 대한 정보를 가져올 것인가? 직접 크롤링해야되나? 라고 생각하며 찾아봤을 때 maple API를 찾을 수 있었다!!
우선, 크롤링하기 위해 코디 시뮬레이터 사이트를 찾았었는데,
https://maples.im/, https://maple.gazua.in/coordi
두 번째 사이트에서 아이탬을 어떻게 가져오고 있나? 개발자 도구로 확인한 결과
다음과 같이 endpoint : https://maplestory.io/api/{region}/{version}/item/{itemID}/icon를 통해 가져오는 것을 확인할 수 있었다. 여기서, maplestory.io API를 사용하고 있는 것을 확인했다.
그럼 이제 crowling 필요 없이 API를 제공하고 있다는 것을 파악했으니, API로 item list를 들고오면 될 거 같다.
How get item icon?
API를 살펴보면서 비교할 아이탬들을 모두 들고오는 로직을 짜도록 하겠습니다.
endpoint : https://maplestory.io/api/{region}/{version}/item/{itemID}/icon 으로 item을 가져온다는 것은 이미 아는 사실이다. 하지만, 저는 hair, top, bottom등에 대해 아이탬들을 가져와야됩니다.
따라서, 초기 endpoint부터 살펴보면,
1. https://maplestory.io/api/{region}/{version}/item 을 통해 모든 item을 가져올 수 있다.
ex) 모든 아이탬 중 하나만 출력해보면,
여기서 subCategory가 hair인 것만 parsing해서 hair들만 가져올 수 있다.
2. https://maplestory.io/api/{region}/{version}/item/{item_id}/icon 를 통해 특정 itemID의 icon을 가져올 수 있다.
위의 모든 item list를 제가 구분한 class에 맞게 json으로 id들을 저장해두고,
해당 endpoint로 icon을 가져와서 score를 비교하면 될 것 같다.
위의 과정을 통해 icon들을 가지고 있는 item id를 저장할 수 있었다.
위의 과정을 통해 4개의 class에 대한 ids를 저장하였다.
Architecture
위에서 추출한 icon들 기반으로 각 class별 score를 추출해서 class별 5개의 item을 추출하도록 해야겠다.
'Project > MapleGenerator' 카테고리의 다른 글
Charactor to Image Project Score계산 (0) | 2025.01.10 |
---|