본문 바로가기

Study/class note

딥러닝 / 사과와 파인애플 분류 신경망 만들기

14  사과와 파인애플 분류 신경망 만들기

1. 자동화 코드를 이용해서 '파인애플' 사진을 웹스크롤링 하시오.

2. 불필요한 사진 제거

3. 사진을 구글에서 받은 사진과 빙에서 받은 사진을 하나로 통합하시오.

그 중 사진 50개씩 뽑아 테스트 데이터를 구성(1~50 파인애플, 51~100 사과)

나머지 사진은로 훈련데이터 구성(파인애플 300개, 사과 300개)

import cv2
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

path = 'c:\pineapple'
 
file_list = os.listdir(path) 
random.shuffle(file_list)
for i,k in enumerate(file_list,1):     # 리스트안에 있는 파일들을 하나씩 빼내는 코드 
    if i <= 300:
        img = Image.open(path + '\\' + file_list[i])
        img.save('c:\\image_train\\'+str(i)+'.png')
    elif i <= 350 and i > 300 :
        img = Image.open(path + '\\' + file_list[i])
        img.save('c:\\image_test\\'+str(i - 300)+'.png')
import cv2
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

path = 'c:\\apple'
 
file_list = os.listdir(path) 
random.shuffle(file_list)
for i,k in enumerate(file_list,301):     # 리스트안에 있는 파일들을 하나씩 빼내는 코드 
    if i <= 600:
        img = Image.open(path + '\\' + file_list[i])
        img.save('c:\\image_train\\'+str(i)+'.png')
    elif i <= 650 and i > 600:
        img = Image.open(path + '\\' + file_list[i])
        img.save('c:\\image_test\\'+str(i - 550)+'.png')

 

 

+)리사이즈까지

import cv2
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

path = 'c:\\pineapple'
 
file_list = os.listdir(path) 
random.shuffle(file_list)
for i,k in enumerate(file_list,1):# 리스트안에 있는 파일들을 하나씩 빼내는 코드 
    try:
        if i <= 300:
            img = Image.open(path + '\\' + file_list[i])
            img2 = img.resize((32,32))
            img2.save('c:\\image_train\\'+str(i)+'.jpg')
        elif i <= 350 and i > 300:
            img = Image.open(path + '\\' + file_list[i])
            img2 = img.resize((32,32))
            img2.save('c:\\image_test\\'+str(i - 300)+'.jpg')
    except:
        pass
import cv2
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

path = 'c:\\apple'
 
file_list = os.listdir(path) 
random.shuffle(file_list)
for i,k in enumerate(file_list,301):# 리스트안에 있는 파일들을 하나씩 빼내는 코드 
    try:
        if i <= 600:
            img = Image.open(path + '\\' + file_list[i])
            img2 = img.resize((32,32))
            img2.save('c:\\image_train\\'+str(i)+'.jpg')
        elif i <= 650 and i > 600:
            img = Image.open(path + '\\' + file_list[i])
            img2 = img.resize((32,32))
            img2.save('c:\\image_test\\'+str(i - 550)+'.jpg')
    except:
        pass

=====================================================

구글 코랩에서 진행

1. 구글 마운트

from google.colab import drive
drive.mount('/content/drive')

2. 압축파일 해제

!unzip -qq /content/drive/MyDrive/fruit/apple.zip  -d /content/drive/MyDrive/fruit/image_apple
!unzip -qq /content/drive/MyDrive/fruit/pineapple.zip -d /content/drive/MyDrive/fruit/image_pineapple

3. 데이터 리사이즈 및 넘버링 

# 데이터 1 분류
import cv2
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import os
import random

path = '/content/drive/MyDrive/fruit/image_pineapple'
train_size = 300
test_size = 50

file_list = os.listdir(path) 
random.shuffle(file_list)

for i,k in enumerate(file_list,1):# 리스트안에 있는 파일들을 하나씩 빼내는 코드 
    if i <= train_size:
        img = cv2.imread(path + '/' + file_list[i])
        resize_img = cv2.resize(img, (32 , 32), interpolation=cv2.INTER_CUBIC)
        cv2.imwrite('/content/drive/MyDrive/fruit/train_image/'+str(i)+'.jpg', resize_img)
    elif i <= test_size and i > train_size:
        img = cv2.imread(path + '/' + file_list[i])
        resize_img = cv2.resize(img, (32 , 32), interpolation=cv2.INTER_CUBIC)
        cv2.imwrite('/content/drive/MyDrive/fruit/test_image/'+str(i - train_size )+'.jpg', resize_img)
