for Robot Artificial Inteligence

Integral Image를 사용한 Normal Surface 구하기

|

Plane Segementation을 하는데 있어 많이 사용하는 방법이 Integral Image 방법을 통해서 Window Traversal을 통한 윈도우 사이즈 별로 2D Pixel 형태로 된 Intergral image의 center point(mean)와 standard deviation을 통해서 Covariance Matrix를 구하고 PCA를 통해 eigen vector와 eigen value를 얻어 Normal Surface의 법선 벡터를 구하는 방법이다.(eigenvalue가 작은 쪽이 방향을 나타내는 법선 벡터가 된다.)

예를 들어 몇 만개의 포인트 클라우드가 있다고 가정을 할때 Ground Segementation을 Integral Image를 이용한 해보겠다,

  1. 포인트 수만큼에 2D 행렬(500x500)을 만든다.(만약 뎁스이미지 카메라라면, 이미지 크기만큼 만든다)
  2. 포인트 순서대로 pixel address에 삽입을 한다.(xyz 포인트 픽셀 address에 삽입)
  3. integral image를 만든다.(first order)
  4. 각 xyz포인트의 제곱을 하여서 매트릭스 데이터를 구하고 integral image를 만든다.(second order) (3x1 * 1x3) = 3x3 <- Covariance Matrix
  5. normal surface를 구하기 위해 특정 window traversal 할 surface 크기(window size)를 설정해준다. (예 with, height : 2x2)
  6. 윈도우 사이즈 만큼, intergral image 영역을 돌면서 first order의 sum값에 window size안에 있는 요소 숫자만큼 나눠줘서 Central(point xyz(mean)) 값을 구한다
  7. 윈도우 사이즈 만큼, second integral 영업을 돌면서 second order의 sum값에 window size안에 있는 요소 숫자(or central points)만큼 나눠서 Covaraince Matrix값을 얻는다.
  8. 얻어진 covariance Matrix에 PCA를 통해 eigen vector와 eigen value를 얻고, Normal Surface에서의 Normal Vector(방향) 값을 얻게 된다.(2개의 벡터가 크거나 같고, 하나가 작다면 Plane, eigenvalue 작은것에 해당하는 것이 normal vector, 2개가 작고 하나가 크다면 line, 3개 모두 작다면 point로 구분할 수 있다.)
  9. 이렇게 된다면 2x2 사이즈의 Normal Surface를 얻게 됨으로 500x500에서, 250x250 수만큼 줄어들게 된다.
  10. 얻어진 eigenvalue를 통해 Normal Surface에 대한 shape를 구하고, curvature를 구하여서 너무 휜 현상을 제거하게 한다.
  11. 각 normal surface의 plane coefficiene를 구하여 Ransac을 통해 Object와 plane을 구분하게 된다.

다른 방법 보다 속도가 빠르기 떄문에 많이들 사용한다.

feature extaction(haar-like) using Integral Image

So remember that Haar-like features are a series of frames that “pan” over an array that represents a grayscale image. These frames can be scaled to nearly any size except a 1x1 pixel. This is because each cell (or element) of the frame (and the image array) represents a single pixel, which can only contain the value for a single color.

// use for integra image is to seperate the feature things(ex, neightboring pixel are whiteness or blackness.) with specific paatern(can be like window size.).

what is integral image

  • it’s an array whose values are the sums of values of an image.
  • look at the example “https://levelup.gitconnected.com/the-integral-image-4df3df5dce35”
  • The value for the cell in our integral image is the sum of all the numbers in the shaded area.
  • A cell in the Integral image corresponds to a specific area in the original image. The value of that cell is the sum of all the values in that corresponding area in the original image.
  • This is where the Integral image shines. Because each cell of the Integral image corresponds to an area of the original image, we can find the sum of the area that holds all of the values we have outlined and then subtract the excess values. L

Comment  Read more

Difference between Variance and Standard Deviation

|

BASIC

Standard deviation and variance are basic mathematical concepts that play important roles throughout the financial sector, including the areas of accounting, economics, and investing. In the latter, for example, a firm grasp of the calculation and interpretation of these two measurements is crucial to the creation of an effective trading strategy.

Standard deviation and variance are both determined by using the mean of a group of numbers in question. The mean is the average of a group of numbers, and the variance measures the average degree to which each number is different from the mean.

The extent of the variance correlates to the size of the overall range of numbers — meaning the variance is greater when there is a wider range of numbers in the group, and the variance is less when there is a narrower range of numbers.

– Standard deviation looks at how spread out a group of numbers is from the mean, by looking at the square root of the variance. – The variance measures the average degree to which each point differs from the mean—the average of all data points. – The two concepts are useful and significant for traders, who use them to measure market volatility.

