분류 전체보기 (17)
생성된 모델로 테스트하기

#생성된 모델로 테스트하기
import os, re, glob 
import cv2  #openCV 라이브러리 import하기
import numpy as np 
import shutil 
from numpy import argmax 
from keras.models import load_model 
 

#분류할 카테고리 지정
categories = ["road", "water", "building", "green"] 
  
def Dataization(img_path): 
    image_w = 28 
    image_h = 28 
    img = cv2.imread(img_path) 
    img = cv2.resize(img, None, fx=image_w/img.shape[1], fy=image_h/img.shape[0]) 
    return (img/256) 
  
src = [] 
name = [] 
test = [] 
image_dir = "./testData/test/building/" #테스트할 이미지 폴더 경로

for file in os.listdir(image_dir): 
    if (file.find('.jpg') is not -1):       
        src.append(image_dir + file) 
        name.append(file) 
        test.append(Dataization(image_dir + file)) 
  
  
test = np.array(test) 
model = load_model('cnnModel_100.h5'#사용할 모델 불러오기
predict = model.predict_classes(test) 
  
for i in range(len(test)): 
    print(name[i] + " : "+ str(categories[predict[i]]))

  Comments,     Trackbacks
생성된 데이터셋으로 훈련하기

#생성된 데이터셋으로 훈련하기  
from keras.models import Sequential 
from keras.layers import Dropout, Activation, Dense 
from keras.layers import Flatten, Convolution2D, MaxPooling2D 
from keras.models import load_model 
import numpy as np 
import cv2  #openCV 라이브러리 import하기


#분류할 카테고리명이 되기에 데이터셋 만들 당시 폴더명과 동일하게 해야함.
categories = ["road", "water", "building", "green"]
num_classes = len(categories)

 

#앞에서 만든 데이터셋을 불러온다.
X_train, X_test, Y_train, Y_test = np.load('./imageDataList_25.npy', allow_pickle = True) 

model = Sequential() 
model = Sequential() 
model.add(Convolution2D(16, 3, 3, border_mode='same', activation='relu', 
                        input_shape=X_train.shape[1:])) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Dropout(0.25)) 
   
