[solafune] 위성 이미지에 따라 공항 이용자 수를 예측하는 기초 모델 with Kers
개시하다
안녕하세요.벨루가입니다.평소 공장 이상 검출 등 AI 제작에 주력하고 있다.
앞서 마이글은 페이터치(ResNet)에서 위성경기의 기본 모델을 공개했으며, 이번에는 커스에서 기초 모델을 소개했다.
위성 영상 경기의 밑줄 모형에 대한 소개.프레임이 텐소플로우의 고급 API인 케라스는 VG16을 사용해 전이 학습을 한다.
나는 일단 움직이는 것이 중요하다고 생각하기 때문에 가능한 한 간단하게 한다.
절차는 ①제작모형, ②제작데이터집, ③학습, ④추론 등 4가지 버전이다.코드만 쫓아다니면 뭘 하는지 모를 것 같아서 기본적으로 이 네 가지를 주의하세요.
마지막으로 하나의 파일로 정리하고 시간이 없는 사람은 마지막 파일 부분을 복사해서 공부에 사용하세요.
Tensorflow의 버전은 GPU가 달린(tensorflow-gpu)로 2.3.1의 속도로 운행된다.기타는 pip install OpenCV(opencv-ptyhon)의 버전 4.4,numby,pandaas,tqdm,scikkit-learn만 있으면 작업을 할 수 있습니다.Google Colab 등이라면 확실히 일할 수 있을 것 같습니다.환경을 구축할 때 Docker 파일은 라이브러리가 부족하면 각각 설치하십시오.
디렉토리 구조
패스 같은 것도 있으니까 일단 적어.
바로 아래에 csv 파일 그룹과 데이터가 있습니다.
> ├ data
> ├ trainimage
> ├ image
> ├ testimage
> ├ image
> ├ evaluatemodel
> ├ image
> ├ testdataset_anotated.csv # 学習
> ├ traindataset_anotated.csv # 評価
> ├ uploadfile.csv # アップロード
① 모형 제작
15층까지는 다운, 16층 이후에는 공부다.
그리고 두 층의 모든 결합층을 추가하고 마지막으로 함수를 활성화하는linear를 적용하여 회귀 문제로 처리합니다.CNN을 이용한 딥러닝은 일반적으로 분류, 물체 탐지, 구분 등의 방법으로 이뤄지지만, 이처럼 회귀 문제로 다루지 않아 신선하다.회귀 문제이기 때문에linear의 활성화 함수를 사용했지만relu도 문제없습니다.
또한 LOSS가 대상 관광객의 원시 수치를 처리할 때 로그를 사용하지 않고 변환하면 상당한 수치가 나타날 수 있으니 주의하십시오.나도 시작했어.
목표치 대수 변환 후 MSE와 같은 LOSS를 사용해도 문제없다.이번에는 Keeras에서 준비한 Mean입니다.squared_logarithmic_LOSS는 error를 사용합니다.
학습률의 초기값은 0.00001(1e-5)으로 시작하지 않으면 발산된다.
def vgg16(imgsize):
input_tensor = (imgsize,imgsize, 3)
base_model_max = VGG16(input_shape=input_tensor, weights='imagenet', include_top=False, pooling='max')
for layer in base_model_max.layers[:15]:
# from 1st to 15th freeze
layer.trainable = False
for layer in base_model_max.layers[15:]:
# from 16th activate
layer.trainable = True
model = Sequential()
model.add(base_model_max)
model.add(Flatten())
model.add(Dense(512)) # 全結合層
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(64)) # 全結合層
model.add(Activation('linear'))
model.add(Dropout(0.5))
model.add(Dense(1)) # 出力層
model.compile(loss='mean_squared_logarithmic_error', optimizer=tf.keras.optimizers.RMSprop(lr=1e-5))
return model
② 데이터 세트 제작
여기는Keeras의ImageDataGenerator의 복잡한 부분이지만, 데이터 획득 방법은Keeras에 3가지,flow,flow가 존재한다.from_directory, flow_from_데이터 프레임입니다.numby 등 이미 데이터 실례가 존재하는 상황에서 flow를 사용하는데 실제로는 MNIST 튜토리얼에서 거의 모두 flow를 사용한다.
flow_from_directory의 경우 탭이 분리된 데이터를 디렉터리에 저장할 때 사용합니다.
마지막 플로우from_데이터 프레임에서 이번에 사용한 유형은 csv 등에 정답 탭과 이번 정답의 수치 데이터를 기록할 때 사용합니다.또한, 설치가 약간 막힌 부분으로classmode="raw"입니다. 목표 값을 직접 처리할 수 있습니다.이미지가 회귀 등을 잘 처리하지 않아서 좀 막혔어요.
이번에는 데이터 확장이 있어서 공부하고 있습니다.Kers의 ImageDataGenerator PyTorch에서 사용할 수 있는 OSS의 Albumentation과 비교하면 줄었다.데이터 확장을 추가하려면 데이터 생성기를 직접 만들어서 데이터 확장을 실현하거나 Kers 방식으로 Albumentation을 실행하십시오.
def get_datagen(mode, df, target_size, batch_size):
if mode == 'train':
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=15,
shear_range=0.2,
horizontal_flip=True,
width_shift_range=0.1,
height_shift_range=0.1
)
train_datagenerator = train_datagen.flow_from_dataframe(
df,
"data/trainimage/image",
x_col='image',
y_col='traveler',
target_size=target_size,
class_mode="raw", # for regression
batch_size=batch_size,
seed=42
)
return train_datagenerator
elif mode == 'valid':
valid_datagen = ImageDataGenerator(rescale=1./255)
valid_datagenerator = valid_datagen.flow_from_dataframe(
df,
"data/testimage/image",
x_col='image',
y_col='traveler',
target_size=target_size,
class_mode="raw", # for regression
batch_size=batch_size,
seed=42
)
return valid_datagenerator
③ 공부
학습 체제는 다음과 같다.조기 종료를 추가했다.일반적으로 앞당겨 끝날 때 학습이 멈출 때 LOSS의 값이 좋지 않습니다. 각각의 LOSS가 가장 좋을 때 모델을 저장하고 불러오십시오.
또한history 저장 등 코드의 가독성이 떨어지는 것을 보여 주었기 때문에 이번tutorial은 설치되지 않았습니다. 각자 설치해 주십시오.
if __name__ == "__main__":
# csv読み込み
train = pd.read_csv('traindataset_anotated.csv', names=["image","traveler"]) # headerあり読み込み
valid = pd.read_csv('testdataset_anotated.csv', names=["image","traveler"]) # headerあり読み込み
# ハイパーパラメータ
batch_size=10
epochs = 200
imgsize = 224
target_size = (imgsize, imgsize)
# データセット取得
train_datagenerator = get_datagen("train", train, target_size, batch_size)
valid_datagenerator = get_datagen("valid", valid, target_size, batch_size)
# 早期終了
early_stop = EarlyStopping(monitor='val_loss', patience=7, verbose=1, mode='auto') # val_loss
# モデル読み込み
model = vgg16(imgsize)
# 学習
history = model.fit(train_datagenerator,
epochs=epochs,
validation_data=valid_datagenerator,
verbose=1,
shuffle=True,
callbacks=[early_stop])
# モデル保存
model.save("solafune_tutorial.h5")
④ 추론
이미지의 사전 처리는 학습 이미지 크기 224의 정사각형에 맞춥니다.
이번 강좌에서 나는 200개 시대를 배웠지만 200개 시대도 끝나지 않았다.
# 推論
upload = pd.read_csv('uploadfile.csv', names=["image","traveler"]) # headerあり読み込み
evaluate_iter = pathlib.Path('data/evaluatemodel/image').glob('*.jpg')
for evaluate_path in tqdm(evaluate_iter):
_path = str(evaluate_path)
_path = _path.split('/')[-1]
# 推論前処理部分
evaluate_img = cv2.imread(str(evaluate_path))
evaluate_img = cv2.cvtColor(evaluate_img, cv2.COLOR_BGR2RGB)
evaluate_img = cv2.resize(evaluate_img, (imgsize, imgsize))
evaluate_img = np.array(evaluate_img / 255.)
evaluate_img = evaluate_img.reshape(1, imgsize, imgsize, 3)
predict_num = int(model.predict(evaluate_img))
upload.loc[upload['image'] == _path, 'traveler'] = int(predict_num)
upload.to_csv("submit_solafune_tutorial.csv", header=False, index=False)
커밋
칠상팔하의 업로드입니다.
결과:
결과적으로 2.64는 괜찮은 느낌을 받았다!
향후 모델 확장 정보
이런 강좌라면 시험해 보면 끝날 것 같아서 앞으로 이렇게 쓰는 게 좋을 것 같아요.
목표 대수 변환
우선 이것을 고려할 수 있다.통계학에서 실진도라는 데이터의 편차를 계산하는 방법이 있지만 편차가 있는 상황에서 실진도를 -1~1 이내의 정규 분포로 제어하는 것을 고려할 수 있다.
나는 3.39의 실진도가 대수 변환을 통해 0.80까지 줄어들 것이라고 생각한다.
train = pd.read_csv('traindataset_anotated.csv', names=["image","traveler"]) # headerあり読み込み
train_x, train_y = train.iloc[:,:1], train.iloc[:,1:2]
print('travelers:', skew(train_y)) => travelers: [3.39508326]
print('log travelers:', skew(np.log1p(train_y))) => log travelers: [0.80800331]
데이터 확장
구름이 있는 이미지 등 색깔이 밝게 보이는 이미지가 많은데 여기를 데이터로 확장하는 게 어때요?
학습 모드
학습 데이터가 적기 때문에 VG16이 올바르지 않을 수도 있습니다.우리도 다른 모델에 대해 토론해 봅시다.
끝말
경기에 별로 출전하지 않아서 많은 것을 배웠다.
카글의 경우 노트북에서 경을 베끼기→모르는 파동이 잦은데, 처음부터 쓰는 코드라 실장 면에서 성장한 느낌이다.
앞으로 운영진에게 기대되는 것은 팀을 통합하고 학습 데이터를 늘릴 수 있다는 것이다.나는 트위터의 회답 속도를 존경한다.
그리고 이거 보신 분들은 답장해 주세요!
환경 구조
Docker 파일을 만들고 이미지를 구성하십시오.또는 GoogleColab 또는 Anaconda에 다음 프로그램 라이브러리를 설치하십시오.
다음은 Docker file입니다.
FROM tensorflow/tensorflow:2.3.1-gpu-jupyter
RUN apt-get update
RUN apt-get install -y libgl1-mesa-dev
RUN pip install pandas
RUN pip install tqdm
RUN pip install opencv-python
RUN pip install tensorflow-addons
RUN pip install scikit-learn
RUN apt-get update && apt-get install -y git
일련의 학습 총결산
다음 파일을 복사하여 사용할 경우 VG16에서 학습할 수 있습니다.디렉토리 구성에 주의하십시오.
import sys
import os
import pathlib
import glob
import math
import random
import argparse
import time
import cv2
from tqdm import tqdm
import pandas as pd
import numpy as np
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten, BatchNormalization
from tensorflow.keras.layers import Convolution2D, MaxPooling2D, GlobalMaxPooling2D, Concatenate
from tensorflow.keras.applications.vgg16 import VGG16
import tensorflow as tf
from tensorflow.keras.layers import Input
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.callbacks import EarlyStopping, LearningRateScheduler, Callback, ModelCheckpoint
import tensorflow as tf
def vgg16(imgsize):
input_tensor = (imgsize,imgsize, 3)
base_model_max = VGG16(input_shape=input_tensor, weights='imagenet', include_top=False, pooling='max')
for layer in base_model_max.layers[:15]:
# from 1st to 15th freeze
layer.trainable = False
for layer in base_model_max.layers[15:]:
# from 16th activate
layer.trainable = True
model = Sequential()
model.add(base_model_max)
model.add(Flatten())
model.add(Dense(512)) # 全結合層
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(64)) # 全結合層
model.add(Activation('linear'))
model.add(Dropout(0.5))
model.add(Dense(1)) # 出力層
model.compile(loss='mean_squared_logarithmic_error', optimizer=tf.keras.optimizers.RMSprop(lr=1e-5))
return model
def get_datagen(mode, df, target_size, batch_size):
if mode == 'train':
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=15,
shear_range=0.2,
horizontal_flip=True,
width_shift_range=0.1,
height_shift_range=0.1
)
train_datagenerator = train_datagen.flow_from_dataframe(
df,
"data/trainimage/image",
x_col='image',
y_col='traveler',
target_size=target_size,
class_mode="raw", # for regression
batch_size=batch_size,
seed=42
)
return train_datagenerator
elif mode == 'valid':
valid_datagen = ImageDataGenerator(rescale=1./255)
valid_datagenerator = valid_datagen.flow_from_dataframe(
df,
"data/testimage/image",
x_col='image',
y_col='traveler',
target_size=target_size,
class_mode="raw", # for regression
batch_size=batch_size,
seed=42
)
return valid_datagenerator
if __name__ == "__main__":
# csv読み込み
train = pd.read_csv('traindataset_anotated.csv', names=["image","traveler"]) # headerあり読み込み
valid = pd.read_csv('testdataset_anotated.csv', names=["image","traveler"]) # headerあり読み込み
# ハイパーパラメータ
batch_size=10
epochs = 200
imgsize = 224
target_size = (imgsize, imgsize)
# データセット取得
train_datagenerator = get_datagen("train", train, target_size, batch_size)
valid_datagenerator = get_datagen("valid", valid, target_size, batch_size)
# 早期終了
early_stop = EarlyStopping(monitor='val_loss', patience=7, verbose=1, mode='auto') # val_loss
# モデル読み込み
model = vgg16(imgsize)
# 学習
history = model.fit(train_datagenerator,
epochs=epochs,
validation_data=valid_datagenerator,
verbose=1,
shuffle=True,
callbacks=[early_stop])
# モデル保存
model.save("solafune_tutorial.h5")
# 推論
upload = pd.read_csv('uploadfile.csv', names=["image","traveler"]) # headerあり読み込み
evaluate_iter = pathlib.Path('data/evaluatemodel/image').glob('*.jpg')
for evaluate_path in tqdm(evaluate_iter):
_path = str(evaluate_path)
_path = _path.split('/')[-1]
# 推論前処理部分
evaluate_img = cv2.imread(str(evaluate_path))
evaluate_img = cv2.cvtColor(evaluate_img, cv2.COLOR_BGR2RGB)
evaluate_img = cv2.resize(evaluate_img, (imgsize, imgsize))
evaluate_img = np.array(evaluate_img / 255.)
evaluate_img = evaluate_img.reshape(1, imgsize, imgsize, 3)
predict_num = int(model.predict(evaluate_img))
upload.loc[upload['image'] == _path, 'traveler'] = int(predict_num)
upload.to_csv("submit_solafune_tutorial.csv", header=False, index=False)
Reference
이 문제에 관하여([solafune] 위성 이미지에 따라 공항 이용자 수를 예측하는 기초 모델 with Kers), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/beluga/articles/f2b7d94c0213680b3dc2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)