Как использовать инструменты Lucid Interpretability на модели обнаружения тензорного потока?

Я хочу использовать Lucid для анализа извлечения функций модели обнаружения, которую я обучал с помощью API обнаружения объектов tensorflow на моем собственном наборе данных. Используемая модель взята из зоопарка Tensorflow Object Detection Zoo, а именно faster_rcnn_resnet101.

Я выполнил учебник модели Lucid, чтобы импортировать свою собственную модель Lucid. и сохранил замороженный график модели с узлом /all_class_predictions_with_background как output_node.

Мне не удается найти входной узел графа, чтобы на нем работала Lucid.

Более того, я не думаю, что у меня правильный подход. Возможно, мне следует сначала извлечь всю классификационную часть модели обнаружения и заморозить новый граф только с этой частью, прежде чем перейти к Lucid.

Или, может быть, мне просто нужно импортировать resnet_101 модель классификации и скопировать / вставить в нее правильные веса из модели обнаружения?

Но я действительно не знаю, как делать такие вещи.

Кто-нибудь может мне помочь? Я действительно хочу попробовать запустить Lucid в моей сети обнаружения.


person leoDup    schedule 09.10.2018    source источник


Ответы (1)


Да, вам следует экспортировать график вывода (замороженный) для работы в Lucid.

Я использую следующий сценарий для экспорта графика из файлов контрольных точек обучения. Полезная информация об узлах в экспортированном файле записывается в консоль.

training_model="ssd_mnet_v2_ppn_512x288.config"

model_signature="eb_13_v09_ppmn2_13_256_adam_512x288_tf_1.14_200k"

# the specific checkpoint to export from
checkpoint_path="/TRAIN/models/model/train/model.ckpt-200000"

# directory to export into
output_path="/XYZ/graphs/${model_signature}"

# ensure these graph nodes are exported, and everything in between
additional_output_tensor_names="Preprocessor/sub,concat_1"

# 
python export_inference_graph.py \
   --input_type=image_tensor \
   --pipeline_config_path /TRAIN/models/model/$training_model \
   --trained_checkpoint_prefix=$checkpoint_path \
   --output_directory=$output_path \
   --additional_output_tensor_names=$additional_output_tensor_names

Я счел удобным создать свой собственный класс модели Lucid после просмотра примеров в зоопарке моделей Lucid. Вы должны внимательно изучить свой график, так как вам нужно указать входной узел и предоставить список слоев, с которыми может работать Lucid.

from lucid.modelzoo.vision_base import Model, _layers_from_list_of_dicts


# the input node "Preprocessor/sub" is appropriate for image injection
class SSD_Mnet2_PPN( Model ):

    def __init__(self, image_shape=None, graph_path=None, labels_path=None ):        
        self.model_path = graph_path
        self.labels_path = labels_path

        self.image_shape = image_shape
        self.image_value_range = (-1, 1) 
        self.input_name = "Preprocessor/sub"

        super().__init__()

# a hand-crafted list of layers - by inspection of the graph
SSD_Mnet2_PPN.layers = _layers_from_list_of_dicts(SSD_Mnet2_PPN, [
  { 'id':  0, 'tags': ['conv'], 'name': 'FeatureExtractor/MobilenetV2/expanded_conv_2/add', 'depth': 24, 'shape': [ 1, 72, 128, 24 ], 'transform_id': 2 },  
  { 'id':  2, 'tags': ['conv'], 'name': 'FeatureExtractor/MobilenetV2/expanded_conv_5/add', 'depth': 32, 'shape': [ 1, 36, 64, 32 ], 'transform_id': 2 },  
  { 'id':  5, 'tags': ['conv'], 'name': 'FeatureExtractor/MobilenetV2/expanded_conv_9/add', 'depth': 64, 'shape': [ 1, 18, 32, 64 ], 'transform_id': 2 },  
  { 'id':  7, 'tags': ['conv'], 'name': 'FeatureExtractor/MobilenetV2/expanded_conv_12/add', 'depth': 96, 'shape': [ 1, 18, 32, 96 ], 'transform_id': 2 },  
  { 'id':  9, 'tags': ['conv'], 'name': 'FeatureExtractor/MobilenetV2/expanded_conv_15/add', 'depth': 160, 'shape': [ 1, 9, 16, 160 ], 'transform_id': 2 },  
  { 'id': 11, 'tags': ['concat'], 'name': 'concat_1', 'depth': 13, 'shape': [ 1, 1212, 13 ], 'transform_id': 4 },
])


def model_for_version( version=None, path=None ):

    if "320x180" in version:
        return SSD_Mnet2_PPN( graph_path=path, image_shape=[ 320, 180, 3 ] )

    if "480x270" in version:
        return SSD_Mnet2_PPN( graph_path=path, image_shape=[ 480, 270, 3 ] )

    if "512x288" in version:
        return SSD_Mnet2_PPN( graph_path=path, image_shape=[ 512, 288, 3 ] )        

    if "720x405" in version:
        return SSD_Mnet2_PPN( graph_path=path, image_shape=[ 720, 405, 3 ] )

    raise ValueError( "No model for graph_version: {}".format( version ) )

Затем вы можете написать следующий код:

from lucid.optvis import render

model = model_for_version( 
    version = "eb_13_v09_ppmn2_13_256_adam_512x288_tf_1.14", 
    path = "/XYZ/graphs/eb_13_v09_ppmn2_13_256_adam_512x288_tf_1.14_200k/frozen_inference_graph.pb" 
)

model.load_graphdef()

_ = render.render_vis( model, "FeatureExtractor/MobilenetV2/expanded_conv_15/add:17", thresholds=( 32, 256, 1024 ) )    

Неизбежно придется немало поэкспериментировать.

person Alaric Dobson    schedule 01.10.2019