caffe多标签装hdf5接口

23 篇文章 0 订阅
15 篇文章 0 订阅

这个代码的作用是输入图像的标签,在caffe里面,由于用自带的lmda和leveldb接口的标签是一个,并且这个标签只能是整数,如果想进行回归或者多标签的话就没法使用自带的接口,因此,我提供了这个接口可以实现任意标签数。
首先介绍一个这个接口的使用:
对于argv[1],里面的txt要求,每一行对应一张图片,每一行的开口对应图片名称,后面接着是标签。

#include<string>
#include<vector>
#include "H5Cpp.h"
#include "hdf5.h"
#include "hdf5_hl.h"
#include<fstream>
#include <iostream>
#include <stdlib.h>
#include<stdio.h>
#include <fstream>  // NOLINT(readability/streams)
#include <string>
#include <utility>
#include <vector>
using namespace H5;
using namespace std;
#define IMAGE_NUM_MAX 10000

//DEFINE_string(lable_type, "double", "support type of int and double");

int main(int argc, char** argv){
    //argv[1] 是label的txt
    //argv[2] 是hdf5存放的位置以及名称
    //argv[3] 是每个样本label的个数
    if (argc != 4){
        //LOG(ERROR) << "input less!" << endl;
        printf("input less\n");
        return false;
    }
    int label_size = atoi(argv[3]);
    std::ifstream in(argv[1]);
    string image_path;
    double* label = new double[label_size*IMAGE_NUM_MAX];
    int image_num = 0;
    while (in >> image_path){
        for (int i = 0; i < label_size; ++i){
            in >> label[i+image_num*label_size];
        }
        ++image_num;
    }//while 标签数组的大小为image_num*label_size
    in.close();

    H5File* file = new H5File(argv[2], H5F_ACC_TRUNC);

    double fill_val = 0.0;
    DSetCreatPropList plist;
    plist.setFillValue(PredType::NATIVE_DOUBLE, &fill_val);

    hsize_t fdim[] = {image_num, label_size};
    DataSpace dataspace(2, fdim);

    DataSet* dataset = new DataSet(file->createDataSet("label", PredType::NATIVE_DOUBLE, dataspace, plist));

    hsize_t start[2] = {0, 0};
    hsize_t count[2] = {image_num, label_size};
    dataspace.selectHyperslab(H5S_SELECT_SET, count, start);

    hsize_t mdim[] = {image_num*label_size};
    DataSpace mspace(1, mdim);

    start[0] = 0;
    count[0] = image_num*label_size;
    mspace.selectHyperslab(H5S_SELECT_SET, count, start);

    dataset->write(label, PredType::NATIVE_DOUBLE, mspace, dataspace);

    delete dataset;
    delete file;
    cout << "process " << image_num << " images " << endl;
    return true;
}

makefile

all:
    g++ -o convert_labels_hdf5 convert_labels_hdf5.cpp  -L/usr/lib -I/usr/include -lhdf5 -lhdf5_hl -lhdf5_cpp

查看生成的文件可以通过matlab,代码如下

label = h5read('filepath','/label')
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值