model.add(Convolution2D(64, 3, 3,  activation='relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Dropout(0.25)) 
  
model.add(Convolution2D(64, 3, 3)) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Dropout(0.25)) 
   
model.add(Flatten()) 
model.add(Dense(256, activation = 'relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(num_classes,activation = 'softmax')) 
   
model.compile(loss='binary_crossentropy',optimizer='Adam',metrics=['accuracy']) 
model.fit(X_train, Y_train, batch_size=32, nb_epoch=100) 
score = model.evaluate(X_test, Y_test)  
print('loss==>' ,score[0]*100)  
print('accuracy==>', score[1]*100)

 

#모델을 저장할 경로와 파일명을 지정한다.
model.save('cnnModel_25.h5')



  Comments,     Trackbacks
로컬 이미지로 데이터셋 만들기

#로컬 이미지로 데이터셋 만들기 
import os, re, glob  
import cv2  #openCV 라이브러리 import하기
import numpy as np  
from sklearn.model_selection import train_test_split 

 

#현재 로컬 이미지 폴더 구조

#dataset/25/road, water, building, green
imagePath = './dataset/25'
categories = ["road", "water", "building", "green"]

#dataset/25 하위 폴더의 이름이 카테고리가 됨. 동일하게 맞춰줘야한다.
nb_classes = len(categories)  

image_w = 28 
image_h = 28 

X = []  
Y = []  

for idx, cate in enumerate(categories):  
    label = [0 for i in range(nb_classes)]  
    label[idx] = 1  
    image_dir = imagePath+'/'+cate+'/'  
     
    for top, dir, f in os.walk(image_dir): 
        for filename in f:  
            print(image_dir+filename)  
            img = cv2.imread(image_dir+filename)  
            img = cv2.resize(img, None, fx=image_w/img.shape[1], fy=image_h/img.shape[0])  
            X.append(img/256)  
            Y.append(label)  
             
X = np.array(X)  
Y = np.array(Y)  

X_train, X_test, Y_train, Y_test = train_test_split(X,Y)  
xy = (X_train, X_test, Y_train, Y_test) 

 

#생성된 데이터셋을 저장할 경로와 파일이름 지정
np.save("./imageDataList_25.npy", xy)

  Comments,     Trackbacks
CNN + OpenCV 이미지 분류 모델 성능 테스트

1. 25x25 Image Data

cnnModel_25.h5

     building - 348 / 500 = 69.6%

     water - 291 / 333 = 87.38%

     road - 211 / 513 = 41.13%

     green - 184 / 531 = 34.65%


2. 50x50 Image Data

cnnModel_50.h5

     building - 449 / 500 = 89.8%

     water - 333 / 333 = 100%

     road - 229 / 513 = 44.63%

     green - 378 / 531 = 71.18%


3. 100x100 Image Data

cnnModel_100.h5

     building - 316 / 500 = 63.2%

     water - 333 / 333 = 100%

     road - 379 / 513 = 73.87%

     green - 326 / 531 = 61.39%



ryong2/kelas/CNNModel/dataset/이미지 사이즈 : 훈련용 데이터

ryong2/kelas/CNNModel/testData/test :  학습용 데이터



훈련용 데이터를 분류하면서 집중력이 흐려져 제대로 분류하지 못한걸 감안하고

전체적으로 이미지 사이즈가 50x50일 때 그나마 정확도가 높다.


'뽀로룡 log > KERAS' 카테고리의 다른 글

생성된 데이터셋으로 훈련하기  (0) 2019.08.26
로컬 이미지로 데이터셋 만들기  (0) 2019.08.26
.h5 -> .pb 변환 프로그램  (1) 2019.08.21
Keras + CNN 모델  (0) 2019.08.19
이미지 데이터 전처리  (1) 2019.05.24
  Comments,     Trackbacks
.h5 -> .pb 변환 프로그램


.h5 -> .pb 변환 프로그램


https://github.com/amir-abdi/keras_to_tensorflow

  Comments,     Trackbacks
Keras + CNN 모델

1. 케라스 + CNN 모델 구현 (캐릭터 이미지 분류)

https://www.pyimagesearch.com/2018/04/16/keras-and-convolutional-neural-networks-cnns/





2. 명령어

  2-1 훈련하기>

  python TrainModel.py --dataset dataset/totalimg --model allImageModel.model --labelbin label.pickle

      학습 파이썬 코드       훈련할 이미지 폴더                   저장할 모델명 지정                           라벨링 카테고리 파일


  2-2 테스트>

  python StartClassfy.py --model OpenCV_CNN_Model.model --labelbin label.pickle --image sample/test40.jpg

                   분류 파이썬 코드        사용할 모델 경로 + 이름                      라벨링 카테고리 파일                        분류할 이미지




3. 경로: /home/ryong2/TestProject

dataset: 학습 데이터

totalimg: 전체 이미지


pyimagesearch: 노상관 검색해서 학습 이미지 다운받는 부분


sample: 테스트 데이터


allImageModel.model: 전체 이미지를 이용해 훈련한 모델


label.pickle: 라벨링 카테고리 파일


OpenCV_CNN_Model.mode: 250장 정도의 좋은 이미지로 학습시킨 모델


plot.png: 훈련 손실, 정확도 그래프


StartClassfy.py: 테스트 실행하는 파이썬 코드


TrainModel.py: 훈련 실행하는 파이썬 코드



  Comments,     Trackbacks
OPENCV Ai 활용예제

1. 인공지능 결과물을 opencv 라이브러리를 활용해서 사용하는 예제 설명입니다.

https://youtu.be/4FLAp9nXlyo




2. 얼굴인식

https://youtu.be/3LNHxezPi1I




3. 객체인식

https://curt-park.github.io/2017-03-26/yolo/



'참고자료' 카테고리의 다른 글

[사이트] keras serving 관련  (0) 2019.04.30
[사이트]tensorflow serving , mnist 포맷 설명  (0) 2019.04.30
  Comments,     Trackbacks
이미지 데이터 전처리
1. 데이터 전처리와 Augmentation

모델이 적은 이미지에서 최대한 많은 정보를 뽑아내서 학습할 수 있도록 우선 이미지를 augment함

이미지를 사용할 때마다 임의로 변형을 가함으로써 마치 훨씬 더 많은 이미지를 보고 공부하는 것과 같은 학습 효과를 낸다.

이를 통해 과적합(overfitting), 즉 모델이 학습 데이터에만 맞춰지는 것을 방지하고, 새로운 이미지도 잘 분류할 수 있게 됨.

이런 전처리 과정을 돕기 위해 케라스는 ImageDataGenerator 클래스를 제공

  1. 학습 도중에 이미지에 임의 변형 및 정규화 적용
  2. 변형된 이미지를 배치 단위로 불러올 수 있는 generator 생성
    1. generator를 생성할 때 flow(data, labels), flow_from_directory(directory) 두 가지 함수를 사용
    2. fir_generator, evaluate_generator 함수를 이용하여 generator로 이미지를 불러와서 모델을 학습할 수 있음

from keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(
        rotation_range = 40,        #이미지 회전 범위 (degrees)
        width_shift_range = 0.2,    #그림을 수평 또는 수직으로 랜덤하게 평행 이동시키는 범위 (원본 가로, 세로 길이에 대한 비율 값)
        height_shift_range = 0.2,    
        rescale = 1./255,             #원본 영상은 0-255의 RGB 계수로 구성되는데, 
       이 같은 입력값은 모델을 효과적으로 학습시키기에 너무 높음 (통상적인 learning rate를 사용할 경우). 
       그래서 이를 1/255로 스케일링하여 0-1 범위로 변환. 이는 다른 전처리 과정에 앞서 가장 먼저 적용.
        shear_range = 0.2,           #임의 전단 변환 (shearing transformation) 범위
        zoom_range = 0.2,           #임의 확대/축소 범위
        horizontal_flip = True,       #True로 설정할 경우, 50% 확률로 이미지를 수평으로 뒤집음
        원본 이미지에 수평 비대칭성이 없을 때 효과적. 즉, 뒤집어도 자연스러울 때 사용하면 좋음.
        fill_mode = `nearest`)        #이미지를 회전, 이동하거나 축소할 때 생기는 공간을 채우는 방식




2. ImageDataGenerator 디버깅
Generator를 이용해서 학습하기 전, 먼저 변형된 이미지이상한 점이 없는지 확인해야 함. 케라스는 이를 돕기 위해 flow라는 함수를 제공. 여기서 rescale 인자는 빼고 진행(255배 어두운 이미지는 아무래도 눈으로 확인하기 힘들 테니까)

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
datagen = ImageDataGenerator(
        rotation_range = 40,
        width_shift_range = 0.2,
        height_shift_range = 0.2,
        shear_range = 0.2,
        zoom_range = 0.2,
        horizontal_flip = True,
        fill_mode = `nearest`)




3. Image Load하여 여러 Image 생성
i = 0
img = load_img('로드할 파일경로, 이름')              #PIL 이미지
x = img_to_array(img)                              #(3, 150, 150) 크기의 NumPy 배열
x = x.reshape((1,) + x.shape)                      #(1, 3, 150, 150) 크기의 NumPy 배열

#임의 변환된 이미지를 배치 단위로 생성해서
for batch in datagen.flow(x, batch_size=1, save_to_dir=`저장할위치`, save_prefix=`파일이름`, save_format=`파일포맷`):
    i += 1
    if i > 20:
        break  #이미지 20장을 생성하고 마침




4. Image와 카테고리를 X, Y값으로 나누기

caltech_dir = "train 이미지 경로"

categories = ["road", "water", "noroad" .....]

nb_classes = len(categories)


image_w = 28

image_h = 28


pixels = image_h * image_w + 3


X = []

Y = []


for idx, cat in enumerate(categories):        #카테고리별로 돌면서 0으로 초기화

label = [0 for i in range(nb_classes)]

label[idx] = 1


image_dir = caltech_dir + "/" + cat    #cat 아님 category의 cat임

file = glob.glob(image_dir + "*.jpg")


for i, f in enumerate(files):

img = Image.open(f)

img = img.convert("RGB")

img = img.resize((image_w, image_h))

data = np.asarray(img)


X.append(data)

Y.append(label)



결과물 ---> image_data.npy


결과물을

X_train, X_test, y_train, y_test = np.load("./image_data.npy")

이렇게 load해서 사용하면 된다.

그리고 모델링을 한다음 학습하고 테스트하면 됨.


  Comments,     Trackbacks
최근 작성 글
최근 작성 댓글
최근 작성 트랙백
프로필
공지사항
글 보관함
캘린더
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
TODAY TOTAL