0517 AI Machine Running

2021. 5. 17. 18:22unity/AI

훈련 모델: 
1. 비지도 훈련 : 자체적으로 데이터셋을 검사하고 분리하는 작업을 수행
2. 지도 훈련: 데이터 과학 분야의 머신 러닝 방법 중 대다수가 예측 또는 분유를 수행하는데 사용한다.
3. 강화 학습:
제어 이론에 기초한 것으로 환경에 대한 초기 상태나 모델없이 학습하는 기법을 제공
에이전트(대상)는 환경(어디서 학습) 속에서 모델링되고 그들의 행동을 기준으로 보상(학습 후 보상)을 받음
4. 보강 학습: 모방 할 행동을 보여주면 에이전트가 모방한다.
5. 커리큘럼 학습 : 문제를 복잡도에 따라 쪼개서 처리하는 진일보한 학습 형태.
6. 딥러닝: 다양한 형태의 내부 훈련 매커니즘을 사용해서 신경망을 훈련함.

강화 학습
보상을 통해서 학습을 수행한다.
시행착오에 따라서 보상을 주게 되고, 계속 보상의 수치를 바꿔가면서 학습을 시킨다.

로코모션 Locomotion 애니메이션이 부자연스럽다.
딥미믹 DeepMimic 딥러닝+이미테이션

agent : 상태 정보와 보상정보를 가지고 행동을 함 (학습) (파이썬 기반)
environment : 상태랑 보상 정보를 에이전트와 주고 받을 수 있는 환경(유니티)

 

 

유니티 패키지 매니저에서 ML-Agent 임포트

https://github.com/Unity-Technologies/ml-agents 

 

Unity-Technologies/ml-agents

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

github.com

릴리즈 17버전 다운로드 필요

 

https://github.com/Unity-Technologies/ml-agents/blob/main/docs/Getting-Started.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

https://github.com/Unity-Technologies/ml-agents/blob/main/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

위의 다큐멘테이션을 따라한 결과물

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Actuators;

public class RollerAgent : Agent
{
    Rigidbody rigidBody;
    public Transform target;
    public float forceMultiplier = 10;

    // Start is called before the first frame update
    void Start()
    {
        this.rigidBody = GetComponent<Rigidbody>();
    }

    public override void OnEpisodeBegin()
    {
        if (this.transform.localPosition.y < 0)
        {
            this.rigidBody.angularVelocity = Vector3.zero;
            this.rigidBody.velocity = Vector3.zero;
            this.transform.localPosition = new Vector3(0, 0.5f, 0);
        }
        //에피소드가 끝나면 큐브를 랜덤 장소로 이동
        this.target.localPosition = new Vector3(Random.value * 8 - 4, 0.5f, Random.value * 8 - 4);
    }

    public override void CollectObservations(VectorSensor sensor)
    {
        //큐브와 구의 위치
        sensor.AddObservation(this.target.localPosition);
        sensor.AddObservation(this.transform.localPosition);

        //에이전트의 속도
        sensor.AddObservation(rigidBody.velocity.x);
        sensor.AddObservation(rigidBody.velocity.z);
    }

    public override void OnActionReceived(ActionBuffers actions)
    {
        //파이썬 api로부터 전달받은 값으로 행동을 한다.
        Vector3 controlSignal = Vector3.zero;
        controlSignal.x = actions.ContinuousActions[0];
        controlSignal.z = actions.ContinuousActions[1];
        this.rigidBody.AddForce(controlSignal * forceMultiplier);

        //보상을 준다.
        float distanceToTarget = Vector3.Distance(this.transform.localPosition, this.target.localPosition);

        //구가 큐브랑 닿으면 보상을 준다.
        if (distanceToTarget < 1.42f)
        {
            SetReward(1f);
            EndEpisode();
        }
        //구가 플레인에서 떨어졌다면 에피소드 종료
        else if (this.transform.localPosition.y < 0)
        {
            EndEpisode();
        }
    }

