요약 정리 

클래스란 무엇인가?

클래스는 컴퓨터 메모리에 있는 객체를 사용할 수 있는 설계도라 생각할 수 있다.
클래스는 객체에 사용할 수 있는 데이터와 기능을 저장한다. 

클래스는 또한, 객체에 속하지 않는 클래스 자체에 속하는 데이터와 기능을 저장할 수 있다.
이는 주로 전역적으로 이용되는 기능을 제공할 때 사용된다. 


접근 한정자(public, private, protected, internal) ?

사진 출처 : https://edmundtips.tistory.com/12

monobehaviour 이란?

게임 오브젝트에 custom behaviour를 프로그래밍하기 위해서 사용된다.
.Net프레임워크의 다중 프레임워크 구현인 Mono프로젝트를 사용함. 
(그래서 이름이 Mono + Behaviour임.)


namespace 란?

코드를 위한 도메인이라고 생각하면 된다. 
namespace는 코드를 조직화하고 이름간의 중복 오류로 인한 충돌을 방지한다.

namespace를 사용하기 위해서 계속 앞에 붙이는 것이 번거롭기에
컴파일러에게 미리 namespace를 찾아두라고 말할 수 있다. 
코드의 맨 앞에 using namespace;의 형태로 사용한다. 


structure란?

structure는 class와 유사하게 설계도의 역할을 합니다. 
다만, class와는 다르게 객체를 생성하는 것이 아닌, 값(정수 혹은 색상)을 생성합니다. 
class와 정의하는 방법이 같습니다. 


const란?

수정하지 않을 값. 필드(객체에서 속성, 변수)일 필요가 없음.
컴파일할 때 계산된다. 숫자와 같은 기본 유형에서만 가능함. 


시계 코드 

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System
using UnityEngine;
 
public class Clock : MonoBehaviour 
{
    public Transform hoursTransform, minutesTransform, secondsTransform;
    const float degreesPerHour = 30f;
    const float degreesPerMinute = 6f;
    const float degreesPerSecond = 6f;
 
    public bool Continous; 
 
    private void Update()
    {
        if (Continous)
        {
            ContinousTime();
        }
        else
            DiscreteTime();
    }
 
    //digital적으로 시계추 움직임 
    private void DiscreteTime()
    {
        //시간 데이터 받아오기 
        DateTime time = DateTime.Now;
        //회전 
        hoursTransform.localRotation = Quaternion.Euler(0f, time.Hour * degreesPerHour, 0f);
        minutesTransform.localRotation = Quaternion.Euler(0f, time.Minute * degreesPerMinute, 0f);
        secondsTransform.localRotation = Quaternion.Euler(0f, time.Second * degreesPerSecond, 0f);
    }
 
    //analog적으로 시계추 움직임 
    private void ContinousTime()
    {
        //시간 데이터 받아오기 
        TimeSpan time = DateTime.Now.TimeOfDay;
        //회전 
        hoursTransform.localRotation = Quaternion.Euler(0f, (float)time.TotalHours * degreesPerHour, 0f);
        minutesTransform.localRotation = Quaternion.Euler(0f, (float)time.TotalMinutes * degreesPerMinute, 0f);
        secondsTransform.localRotation = Quaternion.Euler(0f, (float)time.TotalSeconds * degreesPerSecond, 0f);
    }
}
cs

완성된 영상 


관련링크 
https://catlikecoding.com/unity/tutorials/basics/game-objects-and-scripts/


Posted by 도이(doi)
,

1. tutorial 따라서 가상환경 설치하기.



2. mkdir 디렉토리 설정 전에,

원하는 폴더 생성 이동해서 디렉토리 생성하기 


3. pytesseract homebrew 설치하기 

brew install tesseract


4. ocr script 생성한 디렉토리에 만듦. 

ocr script.py


5. script 작성 : bounding 박스로 위치 받아오는 링크



6. images 폴더 만들어서 image 넣어주고 스크립트의 image 이름 바꿔주기

'programming' 카테고리의 다른 글

Unity Seminar week01 - gpu Instancing  (0) 2019.08.06
Posted by 도이(doi)
,



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

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using System.Linq; 

 

//obj data class(위치, 크기, 회전값)

public class ObjData

{

    public Vector3 pos;

    public Vector3 scale;

    public Quaternion rot;

 

    //위치, 회전, 크기에 대한 정보 행렬 가져오기 

    public Matrix4x4 matrix

    {

        get

        {

            return Matrix4x4.TRS(pos, rot, scale);

        }

    }

    //현재 위치 저장 

    public ObjData(Vector3 pos, Vector3 scale, Quaternion rot)

    {

        this.pos = pos;

        this.scale = scale;

        this.rot = rot;

    }

}

 

//생성자 class

public class Spawner : MonoBehaviour

{

    public int instances; // obj 생성 개수 

    public Vector3 maxPos; // 생성 박스의 크기 

    public Mesh[] objMeshes; // obj의 형태 

    public Material[] objMats; // obj의 매트리얼 

 

    //batch 리스트 

    private List<List<ObjData>> batches = new List<List<ObjData>>();

