perpet

wave function collapse test

 

맵생성 뿐 아니라 , 모델 오브잭트 자동 생성을 하고 싶다.

 

추가적으로 딥러닝을 응용해서 시도 하고 싶다.

 

 

 

 

github.com/perpet99/DeBroglie

 

perpet99/DeBroglie

DeBroglie is a C# library implementing the Wave Function Collapse algorithm with support for additional non-local constraints, and other useful features. - perpet99/DeBroglie

github.com

 

github.com/perpet99/WaveFunctionCollapse

 

perpet99/WaveFunctionCollapse

Bitmap & tilemap generation from a single example with the help of ideas from quantum mechanics - perpet99/WaveFunctionCollapse

github.com

 

Comment +0

언리얼 길찾기 A* 모듈 테스트

 

https://github.com/perpet99/UnrealAStar

 

 

Comment +0

테스트 컴퓨터 기준 기본값으로 데디서버에 1000 - 2000 npc 이상뛰우면 프레임이 떨어지기 시작합니다.

게임로직은 원쓰레드로 돌기때문에 한계를 가집니다.

 

추가적으로 피직스관련 옵션 애니메이션 시뮬레이트 기능등 여러가지 기능을 끄면 3-4 배 이상 퍼포먼스를 향상시킬수있습니다.

 

Comment +0

enum to string 

제네레이터


https://godoc.org/golang.org/x/tools/cmd/stringer


https://github.com/campoy/jsonenums


Comment +0

예전에 작업하면서 코드를 어디서 주어왔는데 기억이 안난다.

그래도 참고 사이트 


http://www.codeproject.com/Articles/151946/A-High-Performance-Binary-Serializer-using-Microso


테스트 코드는 

https://dev.naver.com/svn/cgs/trunk/PacketDefine/PacketHandlerSample



Comment +12

http://ndc.nexon.com/150143453632



게임분석 방법론

1.DATA 를 중심으로 한 정량 분석

2.UX 를 기반으로한 정성 분석

3. DATA 와 UX를 활용한 UXD 분석

% 데이타 분석은 분석대상의 가지만큼 엄청난 가지수가 나오므로 경험적으로 필터링이 필요함


% 게임에서 유용한 팩트들 

1. 모든유저의 레벨 분포도

일반적으로 저랩이 많고 고랩이 적은 완만한 곡선을 유지한다. 특정 구간에서 높이 올라가는 현상이 발생된단느것은

2. FPS 에서 킬 성공좌표를 남겨 통계를 내어 특정위치에서 많이 발견되는지 확인한다.

일반적으로 특정위치한곳에서만 많은 킬이 나온면 안되고 특정위치가 아군및 적군 위치에 골고루 나와야한다. 물론 너무 많거나 너무 골고루 분산 되어있으면 안된다.

인기있는 맵과 인기없는 맵의 킬 성공 위치의 패턴을 보면 많은 참고가 된다.


http://ndc.nexon.com/150143362745


일별 잔존율이 의미가 있을까? 

