66import sys
77import imp
88import numpy as np
9+ import ctypes
910
1011from mmdnn .conversion .examples .imagenet_test import TestKit
1112import utils
@@ -310,6 +311,48 @@ def CntkEmit(original_framework, architecture_name, architecture_path, weight_pa
310311
311312 return converted_predict
312313
314+ @staticmethod
315+ def DarknetEmit (original_framework , architecture_name , architecture_path , weight_path , image_path ):
316+ try :
317+ from mmdnn .conversion .examples .darknet import darknet as cdarknet
318+ from mmdnn .conversion .darknet .darknet_emitter import DarknetEmitter
319+
320+ # IR to code
321+ converted_file = original_framework + '_darknet_' + architecture_name + "_converted"
322+ converted_file = converted_file .replace ('.' , '_' )
323+ emitter = DarknetEmitter ((architecture_path , weight_path ))
324+ emitter .run (converted_file + '.py' , converted_file + '.npy' , 'test' )
325+ del emitter
326+ del DarknetEmitter
327+
328+ # import converted model
329+ imported = imp .load_source ('DarknetModel' , converted_file + '.py' )
330+
331+ imported .make_net (converted_file + '.cfg' )
332+ imported .gen_weight (converted_file + '.npy' , converted_file + '.weights' )
333+
334+ original_framework = checkfrozen (original_framework )
335+ func = TestKit .preprocess_func [original_framework ][architecture_name ]
336+ img = func (image_path )
337+ img = np .ascontiguousarray (img , dtype = np .float32 )
338+
339+ model_converted = cdarknet .load_net ((converted_file + '.cfg' ).encode (), (converted_file + '.weights' ).encode (), 0 )
340+ outputs = cdarknet .network_outputs (model_converted )
341+ output = cdarknet .network_predict (model_converted , img .ctypes .data_as (ctypes .POINTER (ctypes .c_float )))
342+ predict = np .ctypeslib .as_array (output , shape = (outputs ,))
343+ converted_predict = np .squeeze (predict )
344+
345+ cdarknet .free_network (model_converted )
346+ del sys .modules ['DarknetModel' ]
347+ os .remove (converted_file + '.py' )
348+ os .remove (converted_file + '.npy' )
349+ os .remove (converted_file + '.cfg' )
350+ os .remove (converted_file + '.weights' )
351+
352+ return converted_predict
353+ except ImportError :
354+ print ("Cannot import Darknet. Darknet Emit is not tested." )
355+ return None
313356
314357 @staticmethod
315358 def TensorflowEmit (original_framework , architecture_name , architecture_path , weight_path , image_path ):
@@ -775,7 +818,7 @@ def OnnxEmit(original_framework, architecture_name, architecture_path, weight_pa
775818 },
776819
777820 'keras' : {
778- 'vgg19' : [CaffeEmit , CntkEmit , CoreMLEmit , KerasEmit , MXNetEmit , PytorchEmit , TensorflowEmit ],
821+ 'vgg19' : [CaffeEmit , CntkEmit , CoreMLEmit , KerasEmit , MXNetEmit , PytorchEmit , TensorflowEmit , DarknetEmit ],
779822 'inception_v3' : [CaffeEmit , CntkEmit , CoreMLEmit , KerasEmit , MXNetEmit , PytorchEmit , TensorflowEmit ],
780823 'resnet50' : [CaffeEmit , CntkEmit , CoreMLEmit , KerasEmit , MXNetEmit , PytorchEmit , TensorflowEmit ],
781824 'densenet' : [CaffeEmit , CntkEmit , CoreMLEmit , KerasEmit , MXNetEmit , PytorchEmit , TensorflowEmit ],
@@ -788,7 +831,7 @@ def OnnxEmit(original_framework, architecture_name, architecture_path, weight_pa
788831 },
789832
790833 'mxnet' : {
791- 'vgg19' : [CaffeEmit , CntkEmit , CoreMLEmit , KerasEmit , MXNetEmit , PytorchEmit , TensorflowEmit ],
834+ 'vgg19' : [DarknetEmit , CaffeEmit , CntkEmit , CoreMLEmit , KerasEmit , MXNetEmit , PytorchEmit , TensorflowEmit ],
792835 'imagenet1k-inception-bn' : [CaffeEmit , CntkEmit , CoreMLEmit , KerasEmit , MXNetEmit , PytorchEmit , TensorflowEmit ],
793836 'imagenet1k-resnet-18' : [CaffeEmit , CntkEmit , CoreMLEmit , KerasEmit , MXNetEmit , PytorchEmit , TensorflowEmit ],
794837 'imagenet1k-resnet-152' : [CaffeEmit , CntkEmit , CoreMLEmit , KerasEmit , MXNetEmit , PytorchEmit , TensorflowEmit ],
@@ -811,7 +854,7 @@ def OnnxEmit(original_framework, architecture_name, architecture_path, weight_pa
811854 },
812855
813856 'tensorflow' : {
814- 'vgg19' : [CaffeEmit , CoreMLEmit , CntkEmit , KerasEmit , MXNetEmit , PytorchEmit , TensorflowEmit ],
857+ 'vgg19' : [CaffeEmit , CoreMLEmit , CntkEmit , KerasEmit , MXNetEmit , PytorchEmit , TensorflowEmit , DarknetEmit ],
815858 'inception_v1' : [CaffeEmit , CoreMLEmit , KerasEmit , MXNetEmit , PytorchEmit , TensorflowEmit ], # TODO: CntkEmit
816859 'inception_v3' : [CaffeEmit , CoreMLEmit , CntkEmit , KerasEmit , MXNetEmit , PytorchEmit , TensorflowEmit ],
817860 'resnet_v1_152' : [CaffeEmit , CoreMLEmit , KerasEmit , MXNetEmit , PytorchEmit , TensorflowEmit ], # TODO: CntkEmit
@@ -854,7 +897,7 @@ def OnnxEmit(original_framework, architecture_name, architecture_path, weight_pa
854897 'alexnet' : [CaffeEmit , CoreMLEmit , KerasEmit , MXNetEmit , PytorchEmit , TensorflowEmit ],
855898 'densenet201' : [CaffeEmit , CoreMLEmit , KerasEmit , MXNetEmit , PytorchEmit , TensorflowEmit ],
856899 'inception_v3' : [CaffeEmit , CoreMLEmit , KerasEmit , PytorchEmit , TensorflowEmit ], # Mxnet broken https://github.com/apache/incubator-mxnet/issues/10194
857- 'vgg19' : [CaffeEmit , CoreMLEmit , KerasEmit , MXNetEmit , PytorchEmit , TensorflowEmit ],
900+ 'vgg19' : [CaffeEmit , CoreMLEmit , KerasEmit , MXNetEmit , PytorchEmit , TensorflowEmit , DarknetEmit ],
858901 'vgg19_bn' : [CaffeEmit , CoreMLEmit , KerasEmit , MXNetEmit , PytorchEmit , TensorflowEmit ],
859902 'resnet152' : [CaffeEmit , CoreMLEmit , KerasEmit , MXNetEmit , PytorchEmit , TensorflowEmit ],
860903 }
0 commit comments