본문 바로가기

전체 글

(158)
이미지 프로세싱 (2) 1. 이미지 연산■ OpenCV에서 한 픽셀이 가질 수 있는 값의 범위는 0~255이므로 이미지 연산 결과, 값이 0보다 작거나 255보다 큰 경우 값을 0~255 범위 내로 제한해야 한다.■ OpenCV에서는 값의 범위를 제한해 주는 사칙 연산 함수를 제공하며, 해당 함수들은 결괏값을 0보다 작은 값은 0으로, 255보다 큰 값은 255로 처리해서 0~255로 값의 범위를 제한하고 정숫값만 사용한다.■ OpenCV 사칙 연산 함수는 다음과 같다.(1) cv2.add(src1, src2, dest, mask, dtype)- 입력으로 들어오는 두 배열 혹은 배열과 스칼라의 각 원소 간 합을 계산한다.- scr1과 src2는 첫 번째 입력 이미지, 두 번째 입력 이미지이며,- dest는 계산된 결과의 출력 ..
이미지 프로세싱 (1) 1. 관심 영역(Region Of Interest, ROI)■ 관심 영역(ROI)은 이미지에서 분석 대상으로 지정한 특정 부분을 의미한다. 전체 이미지를 처리하는 대신 관심 있는 부분만 잘라내 처리함으로써 연산 효율성을 높일 수 있다. ■ cv2.imread( )로 이미지를 읽으면 이미지 데이터를 넘파이 배열로 반환하기 때문에 슬라이싱을 이용하여 관심 영역만 잘라낼 수 있다. img[y:y+h, x:x+w] y, x는 관심 영역 시작점, h, w는 영역의 폭 ■ img[y:y+h, x:x+w], 이렇게 데이터의 양을 줄이면 이미지 형태가 단순화되어 알고리즘 적용과 좌표 계산이 용이해진다.import cv2from matplotlib import pyplot as pltimg = cv2.imread('i..
NumPy와 Matplotlib 1. Numpy1.1 넘파이 배열 생성 ■ 넘파이 배열 생성 방법은 크게 (1) 값으로 생성 - array( ), (2) 크기와 초깃값으로 생성 - empty( ), zeros( ), ones( ), full( ) , (3) 기존 배열을 기준으로 생성 - empty_like( ), zeros_like( ), ones_like( ), full_like( ), (4) 순차적인 값으로 생성 - arrange( ), (5) 난수로 생성 - random.rand( ), random.randn( ) 이 있다.■ 먼저, array( )로 넘파이 배열을 생성할 경우 다음과 같이 리스트를 사용해서 만들 수 있다. 이 리스트를 이용해서 배열의 차원을 설정할 수 있다.import numpy as npa = np.array(..
기본 입출력 1. 이미지 읽기■ OpenCV에서는 imread( ) 함수로 이미지를 BGR 형태로 읽 수 있다.import cv2img = cv2.imread('img1.jpg')■ imread( )의 첫 번째 인수는 읽어올 이미지 파일의 경로이다. 이때, 파일 경로는 절대 경로와 상대 경로 모두 사용 가능하다. ■ imread( )의 두 번째 인수에는 (1) 이미지 파일을 컬러 이미지로 읽을 건지, (2) 그레이 스케일로 읽을 건지, (3) alpha channel(투명도)까지 포함하여 읽을 건지 flag를 지정한다.(1) cv2.IMREAD_COLOR- 두 번째 인수의 디폴트 값은 cv.IMREAD_COLOR로 이미지 파일을 컬러 이미지로 읽어 들인다. 이때, 투명한 부분은 무시된다- 두 번째 인수에 cv.IMR..
합성곱 신경망(CNN) (2) 1. 층을 깊게 하는 이유 ■ CNN 훈련이 끝나면 활성화 맵은 다음 그림과 같이 원본 이미지들의 특징들을 추출해서 가지고 있다. 원본 이미지의 특징을 추출해서 가지고 있는 활성화 맵을 피처 맵(feature map)이라고 한다.■ CNN 도입부 레이어의 특징 맵은 당연히 중반부, 후반부의 특징 맵보다 사이즈가 크며, 위의 그림과 같이 도입부의 뉴런들은 엣지나 블롭 등의 저수준 특징을 가지고 있다. ■ 중반부의 특징 맵은 중간 사이즈이며, 뉴런들은 얼룩무늬 같은 텍스처에 반응한다. 그리고 분류하기 직전의 후반부 특징 맵은 합성곱 연산이 여러 번 적용되었으므로 사이즈가 작고, 뉴런들은 눈, 얼굴, 바퀴 같은 구체적인 특징에 반응한다. ■ 즉, 계층이 깊어질수록 학습할 문제를 계층적으로 분해해 학습하며 각..
파이토치 합성곱 신경망(CNN) (2) 4. 데이터 증강(Data Augmentation)■ CNN을 포함한 딥러닝 모델은 이미지 특징을 학습하는 것이 주목적이며, 복잡한 문제를 해결하기 위해 층(layer)이 깊어진다.■ 어느 정도 층이 깊어지면 표현력이 향상되고 일반화 성능도 보장되는데, 층이 깊어질수록 신경망 모델은 수십, 수백만 개의 파라미터를 갖게 된다.■ 수많은 파라미터를 가진 심층 신경망 모델이 좋은 성능을 발휘하기 위해서는 그만큼 많은 데이터를 이용한 훈련이 필요하며, 이를 위한 방법으로 데이터 증강이 활용된다.■ 현실 세계 (이미지) 데이터는 보는 각도와 밝기에 따라 전혀 다른 픽셀 값들을 가지고 있으며, 온전한 형태가 아닌 겹치거나 가려져 있을 수 있는데, 데이터 증강으로 이런 현실 세계를 모두 담을 수 없는 데이터 세트의 ..
파이토치 합성곱 신경망(CNN) (1) 1. nn.Module을 이용해 모델 생성■ 합성곱 신경망은 이미지에 대한 특징을 추출(학습)한 다음, 추론을 위해 평탄화한 후 출력층에 데이터를 넣게 된다.■ CNN에는  합성곱(Conv) 계층과 풀링(Pooling) 계층이 존재한다. '합성곱 계층 - 활성화 함수 계층 - (풀링 계층)' 흐름으로 연결되며, 풀링 계층을 생략하기도 한다.합성곱 신경망(CNN) (1) 합성곱 신경망(CNN) (1)1. 합성곱 신경망(Convolutional Neural Network, CNN)■ 합성곱 신경망CNN은 컨브넷(convnet)이라고도 부르며 이미지 인식, 음성 등 다양한 곳에 사용된다. 특히 이미지 인식 분야에서 활용도가 높다.■ 인접hyeon-jae.tistory.com■ 파이토치는 예를 들어 데이터가 2..
torch.nn (2) 5. Dropout■ 파이토치에서 드롭아웃은 torch.nn.functional에서 dropout 함수로 다음과 같이 사용할 수 있다.class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = nn.Linear(28 * 28, 512) self.fc2 = nn.Linear(512, 256) self.fc3 = nn.Linear(256, 10) self.dropout_prob = 0.5 # 몇 퍼센트 드롭아웃할 것인지 def forward(self, x): x = x.view(-1, 28*28) x = self..