Post List

2020년 10월 3일 토요일

R-CNN(Rich feature hierarchies for accurate object detection and semantic segmentation)

convolution, CNN이 중요하고 많이 쓰인다는 것은 알겠지만 최근 네트워크가 왜, 어떤 방향으로 발전되어오고 있는지에 대해 알려고 하지 않았던 것 같다. 따라서 YOLO에 다다르기 까지 여러 논문을 리뷰하고자 한다. 리뷰할 논문은 R-CNN이다.

R-CNN 구조
R-CNN
Object detection with R-CNN

R-CNN의 obect tetection은 3개의 모듈로 구성되어있다.

  • generates category-independent region proposals
  • large CNN extracts a fixed-length feature vector from region
  • set of class specific SVMs
  • Region proposals

    Region proposal 이란 이미지에서 object가 있을 만한 영역을 찾는 것이다. 가장 Naive 하게 접근한다고 하면 sliding window 방식으로 이미지를 탐색하는 것이다.

    Sliding Window
    하지만 딱 보면 알 수 있듯이 굉장히 오래 걸릴것이라고 예상할 수 있다. 따라서 이미지의 모든 영역에 대해 탐색하는 것이 아닌, object가 있을만한 '후보 영역'을 탐색 빠르게 하기위해 제안된 것이 region proposal이다.
    Region Proposal
    Region proposal의 방법으로는 objectness, selective search, category-independent object proposals 등등 다양한 방법이 있으나 R-CNN은 selective search를 이용한다고 한다. Selective Search 도 알면 좋겠지만 논문에서 말하고자 하는 것은 아니니 일단 넘어간다.

    Feature extraction

    Feature Extraction
    Region Proposal 이후, 후보 영역에 대해 4096-dimensional feature vector를 추출한다. 이 부분은 이해가 잘 되지 않았는데 깔끔하게 정리된 블로그가 있어서 참고했다. 링크 Region proposal에서 2천개 정도의 후보 영역을 모두 227x227(fixed-size CNN)로 warp한 후, 4096 차원의 feature vector를 추출한다.

    Classification

    추출된 feature vector는 SVM에 통과시켜 각 영역에 점수를 매긴다. 각 영역에 Score가 나오면 greedy non-maximum suppression을 진행한다 Non-Maximum Suppression이란 1)동일한 object에 대해 여러개의 box가 겹쳐있을 때, 2)가장 스코어가 높은 박스를 제외하고 IoU(Intersection-over-Union)가 일정값을 넘어가면 나머지 박스들을 제거하는 작업이다.

    IoU
    논문에선 IoU가 0.5보다 클 경우 동일 object로 결정한다.

    R-CNN Limitations

    R-CNN의 한계는 무엇일까?

  • 후보 영역의 크기, 비율에 상관없이 fixed-sized CNN에 맞추기 위한 warping 으로 localization에 취약
  • 많은 후보 영역에 대한 CNN inference로 시간이 오래걸림
  • Selective Search, SVM 은 GPU에 적합하지 않음
  • 수행한 Computation Share이 없음
  • 이정도가 R-CNN의 큰 틀이라고 한다. 정리하자면 R-CNN은 CNN을 이용한 최초의 Object Detection 방법이고 정확도, 속도를 크게 향상시켰다 이후 많은 후속 연구들이 진행되어 많이 발전되었다고 한다.

    2020년 8월 8일 토요일

    ML(머신러닝)과 inference(추론) 최대한 빨리 공부해보기(5) (수정중)

    개인적으로 텐서플로우를 이용해보고 싶었지만 이런저런 이유로 MATLAB의 예제부터 진행을 해보도록 한다.

    MNIST Example

    % Data load
    digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos', ...
        'nndatasets','DigitDataset');
    % Create imageData object
    imds = imageDatastore(digitDatasetPath, ...
        'IncludeSubfolders',true,'LabelSource','foldernames');
    

    일단 실험에 쓸 데이터가 필요하다. 저 fullfile이라는 함수는 해당인자들을 순차적으로 타고 들어가는 폴더 경로를 반환한다. fullfile이 반환하는 경로에 가보니 'digitTest'와 'digitTrain'이라는 excel파일과 폴더'0,1, ... 9' 가 존재했다. imageDatastore은 이미지들을 저장할 객체를 생성해주는데 굉장히 많은 일을 한번에 해주는 함수다. digitDatasetPath 하위폴더의 image들을 저장하는데 폴더이름과 같은 이름의 label을 달아준다. 폴더 이름이 '0,1, ..., 9'이기 때문에 각 이미지에 0 부터 9 까지의 label이 달린다.

    figure;
    perm = randperm(10000,20);
    for i = 1:20
        subplot(4,5,i);
        imshow(imds.Files{perm(i)});
    end
    

    그 이후에 sample로 몇개의 이미지들을 가시화하는데 사실 큰 의미는 없는듯하다. figure창을 4x5로 분할하고 분할된 영역에 random한 20개의 파일을 띄운다.

    labelCount = countEachLabel(imds)
    
    img = readimage(imds,1);
    size(img)
    

    그리고 이미지저장소 객체에서 각 label에 해당하는 이미지가 몇개인지 센다. 해당 예제에는 각 1000개씩 존재한다. 그 후로 첫번째 이미지를 저장하고 사이즈(28x28)를 출력하는데 이것도 별 의미 없는 것 같다.

    numTrainFiles = 750;
    [imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,'randomize');
    

    그 후 전체 데이터들 중 train 데이터와 validation 데이터를 분리한나. 750개의 기존 imds에서 다시 두개의 이미지저장소 객체를 만드는데, train 저장소엔 각 레이블마다 750개의 이미지를 저장하고 validation 저장소에 나머지 데이터를 저장한다. 기존에 주어진 코드는 75 : 25 로 Train : Validation 셋을 나누는데 보통 train이 더 적지 않나?? 3:7로 줄였더니 정확도가 내려간다.

    layers = [
        imageInputLayer([28 28 1])
        
        convolution2dLayer(3,8,'Padding','same')
        batchNormalizationLayer
        reluLayer
        
        maxPooling2dLayer(2,'Stride',2)
        
        convolution2dLayer(3,16,'Padding','same')
        batchNormalizationLayer
        reluLayer
        
        maxPooling2dLayer(2,'Stride',2)
        
        convolution2dLayer(3,32,'Padding','same')
        batchNormalizationLayer
        reluLayer
        
        fullyConnectedLayer(10)
        softmaxLayer
        classificationLayer];
    

    그리고 드디어 네트워크의 구조를 만들어주는데 대체 문법이 이상한건지 콤마도 없고.. 그래도 한개씩 보자.

      inputlayer : 28x28 이미지이고 1채널이다. gray scale이란 뜻이겠지.
      convolution2dLater : filter size : 3x3, filter num : 8, padding을 이용해 output size를 input과 같게 만듬
      batchNormalizationLayer :모르겠다. 나중에 보자.
      ReLU Layer : activation function으로 RELU를 쓴다.
      maxPooling2dLayer : down-sampling을 위해 max pooling을 이용한다. size는 2x2
      fullyConnectedLayer : output 10 짜리 fully connected layer.

    options = trainingOptions('sgdm', ...
        'InitialLearnRate',0.01, ...
        'MaxEpochs',4, ...
        'Shuffle','every-epoch', ...
        'ValidationData',imdsValidation, ...
        'ValidationFrequency',30, ...
        'Verbose',false, ...
        'Plots','training-progress');
    

    다음으로는 학습을 어떻게 진행할지 옵션을 준다.

    net = trainNetwork(imdsTrain,layers,options);
    
    YPred = classify(net,imdsValidation);
    YValidation = imdsValidation.Labels;
    
    accuracy = sum(YPred == YValidation)/numel(YValidation) 
    

    마침내 학습을 하고 학습된 모델을 이용해 classification을 진행한다. 만약 최적화를 한다고 치면 trainNetwork, classify를 직접 까보거나 대체하기 위한 함수를 만들 것이다. 정확도를 올리기 위해서는 네트워크의 구조를 변경해야 할 것이다. 예제를 한번 봤는데 실제로 의미있는 부분은 함수로 전부 가려져있다. 좀더 봐야할 듯 하다.

    2020년 7월 31일 금요일

    ML(머신러닝)과 inference(추론) 최대한 빨리 공부해보기(4) (수정중)

    드디어 Convolution Neural Network 까지 왔다. 정말 많이들어본 녀석 중 하나지만 대충 이미지 좋다는 정도만 알고있었다. 정확히 어떤 기능을 하는지, 무엇이 현재 이 분야의 이슈인지 빨리 알아봐야 할 것이다. 수많은 논문중에 눈이 가는 제목 2개를 뽑아 조금 훑어봤는데 꽤나 흥미로운 것 같다.

      Zhijian Liu et al., "Point-Voxel CNN for Efficient 3D Deep Learning" CVPR '19
      Yue Wang et al., "Dynamic Graph CNN for Learning on Point Clouds" CVPR '19
    두번째껀 읽지 않았지만 CNN을 통해 3D Deep Learning을 한다는 내용인것 같다. 사실 2D에서 3D로 확장될 수 있다는 것은 어찌보면 당연한 것일지도 모르지만 이쪽에 아예 조예가 없는 나로선 꽤나 흥미로운 것 같다. 잡소리는 여기까지.

    Convolution Neural Network

    이미지를 컴퓨터로 인식할 수 있을까. 물론 있다. 내가 잘모를 뿐. 아무튼 기본적인 아이디어는 이런 내용인 것 같다. 우리가 이미지를 네트워크로 학습시킬 때 각각의 픽셀을 네트워크의 인풋으로 넣어준다고 가정하자.

    픽셀 단위로 학습을 진행한다면, 위와 같이 같은 A글자더라도 왼쪽으로 이동한다거나 회전된다거나 할 경우, 인식하는데 문제가 발생할 것이라는 것을 직관적으로 이해할 수 있다. 더군다나 이미지라는 것은 관측자(카메라)의 위치, 각도, 조도 등 많은 요인에 의해 영향을 받기 때문에 좀더 안정적이고 효율적인 방안이 필요하다. 그렇기 때문에 나온것이 CNN이라는 것이다. 그러면 CNN은 뭐가 어떻게 더 좋은 것일까.

    Convolution Layer

    일단 Convolution 이란 연산을 지칭하는 단어인데, 수학적으로 정확한 정의는 모르지만 적어도 우리가 다루려고 하는 것은 행렬조각과 Kernel이라 불리는 작은 행렬의 원소간 곱셈의 총합을 구하는 것이다.

    위와 같이 이미지에 필터를 슬라이딩 시키면서 연산을 진행한다. 연산을 진행하고 결과로 나온 행렬을 feature map이라 부른다. 이때 궁금한 것은 filter 역시 학습을 통해 구해지는 것일까? 레이어마다 나오는 feature의 개수, 즉 네트워크 구조는 그냥 때려 맞추는 것일까? 아니면 합리적 결정, 혹은 학습을 통해 결정될까. 넘나 어렵다.

    Pooling Layer

    이렇게 결과로 나온 Feature map은 다시 Pooling Layer를 거치는데 Pooling은 또 뭘까. 찾아보니 네트워크를 학습할때 parameter가 많으면 over-fitting이 발생할 확률이 높다고한다. 이를 방지하는 것이 Pooling Layer라고 한다. Pooling 연산? 작업? 은 2개가 존재하는데 Max Pooling과 Avg Pooling이다.

    그림과 같이 연산 자체는 굉장히 간단하다. 연산이 중요한 것이 아니고 데이터의 사이즈를 줄여 over-fitting을 방지하는 것 같은데 해당 내용은 over-fitting이 무엇인지 좀더 알아보면 좀더 명확히 이해할 수 있지 않을까.

    CNN 구조

    결국 CNN이란 위에서 언급된 Convolution layer와 Pooling layer들이 반복되고 마지막에 Fully connected layer가 붙은 형태를 띈다. 네트워크마다 어떤 이유로 차이가 있을텐데 이것들은 나중에 알아보도록 하자.

    대충 이런 내용들을 훑어봤는데 역시 디테일을 이해하기 위해선 실습이 필요하지 않을까. 사실 얼마전에 Anaconda 설치했는데 뭔가 익숙하지 않아서... Matlab 예제로 mnist를 해볼지, python으로 해볼지 고민해봐야겠다.

    2020년 7월 29일 수요일

    ML(머신러닝)과 inference(추론) 최대한 빨리 공부해보기(3) (수정중)

    자율주행, 혹은 robotics에서 어떤 기술이 필요할까 생각하면서 바로 CNN, 이미지/영상 처리를 볼까 생각하다가 그래도 Neural Network한번 보고 넘어가야겠다고 생각을 고쳐먹었다. 계속 이전 포스팅을 정리하지 못하고 넘어가는 느낌이지만 어쩔수 없다 생각한다.

    Neural Network
    Non-linear Hypothsis

    지금까지 우리는 hypothesis가 linear하다는 가정하에 진행을 해왔다. 하지만 어떤 복잡한 문제는 linear하지 않을것이다. 예를들어 집값을 결정할 때 집값에 영향을 주는 feature가 100개라 가정하자. 이때 hypothesis가 linear하다는 전제가 없으면 feature space 가 너무 넓어진다. 기존 linear hypothesis를 구하는 방식을 2차, 3차,...n차로 확장하는 것은 연산량의 증가만 야기하고 복잡한 함수에 맞추다가 overfitting 문제가 발생할 수 있다.

    그래서 Neural Network는 뭐가 다른다는 것일까? 유튜브 강의를 보다가 뭔가 intuition이 온 것 같다. 사실 예전에 학부강의에서 XOR classification에 대해 설명 듣긴 했지만 한귀로 듣고 흘려보냈는데...

    위 그림과 같이 데이터가 분포할 때 함수로서 데이터들을 구분하기는 어렵다. 그에 비해 AND 나 OR의 경우 쉽게 구할 수 있는데 예시를 보도록하자.
    만약 우리가 위처럼 AND, OR의 weight들을 찾았다 가정해보자.
    결국 아이디어는 간단한 분류기들을 잘 합성한다면 복잡한 형태의 분류기를 만들 수 있다는 것이다. 이는 우리가 어떤 문제에 접근할 때 말도안되는 함수를 찾아내기보단, 네트워크의 weight을 구하는 것이 효율적이다라는 관점을 보여주는 것 같다(맞나?).

    Machine Learning With Neural Network

    NN을 이용해 학습을 한다고 하자. 결굴 근본은 cost function을 최소화하는 weight을 찾는 것인데 이제 이 weight들은 네트워크 layer 사이의 간선, 즉 행렬값을 찾는 것과 같아진다.

    만약 위와 같은 네트워크에 대한 학습이 끝났을 땐, 5x4, 5x6, 4x5의 크기의 행렬이 구해져있을 것이다. Cost function과 back propagation을 온전히 이해해야 '학습'에 대해 안다고 말할텐데 cost function 이 굉장히 복잡하고 back propagation 역시 직관적으로 와닿지 않으니 일단 보류하고 CNN으로 넘어가보자.

    2020년 7월 22일 수요일

    ML(머신러닝)과 inference(추론) 최대한 빨리 공부해보기(2) (수정중)

    Linear Regression

    시간이 촉박하기 때문에 바로 Linear Regression으로 넘어가보자. 이전 포스팅에서 언급했듯이 Regression은 데이터셋에 fit한 함수 f를 찾아나가는 것이다.

    Linear Regression With One Variable
    Housing Prices

    최대한 구현이 어떻게 될지 생각할 수 있게 예시를 사용하도록 하자. 집값에 영향을 주는 요소를 생각해보자. 1차적으로 면적이 넓을수록 가격이 높을 것이다. 그렇다면 내게 면적-집값 이라는 데이터셋이 주어질때 어떻게 학습을 시킬까?

    내게 주어진 데이터셋으로 학습을 해서 어떤 모델(함수)을 만들고, 그 모델(함수)에 집의 면적을 입력했을 때 추정 집값이 나와야한다. 집값이 면적으로만 결정된다면, 즉 1차원 함수라 가정하면 다음과 같이 표현될 것이다.
    그렇다면 함수를 찾는다는 것은 결국 w(weight), b(bias)를 구하는 것과 같다. regression에 대한 개념을 다시 생각해보면 실제 데이터값 y와 내가 구한 함수 h(x)과 비슷해야 한다. 즉 다음 수식이 최소가 될때의 w,b를 구해야한다.

    아주 깔끔하게 요약된 영상을 캡처해서 올려보도록 한다.
    출처 : 유튜브 강의

    위 그림의 cost function이 최소가 되는 theta0,theta1(w,b)를 찾아야한다. 초기엔 값을 모르기 때문에 임의의 값(0,0)으로 초기화를 한다. 그리고 이런 과정을 거치길 바라는 것이다.

    최초 (0,0)으로 초기화 했을때 비용이 빨간 점에서 시작했다면, theta값들을 조절하며 min이 되는 지점을 찾아가는것.
    저 derivative가 의미하는 바를 생각해보자. 1변수 함수라고 가정하면 특정 theta에서의 기울기를 뜻하고 결과적으로 theta는 함수값이 감소하는 방향으로 갱신된다. 2변수 함수로 확장하면 산에서 가장 가파른 길로 내려오는 상황이 만들어지는 것이다.

    ML(머신러닝)과 inference(추론) 최대한 빨리 공부해보기

    Machine Learning

    SLAM 포스팅을 계속 이어갈 생각이었지만 의도치 않게 머신러닝, 특히 추론과정에 대한 기회가 왔기 때문에 잠시 SLAM 포스팅을 접고 새로운 포스팅을 시작한다. 인공지능, 그리고 머신러닝이라는 용어는 컴쟁이 뿐만 아니라 모두가 들어본 기억이 있을텐데 필자도 딱 그 정도이다. 기본적인 개념과 틀은 있지만 디테일과 이 기술이 어디까지 왔는지, 주요 이슈는 모르는 상태다. 최대한 빠르게 진행을 해봐야할 것 같다.

    What is Machine Learning?

    A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured byP, improves with experience E. - T. Michell
    뭔가 멋있게 적혀있지만 짧게 task T를 달성하기 위해 경험 E를 통해 성능 P를 향상시킨다면 이것은 머신러닝이다. 어떤 문제를 인공지능을 통해 해결하려고 한다면 이 3가지 요소를 잘 파악하고, 설계하란 뜻이다.

    TASK

    Task는 기본적으로 크게 3가지라고 한다.

      classification
      regression
      clustering
    classification은 직역한 대로 분류하는 것이다. 가장 대표적인 것으로는 손글씨로 써있는 숫자를 0~9의 숫자로 분류하는 것인데 필자도 연구실 친구가 MNIST 뭐라고 했던 것을 들어본 기억이 있다.
    Regression의 경우는 classification 같이 정답이 discrete하게 주어지는 것이 아닌 연속한 값일 때, 즉 입력값과 결과값이 주어졌을 때 이를 도출해내는 함수를 구하는 과정과 같다. 근본적인 차이가 있는지는 모르겠지만 그렇다고 한다...
    마지막으로 clustering은 raw data가 주어졌을 때 형성된 군집을 추출하는 과정이라 한다.

    PERFORMANCE

    우리가 결국 머신러닝을 통해 원하는 것은 컴퓨터가 어떤일을 인간 대신 수행했을 때 인간과 비슷하게, 혹은 보다 더 잘 하길 바라는 것이다. 그러기 위해선 컴퓨터가 학습을 잘 했는지 판단 할 수 있는 metric이 필요하고, 이 metric을 통해 학습을 진행시켜야 할 것이다.
    MNIST를 다시 예로 들어보자. 필기체 숫자 4가 주어졌을 때 컴퓨터가 4라고 인식한다면 정답이지만 만약 9라고 인식했다면 에러가 발생한 것이다. 따라서 입력값 x에 대해 도출한 결과 y에 대해 정답/오답을 판별 할 수 있고, 이 정확도를 쉽게 구할 수 있다.
    이와 다르게 regression의 경우 실제 데이터에 fit이 맞는 함수를 추출하는 과정이다. 이때 실제 데이터가 이쁘게 100% 어떤 함수 f와 일치하면 좋겠지만 데이터에 노이즈나 오차가 있을 수 있고, 완벽하게 함수로 표현되기 어려울 수도 있다. 따라서 실제 데이터와 함수값이 얼마나 가까운지를 측정해 이를 metric으로 사용하는 것이다.

    EXPERIENCE

    Experience는 간단하게 데이터라고 받아들이면 된다. 학습하기 위해선(지도학습의 경우) 입력(x)-결과(y) 세트가 있어야 그에 대해 평가할 수 있는 것이 당연하다.

    이정도까지가 머신러닝의 정의라고 볼 수 있다. 다음 포스팅에서는 머신러닝이 어떻게 학습되고 추론되는지 알아 볼 수 있으면 좋겠다.