sejongresearch / FlowerClassification

aicoco 팀, 꽃분류기 (2019)
0 stars 5 forks source link

[WEB]오늘의 웹 강의 교실~!~! #44

Open 17011813 opened 5 years ago

17011813 commented 5 years ago
import cv2 
import numpy as np
from flask import Flask, request, make_response,jsonify
import numpy as np
import json
import urllib.request
from urllib.request import Request, urlopen
import base64
import numpy as np
from flask import Flask, render_template, request, redirect, url_for, send_from_directory
import logging

app = Flask(__name__,static_url_path='')

def preprocess_img(img,target_size=(299,299)):  #img가공
    if (img.shape[2] == 4):
        img = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR)    
    img = cv2.resize(img,target_size)   #img사이즈 바꿔줌
    img = np.divide(img,255.)
    img = np.subtract(img,0.5)
    img = np.multiply(img,2.)
    return img

def load_im_from_url(url):           #img를 url주소에 들어가서 사진만 가져오기
    requested_url = urlopen(Request(url,headers={'User-Agent': 'Mozilla/5.0'})) 
    image_array = np.asarray(bytearray(requested_url.read()), dtype=np.uint8)
    print (image_array.shape)
    print (image_array)
    image_array = cv2imdecode(image_array, -1)
    print (image_array.shape)
    return image_array

def load_im_from_system(url):      #img를 array로 길게 문자열로 바꿔주는 거같음
    image_url = url.split(',')[1]
    image_url = image_url.replace(" ", "+")
    image_array = base64.b64decode(image_url)
    #image_array = np.asarray(bytearray(image_array), dtype=np.uint8)
    image_array = np.fromstring(image_array, np.uint8)
    image_array = cv2.imdecode(image_array, -1)       #img를 decode해주고 밑에서 최종 return
    return image_array    

def predict(img):
    sess = tf.InteractiveSession()
    new_saver = tf.train.import_meta_graph('C:\\Users\\Yoona\\Desktop\\drive-download-20190613T041306Z-001\\my_test_model2.ckpt.meta')
    new_saver.restore(sess, 'C:\\Users\\Yoona\\Desktop\\drive-download-20190613T041306Z-001\\my_test_model2.ckpt')

    img=np.reshape(img,[-1,784])
    print (img.shape)
    x = sess.graph.get_tensor_by_name("x:0")
    y = sess.graph.get_tensor_by_name("y_true:0")
    hypothesis = sess.graph.get_tensor_by_name("operation:0")
    k=sess.graph.get_tensor_by_name("keep_prob:0")
    result = sess.run(hypothesis, feed_dict={x:img,k:1.0})
    flower_number = sess.run(tf.argmax(result,1))
    ra = np.array([flower_number])
    ra= np.vstack([ra,float(result[0][sess.run(tf.argmax(result,1))])])  #이중배열로 [[2.][1.]] 이렇게 출력됨
    return ra

@app.route('/classify_system', methods=['GET'])
def classify_system():
    image_url = request.args.get('imageurl')
    image_array = load_im_from_system(image_url)   #위에 load함수 써서 image를 array로 저장
    resp = predict(image_array)     #위의 predict함수에 img넣고 예측한 값을 resp에 저장
    result = []
    print(resp[0])   #어떻게 저장되어있는지 확인하면 그 형식대로 predict돌리고 나서 저장할때 resp꼴 맞게 코드 바꿔야됨
    print(resp.shape)
    result.append({"Class Name":float(resp[0])})
    result.append({"Score":float(resp[1])})
    return jsonify({'results':result})

@app.route('/classify_url', methods=['GET'])  #url과 system이 뭐가 다를까?
def classify_url():
    image_url = request.args.get('imageurl')
    image_array = load_im_from_url(image_url)
    resp = predict(image_array)
    result = []
    result.append({"Class Name":float(resp[0])})
    result.append({"Score":float(resp[1])})
    #for r in resp[0]:
        #result.append({"Class Name":r[1],"Score":float(r[2])})
    return jsonify({'results':result})

@app.route('/classify-system', methods=['GET'])
def do_system():
    return app.send_static_file('system.html')

@app.route('/classify-url', methods=['GET'])
def do_url():
    return app.send_static_file('url.html')

@app.route('/', methods=['GET'])
def root():
    return app.send_static_file('index.html')

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=70, debug=True)

오늘 체크포인트 받은걸로 코드 수정했어 predict를 우리 체크포인트로 CNN돌리는 거로 수정했고 이제 인터넷에서 가져오는 이미지 28x28 로 바꿔서 우리 코드에 맞게 돌아가게만 하면 될거 같아~! 근데 이게 이미지를 구글에서 바로 가져오는거 아니면 사진이 뜨는게 아니라 '이미지를 출력할 수 없습니다'로 뜨는데 이것도 한번 봐야할거같아ㅜㅜ 이건 웹 공부를 더 해서 이미지 출력 부분을 공부하면 될 거 같아 다같이 화이팅 할 수 있다~!~!~!~!~!!~!

23

그리고 이거 VScode 에서 돌리면 오른쪽 버튼 눌러서 run python file in terminal 누르면 밑에 터미날에 결과 출력돼 근데 print('hello') 이런거는 잘 출력 되는데 print(array.shape) 이런거는 왜 출력 안되는지 모르겠음..ㅜㅜ 그래서 형식 맞춰줄 때 파이썬 IDLE로 해본거 위에 사진이얌 다들 모르겠는거 물어보셍용 ㅇ★ㅇ