STANDARD DEVIATION DEFINITION

Standard deviation is a statistic that looks at how far from the mean a group of numbers is, by using the square root of the variance.

The calculation of variance uses squares because it weighs outliers more heavily than data closer to the mean. This calculation also prevents differences above the mean from canceling out those below, which would result in a variance of zero.

Standard deviation is calculated as the square root of variance by figuring out the variation between each data point relative to the mean.

If the points are further from the mean, there is a higher deviation within the date; if they are closer to the mean, there is a lower deviation. So the more spread out the group of numbers are, the higher the standard deviation.

Variance DEFINITION

The variance is the average of the squared differences from the mean. To figure out the variance, first calculate the difference between each point and the mean; then, square and average the results.

For example, if a group of numbers ranges from 1 to 10, it will have a mean of 5.5. If you square the differences between each number and the mean, and then find their sum, the result is 82.5. To figure out the variance, divide the sum, 82.5, by N-1, which is the sample size (in this case 10) minus 1. The result is a variance of 82.5/9 = 9.17. Standard deviation is the square root of the variance so that the standard deviation would be about 3.03.

Because of this squaring, the variance is no longer in the same unit of measurement as the original data. Taking the root of the variance means the standard deviation is restored to the original unit of measure and therefore much easier to interpret.

정리

행렬로 이해하면, Matrix Determinant같다. 득 행렬의 특징을 구하는 Determinant가 여기에서 포인트와 mean 값이 상관관계를 나타내 주는 것이 Standard Deviation이라고 생각이 든다. 이에대한 이용은 아래 레퍼런스를 확인하면 좋을 것 같다. 특히 이것 https://www.mathsisfun.com/data/standard-deviation.html

方差是总体所有变量值与其算术平均数偏差平方的平均值,它表示了一组数据分布的离散程度的平均值。标准差是方差的平方根,它表示了一组数据关于平均数的平均离散程度。

Variance와 Standard Deviation에 Square를 하는 것은, 데이터에 대한 unique 값을 갖게 하려고 하는 것이다 이것도 https://www.mathsisfun.com/data/standard-deviation.html 을 보면 알 수 있다.

REFERENCE https://www.investopedia.com/ask/answers/021215/what-difference-between-standard-deviation-and-variance.asp https://blog.csdn.net/colorknight/article/details/9531461 https://www.cnblogs.com/lonelyshy/p/12555273.html https://www.mathsisfun.com/data/standard-deviation.html

Comment  Read more

법선 벡터을 이용한 어플리케이션 및 방법

|

법선 벡터(normal vector)를 이용하여 컴퓨터 비전에 많은 어플리케이션에 사용이 된다. 주로 사용되는 어플리케이션은 Ground Segementation일 것이다.

법선 벡터는 혼자 만들 수 없다. 주변(neighbor) 포인트들과 결합이 되서 만들어야 된다. 또한 Dimension도 최소 2D 이여야만 한다. 그래야만 법선 방향을 알 수 있기 떄문이다.

2D에서 2개의 포인트로 법선벡터를 만들수 있는데 모양을 아래와 같게 된다. 2D 에서는 최소 2개의 점이 필요하게 되고 외적을 통해 법선 벡터를 만들 수 있다.

3D에서는 최소 3개의 포인트를 필요하게 되고 외적을 통해 법선 벡터를 만들 수 있다.

3D에서의 법선 벡터를 구하는 것은 여러 포인트와 컨넥트가 되어있기 떄문에 다른 말로 Normal Surface라고도 할 수 있다.

법선 벡터가 중요한 이유는 우리는 가지고 있는 벡터들을 통해서 방향성을 얻을 수 있다. (법선 벡터)

앞서 말한 ground segementation같은 경우 벡터들을에 대한 normal vector를 구할 수 있는데, 이를 통해서 surface에 대한 방향을 구할 수 있다.

얻어진 normal surface(normal vector)에는 곡률(curvature)을 나타낼 수 있는데, Ground Plane은 항상 평평함으로써 curvature에 대한 제약 조건과 normal vector의 방향으로 Ground Segementation을 할 수 있다.

즉 법선 벡터를 구하는 이유는 벡터에 대한 방향성을 알 수 있기 떄문에, 이를 통해서 객체와 바닥을 구분할 수 있다.

법선벡터 구하는 방법 및 프로세스

1. Covaraince Matrix 방법

첫번째로는 Covariance Matrix를 이용하여서 법선 벡터(Normal Surface)를 구할 수 있다.

