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') # 모델 저장
반응형
'Study > class note' 카테고리의 다른 글
딥러닝 / librosa 패키지 실습 및 음성데이터 설명 (0) | 2022.04.21 |
---|---|
딥러닝 / 사자, 고양이 분류기 만들기 (0) | 2022.04.21 |
딥러닝 / 신경망 활용 사용자 인터페이스 만들기 (0) | 2022.04.20 |
딥러닝 / 정상 이파리와 질병 이파리 분류 신경망 만들기 (0) | 2022.04.19 |
딥러닝 / CNN구현 (0) | 2022.04.18 |