Skip to content

Instantly share code, notes, and snippets.

@jiayuzhou
Forked from kyamagu/caffe_proto_.cc
Last active August 29, 2015 14:24
Show Gist options
  • Save jiayuzhou/b5029bb1ba7bd7f1d911 to your computer and use it in GitHub Desktop.
Save jiayuzhou/b5029bb1ba7bd7f1d911 to your computer and use it in GitHub Desktop.

Revisions

  1. @kyamagu kyamagu revised this gist Jun 18, 2015. 1 changed file with 6 additions and 0 deletions.
    6 changes: 6 additions & 0 deletions caffe_proto_.cc
    Original file line number Diff line number Diff line change
    @@ -15,6 +15,12 @@
    // datum = caffe_proto_('toDatum', image, label);
    // [image, label] = caffe_proto_('fromDatum', datum);
    //
    // fid = fopen('cat.jpg', 'r');
    // jpg_image = fread(fid, inf, 'uint8=>uint8');
    // fclose(fid);
    // datum = caffe_proto_('toEncodedDatum', image, label);
    // [jpg_image, label] = caffe_proto('fromDatum', datum);
    //

    #include "caffe.pb.h"
    #include "mexplus.h"
  2. @kyamagu kyamagu revised this gist Jun 18, 2015. 1 changed file with 44 additions and 40 deletions.
    84 changes: 44 additions & 40 deletions caffe_proto_.cc
    Original file line number Diff line number Diff line change
    @@ -2,7 +2,11 @@
    //
    // Build
    //
    // mex -I/path/to/mexplus caffe_proto_.cc
    // mex -I/path/to/mexplus ...
    // -I/path/to/build/src/caffe/proto/ ...
    // caffe_proto_.cc ...
    // /path/to/build/src/caffe/proto/caffe.pb.o ...
    // -lprotobuf
    //
    // Usage
    //
    @@ -11,11 +15,6 @@
    // datum = caffe_proto_('toDatum', image, label);
    // [image, label] = caffe_proto_('fromDatum', datum);
    //
    // fid = fopen('cat.jpg', 'rb');
    // jpg_image = fread(fid, inf, 'uint8=>uint8');
    // fclose(fid);
    // datum = caffe_proto_('toEncodedDatum', jpg_image, label);
    //

    #include "caffe.pb.h"
    #include "mexplus.h"
    @@ -91,47 +90,52 @@ MEX_DEFINE(fromDatum) (int nlhs, mxArray* plhs[],
    caffe::Datum datum;
    ASSERT(datum.ParseFromString(input.get<string>(0)),
    "Failed to parse datum.");
    vector<mwIndex> dimensions(3);
    dimensions[0] = (datum.has_height()) ? datum.height() : 0;
    dimensions[1] = (datum.has_width()) ? datum.width() : 0;
    dimensions[2] = (datum.has_channels()) ? datum.channels() : 0;
    MxArray array;
    vector<mwIndex> subscripts(3);
    int index = 0;
    if (datum.has_data()) {
    array.reset(mxCreateNumericArray(dimensions.size(),
    &dimensions[0],
    mxUINT8_CLASS,
    mxREAL));
    const string& data = datum.data();
    for (int k = dimensions[2] - 1; k >= 0; --k) { // BGR to RGB order.
    subscripts[2] = k;
    for (int i = 0; i < dimensions[0]; ++i) {
    subscripts[0] = i;
    for (int j = 0; j < dimensions[1]; ++j) {
    subscripts[1] = j;
    array.set(subscripts, data[index++]);
    if (datum.has_encoded() && datum.encoded()) {
    output.set(0, datum.data());
    }
    else {
    vector<mwIndex> dimensions(3);
    dimensions[0] = (datum.has_height()) ? datum.height() : 0;
    dimensions[1] = (datum.has_width()) ? datum.width() : 0;
    dimensions[2] = (datum.has_channels()) ? datum.channels() : 0;
    MxArray array;
    vector<mwIndex> subscripts(3);
    int index = 0;
    if (datum.has_data()) {
    array.reset(mxCreateNumericArray(dimensions.size(),
    &dimensions[0],
    mxUINT8_CLASS,
    mxREAL));
    const string& data = datum.data();
    for (int k = dimensions[2] - 1; k >= 0; --k) { // BGR to RGB order.
    subscripts[2] = k;
    for (int i = 0; i < dimensions[0]; ++i) {
    subscripts[0] = i;
    for (int j = 0; j < dimensions[1]; ++j) {
    subscripts[1] = j;
    array.set(subscripts, data[index++]);
    }
    }
    }
    }
    }
    else if (datum.float_data_size() > 0) {
    array.reset(mxCreateNumericArray(dimensions.size(),
    &dimensions[0],
    mxSINGLE_CLASS,
    mxREAL));
    for (int k = dimensions[2] - 1; k >= 0; --k) { // BGR to RGB order.
    subscripts[2] = k;
    for (int i = 0; i < dimensions[0]; ++i) {
    subscripts[0] = i;
    for (int j = 0; j < dimensions[1]; ++j) {
    subscripts[1] = j;
    array.set(subscripts, datum.float_data(index++));
    else if (datum.float_data_size() > 0) {
    array.reset(mxCreateNumericArray(dimensions.size(),
    &dimensions[0],
    mxSINGLE_CLASS,
    mxREAL));
    for (int k = dimensions[2] - 1; k >= 0; --k) { // BGR to RGB order.
    subscripts[2] = k;
    for (int i = 0; i < dimensions[0]; ++i) {
    subscripts[0] = i;
    for (int j = 0; j < dimensions[1]; ++j) {
    subscripts[1] = j;
    array.set(subscripts, datum.float_data(index++));
    }
    }
    }
    }
    output.set(0, array.release());
    }
    output.set(0, array.release());
    output.set(1, (datum.has_label()) ? datum.label() : 0);
    }

  3. @kyamagu kyamagu revised this gist Jun 9, 2015. 1 changed file with 17 additions and 0 deletions.
    17 changes: 17 additions & 0 deletions caffe_proto_.cc
    Original file line number Diff line number Diff line change
    @@ -11,6 +11,11 @@
    // datum = caffe_proto_('toDatum', image, label);
    // [image, label] = caffe_proto_('fromDatum', datum);
    //
    // fid = fopen('cat.jpg', 'rb');
    // jpg_image = fread(fid, inf, 'uint8=>uint8');
    // fclose(fid);
    // datum = caffe_proto_('toEncodedDatum', jpg_image, label);
    //

    #include "caffe.pb.h"
    #include "mexplus.h"
    @@ -21,6 +26,18 @@ using namespace mexplus;
    #define ASSERT(condition, ...) \
    if (!(condition)) mexErrMsgIdAndTxt("caffe_proto:error", __VA_ARGS__)

    MEX_DEFINE(toEncodedDatum) (int nlhs, mxArray* plhs[],
    int nrhs, const mxArray* prhs[]) {
    InputArguments input(nrhs, prhs, 2);
    OutputArguments output(nlhs, plhs, 1);
    caffe::Datum datum;
    MxArray array(input.get(0));
    datum.set_data(array.getData<uint8_t>(), array.size());
    datum.set_label(input.get<int>(1));
    datum.set_encoded(true);
    output.set(0, datum.SerializeAsString());
    }

    MEX_DEFINE(toDatum) (int nlhs, mxArray* plhs[],
    int nrhs, const mxArray* prhs[]) {
    InputArguments input(nrhs, prhs, 2);
  4. @kyamagu kyamagu created this gist Mar 9, 2015.
    121 changes: 121 additions & 0 deletions caffe_proto_.cc
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,121 @@
    // Caffe proto converter.
    //
    // Build
    //
    // mex -I/path/to/mexplus caffe_proto_.cc
    //
    // Usage
    //
    // image = imread('cat.jpg');
    // label = 1;
    // datum = caffe_proto_('toDatum', image, label);
    // [image, label] = caffe_proto_('fromDatum', datum);
    //

    #include "caffe.pb.h"
    #include "mexplus.h"

    using namespace std;
    using namespace mexplus;

    #define ASSERT(condition, ...) \
    if (!(condition)) mexErrMsgIdAndTxt("caffe_proto:error", __VA_ARGS__)

    MEX_DEFINE(toDatum) (int nlhs, mxArray* plhs[],
    int nrhs, const mxArray* prhs[]) {
    InputArguments input(nrhs, prhs, 2);
    OutputArguments output(nlhs, plhs, 1);
    caffe::Datum datum;
    MxArray array(input.get(0));
    datum.set_label(input.get<int>(1));
    vector<mwSize> dimensions = array.dimensions();
    int width = dimensions[1];
    int height = dimensions[0];
    int channels = 1;
    for (int i = 2; i < dimensions.size(); ++i)
    channels *= dimensions[i];
    datum.set_channels(channels);
    datum.set_width(width);
    datum.set_height(height);
    vector<mwIndex> subscripts(3);
    if (array.isUint8()) {
    datum.mutable_data()->reserve(array.size());
    for (int k = channels - 1; k >= 0; --k) { // RGB to BGR order.
    subscripts[2] = k;
    for (int i = 0; i < height; ++i) {
    subscripts[0] = i;
    for (int j = 0; j < width; ++j) {
    subscripts[1] = j;
    datum.mutable_data()->push_back(array.at<uint8_t>(subscripts));
    }
    }
    }
    }
    else {
    datum.mutable_float_data()->Reserve(array.size());
    for (int k = channels - 1; k >= 0; --k) { // RGB to BGR order.
    subscripts[2] = k;
    for (int i = 0; i < height; ++i) {
    subscripts[0] = i;
    for (int j = 0; j < width; ++j) {
    subscripts[1] = j;
    datum.add_float_data(array.at<float>(subscripts));
    }
    }
    }
    }
    output.set(0, datum.SerializeAsString());
    }

    MEX_DEFINE(fromDatum) (int nlhs, mxArray* plhs[],
    int nrhs, const mxArray* prhs[]) {
    InputArguments input(nrhs, prhs, 1);
    OutputArguments output(nlhs, plhs, 2);
    caffe::Datum datum;
    ASSERT(datum.ParseFromString(input.get<string>(0)),
    "Failed to parse datum.");
    vector<mwIndex> dimensions(3);
    dimensions[0] = (datum.has_height()) ? datum.height() : 0;
    dimensions[1] = (datum.has_width()) ? datum.width() : 0;
    dimensions[2] = (datum.has_channels()) ? datum.channels() : 0;
    MxArray array;
    vector<mwIndex> subscripts(3);
    int index = 0;
    if (datum.has_data()) {
    array.reset(mxCreateNumericArray(dimensions.size(),
    &dimensions[0],
    mxUINT8_CLASS,
    mxREAL));
    const string& data = datum.data();
    for (int k = dimensions[2] - 1; k >= 0; --k) { // BGR to RGB order.
    subscripts[2] = k;
    for (int i = 0; i < dimensions[0]; ++i) {
    subscripts[0] = i;
    for (int j = 0; j < dimensions[1]; ++j) {
    subscripts[1] = j;
    array.set(subscripts, data[index++]);
    }
    }
    }
    }
    else if (datum.float_data_size() > 0) {
    array.reset(mxCreateNumericArray(dimensions.size(),
    &dimensions[0],
    mxSINGLE_CLASS,
    mxREAL));
    for (int k = dimensions[2] - 1; k >= 0; --k) { // BGR to RGB order.
    subscripts[2] = k;
    for (int i = 0; i < dimensions[0]; ++i) {
    subscripts[0] = i;
    for (int j = 0; j < dimensions[1]; ++j) {
    subscripts[1] = j;
    array.set(subscripts, datum.float_data(index++));
    }
    }
    }
    }
    output.set(0, array.release());
    output.set(1, (datum.has_label()) ? datum.label() : 0);
    }

    MEX_DISPATCH