반응형

구글 코랩이나, 주피터 노트북을 사용하시는 분들에서는 일부 Windows 함수를 사용할 수 없습니다.

그래서, 새창을 띄워서 이미지를 확인하는 작업을 할 수가 없습니다.

 

그러신 분들은 matplotlib를 이용하여 이미지를 확인할 수 있습니다.

import matplotlib.pyplot as plt
import cv2

우선 해당 모듈을 설치 및 불러와주시고 파일 업로드를 해줍니다.

주피터 노트북을 사용하시는 분들은 작업하시는 환경에 이미지 파일을 복사해서 사용하시고,

구글 코랩을 사용하시는 분들은

from google.colab import files
uploaded = files.upload()

명령어를 통해서 이미지 파일을 업로드해줍니다.

 

그리고 지난 포스팅에 소개해드렸던 것처럼, imread를 통해 파일을 불러옵니다.

img = cv2.imread('choco.jpg')
plt.imshow(img)

이렇게 실행을 해주면, 새창 없이 바로 결과물을 확인할 수 있습니다.

 

음... 근데 결과물을 확인해보니, 색상이 많이 이상하다는 것을 확인할 수 있습니다.

이러한 이유는, 우리가 기본적으로 IMREAD 함수로 컬러 사진을 불러올 때는 아닌 BGR 순서로 불러옵니다.

그러나 matplotlib은 기본적으로 RGB 순서로 컬러를 받아 들여옵니다.

 

그렇기 때문에, 우리는 BGR 순서를 RGB 형태로 바꿔 주어야 할 것입니다.

힘든 작업처럼 보이지만, cv2에서 제공하는 cvtColor함수를 사용하여 쉽게 BGR에서 RGB로 바꿔줄 수 있습니다.

img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

반대로 RGB에서 BGR로 바꿔줄 수 있고요... (cv2.COLOR_RGB2BGR)

이렇게 변환한 파일을 출력해보면

img = cv2.imread('choco.jpg')
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img2)

색상이 돌아온 것을 확인할 수 있습니다.

 

추가적으로, matpltlib을 사용한다면 pyplot이 제공하는 함수들을 이용할 수 있습니다.

예로 들어, axis를 없애 주거나, 결과물에 여러 개를 표현한다거나...

plt.subplot(121), plt.axis('off'), plt.imshow(img)
plt.subplot(122), plt.axis('off'), plt.imshow(img2)

여기서 121의 의미는 1행 2열 1번째로 배치시기겠다이며, 122는 당연히 1행 2열 2번째로 배치시기겠다는 의미입니다.

또한, plt.axis('off')는 x축과 y축에 크기를 나타나는 크기 정보를 없애고 순수 이미지만을 보여주겠다는 의미입니다.

그럼 결과를 확인해보도록 하겠습니다.

 

이처럼 우리는 windows함수 없이도, 이미지를 확인할 수 있습니다. windows환경에서도 실행 가능하며 windows환경에서 사용하시는 분들은 편한 방법을 선택해서 사용하시면 됩니다.

반응형

예제 영상 파일

choco.jpg

예제 파일은 아무 이미지 파일로 사용하셔도 됩니다. 저는 귀여운 강아지 초코로 진행해볼 예정입니다.

파일을 다운받으셔서 같은 환경(실행하는 파이썬 디렉터리)에 저장을 시켜 둡니다.

(만약 다른 곳에 있다면 경로를 아셔야 합니다)

 

imread 함수

지난 포스팅에서, imread 함수에 대해서...

- imread

imread 함수는 image read의 약자로, 이미지를 읽어 오는 함수입니다.

img = cv2.imread('choco.jpg')

라고 간단히 설명을 드렸습니다. 추가적으로 설명을 드리자면, imread 함수에서는 flags를 통해서 이미지 타입을 지정해줄 수 있습니다.

타입은 다음과 같이 여러가지가 있지만, 가장 대표적으로 사용하는 3가지(빨간색 표시)에 대해서 설명하겠습니다.

 

IMREAD_COLOR

IMREAD_GRAYSCALE

