blob: 939b7011a4f2a9b13884e410b2976e516a557961 [file] [log] [blame] [view]
# 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)`