示例#1
0
    def build(self,
              weights_path="open_nsfw-weights.npy",
              input_type=InputType.TENSOR):

        self.weights = np.load(weights_path, encoding="latin1").item()
        self.input_tensor = None

        if input_type == InputType.TENSOR:
            self.input = tf.placeholder(
                tf.float32, shape=[None, 224, 224, 3], name="input")
            self.input_tensor = self.input
        elif input_type == InputType.BASE64_JPEG:
            from image_utils import load_base64_tensor

            self.input = tf.placeholder(
                tf.string, shape=(None, ), name="input")
            self.input_tensor = load_base64_tensor(self.input)
        else:
            raise ValueError("invalid input type '{}'".format(input_type))

        x = self.input_tensor

        x = tf.pad(x, [[0, 0], [3, 3], [3, 3], [0, 0]], 'CONSTANT')
        x = self.__conv2d(
            "conv_1",
            x,
            filter_depth=64,
            kernel_size=7,
            stride=2,
            padding='valid')

        x = self.__batch_norm("bn_1", x)
        x = tf.nn.relu(x)

        x = tf.layers.max_pooling2d(x, pool_size=3, strides=2, padding='same')

        x = self.__conv_block(
            stage=0,
            block=0,
            inputs=x,
            filter_depths=[32, 32, 128],
            kernel_size=3,
            stride=1)

        x = self.__identity_block(
            stage=0,
            block=1,
            inputs=x,
            filter_depths=[32, 32, 128],
            kernel_size=3)
        x = self.__identity_block(
            stage=0,
            block=2,
            inputs=x,
            filter_depths=[32, 32, 128],
            kernel_size=3)

        x = self.__conv_block(
            stage=1,
            block=0,
            inputs=x,
            filter_depths=[64, 64, 256],
            kernel_size=3,
            stride=2)
        x = self.__identity_block(
            stage=1,
            block=1,
            inputs=x,
            filter_depths=[64, 64, 256],
            kernel_size=3)
        x = self.__identity_block(
            stage=1,
            block=2,
            inputs=x,
            filter_depths=[64, 64, 256],
            kernel_size=3)
        x = self.__identity_block(
            stage=1,
            block=3,
            inputs=x,
            filter_depths=[64, 64, 256],
            kernel_size=3)

        x = self.__conv_block(
            stage=2,
            block=0,
            inputs=x,
            filter_depths=[128, 128, 512],
            kernel_size=3,
            stride=2)
        x = self.__identity_block(
            stage=2,
            block=1,
            inputs=x,
            filter_depths=[128, 128, 512],
            kernel_size=3)
        x = self.__identity_block(
            stage=2,
            block=2,
            inputs=x,
            filter_depths=[128, 128, 512],
            kernel_size=3)
        x = self.__identity_block(
            stage=2,
            block=3,
            inputs=x,
            filter_depths=[128, 128, 512],
            kernel_size=3)
        x = self.__identity_block(
            stage=2,
            block=4,
            inputs=x,
            filter_depths=[128, 128, 512],
            kernel_size=3)
        x = self.__identity_block(
            stage=2,
            block=5,
            inputs=x,
            filter_depths=[128, 128, 512],
            kernel_size=3)

        x = self.__conv_block(
            stage=3,
            block=0,
            inputs=x,
            filter_depths=[256, 256, 1024],
            kernel_size=3,
            stride=2)
        x = self.__identity_block(
            stage=3,
            block=1,
            inputs=x,
            filter_depths=[256, 256, 1024],
            kernel_size=3)
        x = self.__identity_block(
            stage=3,
            block=2,
            inputs=x,
            filter_depths=[256, 256, 1024],
            kernel_size=3)

        x = tf.layers.average_pooling2d(
            x, pool_size=7, strides=1, padding="valid", name="pool")

        x = tf.reshape(x, shape=(-1, 1024))

        self.logits = self.__fully_connected(
            name="fc_nsfw", inputs=x, num_outputs=2)
        self.predictions = tf.nn.softmax(self.logits, name="predictions")