일별보다는 레벨별 잔존율에서 더많은 의미를 찾을 수있어 보인다.(일반적으로 게임들의 난이도와 새로운 재미는 레벨을 기준으로 변경이 되기 때문

레벨에 따른 매출이 어떤 의미를 주는지 모르겠다.


유저 중심분석 : 유저입장에서의 한 게임은 모든다른종류의 게임

유저입장에서 분석하려면 유저를 카테고리로 묶어 가지수를 줄이고 그 기준으로 게임을 분석해 나가야한다. 가령 스타크래프트에 캠패인만 즐기는 유저들,래더만 즐기는 유저 , 커스텀맵만 즐기는 유저등 그룹을 묶고 분석해 나가야한다.

경험적으로 분석을 해보고 데이타를 뽑아봄으로써 가설을 증명해봄


http://ndc.nexon.com/150143358315


근 몇 년간 관찰된 안 좋은 현상

분석을 개발자 스스로 하지 않고 누군가에게 완전 일임 하는것

http://ndc.nexon.com/150142534640


A/B testing

sms 메시지 2가지 타입보내고 응답률 보기

레벨 분포를 통해 이탈포인트 확인

맵에 탑류로 통해 유저 이동 위치나 죽은 위치를 파악해서 게임의 문제점을 파악


 http://ndc.nexon.com/150142371049


가설검정

-지난달 동접수치가 떨어진 것 같은데

     다항식?, 추위를 

-남자의 arpu 와 여자의 arpu 는 같은가

연관성규칙발견

-세트아이템을 만들고 싶은데

잘팔리는 A,B 가 있으면 이걸 같이 싸게 팔면 이득일까?

잘팔리는 

의사결정나무

-게임을 이탈하는 유저들은 어떤 유저들인가

일반적으로 레벨이 낮은 유저들이 이탈의 가장 큰 원인인데 레벨이 문제가 아니라 

유저가 초반에 무엇을느끼고 게임을 접는지 알려면 첫날 부터 무슨 행동을 하는지 봐야한다.

클릭이벤트순으로 디테일한 로그가 필요


-매출에 가장 큰 영향을 미치는 것은 무엇일까

회귀분석

-동시접속자와 신규가입자의 관계는




http://www.slideshare.net/jania902/ga-48367734

http://www.ecogwiki.com/Google_Analytics%EB%A1%9C_%EA%B2%8C%EC%9E%84_%EB%B6%84%EC%84%9D%ED%95%98%EA%B8%B0_2


어떤 분석이 가능한가 #

위와 같은 사항들을 고려하여 URL, uidcid를 설계하여 GA의 Collecting API(Measurement Protocol)로 보내면 몇 시간 후부터 상당히 유용한 정보들을 볼 수 있게 된다. 다음은 몇 가지 예시:

  • 사람들이 각 URL에 얼마나 오래 머무르는가 (Time on Page)
  • 사람들의 주요 동선은 어떠한가 (Behavior Flow)
  • 한 번 접속하면 얼마나 오래 게임을 플레이하나 (Time on Site)
  • 최근 한 달 동안 이 게임에 1번, 5번, 10번 이상/이하로 접속한 사람이 몇 명인가 (# of Sessions)
  • 최근 한 달 동안의 순 방문자는 명 명인가 (Unique Visitors)
  • A 던전은 플레이했으나 B 던전은 플레이하지 않은 사람들이 몇 명인가, 이 사람들은 그렇지 않은 사람들과 어떻게 다르게 행동하는가 (Advanced Segmentation에서 Behavior 기준 세그먼트 설정)
  • 어떤 맵이 가장 인기 있나 (Behavior -> All Pages 또는 Content Drill-down)
  • 사람들이 게임을 가장 많이 그만두는 장소는 어디인가 (Top exit pages)
  • 등등...







Comment +0

스터디 할때 공부좀 한거. 


Comment +0

surf

스터디/C++,CLI,C#2011. 5. 14. 00:13

 

 http://en.wikipedia.org/wiki/SURF

 

여기서 설명하는 SURF 알고리즘 opencv 에 있는 find_obj 소스코드를 기반으로 만들어졌다.

 

1.특징점 추출

( octave , layer , wavelet, hessian 을 이용해 크기와 회전에 강한 특징점을 찾아낸다)

 

 1-1 소스 이미지 integral(적분) 한다.

 개요 : wavelet 정보를 뽑을때 적분영상이 있어야 빠른 wavelet 정보를 만들수있음

 참고자료 :

 http://www.codeproject.com/KB/audio-video/haar_detection.aspx

 http://aisitei.tistory.com/174

 입력 : 입력영상

 처리 : x 축 y 축을 증가시키면서 누적된 픽셀정보를 저장한다

 출력 : 적분을 표현(representation) 한 영상

 

1-2 wavelet 정보 추출

 개요: wavelet mask 를 이용해 wavelet 정보를 octave *  layer 갯수 만큼 만든다

 octave: 이미지의 샘풀링 갯수를 지정 : ( 참고자료 : sift 의 의도와 비슷한 뜻)

              만약 3 이라면

               원본이미지 -> 원본이미지/2 -> 원본이미지 /4   의 이미지를 가짐

 layer : 해당 octave 이미지에 몇개의 layer(size) 로 wavelet 정보를 만들지 결정

            만약 3이라면

             wavelet size   ->  wavelet size  / 2 -> wavelet size/4

 

참고자료:

 http://www.cs.ucf.edu/~mali/haar/

http://www.codeproject.com/KB/graphics/edge_detection.aspx?msg=2331630

 입력 :

적분 영상

Wavelet data

    const int dx_s[NX][5] = { {0, 2, 3, 7, 1}, {3, 2, 6, 7, -2}, {6, 2, 9, 7, 1} };
    const int dy_s[NY][5] = { {2, 0, 7, 3, 1}, {2, 3, 7, 6, -2}, {2, 6, 7, 9, 1} };
    const int dxy_s[NXY][5] = { {1, 1, 4, 4, 1}, {5, 1, 8, 4, -1}, {1, 5, 4, 8, -1}, {5, 5, 8, 8, 1} };

x                                                                     y                                                  xy

Wavelet(1).png 

 

 처리 :  

dx  = icvCalcHaarPattern( s_ptr, Dx, 3 );
dy  = icvCalcHaarPattern( s_ptr, Dy, 3 );
dxy = icvCalcHaarPattern( s_ptr, Dxy, 4 );


각각의 (x , y xy)  wavelet data 를 이용해 x,y,xy 값을 추출

출력 : layer 별 각각의 x,y,xy 정보를 추출

 

 1-3  헤시안 연산

 개요:  x,y,xy 의 wavelet 정보를 바탕으로 헤시안 연산을 하여 hessianThreshold 값이 넘으면 이웃 헤시안 값을 비교 하여 layer 을 포함한 이웃 26 개 정보와 비교후 가장 값이 크면 interpolation 후 특지점으로 추가한다

 입력 : layer 별 wavelet (x,y,xy) 정보

 처리 :

  *det_ptr++ = (float)(dx*dy - 0.81*dxy*dxy);
 *trace_ptr++ = (float)(dx + dy);

연산후 

 

 /* Non-maxima suppression. val0 is at N9[1][4]*/
                        if( val0 > N9[0][0] && val0 > N9[0][1] && val0 > N9[0][2] &&
                            val0 > N9[0][3] && val0 > N9[0][4] && val0 > N9[0][5] &&
                            val0 > N9[0][6] && val0 > N9[0][7] && val0 > N9[0][8] &&
                            val0 > N9[1][0] && val0 > N9[1][1] && val0 > N9[1][2] &&
                            val0 > N9[1][3]                    && val0 > N9[1][5] &&
                            val0 > N9[1][6] && val0 > N9[1][7] && val0 > N9[1][8] &&
                            val0 > N9[2][0] && val0 > N9[2][1] && val0 > N9[2][2] &&
                            val0 > N9[2][3] && val0 > N9[2][4] && val0 > N9[2][5] &&
                            val0 > N9[2][6] && val0 > N9[2][7] && val0 > N9[2][8] )

 

이웃중 가장 큰값인지 확인을 한후 보간을 통해 더 정확한 값을 얻어와서 특지점 리스트에 추가한다.

여기서 보간의 의미는 opencv 게시판에 누군가 잘설명한 것이 있는데 차후 주소를 알게되면 링크추가 예정

 

//////////////////////////////////////////////////////////////////////////////

 2.디스크립터 만들기

찾아낸 특징점에 고유영역을 표현할수있는 디스크립터를 만든다.

 

2-1 orientation 가우시안 웨이트를 만든다.

아래 링크에 있는 이미지와같은 정보를 얻음

http://retina.anatomy.upenn.edu/~lance/modelmath/gaussian.html

ORI_RADIUS = 6

ORI_RADIUS * ORI_RADIUS  방향에 따른 가우시안 웨이트 생성

 

2-2 patch 정보에 대한 가우시안 웨이트를 만든다.

 PATCH_SZ = 20

 PATCH_SZ * PATCH_SZ 영역에 대한 가우시안 웨이트 생성

 

2-3 각방향에 대한 orientation 정보 생성

 개요 : 특징점 주위 6 *6  사이즈안에 있는 모든 포인트에대해서 wavelet 수치를 얻는다.

입력 : 적분이미지

 

처리 :

                        

                 Untitled(3).png

 

black : 특징점

 red : ORI_RADIUS * ORI_RADIUS 방향 안에 있는 점들

green : PATCH_SZ 사이즈 박스 * 특지정에 포함된 사이즈 정보( 소스 100% 분석 안함)

 

green 박스와 아래 wavelet data  연산을 하여 orientation 정보를 만듬

 wavelet2.png

 

 각도에 따른 모든 wavelet 수치를 합산하여 가장 큰 각도 값을 얻는다. 가령 위에서는 파란색이 가장 큰 각도라 판단함

 

 출력 : 가장 수치가 높은 각도를 얻음( 회전에 강한 정보를 얻기위한 초기단계)

 

 2-4 디스크립터 생성

개요 : 크기와 회전에 강한 정보를 만듬

 입력 :  입력 이미지, 윗단계에서 얻은 가장 반응성있는 각도 정보

처리 :

descriptor2.png 

 입력된 방향정보를 기반으로 이미지정보의 gradients 값을 계산한다.

gradients 값을 기반으로 64bin 또는 128 bin  디스크립트 정보를 생성한다.

출력 :  디스크립터 정보 생성

 

3 정합 (matching)

새로운 이미지와 기존에 인식된 이미지정보의 디스크립터를 분석하여 같은 정보인지를 판별하는 작업

FLANN(Fast Library for Approximate Nearest Neighbors)

속도를 개선하기위해 정확도에 따라 근접하였다고 판단되면 해당 인덱스 값을 리턴한다.(내부적인 알고리즘 방식은 아직 분석안했음)

참고자료:

 http://people.cs.ubc.ca/~mariusm/

 http://people.cs.ubc.ca/~mariusm/index.php/FLANN/FLANN

입력 : 인식된 기술자 와 새로입력된 기술자 정보

처리 : 

 

cv::flann::Index flann_index(m_image, cv::flann::KDTreeIndexParams(4));  // using 4 randomized kdtrees

새로 들어온 이미지에대한 디스크립 정보를 kdtree 구조를 기반으로 인덱스를 만든다.

 

flann_index.knnSearch(const Mat& queries, Mat& indices, Mat& dists, int knn, const SearchParams& params);

 // queries 비교할 원본이지의 디스크립터 정보

//  indices  queries 요청한 정보와 가장 근사한 인덱스 정보를 뽑아준다.

//  dists       뽑아준 인덱스 정보(거리값)을 리턴해준다.

//  knn       가장 근사한 후보인덱스 갯수 요청

 

인식되여있는 기술자정보를 queries 값으로 주면 해당하는  가장 비슷하다고 판단된 새로운기술자정보의 인덱스를 knn  갯수만큼 

평가된 dits 정보와 같이 준다

여기서 knn 이 2 값을 사용하여 가장 가깝다고 생각하는 인덱스 2개를 뽑는다.

dists_ptr[2*i]<0.6*dists_ptr[2*i+1]

이두개의 인덱스 평가값이 거의 비슷한 수치가 나오면 같은 기술자정보로 인식한다.

이것이 의미하는것은 하나의 입력이미지에 octave 마다  기술자 정보가 있기 때문에 octave 갯수만큼 기술자가 검색되여지는 특징을 이용한 것이다.

 

출력 : 같은 기술자 정보라고 인식되여진 페어 정보

 

 cvFindHomography 이용하여 객체의 정확한 범위?를 측정

 

 

 

 

 

이 글은 스프링노트에서 작성되었습니다.

Comment +6

  • perpet 2011.05.14 00:17

    예전에 surf 를 분석했을때 정리하던 자료
    몇년전부터느끼지만 비젼처리 하는쪽 소스를 보면서 수학적지식뿐아니라
    문제를 푸는 사고가 넓어지는것 같다.

  • 좋은 자료 설명, 감사합니다.

  • ugg 2013.07.14 18:24

    창밖을 봐 바람에 나뭇가지가 살며시 흔들리면 네가 사랑하는 사람이 널 사랑하고 있는거야.

  • 창밖을 봐 바람에 나뭇가지가 살며시 흔들리면 네가 사랑하는 사람이 널 사랑하고 있는거야.

  • 좋으면 좋고 싫으면 싫은 거지, 뭐가 이렇게 어렵고 복잡하냐구

  • ama3208 2018.03.16 11:51

    opencv 에 있는 find_obj 소스코드를 기반으로 만들어졌다는 말씀은 opencv를 이용해서 짠 알고리즘이라는건가요 ??

몇일전 다른프로젝트 서버 파트에서 서로다른 디비끼리 트랜잭션을 걸면 부하가 심하다고 하여 게임서버가 이것을 직접 구현하기를 원한다는 요청이 들어왔다.
나도 최근까지 이 이슈를 직접 접하지 않았기 때문에 고민하지 않다가 언젠가는 나도 이문제를 해결해야할 솔루션을 찾아야해서 고민을 해봤다.

예를 들어 문제를 풀어보겠다.
유저끼리 아이템거래를 하려고 하고 a 유저가 b 유저에게 아이템을 주라는 명령어를 내렸다고 치자
이때 a 디비 테이블에  item 이    b 디비 테이블에 이동이 되야한다고 하고
 a디비와 b디비 는 서로 다른 회사라 디비안에서 스토어드 프로시저로 트랜잭션을 걸어 이동을 못시키고 프로그램으로
아이템을 옮겨야한다고 하자 억지스러워보이지만 하여간 중요한간 트랜잭션을 게임서버가 해결해줘야하는 이슈가 생긴다는 과정을 하는것이다.
이동중 서버가 다운이 되거나 오류가 있으면 롤백이 되거나 재부팅시 완료가 제대로 이뤄져야한다고 하자.

내가 생각한 방법은
1. a디비테이블에 아이템을 같은 디비에 sendTemp 테이블을 만들어 그곳에 이동시킨다.
2. b디비테이블에 receiveTemp테이블을 만들어서 아이템이 어느테이블에 들어갈지에대한 정보를 넣는다.
3. sendTemp 테이블에 이동할 그아이템을 지운다
4. b디비테이블에 receiveTemp 테이블을 해당유저테이블에 이동시킨다.

이과정을 거치면 중간에 다운이 되여도 다시 복구나 재실행이 가능하다고 본다.
게임서버가 다운이 되고 재실행되면 밑에 가,나 작업을 수행한다.

가.  a디비테이블에  sendTemp 에 이동할 아이템이 있는지 보고 있으면 위에 2번과정을 진행한다. receiveTemp에 이미 이동할 아이템정보가 있다해도 덮어버린후
      진행한다. (이경우는 위에서 1,2번이 작동한후 서버가 다운됬을때 끝나지 않은 작업을 마무리해줌)
나. b디비테이블에 receiveTemp 테이블에 이동해올 아이템정보가 있는지 본다. 있으면 위 4번과정을 진행한다. ( 이경우는 서버가 위에서 3번 과정을 거친후 다운되 였을때 작업을 마무리해줌)


 

Comment +2

LSTM

스터디2011. 3. 21. 17:20

 

 

Untitled.png 

 

lstm2.jpg lstm3.jpg lstm4.jpg lstm5.jpg lstm6.jpg lstm7.jpg lstm8.jpg lstm9.jpg lstm10.jpg  

 

 

 

 

http://www.felixgers.de/

 http://en.wikipedia.org/wiki/Recurrent_neural_network

http://www.bioinf.jku.at/software/  자바와 c 소스 있슴

 http://www.felixgers.de/papers/phd.pdf

http://www.idsia.ch/~juergen/lstm/sld001.htm

 

lstm2003igel.pdf 

 

하나의 메모리 블럭에

cell,input gate output gate,forget gate 존재

 

 기본적인 원리구조

 

이 글은 스프링노트에서 작성되었습니다.

Comment +4