# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function
import utool as ut
from Lasagne.lasagne import layers, nonlinearities
from wbia_cnn.models import abstract_models
print, rrr, profile = ut.inject2(__name__)
[docs]@ut.reloadable_class
class QualityModel(abstract_models.AbstractCategoricalModel):
def __init__(self):
super(QualityModel, self).__init__()
[docs] def label_order_mapping(self, category_list):
quality_mapping = {
'JUNK': 0,
'POOR': 1,
'GOOD': 2,
'OK': 3,
'EXCELLENT': 4,
}
return quality_mapping
[docs] def learning_rate_update(self, x):
return x / 2.0
[docs] def learning_rate_shock(self, x):
return x * 2.0
[docs] def build_model(
self, batch_size, input_width, input_height, input_channels, output_dims
):
from wbia_cnn import custom_layers
Conv2DLayer = custom_layers.Conv2DLayer
MaxPool2DLayer = custom_layers.MaxPool2DLayer
_CaffeNet = abstract_models.PretrainedNetwork('caffenet')
l_in = layers.InputLayer(
# variable batch size (None), channel, width, height
shape=(None, input_channels, input_width, input_height)
)
l_noise = layers.GaussianNoiseLayer(
l_in,
)
l_conv0 = Conv2DLayer(
l_noise,
num_filters=32,
filter_size=(11, 11),
# nonlinearity=nonlinearities.rectify,
nonlinearity=nonlinearities.LeakyRectify(leakiness=(1.0 / 10.0)),
W=_CaffeNet.get_pretrained_layer(0),
)
l_conv0_dropout = layers.DropoutLayer(l_conv0, p=0.10)
l_conv1 = Conv2DLayer(
l_conv0_dropout,
num_filters=32,
filter_size=(5, 5),
# nonlinearity=nonlinearities.rectify,
nonlinearity=nonlinearities.LeakyRectify(leakiness=(1.0 / 10.0)),
W=_CaffeNet.get_pretrained_layer(2),
)
l_pool1 = MaxPool2DLayer(
l_conv1,
pool_size=(2, 2),
stride=(2, 2),
)
l_conv2_dropout = layers.DropoutLayer(l_pool1, p=0.10)
l_conv2 = Conv2DLayer(
l_conv2_dropout,
num_filters=64,
filter_size=(3, 3),
# nonlinearity=nonlinearities.rectify,
nonlinearity=nonlinearities.LeakyRectify(leakiness=(1.0 / 10.0)),
# W=init.Orthogonal(),
)
l_pool2 = MaxPool2DLayer(
l_conv2,
pool_size=(2, 2),
stride=(2, 2),
)
l_conv3_dropout = layers.DropoutLayer(l_pool2, p=0.30)
l_conv3 = Conv2DLayer(
l_conv3_dropout,
num_filters=128,
filter_size=(3, 3),
# nonlinearity=nonlinearities.rectify,
nonlinearity=nonlinearities.LeakyRectify(leakiness=(1.0 / 10.0)),
# W=init.Orthogonal(),
)
l_pool3 = MaxPool2DLayer(
l_conv3,
pool_size=(2, 2),
stride=(2, 2),
)
l_conv4_dropout = layers.DropoutLayer(l_pool3, p=0.30)
l_conv4 = Conv2DLayer(
l_conv4_dropout,
num_filters=128,
filter_size=(3, 3),
# nonlinearity=nonlinearities.rectify,
nonlinearity=nonlinearities.LeakyRectify(leakiness=(1.0 / 10.0)),
# W=init.Orthogonal(),
)
l_pool4 = MaxPool2DLayer(
l_conv4,
pool_size=(2, 2),
stride=(2, 2),
)
l_hidden1 = layers.DenseLayer(
l_pool4,
num_units=512,
# nonlinearity=nonlinearities.rectify,
nonlinearity=nonlinearities.LeakyRectify(leakiness=(1.0 / 10.0)),
# W=init.Orthogonal(),
)
l_hidden1_maxout = layers.FeaturePoolLayer(
l_hidden1,
pool_size=2,
)
l_hidden1_dropout = layers.DropoutLayer(l_hidden1_maxout, p=0.5)
l_hidden2 = layers.DenseLayer(
l_hidden1_dropout,
num_units=512,
# nonlinearity=nonlinearities.rectify,
nonlinearity=nonlinearities.LeakyRectify(leakiness=(1.0 / 10.0)),
# W=init.Orthogonal(),
)
l_hidden2_maxout = layers.FeaturePoolLayer(
l_hidden2,
pool_size=2,
)
l_hidden2_dropout = layers.DropoutLayer(l_hidden2_maxout, p=0.5)
l_out = layers.DenseLayer(
l_hidden2_dropout,
num_units=output_dims,
nonlinearity=nonlinearities.softmax,
# W=init.Orthogonal(),
)
self.output_layer = l_out
return l_out
if __name__ == '__main__':
"""
CommandLine:
python -m wbia_cnn.models.quality
python -m wbia_cnn.models.quality --allexamples
python -m wbia_cnn.models.quality --allexamples --noface --nosrc
"""
import multiprocessing
multiprocessing.freeze_support() # for win32
import utool as ut # NOQA
ut.doctest_funcs()