[Tensorflow] CNN_의류사진 구분 AI 만들기

Sireal·2021년 10월 4일
0

AI

목록 보기
4/12
post-thumbnail
post-custom-banner
  • 다중 객체 검출은 추후에 추가하겠음

이미지 스케일

  • 흑백은 0~255의 1차원스케일
  • 컬러는 3차원 스케일

딥러닝 하는 법(복습)

    1. model 만들기
    1. compile
    1. fit

matplotlib

  • 간단하게 이미지를 띄워볼수 있는 라이브러리 ( 이미지뿐만아니라 여러 그래프도 가능 )
import tensorflow as tf
import matplotlib.pyplot as plt
# trainX : 이미지데이터
# trainY : 정답 (라벨)
((trainX, trainY),(testX,testY)) = tf.keras.datasets.fashion_mnist.load_data()
# 라벨 이름들
class_name = ['T/shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle']
plt.imshow(trainX[2])
plt.gray() # 그레이스케일 변환
plt.colorbar() # 우측에 컬러 색상 막대기 생성
plt.show() # 보여주기

패션MNIST 프로젝트

  • tensorflow에서 제공하는 기본 데이터셋 중 하나
  • 이번 프로젝트땐 이 데이터들을 사용하겠음
  • tuple형으로 되어 있음. ( 변하지 않는 리스트 )
    • 이 데이터셋은 : ((trainX, trainY),(testX,testY)) 이렇게 되어있음.
import tensorflow as tf
((trainX, trainY),(testX,testY)) = tf.keras.datasets.fashion_mnist.load_data()
print(trainX)
print(trainX.shape)

  • 60000개 데이터, 28x28 짜리 이미지인 것을 shape로 확인

모델만들기

  • 인풋값을 넣고 아웃라인을 확인한다.
# 모델 만들기
## 확률예측문제라면 
### 1. 일단 마지막 레이어 노드수를 카테고리 갯수만큼
### 2. cross entropy라는 loss 함수 사용
#### relu : 음수는 다 0으로, convolution layer에서 자주씀
model = tf.keras.Sequential([
    tf.keras.layers.Dense(128, input_shape=(28,28), activation="relu"),
    tf.keras.layers.Dense(64, activation="relu"),
    tf.keras.layers.Dense(10, activation="softmax") # sofmax :0~1 로 압축시켜줌_카테고리예측용_총합1 // sigmoid 는 정답,오답 두개분류일때 사용)
])

# 모델 아웃라인 출력하기
## 학습을 시키기전에 인풋의 요약을 보고싶으면 모델에 모양을 지정시켜야함(input_shape=(n,n))
### tf.keras.layers.Dense(128, input_shape=(28,28),activation="relu"),
model.summary()

  • 마지막에 차원수가 갈렸다..?

    tf.keras.layers.Flatten() : 다차원행열을 1차원으로 변환

model = tf.keras.Sequential([
    tf.keras.layers.Dense(128, input_shape=(28,28), activation="relu"),
    tf.keras.layers.Dense(64, activation="relu"),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(10, activation="softmax") # sofmax :0~1 로 압축시켜줌_카테고리예측용_총합1 // sigmoid 는 정답,오답 두개분류일때 사용)
])

  • 마지막에 있는 10개의 데이터가 우리가 갖고싶은 데이터 수

일단 학습시켜보기

import tensorflow as tf
import matplotlib.pyplot as plt

# trainX : 이미지데이터
# trainY : 정답 (라벨)
((trainX, trainY),(testX,testY)) = tf.keras.datasets.fashion_mnist.load_data()

# 라벨 이름들
class_name = ['T/shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle']
# 모델 만들기
## 확률예측문제라면 
### 1. 일단 마지막 레이어 노드수를 카테고리 갯수만큼
### 2. cross entropy라는 loss 함수 사용
#### relu : 음수는 다 0으로, convolution layer에서 자주씀
model = tf.keras.Sequential([
    tf.keras.layers.Dense(128, input_shape=(28,28), activation="relu"),
    tf.keras.layers.Dense(64, activation="relu"),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(10, activation="softmax") # sofmax :0~1 로 압축시켜줌_카테고리예측용_총합1 // sigmoid 는 정답,오답 두개분류일때 사용)
])
# 모델 아웃라인 출력하기
## 학습을 시키기전에 인풋의 요약을 보고싶으면 모델에 모양을 지정시켜야함(input_shape=(n,n))
### tf.keras.layers.Dense(128, input_shape=(28,28),activation="relu"),
model.summary()
## 다수의 카테고리중 어디 한곳에 들어갈지 정할때 (원핫인코딩) -> sparse_카테고리_크로스엔트로피
model.compile(loss="sparse_categorical_crossentropy", optimizer="adam", metrics=['accuracy'])
model.fit(trainX, trainY, epochs=10)

  • 정답률이 높지않다. 한번 교육을 다시 시켜보자.

