mingming

솔데스크 Deepracer 경진대회 본문

AWS Service

솔데스크 Deepracer 경진대회

mingming_96 2023. 8. 9. 00:52

 

솔데스크학원에서   6.12에 진행된 Deepracer 경진대회에 출전했습니다. 간단한 후기와 소감을 적어보려고 합니다.

[ Deepracer ]

아마존에서는 머신러닝과 클라우드 활성화를 위해, 카메라 영상 기반의 자율주행을 간단히 실험해볼 수 있는 딥레이서를 2018년말에 출시했습니다. 딥레이서는 클라우드 기반의 시물레이터(로보메이커)강화학습 기계(세이지메이커)를 제공해 쉽게 머신러닝을 접할 수 있는 서비스입니다. 

 

[ 요금 정책 ]

AWS 에서 제공해주는 로보메이커세이지메이커로 강화학습을 진행하게 되는데 

가격이 상당히 부담이 아닐 수 없습니다. 

시간당 3.50 USD 아주 무시무시한 가격입니다. 프리티어 계정의 경우 1회에 한해서 10시간의 무료학습 

기회가 주어지지만 충분한 학습을 시키기엔 부족한듯 합니다.  

 

[ 트랙 정보 ]

AWS DeepRacer at re:Invent 2018 에 사용된 트랙을 사용하였습니다.

실제 콘솔에서 트랙을 고를 경우 역방향 주행을 하였습니다. 

 

[ 보상함수 ]

저희 팀은 트랙의 위치를 좌표로 표시해 해당 좌표로 주행 시 크레딧을 부여하는 방식의 보상함수를 사용했습니다.

def reward_function(params):
     
    center_variance = params["distance_from_center"] / params["track_width"]
     
    track_width = params['track_width']
    distance_from_center = params['distance_from_center']
    all_wheels_on_track = params['all_wheels_on_track']
    closest_waypoints = params["closest_waypoints"]
    waypoints = params['waypoints']
    heading = params['heading']
    speed = params['speed']
    abs_steering = abs(params['steering_angle'])
    MAX_SPEED = 3
 
    marker_1 = 0.12 * track_width
    marker_2 = 0.24 * track_width
    marker_3 = 0.36 * track_width
    marker_4 = 0.48 * track_width
     
    left_lane = [25,26,27,28,29,30,31,57,58,59,60,61,62,63,72,73,74,75,76,77,78,79,80,81,82,83,84,
                 101,102,103,104,105,106,127,128,129,130,131,159,160,161,162,163,164]
    right_lane = [38,39,40,41,42,43,44,45,46,85,86,87,88,89,90,91,91,93,94,95]
    center_lane = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
                    32,33,34,35,36,37,46,47,48,49,50,51,52,53,54,55,56,64,65,66,67,68,69,70,71,
                    96,97,98,99,100,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,
                    132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158]
    straight_lane = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,113,114,115,116,117,118,119,120,121,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155]
    left_end_lane = [31,32,33,63,64,65,110,111,112,133,134,135,136,137,138]
    right_end_lane = [45,46,47,48]
     
#     after_closest_waypoints = params["closest_waypoints"][1]
     
    # Calculate 3 markers that are at varying distances away from the center line
    reward = 2.1
     
    if all_wheels_on_track:
        reward += 1
    else:
        reward -= 1
    if closest_waypoints[1] in left_lane and params['is_left_of_center']:
        reward += 1
    elif closest_waypoints[1] in right_lane and not params['is_left_of_center']:
        reward += 1
    elif closest_waypoints[1] in center_lane and center_variance <0.4:
        reward += 1
    else:
        reward -= 1
     
    if closest_waypoints[1] in straight_lane and abs_steering < 5:
        speed = MAX_SPEED
     
    reward_distance=1
     
    if distance_from_center <= marker_1:
        reward_distance = 1.0
    elif distance_from_center <= marker_2:
        reward_distance = 0.7
    elif distance_from_center <= marker_3:
        reward_distance = 0.4
    elif distance_from_center <= marker_4:
        reward_distance = 0.1
    else:
        reward_distance = 1e-3  # likely crashed/ close to off track
    reward_all  = reward + reward_distance
    ABS_STEERING_THRESHOLD = 15
    if closest_waypoints[1] in straight_lane and abs_steering > 5:
        reward_all *=0.8
    elif closest_waypoints[1] in left_end_lane and abs_steering >10 and params['is_left_of_center']:
        reward_all *= 0.8
    elif closest_waypoints[1] in right_end_lane and abs_steering >10 and not params['is_left_of_center']:
        reward_all *= 0.8
    elif closest_waypoints[1] in center_lane and abs_steering > ABS_STEERING_THRESHOLD:
        reward_all *= 0.6
    else:
        reward_all = reward_all
 
    return float(reward_all)

 

[ 강화 학습 ]

 

 

빨간선 : Evaluating Average Percentage completation

초록선 : Reward Average

파란선 : Traing Average Percentage Completation

 

모델 생성 후 강화학습이 시작되면 일정 횟수의 Trainig  후 Evaluating 이 진행되는데 그때 얻은 결과값이 기록되게 됩니다.

여러번 강화학습을 반복하게되면 일정수준 이상으로 학습이 진행되지 않는걸 경험하실 수 있습니다.

그럴 땐 보상함수의 크레딧을 조금씩 조금 바꿔주면 좋습니다.  저희팀의 경우 왼쪽으로 코너를 돌 때 바퀴가 중앙선 기준 왼쪽에 위치한다면 더 많은 크레딧을 부여하는 방법으로 보상함수를 조금씩 수정하였습니다.  

아래 링크는 AWS 기술문서에서 제공하는 예제 보상함수입니다. 

예제 보상함수 

 

[ 강화학습 영상 ]

 

 

[ 대회 후기 ]

 

조금 냉정한 후기를 적어보겠습니다. 

 

1. RC CAR 

수업하는 반을 기준으로 1개의 반에 개의 RC CAR를 제공해 주었습니다. 

강화 학습한 모델 import 후 실제 트랙에서 테스트 해봤는데 카메라가 인식되지 않아 정상적인 테스트가 불가능했습니다. 

실제 대회중 정상작동하는 하나의 RC CAR로 대회를 진행했습니다.

 

2. 대회환경

 대회 준비에 아주 많은 공을 들여주신 것 같아 조금 감동이였습니다. 

팀명패 , 명찰, 팀전용 좌석 등등 꽤 세심한 부분까지 신경써 주셨습니다. 또한 공정한 결과를 위해 많은 직원분들이 

바쁘게 움직이며 고생해주셨습니다. 

3. 아쉬운 점 

사실 테스트 과정에서 RC CAR 이슈로 조금은 포기한 상태였습니다. 실제 주행 결과가 없으니 어떤 부분을 보완해야할지 막막하기도 했구요, 만약 처음부터 정상 작동하는 모델로 테스트를 했다면 조금 더 좋은 결과를 얻을 수 있지 않았을까 생각이 듭니다.  

 

[ 글을 마치며 ]

그래도 처음 학원에 들어와 팀원들과 협동하여 이뤄낸 결과물이었다는 점에서 큰 의미가 있다고 생각이 듭니다. 

서로 의견을 공유하고 방향성을 정하기 위해 회의하면서 한 팀이라는 소속감도 느낄 수 있었습니다.