100균의 주방만으로 이상 검지(성공편)

지난번 은 실패해 버렸습니다만, 시행착오의 위에, 잘 식별할 수 있게 되었습니다.
시행 착오의 궤적을 남깁니다.

이번에도 이것!


이미지의 물 증가



전회 사용한 화상은 모두 400장(정상 200장, 이상 200장)이었습니다. 이미지가 너무 적을까 생각하고 이미지를 늘리기로 했습니다. Keras에 편리한 기능이있었습니다.

자체 딥 러닝을 위한 데이터 세트를 확장하고 늘리십시오.
htps : // 이 m /은 lsp 인 g / ms / 7692504

이미지 전처리 - Keras Documentation
htps : // 케라 s. 이오/쟈/p레 p로세신 g/이마게/

참고로 한 사이트 거의 그대로입니다만, 이번 주방만의 경우, 화상의 각도가 중요하다고 생각해, 화상의 회전은 하지 않게 했습니다.


매개변수
설정값


rotation_range
코멘트 아웃

horizontal_flip
거짓

vertical_flip
거짓

    # 拡張する際の設定
    generator = ImageDataGenerator(
                    # rotation_range=90, # 90°まで回転
                    width_shift_range=0.1, # 水平方向にランダムでシフト
                    height_shift_range=0.1, # 垂直方向にランダムでシフト
                    channel_shift_range=50.0, # 色調をランダム変更
                    shear_range=0.39, # 斜め方向(pi/8まで)に引っ張る
                    horizontal_flip=False, # 垂直方向にランダムで反転
                    vertical_flip=False # 水平方向にランダムで反転
                    )

이 방법으로 이미지를 10배의 4000장(정상 2000장, 이상 2000장)으로 할 수 있었습니다.



모델 매개변수 변경



Keras의 문서를 바라보고, 이번 문제는 「개」 「고양이」 「코끼리」와 같이 복수로 나누는 것이 아니라, 「정상치」 「이상치」의 2개로 분류하는 것만의 문제라고 깨닫고 네.

Sequential 모델 가이드 - Keras Documentation
htps : // / 케라 s. 이오 / 그럼 / 껄껄 gs r d / 세쿠 엔 치아
# マルチクラス分類問題の場合
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
# 2値分類問題の場合
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])
# 前回のコード(参考元のコピペです)
model.compile(loss='categorical_crossentropy',
              optimizer='SGD',
              metrics=['accuracy'])

중간의 '이진 분류 문제'의 코드로 변경했습니다.
optimizer의 의미는 공부합니다.

Optimizer : 심층 학습의 기울기 방법 이해
htps : // 코 m / 토쿠 만 / ms / 1944c00415d129

이미지의 회색조



물 늘어난 이미지를 보았을 때, 이번 문제는 색 정보는 관계 없다고 생각했습니다.
이것도 Keras에서 쉽게 할 수있었습니다. (대단해, Keras!!)
img = img_to_array(load_img(picture, target_size=(224,224), grayscale=True))

그레이스케일로 하는 것으로, 색 정보가 RGB의 3으로부터 1이 되므로, input_shape 를 추가로 지정할 필요가 있습니다. (지정하지 않으면 3 취급인가?)
model = MobileNet(include_top=True, weights=None, classes=2,input_shape=(224, 224, 1))

모델 변경(이번에는 불용)



모델을 바꾸면 결과도 바뀔까라고 생각해 보았습니다만, Raspberry Pi Zero로 예측시키려고 하면, 메모리 부족으로 동작시킬 수 없었습니다. 감각을 모르겠지만 Raspberry Pi Zero의 512MB 메모리에서 작동한다는 것은 대단한 일이지요.

예측




이미지
결과



[[9.9999988e-01 1.2415921e-07]]200g 이하! 정답!


[[1.0000000e+00 5.4107854e-08]]200g 이하! 정답!


[[8.696176e-06 9.999913e-01]]200g 이상 정답!


[[7.8308704e-10 1.0000000e+00]]200g 이상! 정답!


[[4.8343203e-08 1.0000000e+00]]200g 이상! 정답!


[[1.0000000e+00 1.5057713e-08]]200g 이하! 부정해! (주방만의 뒷면) 예상치 못한 이미지 때 어떻게 하면 좋을까


예측 소스
# coding:utf-8

from time import sleep

from keras.applications import mobilenet

from keras.models import load_model
from keras.preprocessing import image
from keras.preprocessing.image import img_to_array, load_img
import numpy as np
from keras.utils import np_utils

model = load_model('0212_my_model_0216.h5', custom_objects={
                   'relu6': mobilenet.relu6,
                   'DepthwiseConv2D': mobilenet.DepthwiseConv2D})

while True:
    X = []

    picture = '/home/pi/motion/capture/lastsnap.jpg'
    img = img_to_array(load_img(picture, target_size=(224, 224), grayscale=True))
    X.append(img)

    X = np.asarray(X)
    X = X.astype('float32')
    X = X / 255.0

    features = model.predict(X)

    print(features)
    if features[0][0] > features[0][1]:
        print('200g以下!')
    else:
        print('200g以上!')

    sleep(5)


끝에



어떻게든 잘 분류할 수 있었습니다.
다만, 역치를 200g에서 300g으로 바꾸고 싶어지면 다시 한번 학습시켜야 하는 것일까?
「멀티 클래스 분류」로 하면 좋을까?



예측에 사용한 이미지와 예측 결과를 LINE Notify로 통지하면 뭔가 했던 느낌.



Python에서 LINE Notify로 LINE으로 메시지 보내기
htps : // 이 m/단 3/이고 ms/0998c18df11d4아1c7427

좋은 웹페이지 즐겨찾기