VGG16에서 이미지 인식을 시도했습니다.
소개
모처럼 Python을 시작했기 때문에 기계 학습으로 화상 인식을 해 보려고 생각했다.
이번에는 이미지를 모아 CNN(컨볼루션 뉴럴 네트워크)에서 학습해 ~라는 방법은 취하지 않고 VGG16이라는 학습된 모델을 사용하여 이미지 인식을 실시합니다.
VGG16이란?
총 16층의 컨벌루션 뉴럴 네트워크로, 1000 클래스를 학습한 모델입니다.
인식할 수 있는 것은 학습한 1000 클래스로 제한됩니다.
1000 클래스(개, 고양이,... 등) 이외의, 예를 들면 인간의 이미지를 인식시키면 가스 마스크라고 인식하거나 합니다(인간이라고 인식할 수 없다)
사용한 것
· 파이썬 3.6
· numpy 1.16.4
· tensorflow 1.3.0
・keras 2.2.4
· OpenCV 4.1.0
했던 일
절차는 다음과 같습니다.
입력 이미지 전처리 → 학습된 모델 불러오기 → 이미지 결정 → 결과 출력
입력 이미지 전처리
다음은 입력 화상의 path를 받아 전처리를 하는 함수.
import numpy as np
import cv2
from keras.applications.vgg16 import preprocess_input
def img_preprocess(img_path):
img = cv2.imread(img_path) #読み込み
size = (224,224)
img = cv2.resize(img, size) #サイズ変更
img = np.array(img) #np.arrayにする
img = np.expand_dims(img, axis=0) #入力用に次元を一つ追加する
img = preprocess_input(img) #VGG16に入力するための前処理を行う
return img
이미지의 판독은 OpenCV(cv2)의 imread로 행한다. (입력된 이미지는 배열로 수신됨)
VGG16에의 입력 화상 사이즈는 224×224이므로 cv2.resize로 사이즈를 변경. (여기서 img는 (224, 224, 3)의 배열이 된다. 마지막 3은 칼라로 입력하고 있으므로 RGB의 3층 있는 것을 나타내고 있다.)
입력은 np.array로 하기 때문에 변환. preprocess_input ()을 사용하여 VGG16에 입력하기위한 전처리가 수행됩니다.
학습된 모델 로드
VGG16은 쉽게 호출 할 수 있습니다.
model = VGG16()
전체 결합층을 떼어낼지, 무게의 종류는 어떻게 할까 등을 선택할 수 있지만, 무게는 1종류 밖에 제공되지 않고 이번은 모델을 그대로 사용하므로 전체 결합층도 그대로 한다.
처음 실행할 때 데이터를 다운로드하므로 시간이 걸립니다.
학습된 모델을 출력하려면
pickle을 사용합니다.
import pickle
#モデルの保存
model_filename = 'model.sav'
pickle.dump(model, open(model_filename, 'wb')
#モデルの読み込み
loaded_model = pickle.load(open(model_filename, 'rb'))
이미지 결정
한 줄로 할 수 있습니다! 편리!
pred = model.predict(img)
pred에 decode_prediction()을 적응한다.
decode_prediction 한 pred는 [(class1, description1, probability1), (class2, description2, probability2), ...]의 튜플로 주어진다.
top=n으로 지정하면, probability(확률)가 가장 높은 것으로부터 n개의 데이터를 취득할 수 있다.
result = decode_predictions(pred, top=1)[0]
코드
main.py와 같은 디렉토리에 있는 img 폴더에서 입력 이미지를 가져옵니다. 인식 결과의 출력을 정돈 & 번역하는 등 세세한 부분까지 포함한 것을 아래에 나타낸다.
main.pyimport utils
import pickle
import numpy as np
from keras.applications.vgg16 import preprocess_input, decode_predictions
#画像のpathを取得
img_path = utils.get_img_path()
#入力画像の前処理
img = utils.img_preprocess(img_path)
#学習済みモデルの読み込み
model_filename = 'model.sav'
model = pickle.load(open(model_filename, 'rb'))
#画像の判定
pred = model.predict(img)
#最もスコアの高いものを取得
result = decode_predictions(pred, top=1)[0]
name_en = result[0][1]
score = round(result[0][2]*100, 1)
#翻訳
name_ja = utils.name_trans(name_en)
print("この画像に映っているのは: {0}({1}) {2}%" .format(name_ja, name_en, score))
print(result)
utils.pyimport os, glob
import numpy as np
import cv2
from keras.applications.vgg16 import preprocess_input
from requests import get
#入力画像のpathを取得する
def get_img_path():
path = './img/'
img_name_arr = os.listdir(path)
img_name = img_name_arr[0]
return path + img_name
#入力画像の前処理を行う
def img_preprocess(img_path):
img = cv2.imread(img_path) #読み込み
size = (224,224)
img = cv2.resize(img, size) #サイズ変更
img = np.array(img) #np.arrayにする
img = np.expand_dims(img, axis=0) #入力用に次元を一つ追加する
img = preprocess_input(img) #VGG16に入力するための前処理を行う
return img
#predictから得られた名前が_(アンダースコア)付きの英単語なので翻訳する
def name_trans(name):
#'_'を取り除く
if '_' in name:
name_arr = name.split('_')
name = ''
for i in range(len(name_arr)):
if i == (len(name_arr) - 1):
name += name_arr[i]
else:
name += (name_arr[i] + " ")
#GASで作ったAPIで翻訳
trans_from = 'en'
trans_to = 'ja'
trans_url = (
'https://script.google.com/macros/s/AKfycbzPH7k0wm5QqP78MtGXt2cOZ_dR0X0G-jMxJODwZvQM3hG89Cct/exec'
+ '?text=' + name + '&source=' + trans_from + '&target=' + trans_to
)
res = get(trans_url)
name_ja = res.text
return name_ja
번역에 대해서는 이전 기사를 참조하십시오.
Google Apps Script로 만든 무료 번역 API 사용
실행해보기
입력하는 이미지는 이것.
결과
この画像に映っているのは: 旅客機(airliner) 84.8%
정답!
결론
학습이 끝난 모델을 사용한 화상 인식은 화상 데이터의 준비, 데이터의 정리, 라벨 첨부라고 하는 번거로운 작업이 없기 때문에 매우 편하다.
게다가 VGG16에 관해서는 keras가 여러가지 해준다.
다음은 VGG16의 전체 결합층을 제외하고 Fine-Tuning을 시도해 보자.
참고
응용 프로그램 - Keras
Python scikit-learn으로 기계 학습 모델 저장 및 로드
Keras에서 VGG16 사용 - 인공 지능에 관한 단창록
Reference
이 문제에 관하여(VGG16에서 이미지 인식을 시도했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/umyomyomyon/items/87355fee78ff98d5d1d6
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
총 16층의 컨벌루션 뉴럴 네트워크로, 1000 클래스를 학습한 모델입니다.
인식할 수 있는 것은 학습한 1000 클래스로 제한됩니다.
1000 클래스(개, 고양이,... 등) 이외의, 예를 들면 인간의 이미지를 인식시키면 가스 마스크라고 인식하거나 합니다(인간이라고 인식할 수 없다)
사용한 것
· 파이썬 3.6
· numpy 1.16.4
· tensorflow 1.3.0
・keras 2.2.4
· OpenCV 4.1.0
했던 일
절차는 다음과 같습니다.
입력 이미지 전처리 → 학습된 모델 불러오기 → 이미지 결정 → 결과 출력
입력 이미지 전처리
다음은 입력 화상의 path를 받아 전처리를 하는 함수.
import numpy as np
import cv2
from keras.applications.vgg16 import preprocess_input
def img_preprocess(img_path):
img = cv2.imread(img_path) #読み込み
size = (224,224)
img = cv2.resize(img, size) #サイズ変更
img = np.array(img) #np.arrayにする
img = np.expand_dims(img, axis=0) #入力用に次元を一つ追加する
img = preprocess_input(img) #VGG16に入力するための前処理を行う
return img
이미지의 판독은 OpenCV(cv2)의 imread로 행한다. (입력된 이미지는 배열로 수신됨)
VGG16에의 입력 화상 사이즈는 224×224이므로 cv2.resize로 사이즈를 변경. (여기서 img는 (224, 224, 3)의 배열이 된다. 마지막 3은 칼라로 입력하고 있으므로 RGB의 3층 있는 것을 나타내고 있다.)
입력은 np.array로 하기 때문에 변환. preprocess_input ()을 사용하여 VGG16에 입력하기위한 전처리가 수행됩니다.
학습된 모델 로드
VGG16은 쉽게 호출 할 수 있습니다.
model = VGG16()
전체 결합층을 떼어낼지, 무게의 종류는 어떻게 할까 등을 선택할 수 있지만, 무게는 1종류 밖에 제공되지 않고 이번은 모델을 그대로 사용하므로 전체 결합층도 그대로 한다.
처음 실행할 때 데이터를 다운로드하므로 시간이 걸립니다.
학습된 모델을 출력하려면
pickle을 사용합니다.
import pickle
#モデルの保存
model_filename = 'model.sav'
pickle.dump(model, open(model_filename, 'wb')
#モデルの読み込み
loaded_model = pickle.load(open(model_filename, 'rb'))
이미지 결정
한 줄로 할 수 있습니다! 편리!
pred = model.predict(img)
pred에 decode_prediction()을 적응한다.
decode_prediction 한 pred는 [(class1, description1, probability1), (class2, description2, probability2), ...]의 튜플로 주어진다.
top=n으로 지정하면, probability(확률)가 가장 높은 것으로부터 n개의 데이터를 취득할 수 있다.
result = decode_predictions(pred, top=1)[0]
코드
main.py와 같은 디렉토리에 있는 img 폴더에서 입력 이미지를 가져옵니다. 인식 결과의 출력을 정돈 & 번역하는 등 세세한 부분까지 포함한 것을 아래에 나타낸다.
main.pyimport utils
import pickle
import numpy as np
from keras.applications.vgg16 import preprocess_input, decode_predictions
#画像のpathを取得
img_path = utils.get_img_path()
#入力画像の前処理
img = utils.img_preprocess(img_path)
#学習済みモデルの読み込み
model_filename = 'model.sav'
model = pickle.load(open(model_filename, 'rb'))
#画像の判定
pred = model.predict(img)
#最もスコアの高いものを取得
result = decode_predictions(pred, top=1)[0]
name_en = result[0][1]
score = round(result[0][2]*100, 1)
#翻訳
name_ja = utils.name_trans(name_en)
print("この画像に映っているのは: {0}({1}) {2}%" .format(name_ja, name_en, score))
print(result)
utils.pyimport os, glob
import numpy as np
import cv2
from keras.applications.vgg16 import preprocess_input
from requests import get
#入力画像のpathを取得する
def get_img_path():
path = './img/'
img_name_arr = os.listdir(path)
img_name = img_name_arr[0]
return path + img_name
#入力画像の前処理を行う
def img_preprocess(img_path):
img = cv2.imread(img_path) #読み込み
size = (224,224)
img = cv2.resize(img, size) #サイズ変更
img = np.array(img) #np.arrayにする
img = np.expand_dims(img, axis=0) #入力用に次元を一つ追加する
img = preprocess_input(img) #VGG16に入力するための前処理を行う
return img
#predictから得られた名前が_(アンダースコア)付きの英単語なので翻訳する
def name_trans(name):
#'_'を取り除く
if '_' in name:
name_arr = name.split('_')
name = ''
for i in range(len(name_arr)):
if i == (len(name_arr) - 1):
name += name_arr[i]
else:
name += (name_arr[i] + " ")
#GASで作ったAPIで翻訳
trans_from = 'en'
trans_to = 'ja'
trans_url = (
'https://script.google.com/macros/s/AKfycbzPH7k0wm5QqP78MtGXt2cOZ_dR0X0G-jMxJODwZvQM3hG89Cct/exec'
+ '?text=' + name + '&source=' + trans_from + '&target=' + trans_to
)
res = get(trans_url)
name_ja = res.text
return name_ja
번역에 대해서는 이전 기사를 참조하십시오.
Google Apps Script로 만든 무료 번역 API 사용
실행해보기
입력하는 이미지는 이것.
결과
この画像に映っているのは: 旅客機(airliner) 84.8%
정답!
결론
학습이 끝난 모델을 사용한 화상 인식은 화상 데이터의 준비, 데이터의 정리, 라벨 첨부라고 하는 번거로운 작업이 없기 때문에 매우 편하다.
게다가 VGG16에 관해서는 keras가 여러가지 해준다.
다음은 VGG16의 전체 결합층을 제외하고 Fine-Tuning을 시도해 보자.
참고
응용 프로그램 - Keras
Python scikit-learn으로 기계 학습 모델 저장 및 로드
Keras에서 VGG16 사용 - 인공 지능에 관한 단창록
Reference
이 문제에 관하여(VGG16에서 이미지 인식을 시도했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/umyomyomyon/items/87355fee78ff98d5d1d6
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
절차는 다음과 같습니다.
입력 이미지 전처리 → 학습된 모델 불러오기 → 이미지 결정 → 결과 출력
입력 이미지 전처리
다음은 입력 화상의 path를 받아 전처리를 하는 함수.
import numpy as np
import cv2
from keras.applications.vgg16 import preprocess_input
def img_preprocess(img_path):
img = cv2.imread(img_path) #読み込み
size = (224,224)
img = cv2.resize(img, size) #サイズ変更
img = np.array(img) #np.arrayにする
img = np.expand_dims(img, axis=0) #入力用に次元を一つ追加する
img = preprocess_input(img) #VGG16に入力するための前処理を行う
return img
이미지의 판독은 OpenCV(cv2)의 imread로 행한다. (입력된 이미지는 배열로 수신됨)
VGG16에의 입력 화상 사이즈는 224×224이므로 cv2.resize로 사이즈를 변경. (여기서 img는 (224, 224, 3)의 배열이 된다. 마지막 3은 칼라로 입력하고 있으므로 RGB의 3층 있는 것을 나타내고 있다.)
입력은 np.array로 하기 때문에 변환. preprocess_input ()을 사용하여 VGG16에 입력하기위한 전처리가 수행됩니다.
학습된 모델 로드
VGG16은 쉽게 호출 할 수 있습니다.
model = VGG16()
전체 결합층을 떼어낼지, 무게의 종류는 어떻게 할까 등을 선택할 수 있지만, 무게는 1종류 밖에 제공되지 않고 이번은 모델을 그대로 사용하므로 전체 결합층도 그대로 한다.
처음 실행할 때 데이터를 다운로드하므로 시간이 걸립니다.
학습된 모델을 출력하려면
pickle을 사용합니다.
import pickle
#モデルの保存
model_filename = 'model.sav'
pickle.dump(model, open(model_filename, 'wb')
#モデルの読み込み
loaded_model = pickle.load(open(model_filename, 'rb'))
이미지 결정
한 줄로 할 수 있습니다! 편리!
pred = model.predict(img)
pred에 decode_prediction()을 적응한다.
decode_prediction 한 pred는 [(class1, description1, probability1), (class2, description2, probability2), ...]의 튜플로 주어진다.
top=n으로 지정하면, probability(확률)가 가장 높은 것으로부터 n개의 데이터를 취득할 수 있다.
result = decode_predictions(pred, top=1)[0]
코드
main.py와 같은 디렉토리에 있는 img 폴더에서 입력 이미지를 가져옵니다. 인식 결과의 출력을 정돈 & 번역하는 등 세세한 부분까지 포함한 것을 아래에 나타낸다.
main.py
import utils
import pickle
import numpy as np
from keras.applications.vgg16 import preprocess_input, decode_predictions
#画像のpathを取得
img_path = utils.get_img_path()
#入力画像の前処理
img = utils.img_preprocess(img_path)
#学習済みモデルの読み込み
model_filename = 'model.sav'
model = pickle.load(open(model_filename, 'rb'))
#画像の判定
pred = model.predict(img)
#最もスコアの高いものを取得
result = decode_predictions(pred, top=1)[0]
name_en = result[0][1]
score = round(result[0][2]*100, 1)
#翻訳
name_ja = utils.name_trans(name_en)
print("この画像に映っているのは: {0}({1}) {2}%" .format(name_ja, name_en, score))
print(result)
utils.py
import os, glob
import numpy as np
import cv2
from keras.applications.vgg16 import preprocess_input
from requests import get
#入力画像のpathを取得する
def get_img_path():
path = './img/'
img_name_arr = os.listdir(path)
img_name = img_name_arr[0]
return path + img_name
#入力画像の前処理を行う
def img_preprocess(img_path):
img = cv2.imread(img_path) #読み込み
size = (224,224)
img = cv2.resize(img, size) #サイズ変更
img = np.array(img) #np.arrayにする
img = np.expand_dims(img, axis=0) #入力用に次元を一つ追加する
img = preprocess_input(img) #VGG16に入力するための前処理を行う
return img
#predictから得られた名前が_(アンダースコア)付きの英単語なので翻訳する
def name_trans(name):
#'_'を取り除く
if '_' in name:
name_arr = name.split('_')
name = ''
for i in range(len(name_arr)):
if i == (len(name_arr) - 1):
name += name_arr[i]
else:
name += (name_arr[i] + " ")
#GASで作ったAPIで翻訳
trans_from = 'en'
trans_to = 'ja'
trans_url = (
'https://script.google.com/macros/s/AKfycbzPH7k0wm5QqP78MtGXt2cOZ_dR0X0G-jMxJODwZvQM3hG89Cct/exec'
+ '?text=' + name + '&source=' + trans_from + '&target=' + trans_to
)
res = get(trans_url)
name_ja = res.text
return name_ja
번역에 대해서는 이전 기사를 참조하십시오.
Google Apps Script로 만든 무료 번역 API 사용
실행해보기
입력하는 이미지는 이것.
결과
この画像に映っているのは: 旅客機(airliner) 84.8%
정답!
결론
학습이 끝난 모델을 사용한 화상 인식은 화상 데이터의 준비, 데이터의 정리, 라벨 첨부라고 하는 번거로운 작업이 없기 때문에 매우 편하다.
게다가 VGG16에 관해서는 keras가 여러가지 해준다.
다음은 VGG16의 전체 결합층을 제외하고 Fine-Tuning을 시도해 보자.
참고
응용 프로그램 - Keras
Python scikit-learn으로 기계 학습 모델 저장 및 로드
Keras에서 VGG16 사용 - 인공 지능에 관한 단창록
Reference
이 문제에 관하여(VGG16에서 이미지 인식을 시도했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/umyomyomyon/items/87355fee78ff98d5d1d6
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
この画像に映っているのは: 旅客機(airliner) 84.8%
학습이 끝난 모델을 사용한 화상 인식은 화상 데이터의 준비, 데이터의 정리, 라벨 첨부라고 하는 번거로운 작업이 없기 때문에 매우 편하다.
게다가 VGG16에 관해서는 keras가 여러가지 해준다.
다음은 VGG16의 전체 결합층을 제외하고 Fine-Tuning을 시도해 보자.
참고
응용 프로그램 - Keras
Python scikit-learn으로 기계 학습 모델 저장 및 로드
Keras에서 VGG16 사용 - 인공 지능에 관한 단창록
Reference
이 문제에 관하여(VGG16에서 이미지 인식을 시도했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/umyomyomyon/items/87355fee78ff98d5d1d6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)