컨볼루션 레이어

  • Flatten 을 사용하면 (1차원으로 해체) 응용력이 없어짐. ( 조금만 달라도 틀렸다고 나옴)

    • 해결책 -> 컨볼루션 레이어
    • feature Extraction : 특성 추출 : 이미지 인식에서는 필수.
        1. 이미지에서 중요한 부분들을 추려서 복사본 20장 만든다
        1. 거기엔 이미지의 중요한 feature, 특성이 담겨있음
        1. 이걸로 학습한다.
    • 쉽게말해 이미지를 주고 가이드라인을 주는것.. 예) 손까락 다섯개 있으면 손이야.
  • 커널을 거쳐서 이미지를 압축하여 모은다. ( 커널 = 마스크 )

    • 이런식
  • 문제점 : 그냥 이걸 적용하면 응용력이 떨어짐

    • 해결책 : Pooling Layer( Down Sampling )

풀링 레이어

  • 컨볼루션 레이어의 단점(이미지가 움직이면 쓸모없어짐)을 처리하기위해 함께 사용
  • max Pooling 기법을 많이 사용한다.
    • 똑같이 중요한 특성(최대값만)을 추출하여 압축시킴
  • average Pooling 기법을 많이 사용한다.
    • 똑같이 중요한 특성(평균값만)을 추출하여 압축시킴

컨볼루션 + 풀링레이어

  • 특징추출 + 특징을 가운데로 모아줌 으로써 잘 맞춤.

컨볼루션 추가 _ 특징

# trainX : 이미지데이터
# trainY : 정답 (라벨)
(trainX, trainY),(testX,testY) = tf.keras.datasets.fashion_mnist.load_data()
# (선택사항)이미지데이터 전처리 (0~1로 압축해서 넣는다.)
trainX = trainX/255.0
testX = testX/255.0
# 괄호처리(모양지정)을 해줘야함(넘파이 참 좋다)
## 28개, 28개, 60000개 있고, 컨볼루션하기위해 한차원 더만듦
trainX = trainX.reshape((trainX.shape[0], 28,28, 1))
testX = testX.reshape((testX.shape[0], 28,28, 1))
# 라벨 이름들
class_name = ['T/shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle']
# 모델 만들기
## Flatten 을 사용하면 (1차원으로 해체) 응용력이 없어짐. ( 조금만 달라도 틀렸다고 나옴)
## 해결책 -> 컨볼루션 레이어
### feature Extraction : 특성 추출 : 이미지 인식에서는 필수.
### 1. 이미지에서 중요한 부분들을 추려서 복사본 20장 만든다
### 2. 거기엔 이미지의 중요한 feature, 특성이 담겨있음
### 3. 이걸로 학습한다.
model = tf.keras.Sequential([
    # 컨볼루션 레이어 생성
    ## 32개 컨볼루션 이미지와 커널사이즈는 3x3, 패딩(가에 공간)은 넣는게 좋음,
    ## relu는 음수를 안넣기 위해서,
    ## input_shpae() = ndim 에러를 없애기 위해 모양 지정 + 1차원 더 넣어줘야함
    ## 컬러데이터면 inputshape( , , 3) 이 되야겠죠 (R,G,B)
    tf.keras.layers.Conv2D(32, (3,3), padding="same",activation='relu', input_shape=(28,28,1)),
    ### 풀링하기. 맥스로 2x2 사이즈로(중앙으로 압축)
    tf.keras.layers.MaxPooling2D( (2,2) ),
    # tf.keras.layers.Dense(128, input_shape=(28,28), activation="relu"),
    tf.keras.layers.Dense(64, activation="relu"),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(10, activation="softmax") # sofmax :0~1 로 압축시켜줌_카테고리예측용_총합1 // sigmoid 는 정답,오답 두개분류일때 사용)
])

풀링레이어 추가 _ 중앙

### 풀링하기. 맥스로 2x2 사이즈로(중앙으로 압축)
    tf.keras.layers.MaxPooling2D( (2,2) ),

모델 평가

  • 컴퓨터가 처음보는 (TEST)데이터로 평가해야한다.
# 모델 평가
## 컴퓨터가 처음보는 데이터를 넣어줘야한다.
model.evaluate(testX, testY)

오버피팅 : 컴퓨터가 답을 외워서 실제 정답률 낮음

  • 위의 코드처럼 짜면은 효율적이지 않음
  • epoch 1회 끝날시 채점하는 법이 있음

validation_data=(X,Y)

model.evaluate(testX, validation_data=(testX, testY), testY)
  • 이렇게 하면 오버피팅이 일어나는지 확인가능하다. 오버피팅이 나면 중간에 끊으면 된다.

profile
🚄계속 앞으로🚄
post-custom-banner

0개의 댓글