# 데이터 2 분류
path2 = '/content/drive/MyDrive/fruit/image_apple'

file_list2 = os.listdir(path2) 
random.shuffle(file_list2)

for i,k in enumerate(file_list2,301):# 리스트안에 있는 파일들을 하나씩 빼내는 코드 
    if i <= 600:
        img = cv2.imread(path + '/' + file_list[i])
        resize_img = cv2.resize(img, (32 , 32), interpolation=cv2.INTER_CUBIC)
        cv2.imwrite('/content/drive/MyDrive/fruit/train_image/'+str(i)+'.jpg', resize_img)
    elif i <= 650 and i > 600:
        img = cv2.imread(path + '/' + file_list[i])
        resize_img = cv2.resize(img, (32 , 32), interpolation=cv2.INTER_CUBIC)
        cv2.imwrite('/content/drive/MyDrive/fruit/test_image/'+str(i - 550 )+'.jpg', resize_img)

4. 함수생성

import os
import re
import cv2
import numpy as np
 
def image_load(path):
    file_list = os.listdir(path)
    file_name=[]
 
    for  i  in  file_list:
        a = int( re.sub('[^0-9]','', i) )   # i 가 숫자가 아니면 null 로 변경해라 ~
        file_name.append(a)
    
    file_name.sort() # 정렬작업 
    
    image = []

    for k in file_name:
      file = path + '/' + str(k) + '.jpg'
      img = cv2.imread(file)
      image.append(img)

    return np.array(image)
import csv
 
def  label_load(path):
    file = open(path)
    labeldata = csv.reader(file)
    labellist = []
    for  i  in  labeldata:
        labellist.append(int(i[0]))
 
    return   np.array(labellist)

5. 데이터 로드

# 1. leaf 데이터를 불러옵니다.

# 이미지 데이터와 라벨위치 
train_image = '/content/drive/MyDrive/fruit/image_train/'
test_image = '/content/drive/MyDrive/fruit/image_test/'
train_label = '/content/drive/MyDrive/fruit/train_label.csv'
test_label = '/content/drive/MyDrive/fruit/test_label.csv'

# 데이터 로드 
x_train = image_load(train_image)
y_train = label_load(train_label)
x_test = image_load(test_image)
y_test = label_load(test_label)     

print(x_train.shape)
print(x_test.shape)
print(y_train.shape)
print(y_test.shape)

6. 모델 생성 및 훈련

# 4. 모델을 구성합니다. 3층 신경망으로 구성
model = Sequential()
model.add(Conv2D(200, activation='relu', kernel_size=(7,7), padding='same', input_shape=(32,32,3)))
model.add(MaxPooling2D(pool_size=(2,2), padding='same'))

model.add(Conv2D(200, activation='relu', kernel_size=(7,7), padding='same'))
model.add(MaxPooling2D(pool_size=(2,2), padding='same'))
model.add(Dropout(0.15))
 
model.add(Flatten())
model.add(Dense(200,activation='relu'))
model.add(Dropout(0.22))
model.add(BatchNormalization())
model.add(Dense(200,  activation='relu'))
model.add(Dropout(0.22))
model.add(BatchNormalization())
model.add(Dense(2,  activation='softmax'))
model.summary()
 
# 5. 모델을 설정합니다. ( 경사하강법, 오차함수를 정의해줍니다. )
model.compile(optimizer='adam', 
                     loss = 'categorical_crossentropy', 
                     metrics=['acc'])  # 학습과정에서 정확도를 보려고 

# from tensorflow.keras import backend as K  

# K.set_value(model.optimizer.learning_rate, 0.01)  # 러닝레이트를 0.01로 하겠다
# print("Learning rate before second fit : ", model.optimizer.learning_rate.numpy())

#6. 모델을 훈련시킵니다. 
history = model.fit(x_train, y_train,
                    batch_size = 200,
                    validation_data = (x_test, y_test),
                    epochs = 200)
 
# 7.모델을 평가합니다. (오차, 정확도가 출력됩니다.)
model.evaluate(x_test, y_test)
 
train_acc_list=history.history['acc'] 
test_acc_list=history.history['val_acc']

 
import  matplotlib.pyplot  as  plt
 
x = np.arange( len(train_acc_list) )
plt.plot( x, train_acc_list, label='train acc')
plt.plot( x, test_acc_list, label='test acc',  linestyle='--')
plt.ylim(0, 1)
plt.legend(loc='lower right')
plt.title('CNN - CAT & LION classification')
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.show()
 
# model.save('/content/drive/MyDrive/leaf/leaf_model2.h5')  # 모델 저장
반응형