765 프로 삼가를 CNN에서 식별해 보았다 (with Chainer 2.0.0)

연구실의 딥 러닝 공부회에서 각자 뭔가 해보자는 것이 되었으므로, 아이머스의 원조 어삼가를 CNN으로 식별해 보았습니다.

결과는 이런 느낌


( h tp : // 어쨌든 ls r. jp / 속눈썹 s / 에이 t / 9th / 오 ds / 마 mg_ 오 ds37. jpg 보다 이 이미지는 빌렸습니다.문제가 있으면 삭제합니다.)

마음껏 10시간 정도로 할 수 있었습니다. 여러분이 공개해 주시는 코드에 감사합니다.

환경



· MacOS X El Capitan
· 파이썬 3.5.2
· OpenCV 3.1.0
・anaconda3-4.2.0
· Chainer 2.0.0
・PIL


OpenCV를 conda로 넣고 거기에 Chainer와 뭔가를 넣으면 편하다.

데이터 세트



python3에서 google 이미지 다운로드
이쪽의 코드를 빌려서 3명의 이미지를 각각 100장 정도 수집했습니다.

다른 용도로 다른 이미지도 적절하게 수집했습니다.

「100장? 적은!」
라고 생각될지도 모릅니다만, 이번은 이것만으로 잘 되었습니다.
특징을 알기 쉽기 때문입니까.

얼굴 잘라내다



OpenCV를 사용하여 누구의 얼굴인지 추정 (Eigenface, Fisherface, LBPH)
이 코드를 바탕으로 잘라내고 저장했습니다.

크기는 32x32입니다.

변경 사항은 OpenCV에 의한 애니메이션 얼굴 검출이라면 lbpcascade_animeface.xml
로 배포되고 있는 「lbpcascade_animeface.xml」을 특징량 검출기에 사용한 것과, 컬러 보존을 할 수 있도록 한 것입니다.

kao.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import cv2, os
import numpy as np
from PIL import Image

# 元画像
train_path = '元画像フォルダのパス'

# アニメ顔特徴分類器
cascadePath = "lbpcascade_animeface.xml"
faceCascade = cv2.CascadeClassifier(cascadePath)

# 指定されたpath内の画像を取得
def get_images_and_labels(path):
    # 画像を格納する配列
    images = []
    # ラベルを格納する配列
    labels = []
    # ファイル名を格納する配列
    files = []
    i = 0
    for f in os.listdir(path):
        # 画像のパス
        image_path = os.path.join(path, f)
        # 画像を読み込む
        image_pil = Image.open(image_path)
        # NumPyの配列に格納
        image = np.array(image_pil, 'uint8')
        # アニメ顔特徴分類器で顔を検知
        faces = faceCascade.detectMultiScale(image)
        # 検出した顔画像の処理
        for (x, y, w, h) in faces:
            # 顔を 32x32 サイズにリサイズ
            roi = cv2.resize(image[y: y + h, x: x + w], (32, 32), interpolation=cv2.INTER_LINEAR)
            # 画像を配列に格納
            images.append(roi)
            # ファイル名を配列に格納
            files.append(f)
            save_path = './書き出しフォルダのパス/' + str(i) + '.jpg'
            # そのまま保存すると青みがかる(RGBになっていない)
            cv2.imwrite(save_path, roi[:, :, ::-1].copy())
            print(i)

            i+=1

    return images

images = get_images_and_labels(train_path)

# 終了処理
cv2.destroyAllWindows()


데이터의 물을 늘리지 않고도 잘 진행되었습니다.

학습



python : chainer를 사용하여 화 이야기 캐릭터를 인식시킵니다! ~part5 주요 캐릭터로 다치 분류(미지 데이터에 적용편)~
이 기사를 토대로 Chainer 2.0.0에서 실행되도록 다시 작성했습니다.

포인트는
    train = tuple_dataset.TupleDataset(X_train, y_train)
    test = tuple_dataset.TupleDataset(X_test, y_test)

    train_iter = chainer.iterators.SerialIterator(train, args.batchsize)
    test_iter = chainer.iterators.SerialIterator(test, args.batchsize,
                                                 repeat=False, shuffle=False)

    # Set up a trainer
    updater = training.StandardUpdater(train_iter, optimizer, device=args.gpu)
    trainer = training.Trainer(updater, (args.epoch, 'epoch'), out="output")

    # Evaluate the model with the test dataset for each epoch
    trainer.extend(extensions.Evaluator(test_iter, model, device=args.gpu))


이와 같이, 원래 코드의 「학습과 테스트」를 옮겨 trainer와 updater가 달리게 한 것입니다.
나머지는
model = L.Classifier(clf_bake())

또는 레이어를 L.Convolution2D로 수정하거나 def forward를 def call로 대체하는 것입니다.

모델은 시각화하면 이런 느낌



학습 결과



CPU로 30epoch 돌렸습니다. GPU 사용하지 않아도 4 층 정도라면 빠릅니다.


loss


accuracy


데이터 세트가 100장 정도인데도 val/accuracy가 85%는 꽤 대단한 것이 아닐까요. 자신도 처음으로 돌렸을 때는 놀랐습니다.

CNN 대단해!

알 수 없는 데이터 추정



이쪽도 대부분은 python : chainer를 사용하여 화 이야기 캐릭터를 인식시킵니다! ~part5 주요 캐릭터로 다치 분류(미지 데이터에 적용편)~ 의 기사를 기초로 했습니다.

포인트는 모델을로드합니다.
model = L.Classifier(clf_bake())

chainer.serializers.load_npz("output/model_snapshot_500", model) 

와 같이 Classifier를 사용하면,

recognition 함수의 반환 값
def recognition(image, faces):

(中略)

return model.predictor(face_images) , image

하는 것입니다.

감상



곧 결과가 보이므로 재미 있습니다.
스스로 데이터 세트를 준비해 보면 즐겁기 때문에 꼭.

이번에는 더 많은 클래스로 해보자.

좋은 웹페이지 즐겨찾기