머신러닝을 통해'령화'티셔츠와'평성'티셔츠를 구분한다.

13187 단어 기계 학습Python

목표


2019.4.1.신원호'링화'가 발표되었다.

'사람들의 아름다운 마음의 교차 속에서 문화가 탄생하여 성장한다'는 뜻을 포함하고 있다
재해와 경기 변동의 영향이 남아 있는 평성시대의 과제에 따라 좋은 시대를 만들어 나가길 바란다.
한편 신년호와 관련된 상품도 곳곳에서 볼 수 있다.

그러고 보니 나는 평성 티셔츠가 생각났다

이번에 나는 이 상품들의 문자가 어느 정도 기계 학습을 통해 분류될 수 있는지 시험해 보고 싶다.

준비


1. [명령] [평화]의 텍스트 이미지를 준비합니다.
  • 령과 20장
  • 20장 완성.
  • 최종 평가는 6장 ※ 문자의 부분을 잘라서 사용하고, 일부의 이미지는 유명인의 이미지를 사용하도록 하겠습니다.
  • 2. 각각 학습/검증/최종 평가 폴더에 저장됩니다.
    data-org
    - train
    reiwa: 준비된'령화'중 16장을 여기에 놓았어요.
    Heisei: 준비된'평성'중 16장이 여기에 저장되어 있습니다.
    - validation
    reiwa: 준비된'령화'중 4장을 여기에 놓았어요.
    Heisei: 준비된'평성'중 4장이 여기에 저장되어 있습니다.
    - 평가 6장
      
    3. 기계 학습용 코드 준비(후술한learn.py)
    가장 좋은 것은 학습 데이터의 수를 늘리는 것이지만, 준비 시간을 줄이기 위해서이다
    ImageDataGenerator에서 회전/축소/등을 사용하여 장 수를 늘립니다.

    코드


    'learn.py'
    from tensorflow.python.keras import layers
    from tensorflow.python.keras import models
    from tensorflow.python.keras import optimizers
    from tensorflow.python.keras.preprocessing.image import ImageDataGenerator
    import matplotlib.pyplot as plt
    import numpy as np
    from PIL import Image
    import glob
    
    # モデルの定義
    model = models.Sequential()
    model.add(layers.Conv2D(16, (3, 3), activation='relu', input_shape=(256, 256, 3)))
    model.add(layers.Conv2D(16, (3, 3), activation='relu'))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(32, (3, 3), activation='relu'))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Flatten())
    model.add(layers.Dense(512, activation='relu'))
    model.add(layers.Dense(256, activation='relu'))
    model.add(layers.Dense(1, activation='sigmoid'))
    
    # モデルのコンパイル
    model.compile(optimizer='rmsprop',
                  loss='binary_crossentropy',
                  metrics=['acc'])
    
    model.summary()
    
    # クラス宣言
    train_datagen = ImageDataGenerator(
        rescale=1.0 / 255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)
    
    test_datagen = ImageDataGenerator(rescale=1.0 / 255)
    
    
    # フォルダ指定
    batch_size=20
    train_generator = train_datagen.flow_from_directory(
        'data/train',
        target_size=(256, 256),
        batch_size=batch_size,
        class_mode='binary')
    
    validation_generator = test_datagen.flow_from_directory(
        'data/validation',
        target_size=(256, 256),
        batch_size=batch_size,
        class_mode='binary')
    
    print(train_generator.class_indices)
    
    
    # 学習
    history = model.fit_generator(train_generator,
                                  steps_per_epoch=10,
                                  epochs=10,
                                  validation_data=validation_generator,
                                  validation_steps=10)
    
    acc = history.history['acc']
    val_acc = history.history['val_acc']
    loss = history.history['loss']
    val_loss = history.history['val_loss']
    
    epochs = range(1, len(acc) + 1)
    
    print(acc);
    print(val_acc);
    print(loss);
    print(val_loss);
    
    plt.plot(epochs, acc, 'bo', label='Training acc')
    plt.plot(epochs, val_acc, 'b', label='Validation acc')
    plt.title('Training and validation accuracy')
    plt.legend()
    plt.savefig("figure-acc.png")
    plt.figure()
    
    plt.plot(epochs, loss, 'bo', label='Training loss')
    plt.plot(epochs, val_loss, 'b', label='Validation loss')
    plt.title('Training and validation loss')
    plt.legend()
    plt.savefig("figure-loss.png")
    
    # evaluation
    paths = glob.glob("./data/evaluation/*.jpg")
    for path in paths:
        img = Image.open(path).convert('RGB')
        img = img.resize((256, 256))
        x = np.array(img)
        x = x / 255.
        x = x[None, ...]
        pred_prob = model.predict(x, batch_size=1, verbose=0)
    
        # 2値分類なので[0,1]の確率を出力する。0.5以上なら1とする。
        pred = np.round(pred_prob, 0)
    
        print("---{0}---".format(path))
        print(pred_prob)
        print("{0}の予測結果は{1}です.".format(path, pred))
    
    

    테스트


    학습 단계의 크기는 조정이 필요하지만, 먼저 15epoch를 지정하여 학습을 진행한다.
    (더 좋은 매개 변수가 있어야 한다)
    2019-04-14 17:34:11.610592: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
    Model: "sequential"
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    conv2d (Conv2D)              (None, 254, 254, 16)      448       
    _________________________________________________________________
    conv2d_1 (Conv2D)            (None, 252, 252, 16)      2320      
    _________________________________________________________________
    max_pooling2d (MaxPooling2D) (None, 126, 126, 16)      0         
    _________________________________________________________________
    conv2d_2 (Conv2D)            (None, 124, 124, 32)      4640      
    _________________________________________________________________
    max_pooling2d_1 (MaxPooling2 (None, 62, 62, 32)        0         
    _________________________________________________________________
    flatten (Flatten)            (None, 123008)            0         
    _________________________________________________________________
    dense (Dense)                (None, 512)               62980608  
    _________________________________________________________________
    dense_1 (Dense)              (None, 256)               131328    
    _________________________________________________________________
    dense_2 (Dense)              (None, 1)                 257       
    =================================================================
    Total params: 63,119,601
    Trainable params: 63,119,601
    Non-trainable params: 0
    _________________________________________________________________
    Found 32 images belonging to 2 classes.
    Found 8 images belonging to 2 classes.
    {'heisei': 0, 'reiwa': 1}
    Epoch 1/15
    10/10 [==============================] - 18s 2s/step - loss: 8.1931 - acc: 0.4750 - val_loss: 0.8280 - val_acc: 0.5000
    Epoch 2/15
    10/10 [==============================] - 16s 2s/step - loss: 0.7148 - acc: 0.4875 - val_loss: 0.7022 - val_acc: 0.5000
    Epoch 3/15
    10/10 [==============================] - 17s 2s/step - loss: 0.7318 - acc: 0.5250 - val_loss: 0.7039 - val_acc: 0.5000
    Epoch 4/15
    10/10 [==============================] - 18s 2s/step - loss: 0.6831 - acc: 0.5437 - val_loss: 0.7165 - val_acc: 0.5000
    Epoch 5/15
    10/10 [==============================] - 18s 2s/step - loss: 0.9253 - acc: 0.5375 - val_loss: 0.6806 - val_acc: 0.5375
    Epoch 6/15
    10/10 [==============================] - 16s 2s/step - loss: 0.6640 - acc: 0.6438 - val_loss: 0.6785 - val_acc: 0.4875
    Epoch 7/15
    10/10 [==============================] - 17s 2s/step - loss: 0.6093 - acc: 0.6812 - val_loss: 0.7921 - val_acc: 0.4000
    Epoch 8/15
    10/10 [==============================] - 16s 2s/step - loss: 0.6163 - acc: 0.6875 - val_loss: 0.8923 - val_acc: 0.4500
    Epoch 9/15
    10/10 [==============================] - 16s 2s/step - loss: 0.5593 - acc: 0.7312 - val_loss: 0.8695 - val_acc: 0.5625
    Epoch 10/15
    10/10 [==============================] - 17s 2s/step - loss: 0.5669 - acc: 0.7063 - val_loss: 0.8767 - val_acc: 0.3125
    Epoch 11/15
    10/10 [==============================] - 16s 2s/step - loss: 0.6163 - acc: 0.7188 - val_loss: 0.8409 - val_acc: 0.5000
    Epoch 12/15
    10/10 [==============================] - 16s 2s/step - loss: 0.5653 - acc: 0.7125 - val_loss: 0.9275 - val_acc: 0.4125
    Epoch 13/15
    10/10 [==============================] - 17s 2s/step - loss: 0.6229 - acc: 0.7625 - val_loss: 0.8779 - val_acc: 0.3500
    Epoch 14/15
    10/10 [==============================] - 17s 2s/step - loss: 0.5152 - acc: 0.7625 - val_loss: 0.8519 - val_acc: 0.5125
    Epoch 15/15
    10/10 [==============================] - 17s 2s/step - loss: 0.5381 - acc: 0.7563 - val_loss: 0.7191 - val_acc: 0.5000
    

    실제 이미지 평가


    최종 평가용 이미지 데이터 6장 사용

    기대치: 평가 예측치: 평가
    ---./data_org/evaluation/heisei1-2.jpg---
    [[0.04057287]]
    ./data_org/evaluation/heisei1-2.jpgの予測結果は[[0.]]です.
    

    기대치: 평가 예측치: 평가 ※ 점수 억지
    ---./data_org/evaluation/heisei2-2.jpg---
    [[0.4843383]]
    ./data_org/evaluation/heisei2-2.jpgの予測結果は[[0.]]です.
    

    기대치: 령과 예측치: 령과 ※ 간신히 득점
    ---./data_org/evaluation/reiwa1-1.jpg---
    [[0.5244837]]
    ./data_org/evaluation/reiwa1-1.jpgの予測結果は[[1.]]です.
    

    기대치: 명령과 예측치: 명령과
    ---./data_org/evaluation/reiwa2-2.jpg---
    [[0.93729514]]
    ./data_org/evaluation/reiwa2-2.jpgの予測結果は[[1.]]です.
    

    기대치: 명령과 예측치: 명령과
    ---./data_org/evaluation/reiwa3-2.jpg---
    [[0.9273448]]
    ./data_org/evaluation/reiwa3-2.jpgの予測結果は[[1.]]です.
    

    기대치: 명령과 예측치: 명령과
    ---./data_org/evaluation/reiwa4-2.jpg---
    [[0.9319874]]
    ./data_org/evaluation/reiwa4-2.jpgの予測結果は[[1.]]です.
    

    기대치: 령과 예측치: 령과 ※ 간신히 득점
    ---./data_org/evaluation/reiwa5-2.jpg---
    [[0.6226176]]
    ./data_org/evaluation/reiwa5-2.jpgの予測結果は[[1.]]です.
    

    감상


    나는 평가 점수가 더욱 명확해질 것이라고 생각하지만, 몇 가지 무리한 데이터가 있다.
    전체적인 결과는 기대만큼 많지만 샘플 수가 적습니다. 정말 성능에 문제가 없나요? 계속 확인할 필요가 있다고 생각합니다.남은 과제는 다음과 같다.
    ・과도한 학습, 학습 부족 여부 확인
    → 입력 데이터의 소음은 얼마나 큰 영향을 줍니까?
    ・ 하이퍼패라메트릭 조정
    범용 성능 평가
    만약 상세한 사람이 있다면 저를 지도해 주시기 바랍니다.

    CodeingError 대책

    OSError: cannot identify image file './data_org/train/showa//.DS_Store'
    
    DS_Store는 Mac의 메타데이터인 것 같습니다.python 처리가 필요하지 않으면 아래 명령 등으로 삭제하세요.
    $ find ./data_org/-name .DS_Store | xargs rm

    참고 자료


    위키백과, 우리 모두의 백과사전.
    Python: 명령행 매개변수란 무엇입니까?(슈퍼 베이스)
    맥에서DS_스토리지 종료
    ImageDataGenerator 클래스
    Sequential 모형으로 Keras를 시작해보도록 하겠습니다.
    그 모델, 공부 많이 했어요?공부 안 했어요?하면, 만약, 만약...

    좋은 웹페이지 즐겨찾기