Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

지극히 개인적인 개발블로그

유니티 머신러닝 4. 다른 예제 실습 본문

카테고리 없음

유니티 머신러닝 4. 다른 예제 실습

코드분쇄기 2019. 8. 19. 21:41

https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Learning-Environment-Create-New.md

 

Unity-Technologies/ml-agents

Unity Machine Learning Agents Toolkit. Contribute to Unity-Technologies/ml-agents development by creating an account on GitHub.

github.com

이 블로그를 참고하였음을 알려드립니다.

 

 

이번 게시글에서는 만들어진 게임이 아닌, 직접 만든 게임을 가지고 머신러닝을 진행해 보겠습니다.

직접 만든 게임이라고 해봐야 높은 수준은 아니니 유니티를 처음 하시는 분들이라도 어렵지 않게 할수 있습니다.

 

1. 새로운 프로젝트를 만들자

유니티 프로젝트를 만들고 ML-Agent toolkit를 임포트 하겠습니다.

 

(1)새로운 프로젝트를 만들어 줍시다. 이름은 RollerBall로 하겠습니다.

(2)스크립팅 런타임 버전이 .NET 4.x Equivalent인지 확인해 줍시다. 확인 하는 방법은 저번 게시글에 나와있습니다.

(3)UnitySDK/Asset폴더 안에 GizmosML-Agents폴더가 있을겁니다. 이 폴더들을 유니티 Asset에 넣어줍시다.

왼쪽사진에 있는 2개의 폴더를 넣어주자. 오른쪽처럼 나오면 된다.

2. 환경을 만들자

(1)바닥을 만들어주고 이름을 Floor로 합니다.

Hierarchy Window에서 진행한다.

(2)아래 스크린샷처럼 설정을 바꿔줍시다.

(3)위 방법대로 타켓을 만들어 줍시다. 3D Object->Cube선택. 이름은 "Target"

(4)Element 0nt 0는 Block로  하겠습니다.

 

위치도 설정해줘야 한다.

(5)이젠 Agent를 만들겠습니다. 3D Object -> Sphere선택. 이름은 "RollerAgent"

(6)Element 0은 CheckerSquare로 하겠습니다. 그 후에 Add Component를 누르고  Physics/Rigidbody도 적용해 줍시다. 충돌박스를 설정해 주는 겁니다.

(7)Empty Object를 만들어 줍니다. 이름은 "Academy"

 

3.아카데미 보강

(1)Academy에 새로운 스크립트를 추가해줍시다. 이름은 RollerAcademy.

(2)해당 스크립트 파일을 열어서 수정해 줍시다.

using MLAgents;

public class RollerAcademy : Academy { }

default함수인 start()와 update()함수는 삭제해 줍시다.

(3)Barin Asset을 만들어주겠습니다. 첫번째 Brain이름은 RollerBallBrain, 두번째 Brain이름은 RollerBallPlayer입니다.

(4)RollerAgent에 스크립트를 하나 추가해줍시다. RollerAgent.cs의 내용은 아래와 같습니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MLAgents;

public class RollerAgent : Agent
{
    Rigidbody rBody;
    // Start is called before the first frame update
    void Start()
    {
        rBody = GetComponent<Rigidbody>();
    }
    public Transform Target;
    public override void AgentReset()
    {
        if(this.transform.position.y <0)
        {
            //IF the Agent fell, zero its momentum
            this.rBody.angularVelocity = Vector3.zero;
            this.rBody.velocity = Vector3.zero;
            this.transform.position = new Vector3(0, 0.5f, 0);
        }

        //Move the target to a new spot
        Target.position = new Vector3(Random.value * 8 - 4, 0.5f, Random.value * 8 - 4);
    }
}

(5)그 이외에 필요한 함수도 전부 작성하겠습니다.

public override void CollectObservations()
    {
        //Poisition of the target
        AddVectorObs(Target.position);

        //Position of the Agent itself
        AddVectorObs(this.transform.position);

        //the velocity of the Agent
        AddVectorObs(rBody.velocity.x);
        AddVectorObs(rBody.velocity.z);

    }
    public float speed = 10;
    public override void AgentAction(float[] vectorAction, string textAction)
    {
        //Actions, size = 2
        Vector3 controlSignal = Vector3.zero;
        controlSignal.x = vectorAction[0];
        controlSignal.z = vectorAction[1];
        rBody.AddForce(controlSignal * speed);

        //Rewards
        float distanceToTarget = Vector3.Distance(this.transform.
            position, Target.position);

        //Reached target 
        if(distanceToTarget < 1.42f)
        {
            SetReward(1.0f);
            Done();
        }

        //Fell off platform
        if(this.transform.position.y < 0)
        {
            Done();
        }
    }

(6)유니티로 돌아와서 RollerAgent를 수정하겠습니다.

색깔에 맞게 잘 배치해 주세요.

(7)RollerBallBarin과 RollerBallPlayer의 설정도 바꿔줍시다.

  

(8)RollerBallPlayer Asset을 열어줍시다. Key continuous Player Actions창을 열고 아래와 같이 작성해 줍시다.

(9)