Coding style changes
This commit is contained in:
@@ -3,41 +3,33 @@ YOLO v3 object detection with Keras
|
||||
|
||||
Source: https://towardsdatascience.com/yolo-v3-object-detection-with-keras-461d2cfccef6
|
||||
"""
|
||||
# import os
|
||||
# import scipy.io
|
||||
# import scipy.misc
|
||||
import numpy as np
|
||||
# import pandas as pd
|
||||
# import PIL
|
||||
import struct
|
||||
# import cv2
|
||||
import glob
|
||||
import numpy as np
|
||||
from numpy import expand_dims
|
||||
# import tensorflow as tf
|
||||
# from skimage.transform import resize
|
||||
from keras import backend as K
|
||||
from keras.layers import Input, Lambda, Conv2D, BatchNormalization, LeakyReLU, ZeroPadding2D, UpSampling2D
|
||||
from keras.models import load_model, Model
|
||||
from keras.layers import Input, Conv2D, BatchNormalization, LeakyReLU, ZeroPadding2D, UpSampling2D
|
||||
from keras.models import Model
|
||||
from keras.layers.merge import add, concatenate
|
||||
from keras.preprocessing.image import load_img
|
||||
from keras.preprocessing.image import img_to_array
|
||||
from matplotlib import pyplot
|
||||
import matplotlib.pyplot as plt
|
||||
from matplotlib.pyplot import imshow
|
||||
from matplotlib.patches import Rectangle
|
||||
# %matplotlib inline
|
||||
|
||||
"""**Step 1:** `WeightReader` class is used to parse the "yolov3.weights" file and load the model weights into memory in a format that we can set into keras model"""
|
||||
|
||||
# Step 1:
|
||||
# WeightReader class is used to parse the "yolov3.weights" file and load the model weights into
|
||||
# memory in a format that we can set into keras model
|
||||
class WeightReader:
|
||||
def __init__(self, weight_file):
|
||||
with open(weight_file, 'rb') as w_f:
|
||||
major, = struct.unpack('i', w_f.read(4))
|
||||
minor, = struct.unpack('i', w_f.read(4))
|
||||
revision, = struct.unpack('i', w_f.read(4))
|
||||
|
||||
if (major*10 + minor) >= 2 and major < 1000 and minor < 1000:
|
||||
w_f.read(8)
|
||||
else:
|
||||
w_f.read(4)
|
||||
|
||||
transpose = (major > 1000) or (minor > 1000)
|
||||
binary = w_f.read()
|
||||
self.offset = 0
|
||||
@@ -52,6 +44,7 @@ class WeightReader:
|
||||
try:
|
||||
conv_layer = model.get_layer('conv_' + str(i))
|
||||
print("loading weights of convolution #" + str(i))
|
||||
|
||||
if i not in [81, 93, 105]:
|
||||
norm_layer = model.get_layer('bnorm_' + str(i))
|
||||
size = np.prod(norm_layer.get_weights()[0].shape)
|
||||
@@ -60,6 +53,7 @@ class WeightReader:
|
||||
mean = self.read_bytes(size) # mean
|
||||
var = self.read_bytes(size) # variance
|
||||
weights = norm_layer.set_weights([gamma, beta, mean, var])
|
||||
|
||||
if len(conv_layer.get_weights()) > 1:
|
||||
bias = self.read_bytes(np.prod(conv_layer.get_weights()[1].shape))
|
||||
kernel = self.read_bytes(np.prod(conv_layer.get_weights()[0].shape))
|
||||
@@ -71,110 +65,135 @@ class WeightReader:
|
||||
kernel = kernel.reshape(list(reversed(conv_layer.get_weights()[0].shape)))
|
||||
kernel = kernel.transpose([2,3,1,0])
|
||||
conv_layer.set_weights([kernel])
|
||||
|
||||
except ValueError:
|
||||
print("no convolution #" + str(i))
|
||||
|
||||
def reset(self):
|
||||
self.offset = 0
|
||||
|
||||
"""**Step 2:**
|
||||
- `_conv_block(input, convs, skip=True)` is a function to create convolutional layer
|
||||
- `make_yolov3_model()` is a function to create layers of convoluational and stack together as a whole yolo model
|
||||
"""
|
||||
|
||||
def _conv_block(inp, convs, skip=True):
|
||||
# Step 2:
|
||||
# _cb(input, convs, skip=True) is a function to create convolutional layer
|
||||
def _cb(inp, convs, skip=True):
|
||||
x = inp
|
||||
count = 0
|
||||
for conv in convs:
|
||||
if count == (len(convs) - 2) and skip:
|
||||
skip_connection = x
|
||||
count += 1
|
||||
if conv['stride'] > 1: x = ZeroPadding2D(((1,0),(1,0)))(x) # peculiar padding as darknet prefer left and top
|
||||
if conv['stride'] > 1: x = ZeroPadding2D(((1,0),(1,0)))(x) # peculiar padding as darknet
|
||||
# prefer left and top
|
||||
x = Conv2D(conv['filter'],
|
||||
conv['kernel'],
|
||||
strides=conv['stride'],
|
||||
padding='valid' if conv['stride'] > 1 else 'same', # peculiar padding as darknet prefer left and top
|
||||
padding='valid' if conv['stride'] > 1 else 'same', # peculiar padding as darknet
|
||||
# prefer left and top
|
||||
name='conv_' + str(conv['layer_idx']),
|
||||
use_bias=False if conv['bnorm'] else True)(x)
|
||||
if conv['bnorm']: x = BatchNormalization(epsilon=0.001, name='bnorm_' + str(conv['layer_idx']))(x)
|
||||
if conv['leaky']: x = LeakyReLU(alpha=0.1, name='leaky_' + str(conv['layer_idx']))(x)
|
||||
|
||||
if conv['bnorm']: x = BatchNormalization(epsilon=0.001, name='bnorm_'
|
||||
+ str(conv['layer_idx']))(x)
|
||||
if conv['leaky']: x = LeakyReLU(alpha=0.1, name='leaky_'
|
||||
+ str(conv['layer_idx']))(x)
|
||||
|
||||
return add([skip_connection, x]) if skip else x
|
||||
|
||||
# make_yolov3_model() is a function to create layers of convoluational and stack together as a
|
||||
# whole yolo model
|
||||
def make_yolov3_model():
|
||||
input_image = Input(shape=(None, None, 3))
|
||||
|
||||
# Layer 0 => 4
|
||||
x = _conv_block(input_image, [{'filter': 32, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 0},
|
||||
x = _cb(input_image, [{'filter': 32, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 0},
|
||||
{'filter': 64, 'kernel': 3, 'stride': 2, 'bnorm': True, 'leaky': True, 'layer_idx': 1},
|
||||
{'filter': 32, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 2},
|
||||
{'filter': 64, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 3}])
|
||||
|
||||
# Layer 5 => 8
|
||||
x = _conv_block(x, [{'filter': 128, 'kernel': 3, 'stride': 2, 'bnorm': True, 'leaky': True, 'layer_idx': 5},
|
||||
x = _cb(x, [{'filter': 128, 'kernel': 3, 'stride': 2, 'bnorm': True, 'leaky': True, 'layer_idx': 5},
|
||||
{'filter': 64, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 6},
|
||||
{'filter': 128, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 7}])
|
||||
|
||||
# Layer 9 => 11
|
||||
x = _conv_block(x, [{'filter': 64, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 9},
|
||||
x = _cb(x, [{'filter': 64, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 9},
|
||||
{'filter': 128, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 10}])
|
||||
|
||||
# Layer 12 => 15
|
||||
x = _conv_block(x, [{'filter': 256, 'kernel': 3, 'stride': 2, 'bnorm': True, 'leaky': True, 'layer_idx': 12},
|
||||
x = _cb(x, [{'filter': 256, 'kernel': 3, 'stride': 2, 'bnorm': True, 'leaky': True, 'layer_idx': 12},
|
||||
{'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 13},
|
||||
{'filter': 256, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 14}])
|
||||
|
||||
# Layer 16 => 36
|
||||
for i in range(7):
|
||||
x = _conv_block(x, [{'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 16+i*3},
|
||||
x = _cb(x, [{'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 16+i*3},
|
||||
{'filter': 256, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 17+i*3}])
|
||||
skip_36 = x
|
||||
|
||||
# Layer 37 => 40
|
||||
x = _conv_block(x, [{'filter': 512, 'kernel': 3, 'stride': 2, 'bnorm': True, 'leaky': True, 'layer_idx': 37},
|
||||
x = _cb(x, [{'filter': 512, 'kernel': 3, 'stride': 2, 'bnorm': True, 'leaky': True, 'layer_idx': 37},
|
||||
{'filter': 256, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 38},
|
||||
{'filter': 512, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 39}])
|
||||
|
||||
# Layer 41 => 61
|
||||
for i in range(7):
|
||||
x = _conv_block(x, [{'filter': 256, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 41+i*3},
|
||||
x = _cb(x, [{'filter': 256, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 41+i*3},
|
||||
{'filter': 512, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 42+i*3}])
|
||||
skip_61 = x
|
||||
|
||||
# Layer 62 => 65
|
||||
x = _conv_block(x, [{'filter': 1024, 'kernel': 3, 'stride': 2, 'bnorm': True, 'leaky': True, 'layer_idx': 62},
|
||||
x = _cb(x, [{'filter': 1024, 'kernel': 3, 'stride': 2, 'bnorm': True, 'leaky': True, 'layer_idx': 62},
|
||||
{'filter': 512, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 63},
|
||||
{'filter': 1024, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 64}])
|
||||
|
||||
# Layer 66 => 74
|
||||
for i in range(3):
|
||||
x = _conv_block(x, [{'filter': 512, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 66+i*3},
|
||||
x = _cb(x, [{'filter': 512, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 66+i*3},
|
||||
{'filter': 1024, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 67+i*3}])
|
||||
|
||||
# Layer 75 => 79
|
||||
x = _conv_block(x, [{'filter': 512, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 75},
|
||||
x = _cb(x, [{'filter': 512, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 75},
|
||||
{'filter': 1024, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 76},
|
||||
{'filter': 512, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 77},
|
||||
{'filter': 1024, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 78},
|
||||
{'filter': 512, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 79}], skip=False)
|
||||
{'filter': 512, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 79}],
|
||||
skip=False)
|
||||
|
||||
# Layer 80 => 82
|
||||
yolo_82 = _conv_block(x, [{'filter': 1024, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 80},
|
||||
{'filter': 255, 'kernel': 1, 'stride': 1, 'bnorm': False, 'leaky': False, 'layer_idx': 81}], skip=False)
|
||||
yolo_82 = _cb(x, [{'filter': 1024, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 80},
|
||||
{'filter': 255, 'kernel': 1, 'stride': 1, 'bnorm': False, 'leaky': False, 'layer_idx': 81}],
|
||||
skip=False)
|
||||
|
||||
# Layer 83 => 86
|
||||
x = _conv_block(x, [{'filter': 256, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 84}], skip=False)
|
||||
x = _cb(x, [{'filter': 256, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 84}],
|
||||
skip=False)
|
||||
|
||||
x = UpSampling2D(2)(x)
|
||||
x = concatenate([x, skip_61])
|
||||
|
||||
# Layer 87 => 91
|
||||
x = _conv_block(x, [{'filter': 256, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 87},
|
||||
x = _cb(x, [{'filter': 256, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 87},
|
||||
{'filter': 512, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 88},
|
||||
{'filter': 256, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 89},
|
||||
{'filter': 512, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 90},
|
||||
{'filter': 256, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 91}], skip=False)
|
||||
# Layer 92 => 94
|
||||
yolo_94 = _conv_block(x, [{'filter': 512, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 92},
|
||||
yolo_94 = _cb(x, [{'filter': 512, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 92},
|
||||
{'filter': 255, 'kernel': 1, 'stride': 1, 'bnorm': False, 'leaky': False, 'layer_idx': 93}], skip=False)
|
||||
# Layer 95 => 98
|
||||
x = _conv_block(x, [{'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 96}], skip=False)
|
||||
x = _cb(x, [{'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 96}], skip=False)
|
||||
x = UpSampling2D(2)(x)
|
||||
x = concatenate([x, skip_36])
|
||||
# Layer 99 => 106
|
||||
yolo_106 = _conv_block(x, [{'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 99},
|
||||
yolo_106 = _cb(x, [{'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 99},
|
||||
{'filter': 256, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 100},
|
||||
{'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 101},
|
||||
{'filter': 256, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 102},
|
||||
{'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 103},
|
||||
{'filter': 256, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 104},
|
||||
{'filter': 255, 'kernel': 1, 'stride': 1, 'bnorm': False, 'leaky': False, 'layer_idx': 105}], skip=False)
|
||||
|
||||
model = Model(input_image, [yolo_82, yolo_94, yolo_106])
|
||||
|
||||
return model
|
||||
|
||||
"""**Step 3:**
|
||||
@@ -394,8 +413,6 @@ labels = ["person", "bicycle", "car", "motorbike", "aeroplane", "bus", "train",
|
||||
# from google.colab import files
|
||||
# upload = files.upload()
|
||||
|
||||
import glob
|
||||
|
||||
for photo_filename in glob.glob("images/test/dog/*"):
|
||||
|
||||
# for fn in upload.keys():
|
||||
@@ -434,4 +451,3 @@ for photo_filename in glob.glob("images/test/dog/*"):
|
||||
draw_boxes(photo_filename, v_boxes, v_labels, v_scores)
|
||||
|
||||
print([a.shape for a in yhat])
|
||||
|
||||
|
||||
Reference in New Issue
Block a user