IMREAD_UNCHANGED
IMREAD_ANYDEPTH
IMREAD_ANYCOLOR
IMREAD_LOAD_GDAL
IMREAD_REDUCED_GRAYSCALE_2
IMREAD_REDUCED_COLOR_2
IMREAD_REDUCED_GRAYSCALE_4
IMREAD_REDUCED_COLOR_4
IMREAD_REDUCED_GRAYSCALE_8
IMREAD_REDUCED_COLOR_8
IMREAD_IGNORE_ORIENTATION

 

- IMREAD_COLOR

 

첫 번째로, 알아볼 flags는 IMREAD_COLOR입니다.

 

imread 함수에 flags를 지정을 안 해주게 되면 default값으로 설정되는 기본값이며 3 채널 값인 (BGR)로 표현되는 옵션입니다. 코드를 통해 보면, 다음과 같이 지정해 줄 수 있습니다.

img_color = cv2.imread('choco.jpg')
img_color = cv2.imread('choco.jpg', cv2.IMREAD_COLOR)
cv2.imshow('img1', img_color)
cv2.waitKey()

이미지 결과 :

- IMREAD_GRAYSCALE

 

두 번째로, 알아볼 flags는 IMREAD_GRAYSCALE입니다. 흑백사진처럼 색상 정보가 없이 오직 밝기 정보만으로 구성된 이미지 파일로써,

밝기 정보를 256단계로 변환하여 보여줍니다.