    private List<int> MeshList = new List<int>();

    private List<int> MatList = new List<int>();

 

    void Start()

    {

        int batchIndexNum = 0;

        //현재 objdata 리스트를 새로운 objdata리스트에 저장

        List<ObjData> currBatch = new List<ObjData>(); 

        for(int i=0; i<instances; i++)

        {

            AddObj(currBatch, i); //objData리스트 넘버링 

            //objData리스트의 형태 : [currBatch, 1], [currBatch, 2]...

            batchIndexNum++;

 

            //batchIndexNum이 1000을 주기로 batches리스트에 새로운 objData 리스트를 추가

            //(리스트의 열이 늘어나는 것으로 생각)

            if(batchIndexNum >= 1000)

            {

                batches.Add(currBatch);

                currBatch = BuiildNewBatch();

                batchIndexNum = 0;

            }

        }

        

        for(int i=0; i<batches.Count; i++)

        {

            int objMeshIndex = Random.Range(0, objMeshes.Length);

            int objMatIndex = Random.Range(0, objMats.Length);

            MeshList.Add(objMeshIndex);

            MatList.Add(objMatIndex);

        }

        

    }

 

    void Update()

    {

        RenderBatches();

    }

 

    //위치 지정 

    private void AddObj(List<ObjData> currBatch, int i) 

    {

        Vector3 position = new Vector3(Random.Range(-maxPos.x, maxPos.x), Random.Range(-maxPos.y, maxPos.y), Random.Range(-maxPos.z, maxPos.z));

        currBatch.Add(new ObjData(position, new Vector3(222), Quaternion.identity));

    }

 

    private List<ObjData> BuiildNewBatch()

    {

        return new List<ObjData>();

    }

 

    //object를 그리는 

    private void RenderBatches()

    {

        //fixed

        //for(int i=0; i<batches.Count; i++)

        //{

        //    Graphics.DrawMeshInstanced(objMeshes[MeshList[i]], 0, objMats[MatList[i]], batches[i].Select((a) => a.matrix).ToList());

        //    //batches[i] 즉, batch 안에 있는 원소들을 개별적으로 선택해서 matrix연산(matrix행렬로 변환)을 적용시킨 후, list로 변환. 

        //}

 

        //random

        foreach(var batch in batches)

        {

            Graphics.DrawMeshInstanced(objMeshes[Random.Range(0, objMeshes.Length)], 0, objMats[Random.Range(0, objMats.Length)], batch.Select((a) => a.matrix).ToList());

        }

    }

}

 

Colored by Color Scripter

cs


*material - 'enable instancing' chk

'programming' 카테고리의 다른 글

OCR(optical character recognition)  (0) 2019.08.06
Posted by 도이(doi)
,

스타일 트랜스퍼(style transfer) 

 CNN(convolutional neural network) 


스타일 트랜스퍼(style transfer)?

스타일 이미지를 학습시킨 후에, 콘텐츠 이미지에 적용시키는 것. 

ex) 반고흐 이미지를 스타일 이미지로 정함. 
반고흐 이미지를 내 얼굴 사진의 스타일을 바꾸는 필터로 사용하는 것을
스타일 트랜스퍼라고 이해할 수 있다. 

CNN(convolutional neural network : 합성곱 신경망)?

머신러닝을 사용할 때 어떤 식으로 학습시킬지 미리 graph를 설계한다. 

CNN은 model의 설계 방식 중 하나라고 생각하면 된다.

CNN의 특징은 학습시킬 대상의 특징을 가져온다. 


Neural Network란?


튜토리얼에서 사용하는 Neural Network 모델은 vgg16이다. 

vgg16은 16개의 레이어로 구성된 CNN(합성곱 신경망)이다.

스타일 이미지와 콘텐츠 이미지의 loss(손실) 값을 줄여서
두 이미지의 차이를 줄여 콘텐츠 이미지에 스타일을 적용시키기 위해서 사용된다. 


과정

<전처리>
  • 라이브러리 import
  • 이미지 전처리 (생략) 
<머신러닝>
  • 손실함수 만들기(MSE)
    • 콘텐츠 손실함수
    • 스타일 손실함수 (gram matrix)
    • 노이즈 제거 손실함수 
  • 스타일 트랜스퍼 알고리즘
    • 손실함수에 gradient descent(기울기) 적용
    • 손실함수 정규화 

<실행>
  • 콘텐츠, 스타일 이미지 가져오기
  • 콘텐츠 레이어 아이디 지정 
  • 스타일 레이어 아이디 지정(하위 레이어 / 상위 레이어)
  • 스타일 트랜스퍼 실행 (손실함수 최적화)

그람행렬 - 자기 자신에 전치행렬(90 돌린) 곱한

사용이유는 스타일에만 집중할 있도록 하기 위해서이다. 컨텐츠에는 적용되지 않는다.


손실함수는 컨텐츠 이미지와 mixed이미지 손실을 MSE를 사용해서 구한다.


Session은 




Reference

https://www.youtube.com/watch?v=YoBEGQD3LCc

Posted by 도이(doi)
,