[ https://issues.apache.org/jira/browse/SYSTEMML-1583?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16005332#comment-16005332 ]
Mike Dusenberry commented on SYSTEMML-1583: ------------------------------------------- Definitely think it is a great idea to be able to accept Caffe model files, in addition to the protobuf definitition files. In the near future, we can also extend this to Keras, using the same infrastructure from the base of Caffe2DML. I agree with Fred that it would be ideal to use Caffe files directly so that users can seamlessly move from Caffe(2) to SystemML. It would be nice to be able to simply pass in URLs of protobufs & model files, and the system could cache them locally to avoid having to download them repeatedly. We could possibly even cache the SystemML binary format of the models transparently for the user. Overall, we need to continue to focus on flexibility for creating and running models at scale. > Implement converter in Python to convert caffemodel in SystemML format > ---------------------------------------------------------------------- > > Key: SYSTEMML-1583 > URL: https://issues.apache.org/jira/browse/SYSTEMML-1583 > Project: SystemML > Issue Type: Sub-task > Reporter: Niketan Pansare > Assignee: Arvind Surve > > Ideally, this converter shouldnot require the caffe to be installed. Please > see > http://stackoverflow.com/questions/37572948/extracting-weights-from-caffemodel-without-caffe-installed-in-python > An example code to convert a caffe model to csv if caffe is installed: > {code} > import caffe > import numpy as np > #net = > caffe.Net('/home/biuser/nike/barista/VGG_ILSVRC_19_layers_train_val.prototxt', > caffe.TEST) > net = > caffe.Net('/home/biuser/VGG_trained_models/VGG_ILSVRC_19_layers_deploy.prototxt', > '/home/biuser/VGG_trained_models/VGG_ILSVRC_19_layers.caffemodel', > caffe.TEST) > #surgery.transplant(net, base_net) > for l in [ "conv1_1", "conv1_2", "conv2_1", "conv2_2", "conv3_1", "conv3_2", > "conv3_3", "conv3_4", "conv4_1", "conv4_2", "conv4_3", "conv4_4", "conv5_1", > "conv5_2", "conv5_3", "conv5_4", "fc6", "fc7", "fc8" ]: > w = net.params[l][0].data > w = w.reshape(w.shape[0], -1) > b = net.params[l][1].data > b = b.reshape(b.shape[0], -1) > # You may have to reshape it for fc layers > np.savetxt("VGG_trained_models/" + l + "_weight.csv", w, > delimiter=",") > np.savetxt("VGG_trained_models/" + l + "_bias.csv", b, delimiter=",") > {code} > Here is an example pyspark script to test this JIRA: > {code} > from systemml.mllearn import Caffe2DML > from pyspark.sql import SQLContext > import numpy as np > import urllib, os, scipy.ndimage > from PIL import Image > import systemml as sml > # ImageNet specific parameters > img_shape = (3, 224, 224) > # Downloads a jpg image, resizes it to 224 and return as numpy array in N X > CHW format > url = > 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/58/MountainLion.jpg/312px-MountainLion.jpg' > outFile = 'test.jpg' > urllib.urlretrieve(url, outFile) > input_image = sml.convertImageToNumPyArr(Image.open(outFile), > img_shape=img_shape) > # Download the ResNet network > import urllib > urllib.urlretrieve('https://raw.githubusercontent.com/niketanpansare/model_zoo/master/caffe/vision/resnet/ilsvrc12/ResNet_50_network.proto', > 'ResNet_50_network.proto') > urllib.urlretrieve('https://raw.githubusercontent.com/niketanpansare/model_zoo/master/caffe/vision/resnet/ilsvrc12/ResNet_50_solver.proto', > 'ResNet_50_solver.proto') > home_dir = os.path.expanduser('~') > # let's assume that this function is implemented as > saveAsBinaryBlock(inputCaffeModel, outputDir) > resnet_pretrained_weight_dir = os.path.join(home_dir, 'model_zoo', 'caffe', > 'vision', 'resnet', 'ilsvrc12', 'ResNet_50_pretrained_weights') > urllib.urlretrieve('https://deepdetect.com/models/resnet/ResNet-50-model.caffemodel', > 'ResNet-50-model.caffemodel') > ####################################################################### > # To be implemented as part of this JIRA > sml.saveAsBinaryBlock('ResNet-50-model.caffemodel', > resnet_pretrained_weight_dir) > ####################################################################### > resnet = Caffe2DML(sqlCtx, solver='ResNet_50_solver.proto', > weights=resnet_pretrained_weight_dir, input_shape=img_shape) > resnet.predict(input_image) > # This should return array(['cougar, puma, catamount, mountain lion, painter, > panther, Felis '], dtype='|S64') > {code} -- This message was sent by Atlassian JIRA (v6.3.15#6346)