img_gray = cv2.imread('choco.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('img2', img_gray)
cv2.waitKey()

이미지 결과 :

 

- IMREAD_UNCHANGED

마지막으로 알아볼 flags는 IMREAD_UNCHANGED입니다. UNCHANGE를 보면 알 수 있듯이 원본 그대로 출력을 한다는 것입니다.

먼저 코드와 결과를 확인해보도록 하겠습니다.

img_uc = cv2.imread('choco.jpg', cv2.IMREAD_UNCHANGED)
cv2.imshow('img1', img_uc) # image show -> imshow, 우리가 뛰울 윈도우창에 img 를 보여줘라
cv2.waitKey()

IMREAD_COLOR와 결과가 같은 것처럼 보이지만, IMREAD_COLOR는 3 채널 값인 (BGR)로 변경이 되어서 보여주지만, IMREAD_UNCHANGED는 색상값 변경 없이 원본사진 그대로를 출력해주는 것입니다.

추가적으로, 투명한 png 파일 등에서, alpha channel까지 포함하여 읽어 올 수 있다는 특징이 있습니다.

 

나머지 flags 타입은 짧게나마 글로 설명 드리도록 하겠습니다만, 거의 사용하지는 않습니다.

 

IMREAD_ANYDEPTH : 대응되는 depth에 따라 16/32비트 이미지로 로드 아님 8비트로 읽는다.

IMREAD_ANYCOLOR : 이미지를 가능한 칼라 포멧으로 읽는다.

IMREAD_LOAD_GDAL : 이미지를 GDAL 드라이버를 활용하여 읽는다. (GDAL : 지도관련 이미지 처리)

IMREAD_REDUCED_GRAYSCALE_2 : 1 채널, 1/2 크기, GRAYSCALE 적용

IMREAD_REDUCED_GRAYSCALE_4 : 1 채널, 1/4 크기, GRAYSCALE 적용

IMREAD_REDUCED_GRAYSCALE_8 : 1 채널, 1/8 크기, GRAYSCALE 적용

IMREAD_REDUCED_COLOR_2 : 3 채널, 1/2 크기, BGR COLOR 이미지 사용

IMREAD_REDUCED_COLOR_4 : 3 채널, 1/4 크기, BGR COLOR 이미지 사용

IMREAD_REDUCED_COLOR_8 : 3 채널, 1/8 크기, BGR COLOR 이미지 사용

 

- imwrite

 

imwrite 함수는, 이미지를 저장할 때 사용 합니다. 우리가 변환한 이미지를 저장하고 싶으면 다음과 같이 사용하면 됩니다.

함수 사용방법은 cv2.imwrite(새로 만들 파일 이름 및 형식, 저장할 이미지, 압축률(옵션)) 입니다.

 

다음 예제는, 그레이 스케일로 변환한 img_gray파일은 new_choco.jpg로 90%압축을 하여 저장하는 것입니다.

cv2.imwrite('new_choco.jpg', img_gray, params=[cv2.IMWRITE_JPEG_QUALITY, 90])
반응형

예제 영상 파일

choco.jpg

예제 파일은 아무 이미지 파일로 사용하셔도 됩니다. 저는 귀여운 강아지 초코로 진행해볼 예정입니다.

파일을 다운받으셔서 같은 환경(실행하는 파이썬 디렉토리)에 저장을 시켜 둡니다.

(만약 다른 곳에 있다면 경로를 아셔야 합니다)

 

- cv2 모듈 설정

import cv2

image 관련 함수

- imread

imread 함수는 image read의 약자로, 이미지를 읽어 오는 함수입니다.

img = cv2.imread('choco.jpg')

저는 확장자는 jpg이고, 파일 이름으로 choco로 지정을 해두었습니다. 혹시라도 다른 경로 및 다른 이미지 파일 이름을 사용하신다면, 다음과 같이 파일 경로 및 지정한 파일 이름을 직접 넣어 주셔야 합니다.

img = cv2.imread('{파일경로}\choco.jpg')
img = cv2.imread('{파일경로}\{지정한 파일 이름}.jpg')

- imshow

초기에 세팅된 window 창에, 방금 지정한 img를 띄웁니다.

cv2.imshow('image', img)

(tip, 초기 Windows 세팅 없이도 바로 사용 가능합니다. 이땐, image라는 WINDOW_AUTOSIZE가 적용된 윈도우창이 새로 뜹니다.)

- waitkey

사용자가 입력받기 전까지 윈도우창을 유지시켜줍니다.

cv2.waitKey()

이때, 키보드에 아무 버튼을 누르면 윈도우 창은 종료됩니다.

 

만약 3초 후에, 자동으로 꺼지게 하고 싶다면,

cv2.waitKey(3000)

으로 지정해주시면 됩니다. 괄호 안에 숫자 단위는 ms입니다. (3초 = 3000ms)

 

또한, esc 키를 누를 때만 종료하고 싶다면, esc의 아스키코드 값인 27 (enter는 13)을 설정해 주시면 됩니다.

while True :
    if cv2.waitKey() == 27 :
        break

특정 아스키코드를 알고 싶다면 (https://ko.wikipedia.org/wiki/ASCII)에서 확인 가능합니다.

또는 아래처럼 세팅을 한 후에, 키보드 누르는 값을 출력하여 알아낼 수 있습니다.

key = cv2.waitKey()
print(key)

특정 키보드 문자로 종료시키고 싶다면, (아스키코드를 이용해도 됩니다만) ord함수를 이용하여 종료시킬 수 있습니다.

키보드 'n' 키를 누르면 종료시키려면 다음과 같이 사용하시면 됩니다.

(*ord 함수 : 특정한 한 문자를 아스키 코드 값으로 변환해 주는 함수)

while True :
    if cv2.waitKey() == ord('n') :
        break

 

(tip, 특정한 값을 눌렀을 때, 특정 효과를 띄울 때도 사용할 수 있습니다)

아래 코드는, s 키를 눌렀을 때, 픽셀값을 바꾸어 이미지 반전 효과를 주는 코드입니다.

img = cv2.imread('choco.jpg')
cv2.imshow('image', img)
while True :
    key = cv2.waitKey()
    if cv2.waitKey() == 27 :
        break
    elif key == ord('s') or key == ord('S'):
        img = ~img
        cv2.imshow('image', img)
반응형

- cv2 모듈 설정

import cv2

Window 관련 함수

- namedWindow

새로운 윈도우창을 띄울 때, 사용합니다. 저는 새로운 창을 띄울 때, 창 이름을 image라고 설정을 해두었습니다.

cv2.namedWindow('image')

이때, flags 옵션을 줄 수가 있는데, WINDOW_AUTOSIZE 옵션과 WINDOW_NORMAL 옵션이 있습니다.

WINDOW_AUTOSIZE 란, 창 크기를 영상 크기에 맞게 변경을 해주는 것입니다.

cv2.namedWindow('image', flags=cv2.WINDOW_AUTOSIZE)

flags를 사용 안 하면 default로 WINDOW_AUTOSIZE가 기본 적용됩니다.

cv2.namedWindow('image', flags=cv2.WINDOW_NORMAL)

WINDOW_NORMAL 란, 영상 크기를 창 크기에 맞게 변경해주는 것입니다.

주로 큰 해상도에 이미지가 모니터에 안 들어오는 경우 수동으로 사이즈를 조절할 수 있습니다.

(Tip, 마우스로 크기 변경 가능)

- resizeWindow

윈도우 창 size를 수동으로 바꾸고 싶으면 namedWindow를 먼저 선언하고 width값과 height 값을 지정해 줍니다.

이때, winname은 앞에 선언한 window 창 이름을 넣어주시면 됩니다. 이때, flags의 값은 WINDOW_NORMAL로 설정이 됩니다.

(Tip, 영상파일이 해상도가 커서 다루기 힘들 때, 지정해 줍니다.)

cv2.resizeWindow(winname='image', width=200, height=150)

- moveWindow

특정한 위치에 윈도우를 띄우고 싶다면, 윈도우 x좌표와 y좌표를 설정해주시면 됩니다.

(Tip, 영상 파일이 윈도우 화면에 벗어났을 때, 위치를 지정해 줍니다.)

cv2.moveWindow(winname='image', x=200, y=200)

- destroyWindow

우리가 생성한 특정 윈도우창을 닫을 때, 사용합니다. 프로그램 개발 시, 특정 windows를 닫아줄 경우 사용합니다.

cv2.destroyWindow("image")

- destroyAllWindow

모든 윈도우창을 닫을 때, 사용합니다. 프로그램 개발 시, 모든 작업이 끝났을 경우 사용합니다.

cv2.destroyAllWindows()
반응형

Open CV 설치하기

pip install opencv-python

Open CV 설치 확인하기

print("CV version : ", cv2.__version__)

CV version :  3.4.2

 

저는 Python 3.8 버전 IDE : Pycharm으로 진행하였습니다.

반응형

필요 모듈 설정

import tensorflow as tf
import keras
import numpy as np
from matplotlib import pyplot as plt
from keras.datasets import mnist
from keras import models, layers
from keras.utils import to_categorical

mnist 데이터 불러오기

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

mnist 데이터 확인하기

print(train_images.shape)
print(train_labels)
print(test_images.shape)
print(test_labels)

예측 확인용 체크 이미지 저장 하기

check_image = test_images[24]

Keras 모델 만들기

model = models.Sequential()
model.add(layers.Dense(512, activation='relu', input_shape=(28*28, )))
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

만든 모델 구조 확인하기

from keras.utils import plot_model
plot_model(model, show_shapes=True)

모델 컴파일 하기

model.compile(optimizer = 'rmsprop',
              loss = 'categorical_crossentropy',
              metrics = ['accuracy'])

이미지 모양 바꿔주기

train_images = train_images.reshape((60000, 28*28))
train_images = train_images.astype('float32')/255
test_images = test_images.reshape((10000, 28*28))
test_images = test_images.astype('float32')/255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

모델 학습하기

model.fit(train_images, train_labels, epochs=5, batch_size=128)

모델 Cost 및 loss 값 확인하기

test_loss, test_acc = model.evaluate(test_images, test_labels)
print(test_loss, test_acc)

예측 확인용 체크 이미지 확인하기

plt.imshow(check_image, cmap = plt.cm.binary)

예측 확인용 체크 이미지 모델에 넣고 예측하기

checking_img = check_image.reshape((1, 28*28))
output = model.predict(checking_img)
print(np.argmax(output))

 

반응형
x_data = np.array([[1, 2, 1, 1],[2, 1, 3, 2],[3, 1, 3, 4],[4, 1, 5, 5],[1, 7, 5, 5],[1, 2, 5, 6],[1, 6, 6, 6],[1, 7, 7, 7]], dtype=np.float32)
y_data = np.array([[0, 0, 1],[0, 0, 1],[0, 0, 1],[0, 1, 0],[0, 1, 0],[0, 1, 0],[1, 0, 0],[1, 0, 0]], dtype=np.float32)

w = tf.Variable(tf.random.normal([4, 3]))
b = tf.Variable(tf.random.normal([3]))

learning_rate = 0.001

for i in range(5001):

    with tf.GradientTape() as tape:

        hypothesis = tf.nn.softmax(tf.matmul(x_data, W) + b)
        cost = tf.reduce_mean(-tf.reduce_sum(y_data*tf.math.log(hypothesis), axis=1))        
        W_grad, b_grad = tape.gradient(cost, [W, b])

        W.assign_sub(learning_rate * W_grad)
        b.assign_sub(learning_rate * b_grad)
    if i % 500 == 0:
        print(f'Step : {i}, Cost : {cost.numpy()}, Weight : {w.numpy()[0]}, Bias : {b.numpy()[0]}')
반응형
import tensorflow as tf
import numpy as np

tf.random.set_seed(400)

x_data = np.array([[50, 47], [40, 43], [30, 15], [85, 83], [97, 85], [100, 100]], dtype=np.float32)
y_data = np.array([[0], [0], [0], [1], [1], [1]], dtype=np.float32)

w = tf.Variable(tf.random.normal([2, 1]))
b = tf.Variable(tf.random.normal([1]))
print(w, b)
learning_rate = 0.0001
for i in range(5001):
    with tf.GradientTape() as tape:
        hypothesis = 1 / (1 + tf.exp(-(tf.matmul(x_data, w) + b)))
        cost = tf.reduce_mean(-tf.reduce_sum(y_data*tf.math.log(hypothesis) + (1-y_data)*tf.math.log(1-hypothesis)))        
        w_grad, b_grad = tape.gradient(cost, [w, b])
        w.assign_sub(learning_rate * w_grad)
        b.assign_sub(learning_rate * b_grad)
    if i % 500 == 0:
        print(f'Step : {i}, Cost : {cost.numpy()}, Weight : {w.numpy()[0]}, Bias : {b.numpy()[0]}')

temp_x = np.array([[30, 25]], dtype=np.float32)
logistic = 1 / (1 + tf.exp(-(tf.matmul(temp_x, w) + b)))
print(f"점수가 {temp_x[0]} 일 때", tf.cast(logistic > 0.5, dtype=tf.float32).numpy()[0])
반응형
import tensorflow as tf

x_data = [11,12,13,14,15,16,17]
x_data_2 = [0, 0, 0, 0, 1, 1, 1]
y_data = [35, 44, 56, 72, 192, 200, 208]
w = tf.Variable(tf.random.normal([1]))
w_2 = tf.Variable(tf.random.normal([1]))
b = tf.Variable(tf.random.normal([1]))
learning_rate = 0.001
for i in range(20001):
    with tf.GradientTape() as tape:
        hypothesis = w * x_data + w_2 * x_data_2 + b
        cost = tf.reduce_mean(tf.square(hypothesis - y_data))
    w_grad, w_2_grad, b_grad = tape.gradient(cost, [w, w_2, b])
    w.assign_sub(learning_rate * w_grad)
    w_2.assign_sub(learning_rate * w_2_grad)
    b.assign_sub(learning_rate * b_grad)
    
    if i % 500 == 0:
      print(f'Step : {i}, Cost : {int(cost)}, Weight : {w.numpy()[0], w_2.numpy()[0]}, Bias : {b.numpy()[0]}')

temp_x = 18
temp_x_2 = 1
print()
print(f"온도가 {temp_x}도이며 프로모션 진행여부 {temp_x_2} 일 때, 에어컨 판매 예상 갯수 :", int(w * temp_x + w_2 * temp_x_2 + b))
반응형

기온에 따른 감귤 가격 예측 머신러닝 모델 구현

실습 데이터

https://bit.ly/2Eb8YZ3

 

price_data.csv

 

drive.google.com

데이터 소개

  • 날짜(A)
    • 범위 : 20081~ 20203(12)
  • 감귤 가격(B):
  • 기온(C) :
    • 단위 : 도
  • 일 강수량(D) :
    • 단위 : mm

실습 내용

텐서플로를 선형 회귀(Linear Regression)를 활용하여 기온에 따른, 가격 예측 모델을 만든다.

 

실습 Tip

필요 모듈

import numpy as np
import pandas as pd
from pandas.io.parsers import read_csv
from google.colab import files
import tensorflow as tf

코랩에서 파일 업로드 하는 방법

uploaded = files.upload()

데이터 읽어 오기

xy = np.array(data)
x_data = xy[:, [2]]
y_data = xy[:, [1]]

 

  • 적절한 Learning Rate 찾기
  • 적절한 Range 찾기 (Cost 값 확인)
  • 특정 온도에서 가격 확인
반응형

+ Recent posts