示例#2
0
    def build(self, input_type=InputType.TENSOR):

        #self.weights = np.load(weights_path, encoding="latin1").item()
        self.input_tensor = None
        self.training = tf.placeholder(tf.bool, name='training_mode')
        self.learning_rate = tf.placeholder(tf.float32, name='learning_rate')

        if input_type == InputType.TENSOR:
            self.input = tf.placeholder(tf.float32,
                                        shape=[None, 224, 224, 3],
                                        name="input")
            self.input_tensor = self.input
        elif input_type == InputType.BASE64_JPEG:
            from image_utils import load_base64_tensor

            self.input = tf.placeholder(tf.string,
                                        shape=(None, ),
                                        name="input")
            self.input_tensor = load_base64_tensor(self.input)
        else:
            raise ValueError("invalid input type '{}'".format(input_type))

        x = self.input_tensor
        self.y = tf.placeholder(tf.int32, (None))
        one_hot_y = tf.one_hot(self.y, self.num_classes)

        x = tf.pad(x, [[0, 0], [3, 3], [3, 3], [0, 0]], 'CONSTANT')
        x = self.__conv2d("conv_1",
                          x,
                          filter_depth=64,
                          kernel_size=7,
                          stride=2,
                          padding='valid')

        x = self.__batch_norm("bn_1", x)
        x = tf.nn.relu(x)

        x = tf.layers.max_pooling2d(x, pool_size=3, strides=2, padding='same')

        x = self.__conv_block(stage=0,
                              block=0,
                              inputs=x,
                              filter_depths=[32, 32, 128],
                              kernel_size=3,
                              stride=1)

        x = self.__identity_block(stage=0,
                                  block=1,
                                  inputs=x,
                                  filter_depths=[32, 32, 128],
                                  kernel_size=3)
        x = self.__identity_block(stage=0,
                                  block=2,
                                  inputs=x,
                                  filter_depths=[32, 32, 128],
                                  kernel_size=3)

        x = self.__conv_block(stage=1,
                              block=0,
                              inputs=x,
                              filter_depths=[64, 64, 256],
                              kernel_size=3,
                              stride=2)
        x = self.__identity_block(stage=1,
                                  block=1,
                                  inputs=x,
                                  filter_depths=[64, 64, 256],
                                  kernel_size=3)
        x = self.__identity_block(stage=1,
                                  block=2,
                                  inputs=x,
                                  filter_depths=[64, 64, 256],
                                  kernel_size=3)
        x = self.__identity_block(stage=1,
                                  block=3,
                                  inputs=x,
                                  filter_depths=[64, 64, 256],
                                  kernel_size=3)

        x = self.__conv_block(stage=2,
                              block=0,
                              inputs=x,
                              filter_depths=[128, 128, 512],
                              kernel_size=3,
                              stride=2)
        x = self.__identity_block(stage=2,
                                  block=1,
                                  inputs=x,
                                  filter_depths=[128, 128, 512],
                                  kernel_size=3)
        x = self.__identity_block(stage=2,
                                  block=2,
                                  inputs=x,
                                  filter_depths=[128, 128, 512],
                                  kernel_size=3)
        x = self.__identity_block(stage=2,
                                  block=3,
                                  inputs=x,
                                  filter_depths=[128, 128, 512],
                                  kernel_size=3)
        x = self.__identity_block(stage=2,
                                  block=4,
                                  inputs=x,
                                  filter_depths=[128, 128, 512],
                                  kernel_size=3)
        x = self.__identity_block(stage=2,
                                  block=5,
                                  inputs=x,
                                  filter_depths=[128, 128, 512],
                                  kernel_size=3)

        x = self.__conv_block(stage=3,
                              block=0,
                              inputs=x,
                              filter_depths=[256, 256, 1024],
                              kernel_size=3,
                              stride=2)
        x = self.__identity_block(stage=3,
                                  block=1,
                                  inputs=x,
                                  filter_depths=[256, 256, 1024],
                                  kernel_size=3)
        x = self.__identity_block(stage=3,
                                  block=2,
                                  inputs=x,
                                  filter_depths=[256, 256, 1024],
                                  kernel_size=3)

        x = tf.layers.average_pooling2d(x,
                                        pool_size=7,
                                        strides=1,
                                        padding="valid",
                                        name="pool")

        x = tf.reshape(x, shape=(-1, 1024), name='nsfw_features')

        # output
        self.logits = self.__fully_connected(name="fc_nsfw",
                                             inputs=x,
                                             num_outputs=self.num_classes)
        self.loss = tf.reduce_mean(
            tf.nn.softmax_cross_entropy_with_logits_v2(labels=one_hot_y,
                                                       logits=self.logits))
        self.optimizer = tf.train.AdamOptimizer(
            learning_rate=self.learning_rate).minimize(self.loss)

        ## accuracy
        self.correct_prediction = tf.equal(
            tf.cast(tf.argmax(self.logits, 1), tf.int32), self.y)
        self.accuracy_operation = tf.reduce_mean(
            tf.cast(self.correct_prediction, tf.float32))

        ## recall
        toxic_predicts = tf.equal(tf.cast(tf.argmax(self.logits, 1), tf.int32),
                                  tf.cast(2, tf.int32))
        toxic_labels = tf.equal(self.y, tf.cast(2, tf.int32))
        self.toxic_recall = tf.metrics.recall(toxic_labels, toxic_predicts)
        self.toxic_label_sum = tf.reduce_sum(tf.cast(toxic_labels, tf.int32))

        ## precision
        self.toxic_precision = tf.metrics.precision(toxic_labels,
                                                    toxic_predicts)
        self.toxic_predict_sum = tf.reduce_sum(
            tf.cast(toxic_predicts, tf.int32))