    //직접 테스트 해보는 코드
    public override void Heuristic(in ActionBuffers actionsOut)
    {
        var continuousActionsOut = actionsOut.ContinuousActions;
        continuousActionsOut[0] = Input.GetAxis("Horizontal");
        continuousActionsOut[1] = Input.GetAxis("Vertical");
    }
}

 

OnEpisodeBegin()
각각의 에피소드는 에이전트가 task를 풀었을 경우와 실패했을 경우 재실행되는데,
위의 함수는 에피소드가 종료 되었을 때 환경을 재시작 해준다.
지금의 경우엔 큐브가 맵에 랜덤 생성되고, 구의 위치가 재배치 되는 형식이다.
위의 코드에선 구가 플레인 밖으로 떨어졌을 경우와 큐브를 제대로 찾았을 때 두 가지 경우로 나누었다.


CollectObservations(VectorSensor sensor)
에이전트는 수집한 정보를 brain에 전송하여 결정을 내리는데 사용된다.
에이전트를 훈련하면 데이터가 신경망에 공급된다. 그러기 위해선 올바른 정보를 제공해야하는데,
지금의 경우엔 큐브의 위치, 에이전트 자체의 위치 및 에이전트의 속도를 제공해서
속도를 제어하는 방법을 익히도록 한다.
public override void CollectObservations(VectorSensor sensor)
{
    // Target and Agent positions
    sensor.AddObservation(Target.localPosition); //x,y,z
    sensor.AddObservation(this.transform.localPosition); //x,y,z

    // Agent velocity
    sensor.AddObservation(rBody.velocity.x); //x
    sensor.AddObservation(rBody.velocity.z); //z
    
    위치와 속도 정보 8개를 보내게 된다.
}


OnActionReceived()
위의 함수는 보상을 주는 함수이다.
위의 코드에선 구가 큐브에 닿았을 시엔 +1의 보상을 주었고,
플레인에서 떨어졌을 땐 보상을 주지 않고 에피소드를 종료시켰다.

Decision Requester 컴포넌트를 꼭 붙혀야 한다.

 


 

 파이썬 3.6.2 이상의 버전 다운로드 후

pip3 install torch~=1.7.1 -f https://download.pytorch.org/whl/torch_stable.html

 

https://download.pytorch.org/whl/torch_stable.html

 

download.pytorch.org

 cmd 에서 위의 것을 다운받아준다.

https://github.com/Unity-Technologies/ml-agents/blob/main/docs/Installation.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

↑ 내용은 위에 나와있다.

 

python -m pip install mlagents==0.26.0

다음엔 위의 것을 다운받아주고

C:\Users\TJOEUN\Documents\WorkSpace\ml-agents-release_17\ml-agents-release_17\config\ppo

에서 yaml 파일 하나 복사해서 RollerBall로 파일명을 바꿔준다.

파일을 비쥬얼 스튜디오로 오픈

둘이 이름이 같아야 한다.

cd C:\Users\TJOEUN\Documents\WorkSpace\ml-agents-release_17\ml-agents-release_17

mlagents-learn config/ppo/RollerBall.yaml --run-id=RollerBall

위의 것을 프롬프트에 타입한다.

성공하면 휴리스틱이 아닌 디폴트로 재생을 누르면 훈련을 시작한다.

위와 같은 문구가 뜨면 드디어 되는 거다......
12000번에 한 번씩 업데이트된다.
열심히 알아서 훈련 중...

 

result 폴더에서 저 파일을 끌어다 유니티 프로젝트 란에 넣고
onnx 파일을 저 칸에 assing 하면 된다.

 

50만번의 훈련이 완료되어서 되어서 이제 스스로 큐브를 찾아간다.

 

'unity > AI' 카테고리의 다른 글

0525 AI 펭귄  (0) 2021.05.25