ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 데이터 모으기
    유니티/PathFinder_3Cushion 2021. 4. 12. 16:41

    아무리 찾아봐도 3쿠션 길에 대한 데이터를 찾을 수 없었다,

    당구에 대한 데이터를 찾으면 어떤 선수의 승률이나 공에 대한 이미지만 있었다.

    더 찾아보면 어디엔가 있을 수 있지만 찾기 힘들어서 직접 만들기로 했다.

     

    처음엔 영상을 보면서 한땀한땀 좌표들을 기록하려고 했으나

    시간이 남아도는거도 아니고 그건 아닌거 같았다.

     

    그래서 유니티를 이용했다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

    화질이 안좋다.

    포인트를 기록하는데에는 조건이 있었다.

     

    1. 유니티상 댕구대의 가로 세로 비율은 실제 당구대의 비율로 한다. 당구공도 실제 비율로 한다.

    2. 노란색공부터 시작한다.

    3. 경로는 공 -> 쿠션1 -> 쿠션2 -> 쿠션3 -> 다른공이다.

    4. 입사각과 반사각만을 생각하고 힘과 회전은 고려하지 않는다.

     

    이 조건으로 유니티를 이용해 스크립트를 작성해서 위의 GIF 처럼 노란색 공이 경로를 탐색하게 했다.

    경로를 탐색하게되면 스크린샷을 저장하고 좌표를 csv로 저장한다.

    5초 뒤에 경로를 재탐색하고 3000번 탐색하면 자동종료된다.

     

    - 스크린샷을 저장하는 이유

    못쓸 경로(왼쪽), 쓸 수 있는 경로(오른쪽)

    하지만 힘과 회전을 고려하지 않고 그냥 각도만 생각했기 때문에

    경로를 못쓸 경로를 탐색할 수 있다. 위 이미지의 왼쪽 경로의 경우가 그렇다.

    스크린샷으로 경로를 보고 쓸 수 있을 경로들을 걸러냈다.

    - 좌표를 csv 형식으로 저장

    경로를 찾았을때 좌표

    경로를 찾으면 위와 같은 좌표들을 얻을 수 있다.

    0 = 노란색공, 1 = 다른공, 2~ 4 = 쿠션, 5 = 다른공

    이 좌표들을 csv형식으로 저장했다.

     

    저장 폴더들

    datas에는 csv파일이 저장된다.

    images에는 스크린샷이 저장되며 손으로 걸러낸 스크린샷은 Selected에 저장된다.

    스크린샷의 파일명을 csv의 인덱스로 했으므로 Selected에 있는 파일명을 이용해서

    쓸 수 있는 좌표들을 csv 파일에서 걸러내려고 한다.

     

    - 쓸만한 좌표만 가져오기

    # !cd /content/gdrive/MyDrive/DataProcessing/
    
    # 이곳의 구글드라이브 경로
    path_root = '/content/gdrive/MyDrive/DataProcessing/'
    
    # 데이터가 있는 폴더명
    path_dir = ['Day1', 'Day2', 'Day3', 'Day4']
    
    # 데이터는 16개의 열로 저장되어있다. 각 열의 이름들.
    first_row = ['Yellow_x', 'Yellow_y', 'red_x', 'red_y', 'white_x', 'white_y',
                 '1_x', '1_y', '2_x', '2_y', '3_x', '3_y', '4_x', '4_y', '5_x', '5_y']

    추출을 4일동안만해서 폴더는 Day1 ~ Day4까지 밖에 없다.

    파일들을 구글드라이브에 올리고 구글 코랩을 이용했다. 

     

    좌표들은 총 16개 저장된다.

    처음 6개 좌표는 공들의 좌표고, 나머지 좌표는 포인트들의 좌표다.

    나머지 좌표 중 1번과 5번은 공의 좌표로 2~4는 쿠션의 좌표다.

    with open('/content/gdrive/MyDrive/DataProcessing/selected_data_float.csv', 'a', newline='') as selected_path:
    
      # csv 모듈사용
      selected_data = csv.writer(selected_path)
      # 열목록을 먼저 저장
      selected_data.writerow(first_row)
    
      # path_dir 리스트에 있는 폴더명으로 각 데이터에 접근한다
      for dir in path_dir:
        path = path_root + dir
        print(path)
        
        # 데이터파일
        pathdata = open(path + '/datas/pathdata.csv', 'r')
        datas = csv.reader(pathdata)
        # 리스트로 변환한다
        list_datas = list(datas)
        pathdata.close()
    
        # 선별된 경로 이미지의 이름 리스트
        images = os.listdir(path + '/Selected')
        print(len(images))
    
    
        for image in images:
          # .jpg를 제외한 이미지의 이름을 인덱스로 이용해 저장데이터에 접근한다.
          data_idx = int(image[:-4])
          for i, data in enumerate(list_datas[data_idx]):
            if i % 2 == 0:
              # x좌표 0.0~1.0 스케일링
              list_datas[data_idx][i] = float(data) / 20.
            else:
              # y좌표 0.0~1.0 스케일링
              list_datas[data_idx][i] = float(data) / -10.
          selected_data.writerow(list_datas[data_idx])

     

    Day1 ~ Day4 폴더의 datas에 있는 csv파일과 Selected 폴더에있는 스크린샷의 이름을 이용해서

    쓸 수 있는 좌표만을 가져와 새로운 csv파일을 만들었다. 파이썬의 csv 모듈을 사용했다.

    좌표를 저장할때 0.0 ~ 1.0으로 스케일링해서 저장했다.

     

    유니티상에서 당구대 가로 길이는 20이었고 세로 길이는 10이었다.

    세로 길이의 경우 좌표가 음수였기 때문에 -를 붙여서 스케일링했다.

     

    저장된 좌표들

    이렇게 유니티를 이용해 찾은 좌표 중에 쓸만한 좌표들을 가져와 스케일링해서 저장했다.

    이제 이 좌표를 OpenCV를 이용해 그려보고 신경망을 만들어 학습시켜야 한다.

    데이터양도 너무 적어서 더 필요할거 같다.


    데이터 만드는 일이 이렇게 끔찍한일인줄은 몰랐다.

    힘들겠다라고 생각은 했지만 이렇게 손이 많이가고 필요한게 많을지는 상상도 못했다.

    하루 데이터만드는데 6~7시간 정도 걸렸다. 3000개 뽑으면 그중에서 300개 정도 좌표만 쓸만했다.

     

    그리고 데이터를 다루기 위해서는 그 데이터에 대한 기본지식이 있으면 매우 도움되겠다라는 생각을 했다.

    당구에 대한 지식이 별로 없으니 쓸만한 좌표를 거를때도 시간이 많이걸렸다.

    이 길이 맞는건지 실제로 공이 이렇게 있으면 이렇게 칠건지 등등 생각할게 많았다.

     

    그리고 이 데이터는 힘과 회전을 고려하지 않고 유니티를 이용해 각도만 찾아서 했기 때문에

    정확한 데이터라고 할 수도 없다. 그래서 자꾸 쓸만한 좌표라고 말했다.

    실제로 3쿠션만이 아니라 더 많은 쿠션을 사용하기도 한다.

    이 데이터는 3쿠션만을 이용하기 때문에 학습도 잘 안되고 정확도도 낮을거 같다. ㅜㅜ

     

    어느 글에서 머신러닝의 모델을 어떻게 만들지는 데이터의 영향을 많이 받는다고 봤는데

    뭔소리인지 몰랐지만 이거하면서 조금 알게된거 같다.

    '유니티 > PathFinder_3Cushion' 카테고리의 다른 글

    좌표 가져오기  (0) 2021.04.10
    제작의도  (0) 2021.04.05
Designed by Tistory.