Web/応用サービス分野AIイノベーション


1.アクセス情報分析


年齢/性別、地域、トラフィック・ソース、アクセス・ページ、製品などの測定基準を使用して、プロパティを分析します.
=>ユーザ流出、グループ間分析行動パターン例)Googleコメント(Web)/Google Firebase(アプリケーション)

2.スクリーン単位の動作パターンを分析する


  • アクションデータ
    ユーザーがサービスを使用する動作をデータ化

  • A/Bテスト

  • Webサイト内のホットマップの分析


  • 3.実習


    実習.
    from __future__ import absolute_import, division, print_function, unicode_literals
    
    import tensorflow as tf
    import numpy as np
    
    import cv2
    import matplotlib.pyplot as plt
    
    import warnings
    warnings.filterwarnings("ignore", category=DeprecationWarning)
    
    from elice_utils import EliceUtils
    elice_utils = EliceUtils()
    
        
        
    def data_print():
        
        img = cv2.imread("data/numbers.jpg")
        
        print("원본 이미지를 출력합니다.")
        plt.figure(figsize=(15,12))
        plt.imshow(img);
        
        plt.savefig("result2.png")
        elice_utils.send_image("result2.png")
        
        img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        img_blur = cv2.GaussianBlur(img_gray, (5, 5), 0)
        img_th = cv2.threshold(img_blur, 155, 250, cv2.THRESH_BINARY_INV)[1]
        
        contours, hierachy= cv2.findContours(img_th, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    
        rects = [cv2.boundingRect(each) for each in contours]
        
        tmp = [w*h for (x,y,w,h) in rects]
        tmp.sort()
        
        rects = [(x,y,w,h) for (x,y,w,h) in rects if ((w*h>1000)and(w*h<500000))]
        
        print("\n이미지를 분할할 영역을 표시합니다.")
        for rect in rects:
        # Draw the rectangles
            cv2.rectangle(img, (rect[0], rect[1]), (rect[0] + rect[2], rect[1] + rect[3]), (0, 255, 0), 5) 
        plt.clf()
        plt.figure(figsize=(15,12))
        plt.imshow(img);
        plt.savefig("result3.png")
        elice_utils.send_image("result3.png")
        
        seg_img = []
    
        margin_pixel = 50
    
        for cnt in contours: 
            x, y, w, h = cv2.boundingRect(cnt) 
    
            # Drawing a rectangle on copied image 
            if ((w*h>1000)and(w*h<500000)): 
    
                # Cropping the text block for giving input to OCR 
                cropped = img.copy()[y - margin_pixel:y + h + margin_pixel, x - margin_pixel:x + w + margin_pixel] 
                seg_img.append(cropped)
    
                rect = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 255), 5)
    
        print("\n분할 된 이미지를 출력합니다.")
        for i in range(len(seg_img)):
            plt.clf()
            plt.imshow(seg_img[i]);
            plt.savefig("result4.png")
            elice_utils.send_image("result4.png")
        
        
        re_seg_img = []
    
        for i in range(len(seg_img)):
            re_seg_img.append(cv2.resize(seg_img[i], (28,28), interpolation=cv2.INTER_AREA))
        
        gray = cv2.cvtColor(re_seg_img[0], cv2.COLOR_BGR2GRAY)
        
    import machine as ma
    
    def main():
        
        """
        지시사항 1번. 손글씨 이미지에서 숫자 부분만 분리하는 과정을 수행해보세요.
        """
        ma.data_print()
    
    if __name__ == "__main__":
        main()
    
    実習手書き分類深さ学習モデル
    from __future__ import absolute_import, division, print_function, unicode_literals
    
    import tensorflow as tf
    import numpy as np
    
    import cv2
    import matplotlib.pyplot as plt
    
    import warnings
    warnings.filterwarnings("ignore", category=DeprecationWarning)
    
    from elice_utils import EliceUtils
    elice_utils = EliceUtils()
    
    def train():
        mnist = tf.keras.datasets.mnist
    
        (x_train, y_train), (x_test, y_test) = mnist.load_data()
        x_train, x_test = x_train / 255.0, x_test / 255.0
    
        # model에 batch normalization layer 추가
        model = tf.keras.models.Sequential([
          tf.keras.layers.Flatten(input_shape=(28, 28)),
          tf.keras.layers.Dense(128, activation='relu'),
          tf.keras.layers.Dense(128, activation='relu'),
          tf.keras.layers.Dense(10, activation='softmax')
          #tf.keras.layers.Dense(10, activation='relu')
        ])
    
        # adam외의 optimizer로 변경
        # sparse_categorical_crossentropy외의 loss로 변경
        model.compile(optimizer='adam',
                      loss='sparse_categorical_crossentropy',
                      metrics=['accuracy'])
    
        # epochs 값 변경
        model.fit(x_train, y_train, epochs=5)
    
        model.evaluate(x_test,  y_test, verbose=2)
    
        # 임의의 5가지 test data의 이미지와 레이블값을 출력하고 예측된 레이블값 출력
        predictions = model.predict(x_test)
        idx_n = [15, 34, 68, 75, 98]
    
        for i in idx_n:
    
            img = x_test[i].reshape(28,28)
            plt.imshow(img,cmap="gray")
            plt.show()
            plt.savefig("result1.png")
            elice_utils.send_image("result1.png")
    
            print("Label: ", y_test[i])
            print("Prediction: ", np.argmax(predictions[i]))
            
        return model
        
        
    import machine as ma
    
    def main():
        
        """
        지시사항 1번. MNIST 데이터를 학습하는 인공지능 모델을 구현해보세요.
        """
        model = ma.train()
    
    if __name__ == "__main__":
        main()
    
    実習予測分割画像の数値
    from __future__ import absolute_import, division, print_function, unicode_literals
    
    import tensorflow as tf
    import numpy as np
    
    import cv2
    import matplotlib.pyplot as plt
    
    import warnings
    warnings.simplefilter("ignore")
    
    from elice_utils import EliceUtils
    elice_utils = EliceUtils()
    
    import os
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
    
    from tensorflow.python.util import deprecation
    deprecation._PRINT_DEPRECATION_WARNINGS = False
    
    tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)
        
    def data_predit():
    
        # model에 batch normalization layer 추가
        model = tf.keras.models.Sequential([
          tf.keras.layers.Flatten(input_shape=(28, 28)),
          tf.keras.layers.Dense(128, activation='relu'),
          tf.keras.layers.Dense(128, activation='relu'),
          tf.keras.layers.Dense(10, activation='softmax')
          #tf.keras.layers.Dense(10, activation='relu')
        ])
    
        # adam외의 optimizer로 변경
        # sparse_categorical_crossentropy외의 loss로 변경
        model.compile(optimizer='adam',
                      loss='sparse_categorical_crossentropy',
                      metrics=['accuracy'])
        
        import os
    
        checkpoint_path = "./cp.ckpt"
        checkpoint_dir = os.path.dirname(checkpoint_path)
        
        model.load_weights(checkpoint_path)
    
    
        
        img = cv2.imread("data/numbers.jpg")
        
        img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        img_blur = cv2.GaussianBlur(img_gray, (5, 5), 0)
        img_th = cv2.threshold(img_blur, 150, 250, cv2.THRESH_BINARY_INV)[1]
        
        contours, hierachy= cv2.findContours(img_th, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    
        rects = [cv2.boundingRect(each) for each in contours]
        
        tmp = [w*h for (x,y,w,h) in rects]
        tmp.sort()
        
        rects = [(x,y,w,h) for (x,y,w,h) in rects if ((w*h>1000)and(w*h<500000))]
        
        for rect in rects:
        # Draw the rectangles
            cv2.rectangle(img, (rect[0], rect[1]), (rect[0] + rect[2], rect[1] + rect[3]), (0, 255, 0), 5) 
        
        
        seg_img = []
    
        margin_pixel = 50
    
        for cnt in contours: 
            x, y, w, h = cv2.boundingRect(cnt) 
    
            # Drawing a rectangle on copied image 
            if ((w*h>1500)and(w*h<600000)): 
    
                # Cropping the text block for giving input to OCR 
                cropped = img.copy()[y - margin_pixel:y + h + margin_pixel, x - margin_pixel:x + w + margin_pixel] 
                seg_img.append(cropped)
    
                rect = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 255), 5)
    
        re_seg_img = []
    
        for i in range(len(seg_img)):
            re_seg_img.append(cv2.resize(seg_img[i], (28,28), interpolation=cv2.INTER_AREA))
        
        gray = cv2.cvtColor(re_seg_img[0], cv2.COLOR_BGR2GRAY)
        
        for i in range(len(seg_img)):
        
            gray = cv2.cvtColor(re_seg_img[i], cv2.COLOR_BGR2GRAY)
            img_binary = cv2.threshold(gray, 150, 250, cv2.THRESH_BINARY_INV)[1]
            test = img_binary.reshape(1,28,28) / 255.0
    
            #print(len(test))
    
            predictions = model.predict(test)
    
            img_test = test.reshape(28,28)
            plt.clf()
            
            plt.subplot(121)
            plt.imshow(seg_img[i])
            plt.title('Origin')
    
            plt.subplot(122)
            plt.imshow(img_test,cmap="gray")
            plt.title('Coverted')
            plt.show()
            
            plt.savefig("result4.png")
            elice_utils.send_image("result4.png")
    
            #print("Label: ", y_test[i])
            print("Prediction: ", np.argmax(predictions))
      import machine as ma
    
    def main():
        
        """
        지시사항 1번. 이미지 변환 과정과 예측 과정을 수행해보세요.
        """
        ma.data_predit()
    
    if __name__ == "__main__":
        main()