예로 많은 데이터가 3D상에 분포가 되어 있다고 가정을 한다면, 우리는 KNN같은 nearlest Search 알고리즘이나, 특정 Region(Submap or ellipes)를 지정을 하여서 포인트들에 대한 집합을 찾는다.

포인트들에 대한 집합을 찾았으면, 집합에 대한 Mean값을 찾고 Variance를 이용한 Standard Deivation(Square Variance)을 만들게 된다. 만들어진 Standard Deviation을 통해 Covariance Matrix를 아래와 같이 구할 수 있다.

Covariance Matrix(Information Matrix) =
std_xx std_xy std_xz
std_yx std_yy std_yz
std_zx std_zy std_zz

구해진 Covariance Matrix를 SVD(Singularity value decomposition) 및 PCA를 통해서 EigenValue와 EigenVector를 구하게 된다.

얻어진 EigenValue와 EigenVector를 통해 우리는 법선 벡터, 즉 Normal Surface에대한 방향을 구할 수 있다. EigenValue의 값이 2개는 크거나 같고 하나가 작다면 Plane이고, EigenVector가 1나가 크고 2개가 작다면 라인, 3개가 작다면 Point로 간주하게 된다.

이떄 보통 우리는 Normal Vector의 방향을 나타낼떄는 Eigenvalue가 작은 것을 사용을 하여서 방향을 나타낸다.

이를 통해 데이터에 대한 법선 벡터(Normal Surface)를 알 수 있다

Principle axes of ellipse point in directions of corresponding eigenvectors

So: surface normal is in the direction of the Eigenvector corresponding to the smallest Eigenvalue of

핵심 및 활용 http://www.ccs.neu.edu/home/rplatt/cs5335_fall2016/slides/point_clouds.pdf

Centet point의 eigenvector와 EigenValue로 법선 벡터를 구할 수 있다.

2. Cross Product 외적 방법

쉽게 외적을 통해서 Normal Vector를 구할 수 있다. 3디라면 최소 3개의 포인트를 통해서 구할 수 있다. 외적을 통해서 얻어진 Normal Vector들은 Covariance Matrix와 마찬가지로 2개의 벡터가 크거나 같고, 하나가 작으면 Plane, 1개의 벡터가 크고 2개의 Plane이 작다면 line, 3다 작으면 점이다.외적을 통해 얻어진 normal vector가 되며 비율을 통해서 포인트의 특징 (Shape) 결정을 할 수 있다. 보통 작은 벡터가 Normal Vector로 간주 된다.(Min Vector), length가 긴것(큰 벡터)들은 plane을 만들게 된다

비교

Covariance를 사용하는 방법은 Cost 하지만 정확하다. Cross Product을 사용하면 계산이 쉽지만 노이즈가 많을 수 있다.

Comment  Read more

연산자 Operator 활용하기

|

https://blog.hexabrain.net/177

클래스에서 생성된 함수끼리는 연산자를 쓰게 되면 “피연산자와 일치하는 연산자가 없습니다.”라고 뜬다. 그 이유는 사용하는 클래스에 +,-,x 등의 함수를 이용하여 계산하기 위한 연산자가 지정이 되지 않았기 때문이다.

위에 엄청 잘 설명되어있는 예제가 있다.

이것을 보고 따라하면 금방 좋은 프로그램을 짤 수 있을 것 같다.

Comment  Read more

오버로딩, friend class

|

오버로딩은 똑같은 이름을 가지고 함수를 가지고 있을태인데, 그것을 구분해서 로딩을 하는 것이다.

void print(int);
void print(long);
void print(int, long);

이중에 함수를 사용을 할떄 parameter의 데이터 타입과 크기에 따라 자동적으로 오버로딩이 된다.

friend class는 접근하고자 하는 private 멤버를 갖는 클래스 내부에 클래스 함수를 선언 한다. 프렌드 함수를 선언할 때는 함수명 앞에 friend들을 붙인다.

#include <iostream>
using namespace std;
class Complex
{
private:
  int real, image;
public:
  Complex(inr r = 0, int i = 0) : real(r), image(i) {};
  void showComplex() const;
  friend void prn(Complex* pCOM);
};
void Complex::showComplex() const
{
  cout << real << image << endl;
}

void prn(Complex* pCOM)
{
  for(int i =0; i<4; i++)
  {
    cout<<pCOM[i].real << pCOM[i].image;
  }
}

void main()
{
  Complex arr[4] = {
    Complex(2,4),
    Complex(4,8),
    Complex(8,16),
    Complex(16,32),
  }
  prn(arr);

  Complex *p =arr;
  P->showComplex();
  (p+1)->showComplex();
}

Comment  Read more