Raccoon Dataset์ YOLO V3 Model๋ก ํ์ต์์ผ์ Image & Video์ Object Detection์ ํ๋ฒ ์ํํด ๋ณด๊ฒ ์ต๋๋ค.
- Dataset
Library Download
Object Detection ํ์ต์ ์ํ Library๋ฅผ ๋ค์ด๋ก๋ ํ๊ฒ ์ต๋๋ค.
!pwd
!rm -rf DLCV
!git clone https://github.com/chulminkw/DLCV.git
# DLCV ๋๋ ํ ๋ฆฌ๊ฐ Download๋๊ณ DLCV ๋ฐ์ Detection๊ณผ Segmentation ๋๋ ํ ๋ฆฌ๊ฐ ์๋ ๊ฒ์ ํ์ธ
!ls -lia
!ls -lia DLCV
!pip install tensorflow-gpu==1.15.2
!pip install keras==2.3.0
- ์ฃผ์์ฌํญ: init.py๋ ๋ฐ๋์ import tensorflow, import keras ์ด์ ์ ์ํ๋์ด์ผ ํฉ๋๋ค. ๋ง์ผ tensorflow, keras ์ค์นํ ๋ค ์๋์ import tensorflow, import keras๋ฅผ ๋จผ์ ์ํํ์์ผ๋ฉด ๋ฉ๋ด-> ๋ฐํ์ -> ๋ฐํ์ ๋ค์ ์์์ ๋๋ฅด์ ๋ค init.py๋ฅผ ์์ ํฉ๋๋ค.
import os
# keras backend ๋๋ ํ ๋ฆฌ ์ด๋.
os.chdir('/usr/local/lib/python3.6/dist-packages/keras/backend')
# ๊ธฐ์กด __init__.py ์ญ์ ํ๊ณ ์๋ก์ด __init__.py๋ฅผ download
!rm -rf __init__.py
!rm -rf __pycache__
!wget https://raw.githubusercontent.com/chulminkw/DLCV/master/colab_tf115_modify_files/__init__.py
# GPU๊ฐ ์ธํ
๋์ด ์์ง ์์ผ๋ฉด ์๋จ ๋ฉ๋ด์์ ๋ฐํ์->๋ฐํ์ ์ ํ ๋ณ๊ฒฝ์์ GPU๋ฅผ ์ ํํ ํ ๋ฐํ์ ๋ค์ ์์์ ์ ํํ๊ณ ์ฒ์ ๋ถํฐ์ธ tensorflow, keras ์ค์น ๋ถํฐ ๋ค์ ์์.
import tensorflow as tf
import keras
print(tf.__version__)
print(keras.__version__)
# gpu๊ฐ ์ธํ
๋์ด ์๋์ง ํ์ธ.
tf.test.gpu_device_name()
Raccoon Dataset Download
Object Detection ํ์ต์ ์ํ Raccoon Dataset์ ๋ค์ด๋ก๋ ํ๊ฒ ์ต๋๋ค.
- Racoon ๋ฐ์ดํฐ ์ธํธ๋ฅผ git clone์ผ๋ก ๋ณต์ฌํฉ๋๋ค. git clone https://github.com/experiencor/raccoon_dataset.git
# /content/DLCV/data ๋๋ ํ ๋ฆฌ์ raccoon_dataset์ ๋ค์ด๋ก๋ํจ.
%cd /content/DLCV/data/
!git clone https://github.com/experiencor/raccoon_dataset.git
# raccoon_dataset์ raccoon์ผ๋ก ๋๋ ํ ๋ฆฌ ์ด๋ฆ ๋ณ๊ฒฝํ๊ณ ํ์ธ
!mv raccoon_dataset raccoon
!ls -lia
- VOC Annotation
# annotation๊ณผ image ๋๋ ํ ๋ฆฌ ์ค์ . annotation๋๋ ํ ๋ฆฌ์ ์๋ ํ์ผ ํ์ธ.
import os
from pathlib import Path
#HOME_DIR = str(Path.home())
# ์ฝ๋ฉ ๋ฒ์ ์ HOME_DIR์ /content ๋ก ์ค์ ํฉ๋๋ค.
HOME_DIR = '/content'
ANNO_DIR = os.path.join(HOME_DIR, 'DLCV/data/raccoon/annotations')
IMAGE_DIR = os.path.join(HOME_DIR, 'DLCV/data/raccoon/images')
print(ANNO_DIR)
files = os.listdir(ANNO_DIR)
print('ํ์ผ ๊ฐ์๋:',len(files))
print(files)
/content/DLCV/data/raccoon/annotations
ํ์ผ ๊ฐ์๋: 201
import glob # ํ์ผ ๊ฒฝ๋ก ํจํด ๋งค์นญ์ ์ํด ์ฌ์ฉ (์: ํน์ ๋๋ ํ ๋ฆฌ ๋ด์ ๋ชจ๋ XML ํ์ผ์ ์ฐพ์ ๋)
import xml.etree.ElementTree as ET # XML ํ์ผ์ ํ์ฑํ๊ธฐ ์ํด ์ฌ์ฉ
import os # ํ์ผ ๊ฒฝ๋ก ์ฒ๋ฆฌ๋ฅผ ์ํด ์ฌ์ฉ
# XML ํ์ผ์ CSV ํ์์ ํ
์คํธ ํ์ผ๋ก ๋ณํํ๋ ํจ์
def xml_to_csv(path, output_filename):
xml_list = [] # ํ์ฑํ XML ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ
# ์ถ๋ ฅ ํ์ผ์ ์ฐ๊ธฐ ๋ชจ๋๋ก ์ด๊ธฐ
with open(output_filename, "w") as train_csv_file:
# ์ฃผ์ด์ง ๊ฒฝ๋ก์์ ๋ชจ๋ XML ํ์ผ์ ์ํ
for xml_file in glob.glob(path + '/*.xml'):
# ๊ฐ XML ํ์ผ์ ํ์ฑํ์ฌ Element Tree ๊ฐ์ฒด๋ก ๋ณํํ๊ณ , ์ต์์(root) ์์๋ฅผ ์ถ์ถ
tree = ET.parse(xml_file)
root = tree.getroot()
# XML ๊ตฌ์กฐ์์ ์ด๋ฏธ์ง ํ์ผ๋ช
์ ์ฐพ์ ์ด๋ฏธ์ง์ ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ์์ฑ
full_image_name = os.path.join(IMAGE_DIR, root.find('filename').text)
value_str_list = ' ' # ๊ฐ ๊ฐ์ฒด์ ๋ฐ์ด๋ฉ ๋ฐ์ค ์ ๋ณด๋ฅผ ์ ์ฅํ ๋ฌธ์์ด
# XML์์ 'object' ์์๋ฅผ ๋ชจ๋ ์ฐพ์ ๋ฐ๋ณต, ์ด๋ ์ด๋ฏธ์ง์ ์ฃผ์๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธ
for obj in root.findall('object'):
# 'bndbox' ์์๋ฅผ ์ฐพ์ ๋ฐ์ด๋ฉ ๋ฐ์ค์ ์ขํ ์ ๋ณด(xmin, ymin, xmax, ymax)๋ฅผ ๊ฐ์ ธ์ด
xmlbox = obj.find('bndbox')
x1 = int(xmlbox.find('xmin').text) # ๋ฐ์ด๋ฉ ๋ฐ์ค์ ์ข์ธก ์๋จ x ์ขํ
y1 = int(xmlbox.find('ymin').text) # ๋ฐ์ด๋ฉ ๋ฐ์ค์ ์ข์ธก ์๋จ y ์ขํ
x2 = int(xmlbox.find('xmax').text) # ๋ฐ์ด๋ฉ ๋ฐ์ค์ ์ฐ์ธก ํ๋จ x ์ขํ
y2 = int(xmlbox.find('ymax').text) # ๋ฐ์ด๋ฉ ๋ฐ์ค์ ์ฐ์ธก ํ๋จ y ์ขํ
# ๊ฐ์ฒด์ ํด๋์ค ID, ์ฌ๊ธฐ์๋ ๊ณ ์ ์ ์ผ๋ก 0์ ์ฌ์ฉ (์: ๊ณ ์ ๋ ๊ฐ์ฒด๊ฐ 'raccoon'์ด๋ผ๊ณ ๊ฐ์ )
class_id = 0
# ๋ฐ์ด๋ฉ ๋ฐ์ค์ ํด๋์ค ID ์ ๋ณด๋ฅผ ๋ฌธ์์ด๋ก ํฌ๋งทํ
ํ์ฌ ์ ์ฅ
value_str = ('{0},{1},{2},{3},{4}').format(x1, y1, x2, y2, class_id)
value_str_list = value_str_list + value_str + ' ' # ์ฌ๋ฌ ๊ฐ์ฒด ์ ๋ณด๋ฅผ ์ฐ๊ฒฐํ์ฌ ์ ์ฅ
# ์ด๋ฏธ์ง ๊ฒฝ๋ก์ ๊ฐ์ฒด ์ ๋ณด๋ฅผ CSV ํ์์ผ๋ก ์ถ๋ ฅ ํ์ผ์ ์ ์ฅ
train_csv_file.write(full_image_name + ' ' + value_str_list + '\n')
# XML ํ์ผ ์ํ๋ฅผ ๋ง์นจ
- glob.glob(path + '/*.xml'): ์ฃผ์ด์ง ๋๋ ํ ๋ฆฌ์์ ๋ชจ๋ XML ํ์ผ์ ์ฐพ์ต๋๋ค.
- ET.parse(xml_file): XML ํ์ผ์ ํ์ฑํ์ฌ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์์ฑํฉ๋๋ค.
- root.findall('object'): XML ํ์ผ ๋ด์์ ๋ชจ๋ ๊ฐ์ฒด ์ ๋ณด๋ฅผ ์ฐพ์ต๋๋ค.
- ๋ฐ์ด๋ฉ ๋ฐ์ค ์ขํ(xmin, ymin, xmax, ymax)๋ฅผ ์ถ์ถํ์ฌ ๊ฐ์ฒด์ ์์น๋ฅผ ํ์ ํฉ๋๋ค.
- ํด๋์ค ID๋ฅผ ๊ณ ์ ๊ฐ(0)์ผ๋ก ์ค์ ํ๊ณ , ์ด๋ฅผ ๋ฌธ์์ด๋ก ํฌ๋งทํ ํ์ฌ CSV ํ์์ผ๋ก ๋ณํํฉ๋๋ค.
xml_to_csv(ANNO_DIR, os.path.join(ANNO_DIR,'raccoon_anno.csv'))
print(os.path.join(ANNO_DIR,'raccoon_anno.csv'))
# /content/DLCV/data/raccoon/annotations/raccoon_anno.csv
import numpy as np
import keras.backend as K
from keras.layers import Input, Lambda
from keras.models import Model
from keras.optimizers import Adam
from keras.callbacks import TensorBoard, ModelCheckpoint, ReduceLROnPlateau, EarlyStopping
Keras-yolo3 ํจํค์ง๋ฅผ ๋ค์ด๋ก๋ ํด์, /content/DLCV/Detection/yolo ๋ฐ์ ์ค์น
%cd /content/DLCV/Detection/yolo
!git clone https://github.com/qqwweee/keras-yolo3.git
!ls -lia /content/DLCV/Detection/yolo/keras-yolo3
!ls -lia /content/DLCV/Detection/yolo/keras-yolo3
import sys
import os
# ์ฝ๋ฉ ๋ฒ์ ์ ์๋์ ๊ฐ์ด ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ์ฌ Local Package ์ง์ .
default_dir = '/content/DLCV'
default_yolo_dir = os.path.join(default_dir, 'Detection/yolo')
LOCAL_PACKAGE_DIR = os.path.abspath(os.path.join(default_yolo_dir,'keras-yolo3'))
print(LOCAL_PACKAGE_DIR)
sys.path.append(LOCAL_PACKAGE_DIR)
from yolo3.model import preprocess_true_boxes, yolo_body, tiny_yolo_body, yolo_loss
from yolo3.utils import get_random_data
Pretrained ๋ชจ๋ธ ์ฌ์ฑ์ฑ ๋ฐ font directory ๊ต์ฒด
- model_data ๋ฐ์ coco dataset๋ก pretrained ๋ yolov3.weights ํ์ผ์ yolo.h5 ํ์ผ๋ก ๋ณ๊ฒฝํด ์ค์ผ ํฉ๋๋ค
- keras-yolo3์ font ๋๋ ํ ๋ฆฌ๋ ์ฌ ๊ต์ฒด ํฉ๋๋ค.
%cd /content/DLCV/Detection/yolo/keras-yolo3
!ls
/content/DLCV/Detection/yolo/keras-yolo3
coco_annotation.py LICENSE train_bottleneck.py yolov3.cfg
convert.py model_data train.py yolov3-tiny.cfg
darknet53.cfg __pycache__ voc_annotation.py yolov3.weights
font README.md yolo3 yolo_video.py
kmeans.py snapshots yolo.py
# yolov3.weights ํ์ผ์ download ๋ฐ๊ณ , convert.py ๋ฅผ ์ํํ์ฌ model_data ๋ฐ์ yolo.h5 ํ์ผ ์์ฑ ์ํ.
%cd /content/DLCV/Detection/yolo/keras-yolo3
# yolo ๊ณต์ ์ฌ์ดํธ์์ download์ download ์๋๊ฐ ์ฝ 25๋ถ ์ ๋ ์์๋จ. github์์ ๋ค์ด๋ก๋ ์๋ง.
#!wget https://pjreddie.com/media/files/yolov3.weights
# github์์ ๋ค์ด๋ก๋
!wget https://github.com/chulminkw/DLCV/releases/download/1.0/yolov3.weights
# yolov3.weights๋ฅผ keras-yolo3์์ ์ฌ์ฉํ ์ ์๋๋ก yolo.h5 ๋ก ๋ณํ
!python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5
# model_data ๋ฐ์ yolo.h5 ํ์ผ์ด ์์ฑ๋์๋์ง ํ์ธ.
!ls /content/DLCV/Detection/yolo/keras-yolo3/model_data
# yolo.detect_image() ๋ฉ์๋๋ PIL package๋ฅผ ์ด์ฉํ์ฌ image ์์
์ํ. keras-yolo3/font ๋๋ ํ ๋ฆฌ๋ฅผ ์์ ๋๋ ํ ๋ฆฌ๋ก ๋ณต์ฌ ํด์ผํจ.
%cd /content/DLCV/Detection/yolo
!cp -rf keras-yolo3/font ./font
Model: "model_1"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) (None, None, None, 3 0
__________________________________________________________________________________________________
conv2d_1 (Conv2D) (None, None, None, 3 864 input_1[0][0]
__________________________________________________________________________________________________
batch_normalization_1 (BatchNor (None, None, None, 3 128 conv2d_1[0][0]
__________________________________________________________________________________________________
leaky_re_lu_1 (LeakyReLU) (None, None, None, 3 0 batch_normalization_1[0][0]
__________________________________________________________________________________________________
zero_padding2d_1 (ZeroPadding2D (None, None, None, 3 0 leaky_re_lu_1[0][0]
__________________________________________________________________________________________________
conv2d_2 (Conv2D) (None, None, None, 6 18432 zero_padding2d_1[0][0]
__________________________________________________________________________________________________
batch_normalization_2 (BatchNor (None, None, None, 6 256 conv2d_2[0][0]
__________________________________________________________________________________________________
leaky_re_lu_2 (LeakyReLU) (None, None, None, 6 0 batch_normalization_2[0][0]
__________________________________________________________________________________________________
conv2d_3 (Conv2D) (None, None, None, 3 2048 leaky_re_lu_2[0][0]
__________________________________________________________________________________________________
batch_normalization_3 (BatchNor (None, None, None, 3 128 conv2d_3[0][0]
__________________________________________________________________________________________________
leaky_re_lu_3 (LeakyReLU) (None, None, None, 3 0 batch_normalization_3[0][0]
__________________________________________________________________________________________________
conv2d_4 (Conv2D) (None, None, None, 6 18432 leaky_re_lu_3[0][0]
__________________________________________________________________________________________________
batch_normalization_4 (BatchNor (None, None, None, 6 256 conv2d_4[0][0]
__________________________________________________________________________________________________
leaky_re_lu_4 (LeakyReLU) (None, None, None, 6 0 batch_normalization_4[0][0]
__________________________________________________________________________________________________
add_1 (Add) (None, None, None, 6 0 leaky_re_lu_2[0][0]
leaky_re_lu_4[0][0]
__________________________________________________________________________________________________
zero_padding2d_2 (ZeroPadding2D (None, None, None, 6 0 add_1[0][0]
__________________________________________________________________________________________________
conv2d_5 (Conv2D) (None, None, None, 1 73728 zero_padding2d_2[0][0]
__________________________________________________________________________________________________
batch_normalization_5 (BatchNor (None, None, None, 1 512 conv2d_5[0][0]
__________________________________________________________________________________________________
leaky_re_lu_5 (LeakyReLU) (None, None, None, 1 0 batch_normalization_5[0][0]
__________________________________________________________________________________________________
conv2d_6 (Conv2D) (None, None, None, 6 8192 leaky_re_lu_5[0][0]
__________________________________________________________________________________________________
batch_normalization_6 (BatchNor (None, None, None, 6 256 conv2d_6[0][0]
__________________________________________________________________________________________________
leaky_re_lu_6 (LeakyReLU) (None, None, None, 6 0 batch_normalization_6[0][0]
__________________________________________________________________________________________________
conv2d_7 (Conv2D) (None, None, None, 1 73728 leaky_re_lu_6[0][0]
__________________________________________________________________________________________________
batch_normalization_7 (BatchNor (None, None, None, 1 512 conv2d_7[0][0]
__________________________________________________________________________________________________
leaky_re_lu_7 (LeakyReLU) (None, None, None, 1 0 batch_normalization_7[0][0]
__________________________________________________________________________________________________
add_2 (Add) (None, None, None, 1 0 leaky_re_lu_5[0][0]
leaky_re_lu_7[0][0]
__________________________________________________________________________________________________
conv2d_8 (Conv2D) (None, None, None, 6 8192 add_2[0][0]
__________________________________________________________________________________________________
batch_normalization_8 (BatchNor (None, None, None, 6 256 conv2d_8[0][0]
__________________________________________________________________________________________________
leaky_re_lu_8 (LeakyReLU) (None, None, None, 6 0 batch_normalization_8[0][0]
__________________________________________________________________________________________________
conv2d_9 (Conv2D) (None, None, None, 1 73728 leaky_re_lu_8[0][0]
__________________________________________________________________________________________________
batch_normalization_9 (BatchNor (None, None, None, 1 512 conv2d_9[0][0]
__________________________________________________________________________________________________
leaky_re_lu_9 (LeakyReLU) (None, None, None, 1 0 batch_normalization_9[0][0]
__________________________________________________________________________________________________
add_3 (Add) (None, None, None, 1 0 add_2[0][0]
leaky_re_lu_9[0][0]
__________________________________________________________________________________________________
zero_padding2d_3 (ZeroPadding2D (None, None, None, 1 0 add_3[0][0]
__________________________________________________________________________________________________
conv2d_10 (Conv2D) (None, None, None, 2 294912 zero_padding2d_3[0][0]
__________________________________________________________________________________________________
batch_normalization_10 (BatchNo (None, None, None, 2 1024 conv2d_10[0][0]
__________________________________________________________________________________________________
leaky_re_lu_10 (LeakyReLU) (None, None, None, 2 0 batch_normalization_10[0][0]
__________________________________________________________________________________________________
conv2d_11 (Conv2D) (None, None, None, 1 32768 leaky_re_lu_10[0][0]
__________________________________________________________________________________________________
batch_normalization_11 (BatchNo (None, None, None, 1 512 conv2d_11[0][0]
__________________________________________________________________________________________________
leaky_re_lu_11 (LeakyReLU) (None, None, None, 1 0 batch_normalization_11[0][0]
__________________________________________________________________________________________________
conv2d_12 (Conv2D) (None, None, None, 2 294912 leaky_re_lu_11[0][0]
__________________________________________________________________________________________________
batch_normalization_12 (BatchNo (None, None, None, 2 1024 conv2d_12[0][0]
__________________________________________________________________________________________________
leaky_re_lu_12 (LeakyReLU) (None, None, None, 2 0 batch_normalization_12[0][0]
__________________________________________________________________________________________________
add_4 (Add) (None, None, None, 2 0 leaky_re_lu_10[0][0]
leaky_re_lu_12[0][0]
__________________________________________________________________________________________________
conv2d_13 (Conv2D) (None, None, None, 1 32768 add_4[0][0]
__________________________________________________________________________________________________
batch_normalization_13 (BatchNo (None, None, None, 1 512 conv2d_13[0][0]
__________________________________________________________________________________________________
leaky_re_lu_13 (LeakyReLU) (None, None, None, 1 0 batch_normalization_13[0][0]
__________________________________________________________________________________________________
conv2d_14 (Conv2D) (None, None, None, 2 294912 leaky_re_lu_13[0][0]
__________________________________________________________________________________________________
batch_normalization_14 (BatchNo (None, None, None, 2 1024 conv2d_14[0][0]
__________________________________________________________________________________________________
leaky_re_lu_14 (LeakyReLU) (None, None, None, 2 0 batch_normalization_14[0][0]
__________________________________________________________________________________________________
add_5 (Add) (None, None, None, 2 0 add_4[0][0]
leaky_re_lu_14[0][0]
__________________________________________________________________________________________________
conv2d_15 (Conv2D) (None, None, None, 1 32768 add_5[0][0]
__________________________________________________________________________________________________
batch_normalization_15 (BatchNo (None, None, None, 1 512 conv2d_15[0][0]
__________________________________________________________________________________________________
leaky_re_lu_15 (LeakyReLU) (None, None, None, 1 0 batch_normalization_15[0][0]
__________________________________________________________________________________________________
conv2d_16 (Conv2D) (None, None, None, 2 294912 leaky_re_lu_15[0][0]
__________________________________________________________________________________________________
batch_normalization_16 (BatchNo (None, None, None, 2 1024 conv2d_16[0][0]
__________________________________________________________________________________________________
leaky_re_lu_16 (LeakyReLU) (None, None, None, 2 0 batch_normalization_16[0][0]
__________________________________________________________________________________________________
add_6 (Add) (None, None, None, 2 0 add_5[0][0]
leaky_re_lu_16[0][0]
__________________________________________________________________________________________________
conv2d_17 (Conv2D) (None, None, None, 1 32768 add_6[0][0]
__________________________________________________________________________________________________
batch_normalization_17 (BatchNo (None, None, None, 1 512 conv2d_17[0][0]
__________________________________________________________________________________________________
leaky_re_lu_17 (LeakyReLU) (None, None, None, 1 0 batch_normalization_17[0][0]
__________________________________________________________________________________________________
conv2d_18 (Conv2D) (None, None, None, 2 294912 leaky_re_lu_17[0][0]
__________________________________________________________________________________________________
batch_normalization_18 (BatchNo (None, None, None, 2 1024 conv2d_18[0][0]
__________________________________________________________________________________________________
leaky_re_lu_18 (LeakyReLU) (None, None, None, 2 0 batch_normalization_18[0][0]
__________________________________________________________________________________________________
add_7 (Add) (None, None, None, 2 0 add_6[0][0]
leaky_re_lu_18[0][0]
__________________________________________________________________________________________________
conv2d_19 (Conv2D) (None, None, None, 1 32768 add_7[0][0]
__________________________________________________________________________________________________
batch_normalization_19 (BatchNo (None, None, None, 1 512 conv2d_19[0][0]
__________________________________________________________________________________________________
leaky_re_lu_19 (LeakyReLU) (None, None, None, 1 0 batch_normalization_19[0][0]
__________________________________________________________________________________________________
conv2d_20 (Conv2D) (None, None, None, 2 294912 leaky_re_lu_19[0][0]
__________________________________________________________________________________________________
batch_normalization_20 (BatchNo (None, None, None, 2 1024 conv2d_20[0][0]
__________________________________________________________________________________________________
leaky_re_lu_20 (LeakyReLU) (None, None, None, 2 0 batch_normalization_20[0][0]
__________________________________________________________________________________________________
add_8 (Add) (None, None, None, 2 0 add_7[0][0]
leaky_re_lu_20[0][0]
__________________________________________________________________________________________________
conv2d_21 (Conv2D) (None, None, None, 1 32768 add_8[0][0]
__________________________________________________________________________________________________
batch_normalization_21 (BatchNo (None, None, None, 1 512 conv2d_21[0][0]
__________________________________________________________________________________________________
leaky_re_lu_21 (LeakyReLU) (None, None, None, 1 0 batch_normalization_21[0][0]
__________________________________________________________________________________________________
conv2d_22 (Conv2D) (None, None, None, 2 294912 leaky_re_lu_21[0][0]
__________________________________________________________________________________________________
batch_normalization_22 (BatchNo (None, None, None, 2 1024 conv2d_22[0][0]
__________________________________________________________________________________________________
leaky_re_lu_22 (LeakyReLU) (None, None, None, 2 0 batch_normalization_22[0][0]
__________________________________________________________________________________________________
add_9 (Add) (None, None, None, 2 0 add_8[0][0]
leaky_re_lu_22[0][0]
__________________________________________________________________________________________________
conv2d_23 (Conv2D) (None, None, None, 1 32768 add_9[0][0]
__________________________________________________________________________________________________
batch_normalization_23 (BatchNo (None, None, None, 1 512 conv2d_23[0][0]
__________________________________________________________________________________________________
leaky_re_lu_23 (LeakyReLU) (None, None, None, 1 0 batch_normalization_23[0][0]
__________________________________________________________________________________________________
conv2d_24 (Conv2D) (None, None, None, 2 294912 leaky_re_lu_23[0][0]
__________________________________________________________________________________________________
batch_normalization_24 (BatchNo (None, None, None, 2 1024 conv2d_24[0][0]
__________________________________________________________________________________________________
leaky_re_lu_24 (LeakyReLU) (None, None, None, 2 0 batch_normalization_24[0][0]
__________________________________________________________________________________________________
add_10 (Add) (None, None, None, 2 0 add_9[0][0]
leaky_re_lu_24[0][0]
__________________________________________________________________________________________________
conv2d_25 (Conv2D) (None, None, None, 1 32768 add_10[0][0]
__________________________________________________________________________________________________
batch_normalization_25 (BatchNo (None, None, None, 1 512 conv2d_25[0][0]
__________________________________________________________________________________________________
leaky_re_lu_25 (LeakyReLU) (None, None, None, 1 0 batch_normalization_25[0][0]
__________________________________________________________________________________________________
conv2d_26 (Conv2D) (None, None, None, 2 294912 leaky_re_lu_25[0][0]
__________________________________________________________________________________________________
batch_normalization_26 (BatchNo (None, None, None, 2 1024 conv2d_26[0][0]
__________________________________________________________________________________________________
leaky_re_lu_26 (LeakyReLU) (None, None, None, 2 0 batch_normalization_26[0][0]
__________________________________________________________________________________________________
add_11 (Add) (None, None, None, 2 0 add_10[0][0]
leaky_re_lu_26[0][0]
__________________________________________________________________________________________________
zero_padding2d_4 (ZeroPadding2D (None, None, None, 2 0 add_11[0][0]
__________________________________________________________________________________________________
conv2d_27 (Conv2D) (None, None, None, 5 1179648 zero_padding2d_4[0][0]
__________________________________________________________________________________________________
batch_normalization_27 (BatchNo (None, None, None, 5 2048 conv2d_27[0][0]
__________________________________________________________________________________________________
leaky_re_lu_27 (LeakyReLU) (None, None, None, 5 0 batch_normalization_27[0][0]
__________________________________________________________________________________________________
conv2d_28 (Conv2D) (None, None, None, 2 131072 leaky_re_lu_27[0][0]
__________________________________________________________________________________________________
batch_normalization_28 (BatchNo (None, None, None, 2 1024 conv2d_28[0][0]
__________________________________________________________________________________________________
leaky_re_lu_28 (LeakyReLU) (None, None, None, 2 0 batch_normalization_28[0][0]
__________________________________________________________________________________________________
conv2d_29 (Conv2D) (None, None, None, 5 1179648 leaky_re_lu_28[0][0]
__________________________________________________________________________________________________
batch_normalization_29 (BatchNo (None, None, None, 5 2048 conv2d_29[0][0]
__________________________________________________________________________________________________
leaky_re_lu_29 (LeakyReLU) (None, None, None, 5 0 batch_normalization_29[0][0]
__________________________________________________________________________________________________
add_12 (Add) (None, None, None, 5 0 leaky_re_lu_27[0][0]
leaky_re_lu_29[0][0]
__________________________________________________________________________________________________
conv2d_30 (Conv2D) (None, None, None, 2 131072 add_12[0][0]
__________________________________________________________________________________________________
batch_normalization_30 (BatchNo (None, None, None, 2 1024 conv2d_30[0][0]
__________________________________________________________________________________________________
leaky_re_lu_30 (LeakyReLU) (None, None, None, 2 0 batch_normalization_30[0][0]
__________________________________________________________________________________________________
conv2d_31 (Conv2D) (None, None, None, 5 1179648 leaky_re_lu_30[0][0]
__________________________________________________________________________________________________
batch_normalization_31 (BatchNo (None, None, None, 5 2048 conv2d_31[0][0]
__________________________________________________________________________________________________
leaky_re_lu_31 (LeakyReLU) (None, None, None, 5 0 batch_normalization_31[0][0]
__________________________________________________________________________________________________
add_13 (Add) (None, None, None, 5 0 add_12[0][0]
leaky_re_lu_31[0][0]
__________________________________________________________________________________________________
conv2d_32 (Conv2D) (None, None, None, 2 131072 add_13[0][0]
__________________________________________________________________________________________________
batch_normalization_32 (BatchNo (None, None, None, 2 1024 conv2d_32[0][0]
__________________________________________________________________________________________________
leaky_re_lu_32 (LeakyReLU) (None, None, None, 2 0 batch_normalization_32[0][0]
__________________________________________________________________________________________________
conv2d_33 (Conv2D) (None, None, None, 5 1179648 leaky_re_lu_32[0][0]
__________________________________________________________________________________________________
batch_normalization_33 (BatchNo (None, None, None, 5 2048 conv2d_33[0][0]
__________________________________________________________________________________________________
leaky_re_lu_33 (LeakyReLU) (None, None, None, 5 0 batch_normalization_33[0][0]
__________________________________________________________________________________________________
add_14 (Add) (None, None, None, 5 0 add_13[0][0]
leaky_re_lu_33[0][0]
__________________________________________________________________________________________________
conv2d_34 (Conv2D) (None, None, None, 2 131072 add_14[0][0]
__________________________________________________________________________________________________
batch_normalization_34 (BatchNo (None, None, None, 2 1024 conv2d_34[0][0]
__________________________________________________________________________________________________
leaky_re_lu_34 (LeakyReLU) (None, None, None, 2 0 batch_normalization_34[0][0]
__________________________________________________________________________________________________
conv2d_35 (Conv2D) (None, None, None, 5 1179648 leaky_re_lu_34[0][0]
__________________________________________________________________________________________________
batch_normalization_35 (BatchNo (None, None, None, 5 2048 conv2d_35[0][0]
__________________________________________________________________________________________________
leaky_re_lu_35 (LeakyReLU) (None, None, None, 5 0 batch_normalization_35[0][0]
__________________________________________________________________________________________________
add_15 (Add) (None, None, None, 5 0 add_14[0][0]
leaky_re_lu_35[0][0]
__________________________________________________________________________________________________
conv2d_36 (Conv2D) (None, None, None, 2 131072 add_15[0][0]
__________________________________________________________________________________________________
batch_normalization_36 (BatchNo (None, None, None, 2 1024 conv2d_36[0][0]
__________________________________________________________________________________________________
leaky_re_lu_36 (LeakyReLU) (None, None, None, 2 0 batch_normalization_36[0][0]
__________________________________________________________________________________________________
conv2d_37 (Conv2D) (None, None, None, 5 1179648 leaky_re_lu_36[0][0]
__________________________________________________________________________________________________
batch_normalization_37 (BatchNo (None, None, None, 5 2048 conv2d_37[0][0]
__________________________________________________________________________________________________
leaky_re_lu_37 (LeakyReLU) (None, None, None, 5 0 batch_normalization_37[0][0]
__________________________________________________________________________________________________
add_16 (Add) (None, None, None, 5 0 add_15[0][0]
leaky_re_lu_37[0][0]
__________________________________________________________________________________________________
conv2d_38 (Conv2D) (None, None, None, 2 131072 add_16[0][0]
__________________________________________________________________________________________________
batch_normalization_38 (BatchNo (None, None, None, 2 1024 conv2d_38[0][0]
__________________________________________________________________________________________________
leaky_re_lu_38 (LeakyReLU) (None, None, None, 2 0 batch_normalization_38[0][0]
__________________________________________________________________________________________________
conv2d_39 (Conv2D) (None, None, None, 5 1179648 leaky_re_lu_38[0][0]
__________________________________________________________________________________________________
batch_normalization_39 (BatchNo (None, None, None, 5 2048 conv2d_39[0][0]
__________________________________________________________________________________________________
leaky_re_lu_39 (LeakyReLU) (None, None, None, 5 0 batch_normalization_39[0][0]
__________________________________________________________________________________________________
add_17 (Add) (None, None, None, 5 0 add_16[0][0]
leaky_re_lu_39[0][0]
__________________________________________________________________________________________________
conv2d_40 (Conv2D) (None, None, None, 2 131072 add_17[0][0]
__________________________________________________________________________________________________
batch_normalization_40 (BatchNo (None, None, None, 2 1024 conv2d_40[0][0]
__________________________________________________________________________________________________
leaky_re_lu_40 (LeakyReLU) (None, None, None, 2 0 batch_normalization_40[0][0]
__________________________________________________________________________________________________
conv2d_41 (Conv2D) (None, None, None, 5 1179648 leaky_re_lu_40[0][0]
__________________________________________________________________________________________________
batch_normalization_41 (BatchNo (None, None, None, 5 2048 conv2d_41[0][0]
__________________________________________________________________________________________________
leaky_re_lu_41 (LeakyReLU) (None, None, None, 5 0 batch_normalization_41[0][0]
__________________________________________________________________________________________________
add_18 (Add) (None, None, None, 5 0 add_17[0][0]
leaky_re_lu_41[0][0]
__________________________________________________________________________________________________
conv2d_42 (Conv2D) (None, None, None, 2 131072 add_18[0][0]
__________________________________________________________________________________________________
batch_normalization_42 (BatchNo (None, None, None, 2 1024 conv2d_42[0][0]
__________________________________________________________________________________________________
leaky_re_lu_42 (LeakyReLU) (None, None, None, 2 0 batch_normalization_42[0][0]
__________________________________________________________________________________________________
conv2d_43 (Conv2D) (None, None, None, 5 1179648 leaky_re_lu_42[0][0]
__________________________________________________________________________________________________
batch_normalization_43 (BatchNo (None, None, None, 5 2048 conv2d_43[0][0]
__________________________________________________________________________________________________
leaky_re_lu_43 (LeakyReLU) (None, None, None, 5 0 batch_normalization_43[0][0]
__________________________________________________________________________________________________
add_19 (Add) (None, None, None, 5 0 add_18[0][0]
leaky_re_lu_43[0][0]
__________________________________________________________________________________________________
zero_padding2d_5 (ZeroPadding2D (None, None, None, 5 0 add_19[0][0]
__________________________________________________________________________________________________
conv2d_44 (Conv2D) (None, None, None, 1 4718592 zero_padding2d_5[0][0]
__________________________________________________________________________________________________
batch_normalization_44 (BatchNo (None, None, None, 1 4096 conv2d_44[0][0]
__________________________________________________________________________________________________
leaky_re_lu_44 (LeakyReLU) (None, None, None, 1 0 batch_normalization_44[0][0]
__________________________________________________________________________________________________
conv2d_45 (Conv2D) (None, None, None, 5 524288 leaky_re_lu_44[0][0]
__________________________________________________________________________________________________
batch_normalization_45 (BatchNo (None, None, None, 5 2048 conv2d_45[0][0]
__________________________________________________________________________________________________
leaky_re_lu_45 (LeakyReLU) (None, None, None, 5 0 batch_normalization_45[0][0]
__________________________________________________________________________________________________
conv2d_46 (Conv2D) (None, None, None, 1 4718592 leaky_re_lu_45[0][0]
__________________________________________________________________________________________________
batch_normalization_46 (BatchNo (None, None, None, 1 4096 conv2d_46[0][0]
__________________________________________________________________________________________________
leaky_re_lu_46 (LeakyReLU) (None, None, None, 1 0 batch_normalization_46[0][0]
__________________________________________________________________________________________________
add_20 (Add) (None, None, None, 1 0 leaky_re_lu_44[0][0]
leaky_re_lu_46[0][0]
__________________________________________________________________________________________________
conv2d_47 (Conv2D) (None, None, None, 5 524288 add_20[0][0]
__________________________________________________________________________________________________
batch_normalization_47 (BatchNo (None, None, None, 5 2048 conv2d_47[0][0]
__________________________________________________________________________________________________
leaky_re_lu_47 (LeakyReLU) (None, None, None, 5 0 batch_normalization_47[0][0]
__________________________________________________________________________________________________
conv2d_48 (Conv2D) (None, None, None, 1 4718592 leaky_re_lu_47[0][0]
__________________________________________________________________________________________________
batch_normalization_48 (BatchNo (None, None, None, 1 4096 conv2d_48[0][0]
__________________________________________________________________________________________________
leaky_re_lu_48 (LeakyReLU) (None, None, None, 1 0 batch_normalization_48[0][0]
__________________________________________________________________________________________________
add_21 (Add) (None, None, None, 1 0 add_20[0][0]
leaky_re_lu_48[0][0]
__________________________________________________________________________________________________
conv2d_49 (Conv2D) (None, None, None, 5 524288 add_21[0][0]
__________________________________________________________________________________________________
batch_normalization_49 (BatchNo (None, None, None, 5 2048 conv2d_49[0][0]
__________________________________________________________________________________________________
leaky_re_lu_49 (LeakyReLU) (None, None, None, 5 0 batch_normalization_49[0][0]
__________________________________________________________________________________________________
conv2d_50 (Conv2D) (None, None, None, 1 4718592 leaky_re_lu_49[0][0]
__________________________________________________________________________________________________
batch_normalization_50 (BatchNo (None, None, None, 1 4096 conv2d_50[0][0]
__________________________________________________________________________________________________
leaky_re_lu_50 (LeakyReLU) (None, None, None, 1 0 batch_normalization_50[0][0]
__________________________________________________________________________________________________
add_22 (Add) (None, None, None, 1 0 add_21[0][0]
leaky_re_lu_50[0][0]
__________________________________________________________________________________________________
conv2d_51 (Conv2D) (None, None, None, 5 524288 add_22[0][0]
__________________________________________________________________________________________________
batch_normalization_51 (BatchNo (None, None, None, 5 2048 conv2d_51[0][0]
__________________________________________________________________________________________________
leaky_re_lu_51 (LeakyReLU) (None, None, None, 5 0 batch_normalization_51[0][0]
__________________________________________________________________________________________________
conv2d_52 (Conv2D) (None, None, None, 1 4718592 leaky_re_lu_51[0][0]
__________________________________________________________________________________________________
batch_normalization_52 (BatchNo (None, None, None, 1 4096 conv2d_52[0][0]
__________________________________________________________________________________________________
leaky_re_lu_52 (LeakyReLU) (None, None, None, 1 0 batch_normalization_52[0][0]
__________________________________________________________________________________________________
add_23 (Add) (None, None, None, 1 0 add_22[0][0]
leaky_re_lu_52[0][0]
__________________________________________________________________________________________________
conv2d_53 (Conv2D) (None, None, None, 5 524288 add_23[0][0]
__________________________________________________________________________________________________
batch_normalization_53 (BatchNo (None, None, None, 5 2048 conv2d_53[0][0]
__________________________________________________________________________________________________
leaky_re_lu_53 (LeakyReLU) (None, None, None, 5 0 batch_normalization_53[0][0]
__________________________________________________________________________________________________
conv2d_54 (Conv2D) (None, None, None, 1 4718592 leaky_re_lu_53[0][0]
__________________________________________________________________________________________________
batch_normalization_54 (BatchNo (None, None, None, 1 4096 conv2d_54[0][0]
__________________________________________________________________________________________________
leaky_re_lu_54 (LeakyReLU) (None, None, None, 1 0 batch_normalization_54[0][0]
__________________________________________________________________________________________________
conv2d_55 (Conv2D) (None, None, None, 5 524288 leaky_re_lu_54[0][0]
__________________________________________________________________________________________________
batch_normalization_55 (BatchNo (None, None, None, 5 2048 conv2d_55[0][0]
__________________________________________________________________________________________________
leaky_re_lu_55 (LeakyReLU) (None, None, None, 5 0 batch_normalization_55[0][0]
__________________________________________________________________________________________________
conv2d_56 (Conv2D) (None, None, None, 1 4718592 leaky_re_lu_55[0][0]
__________________________________________________________________________________________________
batch_normalization_56 (BatchNo (None, None, None, 1 4096 conv2d_56[0][0]
__________________________________________________________________________________________________
leaky_re_lu_56 (LeakyReLU) (None, None, None, 1 0 batch_normalization_56[0][0]
__________________________________________________________________________________________________
conv2d_57 (Conv2D) (None, None, None, 5 524288 leaky_re_lu_56[0][0]
__________________________________________________________________________________________________
batch_normalization_57 (BatchNo (None, None, None, 5 2048 conv2d_57[0][0]
__________________________________________________________________________________________________
leaky_re_lu_57 (LeakyReLU) (None, None, None, 5 0 batch_normalization_57[0][0]
__________________________________________________________________________________________________
conv2d_60 (Conv2D) (None, None, None, 2 131072 leaky_re_lu_57[0][0]
__________________________________________________________________________________________________
batch_normalization_59 (BatchNo (None, None, None, 2 1024 conv2d_60[0][0]
__________________________________________________________________________________________________
leaky_re_lu_59 (LeakyReLU) (None, None, None, 2 0 batch_normalization_59[0][0]
__________________________________________________________________________________________________
up_sampling2d_1 (UpSampling2D) (None, None, None, 2 0 leaky_re_lu_59[0][0]
__________________________________________________________________________________________________
concatenate_1 (Concatenate) (None, None, None, 7 0 up_sampling2d_1[0][0]
add_19[0][0]
__________________________________________________________________________________________________
conv2d_61 (Conv2D) (None, None, None, 2 196608 concatenate_1[0][0]
__________________________________________________________________________________________________
batch_normalization_60 (BatchNo (None, None, None, 2 1024 conv2d_61[0][0]
__________________________________________________________________________________________________
leaky_re_lu_60 (LeakyReLU) (None, None, None, 2 0 batch_normalization_60[0][0]
__________________________________________________________________________________________________
conv2d_62 (Conv2D) (None, None, None, 5 1179648 leaky_re_lu_60[0][0]
__________________________________________________________________________________________________
batch_normalization_61 (BatchNo (None, None, None, 5 2048 conv2d_62[0][0]
__________________________________________________________________________________________________
leaky_re_lu_61 (LeakyReLU) (None, None, None, 5 0 batch_normalization_61[0][0]
__________________________________________________________________________________________________
conv2d_63 (Conv2D) (None, None, None, 2 131072 leaky_re_lu_61[0][0]
__________________________________________________________________________________________________
batch_normalization_62 (BatchNo (None, None, None, 2 1024 conv2d_63[0][0]
__________________________________________________________________________________________________
leaky_re_lu_62 (LeakyReLU) (None, None, None, 2 0 batch_normalization_62[0][0]
__________________________________________________________________________________________________
conv2d_64 (Conv2D) (None, None, None, 5 1179648 leaky_re_lu_62[0][0]
__________________________________________________________________________________________________
batch_normalization_63 (BatchNo (None, None, None, 5 2048 conv2d_64[0][0]
__________________________________________________________________________________________________
leaky_re_lu_63 (LeakyReLU) (None, None, None, 5 0 batch_normalization_63[0][0]
___
# colab ๋ฒ์ ์ ์๋ ๋ช
๋ น์ด๋ก raccoon_class.txt ๋ฅผ ์์ ํฉ๋๋ค.
BASE_DIR = os.path.join(HOME_DIR, 'DLCV/Detection/yolo/keras-yolo3')
classes_path = os.path.join(BASE_DIR, 'model_data/raccoon_class.txt')
with open(classes_path, "w") as f:
f.write("raccoon")
# colab ๋ฒ์ ์ raccoon_class.txt์ ์ ๋๋ก ๊ธฐ์ฌ๋์๋ ํ์ธ.
!cat /content/DLCV/Detection/yolo/keras-yolo3/model_data/raccoon_class.txt
from train import get_classes, get_anchors # ํด๋์ค์ ์ต์ปค ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ค๋ ํจ์
from train import create_model, data_generator, data_generator_wrapper # ๋ชจ๋ธ ์์ฑ ๋ฐ ๋ฐ์ดํฐ ์ ๋๋ ์ดํฐ ๊ด๋ จ ํจ์
BASE_DIR = os.path.join(HOME_DIR, 'DLCV/Detection/yolo/keras-yolo3')
## ํ์ต์ ์ํ ๊ธฐ๋ณธ ํ๊ฒฝ ์ค์ . annotation ํ์ผ, ์ ์ฅ๋ ๋ชจ๋ธ ํ์ผ ๊ฒฝ๋ก, ํด๋์ค ํ์ผ, ์ต์ปค ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ค์ .
annotation_path = os.path.join(ANNO_DIR, 'raccoon_anno.csv') # ์ฃผ์ ํ์ผ ๊ฒฝ๋ก
log_dir = os.path.join(BASE_DIR, 'snapshots/000/') # ๋ชจ๋ธ ํ์ต ์ค๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ํด๋
classes_path = os.path.join(BASE_DIR, 'model_data/raccoon_class.txt') # ํด๋์ค ์ ๋ณด ํ์ผ ๊ฒฝ๋ก
anchors_path = os.path.join(BASE_DIR, 'model_data/yolo_anchors.txt') # ์ต์ปค ๋ฐ์ค ์ ๋ณด ํ์ผ ๊ฒฝ๋ก
# ํด๋์ค ์ด๋ฆ๊ณผ ์ต์ปค ๋ฐ์ค ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ด
class_names = get_classes(classes_path) # ํด๋์ค ์ด๋ฆ์ ๊ฐ์ ธ์ด
num_classes = len(class_names) # ํด๋์ค ๊ฐ์๋ฅผ ๊ณ์ฐ
anchors = get_anchors(anchors_path) # ์ต์ปค ๋ฐ์ค๋ฅผ ๊ฐ์ ธ์ด
# ์ต์ด ๊ฐ์ค์น ํ์ผ์ COCO ๋ฐ์ดํฐ์
์ผ๋ก ํ์ต๋ YOLO ๋ชจ๋ธ์ ์ฌ์ฉ.
model_weights_path = os.path.join(BASE_DIR, 'model_data/yolo.h5')
input_shape = (416, 416) # ์
๋ ฅ ์ด๋ฏธ์ง ํฌ๊ธฐ (416x416), YOLO ๋ชจ๋ธ์์ 32์ ๋ฐฐ์์ฌ์ผ ํจ
# ์ต์ปค ๋ฐ์ค ๊ฐ์๊ฐ 6๊ฐ๋ฉด Tiny YOLO ๋ชจ๋ธ ์ฌ์ฉ
is_tiny_version = len(anchors) == 6
# Tiny YOLO ๋ชจ๋ธ์ด๋ ์ผ๋ฐ YOLO ๋ชจ๋ธ์ด๋์ ๋ฐ๋ผ ๋ชจ๋ธ ์์ฑ ๋ฐฉ์์ ์ ํ
if is_tiny_version:
model = create_tiny_model(input_shape, anchors, num_classes,
freeze_body=2, weights_path=model_weights_path)
else:
model = create_model(input_shape, anchors, num_classes,
freeze_body=2, weights_path=model_weights_path) # ๋ ์ด์ด ์ผ๋ถ ๊ณ ์
# ๋ชจ๋ธ ํ์ต ์ ์ฌ์ฉํ ์ฝ๋ฐฑ ์ค์ (TensorBoard ๋ก๊ทธ, ์ฒดํฌํฌ์ธํธ ์ ์ฅ, ํ์ต๋ฅ ์กฐ์ ๋ฑ)
logging = TensorBoard(log_dir=log_dir)
checkpoint = ModelCheckpoint(log_dir + 'ep{epoch:03d}-loss{loss:.3f}-val_loss{val_loss:.3f}.h5',
monitor='val_loss', save_weights_only=True, save_best_only=True, period=3)
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=3, verbose=1)
early_stopping = EarlyStopping(monitor='val_loss', min_delta=0, patience=10, verbose=1)
val_split = 0.1 # ํ์ต ๋ฐ์ดํฐ ์ค 10%๋ฅผ ๊ฒ์ฆ ๋ฐ์ดํฐ๋ก ์ฌ์ฉ
# ์ฃผ์ ํ์ผ์ ์ด์ด ์ด๋ฏธ์ง์ ๊ฐ์ฒด ์ ๋ณด๋ฅผ ์ฝ์ด์ด
with open(annotation_path) as f:
lines = f.readlines()
# ๋ฐ์ดํฐ๋ฅผ ์
ํํ์ฌ ํ๋ จ ๋ฐ์ดํฐ์ ๊ฒ์ฆ ๋ฐ์ดํฐ๋ก ๋๋
np.random.seed(10101)
np.random.shuffle(lines)
np.random.seed(None)
num_val = int(len(lines) * val_split) # ๊ฒ์ฆ ๋ฐ์ดํฐ ๊ฐ์
num_train = len(lines) - num_val # ํ์ต ๋ฐ์ดํฐ ๊ฐ์
# ์ฒซ ๋ฒ์งธ ํ์ต ๋จ๊ณ: ๊ณ ์ ๋ ๋ ์ด์ด๋ก ํ์ต์ ์์ํ์ฌ ๊ธฐ๋ณธ์ ์ธ ์์ค์ ์์ ํ
if True:
model.compile(optimizer=Adam(lr=1e-3), loss={
# yolo_loss๋ ์ฌ์ฉ์ ์ ์ ์์ค ํจ์ (Lambda ๋ ์ด์ด ์ฌ์ฉ)
'yolo_loss': lambda y_true, y_pred: y_pred})
batch_size = 4 # ๋ฐฐ์น ํฌ๊ธฐ ์ค์
print('Train on {} samples, val on {} samples, with batch size {}.'.format(num_train, num_val, batch_size))
# ๋ฐ์ดํฐ ์ ๋๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ํ์ต
model.fit_generator(data_generator_wrapper(lines[:num_train], batch_size, input_shape, anchors, num_classes),
steps_per_epoch=max(1, num_train // batch_size),
validation_data=data_generator_wrapper(lines[num_train:], batch_size, input_shape, anchors, num_classes),
validation_steps=max(1, num_val // batch_size),
epochs=50, # 50 ์ํฌํฌ ๋์ ํ์ต
initial_epoch=0,
callbacks=[logging, checkpoint])
model.save_weights(log_dir + 'trained_weights_stage_1.h5') # ์ฒซ ๋ฒ์งธ ํ์ต ๋จ๊ณ์ ๊ฐ์ค์น๋ฅผ ์ ์ฅ
# ๋ ๋ฒ์งธ ํ์ต ๋จ๊ณ: ๊ณ ์ ๋ ๋ ์ด์ด๋ฅผ ํ๊ณ (fine-tune) ์ถ๊ฐ ํ์ต ์งํ
if True:
for i in range(len(model.layers)):
model.layers[i].trainable = True # ๋ชจ๋ ๋ ์ด์ด๋ฅผ ํ์ต ๊ฐ๋ฅ ์ํ๋ก ์ค์
model.compile(optimizer=Adam(lr=1e-4), loss={'yolo_loss': lambda y_true, y_pred: y_pred}) # ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ๊ธฐ ์ํด ๋ชจ๋ธ ์ฌ์ปดํ์ผ
print('Unfreeze all of the layers.')
batch_size = 4 # ๊ณ ์ ๋ ๋ ์ด์ด๋ฅผ ํผ ํ์๋ ๋ ๋ง์ GPU ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ ์ ์์
print('Train on {} samples, val on {} samples, with batch size {}.'.format(num_train, num_val, batch_size))
# ๋์ผํ ๋ฐฉ์์ผ๋ก ํ์ต, ๊ทธ๋ฌ๋ ๋ชจ๋ ๋ ์ด์ด๊ฐ ํ์ต๋๋๋ก ์ค์
model.fit_generator(data_generator_wrapper(lines[:num_train], batch_size, input_shape, anchors, num_classes),
steps_per_epoch=max(1, num_train // batch_size),
validation_data=data_generator_wrapper(lines[num_train:], batch_size, input_shape, anchors, num_classes),
validation_steps=max(1, num_val // batch_size),
epochs=100, # 100 ์ํฌํฌ ๋์ ํ์ต
initial_epoch=50,
callbacks=[logging, checkpoint, reduce_lr, early_stopping])
model.save_weights(log_dir + 'trained_weights_final.h5') # ์ต์ข
๊ฐ์ค์น ์ ์ฅ
- ๋ชจ๋ธ ๋ก๋ฉ: COCO ๋ฐ์ดํฐ์ ์ผ๋ก ๋ฏธ๋ฆฌ ํ์ต๋ YOLO ๋ชจ๋ธ์ ๋ก๋ฉํ๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ต์ ์์ํฉ๋๋ค.
- ๋ชจ๋ธ ํ์ต ๊ณผ์ :
- ๊ณ ์ ๋ ๋ ์ด์ด๋ก ๋จผ์ ํ์ต์ ์งํํ์ฌ ๊ธฐ๋ณธ์ ์ธ ์์ค์ ์์ ํํฉ๋๋ค.
- ๊ทธ ํ, ๊ณ ์ ๋ ๋ ์ด์ด๋ฅผ ํ์ด(fine-tuning), ๋ชจ๋ธ์ ๋์ฑ ์ธ๋ถ์ ์ผ๋ก ํ์ตํฉ๋๋ค.
- ์ฝ๋ฐฑ ํจ์: ํ์ต ์ค๊ฐ์ค๊ฐ์ ์์ค ๊ฐ์ ๋ฐ๋ผ ํ์ต๋ฅ ์ ์กฐ์ ํ๊ฑฐ๋ ํ์ต์ ์กฐ๊ธฐ ์ข ๋ฃํ๋ ๋ฑ ๋ค์ํ ์ฝ๋ฐฑ ํจ์๋ค์ด ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ๋ถํ : ์ฃผ์ ๋ฐ์ดํฐ๋ฅผ ์ ํํ ํ, 90%๋ ํ์ต์, 10%๋ ๊ฒ์ฆ์ ์ฌ์ฉ๋ฉ๋๋ค.
# snapshots/000 ๋๋ ํ ๋ฆฌ์ ํ์ต๋ weight ํ์ผ์ด ์์ฑ๋์๋์ง ํ์ธ.
!ls /content/DLCV/Detection/yolo/keras-yolo3/snapshots/000
ํ์ต๋ model์ ์ด์ฉํ์ฌ Inference ์ํ
# YOLO ๊ฐ์ฒด ์์ฑ.
import sys
import argparse
from yolo import YOLO, detect_video
#keras-yolo์์ image์ฒ๋ฆฌ๋ฅผ ์ฃผ์ PIL๋ก ์ํ.
from PIL import Image
#LOCAL_PACKAGE_DIR = os.path.abspath("./keras-yolo3")
#sys.path.append(LOCAL_PACKAGE_DIR)
# ์ฝ๋ฉ ๋ฒ์ ์ ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ค์ .
HOME_DIR='/content'
raccoon_yolo = YOLO(model_path=os.path.join(HOME_DIR,'DLCV/Detection/yolo/keras-yolo3/snapshots/000/trained_weights_final.h5'),
anchors_path=os.path.join(HOME_DIR,'DLCV/Detection/yolo/keras-yolo3/model_data/yolo_anchors.txt'),
classes_path=os.path.join(HOME_DIR, 'DLCV/Detection/yolo/keras-yolo3/model_data/raccoon_class.txt'))
# /content/DLCV/Detection/yolo/keras-yolo3/snapshots/000/trained_weights_final.h5 model, anchors, and classes loaded.
import matplotlib
import matplotlib.pyplot as plt
img = Image.open(os.path.join(IMAGE_DIR, 'raccoon-171.jpg'))
plt.figure(figsize=(12, 12))
plt.imshow(img)
<matplotlib.image.AxesImage at 0x7fdcd7226588>
detected_img = raccoon_yolo.detect_image(img)
plt.figure(figsize=(12, 12))
plt.imshow(detected_img)
(416, 416, 3)
Found 1 boxes for img
raccoon 0.99 (105, 29) (185, 106)
2.3317793840005834
<matplotlib.image.AxesImage at 0x7fdcda716b70>
'๐ Computer Vision' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CV] OpenImage Dataset์ Object Detection Inference Part.1 (with Keras-yolo) (0) | 2025.01.22 |
---|---|
[CV] Google Open Image Dataset (0) | 2024.10.11 |
[CV] Object Detection Model Training์ ์ ์์ฌํญ (0) | 2024.10.08 |
[CV] Keras ๊ธฐ๋ฐ YOLO Open Source Package & Object Detection (0) | 2024.10.07 |
[CV] OpenCV์์ YOLO๋ฅผ ์ด์ฉํ Object Detection Part.2 (0) | 2024.10.06 |