Code Name : Cherry | Level : CLASSIFIED | Declassified : 2021-07-24
이런 기믹성 글은 포스팅하고 싶지 않지만 이게 정말 웃긴 이야기이기도 하고 프로젝트에 들인 시간이 있다보니 소개를 안할 수 없을 것 같습니다. 일단 시작해보겠습니다. 친구에게 전화를 걸어 뭘 하고 있는가 물어본적이 있었습니다. PC방에서 약초 캐고 있답니다. 저는 메이플스토리를 하지 않아서 그게 무슨 헛소리인가 하고 들었는데, 단순히 요약해보니
"쥬니퍼베리라는 아이템을 캐다 보면 확률적으로 돈이 되는 아이템이 나온다. 이걸 한 시간 내내 캐면 4000원 정도 벌 수 있다."
정도의 이야기를 해줬습니다. 이후에 PC방을 한 번 같이 간 적이 있는데, 아니 친구 두 명이 돈이 없다고 한 시간 내내 쥬니퍼베리가 스폰되는 것을 찾아다니며 캐고 있는 겁니다. 그때 눈이 살짝 트였습니다. 잠깐, 이거 매크로를 만들어서 PC방 컴퓨터 6대분량을 돌려버리면...PC방비 빼고 아무것도 안해도 시급이 18,000원이잖아? 그럼 컴퓨터 12대를 돌리면 시급이 36,000원, 하루 4시간만 PC방 아이스커피만 먹으면서 돌려도 하루에 144,000원... 머리 속에서 계산이 돌아가니 행동이 앞섰습니다. 아, 그 날로 쥬니퍼베리 캐는 매크로를 만들어야겠다는 결심이 앞섰습니다. 프로젝트를 시작했습니다. 코드명 Cherry.
불법의 영역은 수면 위로 드러나지 않는다. 하지만 난 나의 길을 간다.
막상 웹서핑을 해보니 생각보다 잘 알려진게 없었습니다. 알려졌다 해도 결국에는 돈이 오가는 어둠위 판이라 저같이 귀여운 꼬마친구가 발디딜 곳이나 그런 정보를 찾기가 어려웠습니다. 있다 해도 그런 정보들은 대개 baidu, tencent에 있겠지요. 그래도 일단 한 번 해 보기로 했습니다. 인생 게임은 수 없는 퀘스트의 연속이라 생각했었습니다. 당시 저는 막 딥러닝 기술을 습득했기에 딥러닝으로 메이플 매크로를 만들어야 하는 퀘스트를 해결해야 했습니다. 그래야 다음 퀘스트가 뭔지 알게 되었을테니까요.
엉터리 개발자는 어떻게 매크로를 만들었을까?
로직은 간단했습니다. 일단은 쥬니퍼베리를 캐는 맵까지 일단 수동으로 워프시키고 나서 매크로를 실행시킵니다. 캐릭터가 맵을 배회하도록 하다가, 어느 순간 쥬니퍼베리가 보이거나, 스폰되는 순간 바로 그쪽으로 달려가서 쥬니퍼베리를 캐고 드랍된 아이템을 챙기도록 하는 식이었습니다.
Language | Python | ML Framework | PyTorch 1.9.0 |
Computer Vision | pywin32+OpenCV + YOLOv3 | CUDA | Toolkit 10.2 + cuDNN |
Control | PyAutoGUI + pynput | GPU | GTX1060 6G |
일단은 그렇게 조작하기 위해서는 눈과 손이 필요했습니다. 눈은 YOLO(You Only Look Once)v3를 사용했고, input image는 게임 창의 이미지가 실시간으로 YOLOv3 모델에 입력되도록 했습니다. 손은 PyAutoGUI를 사용해 제작한 매크로 알고리즘을 수행하도록 했습니다.
YOLOv3
게임을 1분 동안 하면서 영상을 녹화하고 이 모든걸 프레임별 사진으로 나눈 후 프로그램을 사용해 각각의 border를 구분지어 데이터 라벨링을 했습니다. Object 종류는 정확히 기억나지 않지만 대략 아래같은 형태로 나누었습니다.
게임 화면을 위의 Object로 구성해 약 1000개 이미지를 직접 Labeling했습니다. 이후 Google Colab에 올려서 약 1000epoch 정도 학습을 시켜 weight를 얻은 후 이를 로컬에서 돌렸습니다.
Done!
오늘 다시 매크로를 설치해봤습니다. Object Detection은 여전히 잘 되고 돌아다니다 알아서 쥬니퍼베리까지 가는 것도 됩니다. 이제 매크로가 약초를 캐려니 화살표가 흔들리는 방향을 맞추라는 매크로 방지 장치가 갑자기 튀어나옵니다. 제 매크로는 저걸 맞출 수 없습니다. 당시에는 저런게 없었거든요. 그래서 저 부분에서는 매크로를 중지하고 제가 맞추려 했으나 실패했습니다. 결국 진실의방에 끌려갔다 나왔습니다.
당시에는 잘 되었습니다. 근데 화살표 인식률이 좋지 않았고 그걸 틀릴 때마다 나오는 거짓말탐지기를 해결할 방법을 못찾아 제대로 써먹기는 어려웠습니다. 결국 이 프로젝트는 폐기했습니다. 동시에 PC방에서 아이스커피 빨면서 돈벌 생각했던 제 꿈도 산산조각 났습니다. 아..저는 PC방 사장이 되어서 컴퓨터 일부분을 심마니로 굴릴 생각까지 하고 있었는데..안타까웠습니다. 능력의 한계인지 착하게 살라는 하늘의 뜻인지
돌이켜 보니 굳이 이미지 1000개씩 라벨링 해가며 할 필요가 있었나 싶습니다. Deep Learning이 deux ex machina같은 게 아니라는걸 좀만 일찍 알았다면 그러진 않았을텐데..싶지만 또 그때는 딥러닝 뽕에 차있던 시기라 그때의 저는 어떻게든 Deep Learning을 써먹어보기 위해 Labeling 노가다를 했을 것 같습니다.
결론
1. 이제보니 생각보다 중구난방으로 코드가 짜져 있어 다 뜯어 고칠까 했다가 너무나 소모적일것 같아서 일단 더이상 손 안대기로 했습니다.
2. 사실 메이플같은 게임에서 YOLO를 사용하는건 너무 무거우면서도 확실치 못한 해결책입니다. 지금 다시 만든다면 적당히 bitmap searching 해서 유사도를 평가하는 방식으로 Computer Vision을 구현하지 않을까 싶습니다.
3. 덕분에 Object Detection에 관한 Insight와 활용하는 방법에 대해서는 제대로 배워가는 좋은 계기가 되었습니다. 다음에는 이렇게 배운것을 계기로 조금 더 의미있는 일을 해 볼까 합니다. 기대해주세요.
4. 이 아이디어를 제공해준 사이버 심마니 친구와 최근 이 매크로에 관해 다시 이야기를 나눠봤습니다. 지금은 메이플의 게임적 가치가 많이 떨어져 매크로를 써도 수익이 거의 안나온답니다. 이런 조심스러운 글을 올려도 괜찮은 시점으로 보이기도 하고 또 마침 시간적 여유도 어느정도 있어 이렇게 비밀을 해제합니다. 음...돈은 정직하게 벌어야겠습니다.
글이 도움이 되셨다면 왼쪽 하단의 ❤️와 광고 클릭 부탁드립니다. 고마움을 표현하는 가장 쉬운 방법입니다.