| # MATLAB binding for MXNet |
| |
| ### How to use |
| |
| MXNet needs to be built so that the `lib/libmxnet.so` is available, which can be done by: |
| |
| ```bash |
| cd .. |
| make |
| ``` |
| The pre-trained `Inception-BN` should be downloaded to obtain the symbol and network parameters. |
| |
| ```bash |
| ./get_inception_model.sh |
| ``` |
| |
| This data will be saved in the `./data` folder: |
| |
| ```bash |
| ./data/ |
| ├── cat.png |
| ├── Inception-BN-0126.params |
| ├── Inception-BN-symbol.json |
| └── synset.txt |
| ``` |
| |
| ####Sample usage |
| |
| Run the demo script from the command-line without invoking Matlab GUI: |
| |
| ```bash |
| matlab -nodisplay -nojvm -nosplash -nodesktop -r "run('./demo.m'), exit(0);" |
| ``` |
| or the script may be run from the Matlab GUI as usual. |
| |
| The script has the following components: |
| |
| - Load model |
| |
| ```matlab |
| model = mxnet.model; |
| model.load('data/Inception-BN', 126); |
| ``` |
| |
| - Load data and normalise. Here we assume a fixed value of 120 as 'mean image': |
| |
| ```matlab |
| img = single(imresize(imread('./data/cat.png'), [224 224])) - 120; |
| ``` |
| |
| - Get prediction: |
| |
| ```matlab |
| pred = model.forward(img); |
| ``` |
| |
| - Do feature extraction on CPU or GPU 0: |
| |
| ```matlab |
| feas = model.forward(img, {'max_pool_5b_pool', 'global_pool', 'fc1'}); % CPU mode |
| feas = model.forward(img, 'gpu', 0, {'max_pool_5b_pool', 'global_pool', 'fc1'}); % GPU mode |
| ``` |
| |
| - See [demo.m](demo.m) for more details |
| |
| ### Note on Implementation |
| |
| We use `loadlibrary` to load mxnet library directly into Matlab and `calllib` to |
| call MXNet functions. Note that Matlab uses the column-major to store N-dim |
| arrays while and MXNet uses the row-major. So assume we create an array in |
| Matlab with |
| |
| ```matlab |
| X = zeros([2,3,4,5]); |
| ``` |
| |
| If we pass the memory of `X` into MXNet, then the correct shape will be |
| `[5,4,3,2]` in MXNet. When processing images, MXNet assumes the data layout is |
| |
| ``` |
| batchSize x channel x width x height |
| ``` |
| |
| while in Matlab we often store images in |
| |
| ``` |
| width x height x channel x batchSize |
| ``` |
| |
| So we should permute the dimensions by `X = permute(X, [2, 1, 3, 4])` before |
| passing `X` into MXNet. |
| |
| ### FAQ |
| |
| 1. You may get the error `GLIBCXX_x.x.xx` is not found. Such as on Ubuntu 14.04: |
| |
| ``` |
| > In loadlibrary (line 359) |
| Error using loadlibrary (line 447) |
| There was an error loading the library "/home/muli/work/mxnet/lib/libmxnet.so" |
| /usr/local/MATLAB/R2015a/bin/glnxa64/../../sys/os/glnxa64/libstdc++.so.6: |
| version `GLIBCXX_3.4.18' not found (required by |
| /home/muli/work/mxnet/lib/libmxnet.so) |
| |
| Caused by: |
| Error using loaddefinedlibrary |
| /usr/local/MATLAB/R2015a/bin/glnxa64/../../sys/os/glnxa64/libstdc++.so.6: |
| version `GLIBCXX_3.4.18' not found (required by |
| /home/muli/work/mxnet/lib/libmxnet.so) |
| ``` |
| |
| One way to fix it is to link `MATLAB_ROOT/sys/os/glnxa64/libstdc++.so.6` to |
| your system's `libstdc++`. For example |
| |
| ```bash |
| muli@ghc:/usr/local/MATLAB/R2015a/sys/os/glnxa64$ sudo rm -r libstdc++.so.6 |
| muli@ghc:/usr/local/MATLAB/R2015a/sys/os/glnxa64$ sudo ln -s /usr/lib/x86_64-linux-gnu/ libstdc++.so.6.0.19 libstdc++.so.6 |
| ``` |
| |
| |
| 2. Matlab binding has been tested with the following version: |
| |
| `R2016b (9.1.0.441655) 64-bit (glnxa64)` |