# 이미지의 파일명이 모두 1부터 시작하는 정수여야 한다.
import tensorflow as tf import os import numpy as np from PIL import Image import random
text_path = '~/Training Data Color/' image_path = '~/Training Data Color/Image Data/'
#----------------------------------------------------------------------------------------------------------------------
learning_rate = 0.001 # 학습율 total_epochs = 10 # 전체 에폭 tf.set_random_seed(777) # 텐서플로의 랜덤 시드 선언
#----------------------------------------------------------------------------------------------------------------------
img_list = os.listdir(image_path) # 이미지 경로가 있는 폴더에서 이미지 리스트를 받아온다. total_data = len(img_list) # 전체 이미지 개수
Text_steering = open("%sSteering_Data.txt" % text_path, 'r') # 조향 데이터가 있는 텍스트 파일을 연다. Steering_label = Text_steering.read().splitlines() # 텍스트 파일로부터 Tab을 기준으로 조향 데이터를 받아온다.
#----------------------------------------------------------------------------------------------------------------------
random.seed(444) # 랜덤 모듈의 시드 선언 random_indexes = random.sample(range(1, total_data+1), total_data) # 데이터 전체를 섞기 위해 1부터 전체 데이터 개수까지 무작위로 된 정수 리스트를 만든다.
#----------------------------------------------------------------------------------------------------------------------
x = tf.placeholder(tf.float32, [70, 280, 3]) # (이미지 세로, 이미지 가로, 이미지 채널(컬러))에 대한 텐서 선언 x_st = tf.image.per_image_standardization(x) # 단일 이미지를 정규화하는 텐서 선언 x_img = tf.reshape(x_st, [1, 70, 280, 3]) # 정규화된 이미지 하나가 하나의 리스트 안에 들어가도록 변경 y_steering = tf.placeholder(tf.float32) # 조향 데이터 하나가 들어가는 텐서 선언 # #-------------------------------------------------------------------------------------------------1st Convolution Layer # W1 = tf.Variable(tf.random_normal([3, 3, 3, 8], stddev=0.01)) # (3X3)사이즈의 필터 8개 L1 = tf.nn.conv2d(x_img, W1, strides=[1, 1, 1, 1], padding='SAME') # 합성곱 신경망 연산 L1 = tf.nn.relu(L1) # 렐루 활성화 함수 L1 = tf.nn.max_pool(L1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') # 이미지의 크기가 줄도록 풀링
#-------------------------------------------------------------------------------------------------2nd Convolution Layer
W2 = tf.Variable(tf.random_normal([3, 3, 8, 16], stddev=0.01)) L2 = tf.nn.conv2d(L1, W2, strides=[1, 1, 1, 1], padding='SAME') L2 = tf.nn.relu(L2) L2 = tf.nn.max_pool(L2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
#-------------------------------------------------------------------------------------------------3rd Convolution Layer
W3 = tf.Variable(tf.random_normal([3, 3, 16, 32], stddev=0.01)) L3 = tf.nn.conv2d(L2, W3, strides=[1, 1, 1, 1], padding='SAME') L3 = tf.nn.relu(L3) L3 = tf.nn.max_pool(L3, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') L3_flat = tf.reshape(L3, [-1, 9 * 35 * 32]) # 완전 연결 신경망에 넣어주기 위해 이미지를 평탄화 해준다.
#---------------------------------------------------------------------------------------------4th Fully Connected Layer
W4 = tf.get_variable('W4', shape=[32 * 35 * 9, 128], initializer=tf.contrib.layers.xavier_initializer()) b4 = tf.Variable(tf.random_normal([128])) L4 = tf.nn.relu(tf.matmul(L3_flat, W4) + b4)
#---------------------------------------------------------------------------------------------5th Fully Connected Layer
W5 = tf.get_variable('W5', shape=[128, 64], initializer=tf.contrib.layers.xavier_initializer()) b5 = tf.Variable(tf.random_normal([64])) L5 = tf.nn.relu(tf.matmul(L4, W5) + b5)
#----------------------------------------------------------------------------------------------------------Output Layer
W6 = tf.get_variable('W6', shape=[64, 1], initializer=tf.contrib.layers.xavier_initializer()) b6= tf.Variable(tf.random_normal([1])) hypothesis = tf.matmul(L5, W6) + b6 # #-----------------------------------------------------------------------------------------------Define cost & optimizer
cost = tf.reduce_mean(tf.square(hypothesis - y_steering)) # 손실 함수 계산 optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost) # 손실 함수 최소화
sess = tf.Session() # 텐서플로 구동 sess.run(tf.global_variables_initializer()) # 변수 초기화
#--------------------------------------------------------------------------------------------------------------Learning
print('Learning started. It takes sometime...')
for epoch in range(total_epochs) :
avg_cost = 0
for index in range(total_data) :
training_img = np.array(Image.open('%s%s.PNG' % (image_path, random_indexes[index]))) # 단일 이미지 배열 training_label = float(Steering_label[random_indexes[index] - 1]) # 조향 데이터
feed_dict = {x: training_img, y_steering: training_label} c, h, _ = sess.run([cost, hypothesis, optimizer], feed_dict=feed_dict) # 학습 avg_cost += c
print('Epoch : ' + '%d ' % (epoch + 1), 'cost = ', '{:.5f}'.format(avg_cost/total_data))
print('Learning Finished!')
|