示例#3
0
    def build(self, weights_path="open_nsfw-weights.npy",
              input_type=InputType.TENSOR):

        self.weights = np.load(weights_path, encoding="latin1").item()
        self.input_tensor = None

        if input_type == InputType.TENSOR:
            self.input = tf.placeholder(tf.float32,
                                        shape=[None, 224, 224, 3],
                                        name="input")
            self.input_tensor = self.input
        elif input_type == InputType.BASE64_JPEG:
            from image_utils import load_base64_tensor

            self.input = tf.placeholder(tf.string, shape=(None,), name="input")
            self.input_tensor = load_base64_tensor(self.input)
        else:
            raise ValueError("invalid input type '{}'".format(input_type))

        x = self.input_tensor

        x = tf.pad(x, [[0, 0], [3, 3], [3, 3], [0, 0]], 'CONSTANT')
        x = self.__conv2d("conv_1", x, filter_depth=64,
                          kernel_size=7, stride=2, padding='valid')

        x = self.__batch_norm("bn_1", x)
        x = tf.nn.relu(x)

        x = tf.layers.max_pooling2d(x, pool_size=3, strides=2, padding='same')

        x = self.__conv_block(stage=0, block=0, inputs=x,
                              filter_depths=[32, 32, 128],
                              kernel_size=3, stride=1)

        x = self.__identity_block(stage=0, block=1, inputs=x,
                                  filter_depths=[32, 32, 128], kernel_size=3)
        x = self.__identity_block(stage=0, block=2, inputs=x,
                                  filter_depths=[32, 32, 128], kernel_size=3)

        x = self.__conv_block(stage=1, block=0, inputs=x,
                              filter_depths=[64, 64, 256],
                              kernel_size=3, stride=2)
        x = self.__identity_block(stage=1, block=1, inputs=x,
                                  filter_depths=[64, 64, 256], kernel_size=3)
        x = self.__identity_block(stage=1, block=2, inputs=x,
                                  filter_depths=[64, 64, 256], kernel_size=3)
        x = self.__identity_block(stage=1, block=3, inputs=x,
                                  filter_depths=[64, 64, 256], kernel_size=3)

        x = self.__conv_block(stage=2, block=0, inputs=x,
                              filter_depths=[128, 128, 512],
                              kernel_size=3, stride=2)
        x = self.__identity_block(stage=2, block=1, inputs=x,
                                  filter_depths=[128, 128, 512], kernel_size=3)
        x = self.__identity_block(stage=2, block=2, inputs=x,
                                  filter_depths=[128, 128, 512], kernel_size=3)
        x = self.__identity_block(stage=2, block=3, inputs=x,
                                  filter_depths=[128, 128, 512], kernel_size=3)
        x = self.__identity_block(stage=2, block=4, inputs=x,
                                  filter_depths=[128, 128, 512], kernel_size=3)
        x = self.__identity_block(stage=2, block=5, inputs=x,
                                  filter_depths=[128, 128, 512], kernel_size=3)

        x = self.__conv_block(stage=3, block=0, inputs=x,
                              filter_depths=[256, 256, 1024], kernel_size=3,
                              stride=2)
        x = self.__identity_block(stage=3, block=1, inputs=x,
                                  filter_depths=[256, 256, 1024],
                                  kernel_size=3)
        x = self.__identity_block(stage=3, block=2, inputs=x,
                                  filter_depths=[256, 256, 1024],
                                  kernel_size=3)

        x = tf.layers.average_pooling2d(x, pool_size=7, strides=1,
                                        padding="valid", name="pool")

        x = tf.reshape(x, shape=(-1, 1024))

        self.logits = self.__fully_connected(name="fc_nsfw",
                                             inputs=x, num_outputs=2)
        self.predictions = tf.nn.softmax(self.logits, name="predictions")