首页 文章

Caffe - 多级和多标签图像分类

提问于
浏览
0

我正在尝试在caffe中创建一个单一的多类和多标签网络配置 .

让我们说狗的分类:狗是小还是大? (课)它是什么颜色的? (上课)有领子吗? (标签)

这个东西可以使用caffe吗?这样做的正确方法是什么?构建lmdb文件的正确方法是什么?

所有关于多标签分类的出版物都是从2015年左右开始的,从那时起这个主题的变化是什么?

谢谢 .

2 回答

  • 0

    Caffe的LMDB接口的问题在于它只允许single int label per image .
    如果您想为每个图像添加多个标签,则必须使用不同的输入图层 .
    我建议使用"HDF5Data"图层:
    这样可以更灵活地设置输入数据,您可以拥有此层所需的 "top" . 每个输入图像可能有多个标签,并且您的网络需要多次损失才能进行训练 .

    有关如何为caffe创建hdf5数据,请参阅this post .

  • 0

    谢谢Shai

    只是试图理解实用的方法..在创建包含图像的所有标签的2个.text文件(一个用于训练,一个用于验证)之后,例如:

    /train/img/1.png 0 4 18
    /train/img/2.png 1 7 17 33
    /train/img/3.png 0 4 17
    

    运行py脚本:

    import h5py, os
    import caffe
    import numpy as np
    
    SIZE = 227 # fixed size to all images
    with open( 'train.txt', 'r' ) as T :
        lines = T.readlines()
    # If you do not have enough memory split data into
    # multiple batches and generate multiple separate h5 files
    X = np.zeros( (len(lines), 3, SIZE, SIZE), dtype='f4' ) 
    y = np.zeros( (len(lines),1), dtype='f4' )
    for i,l in enumerate(lines):
        sp = l.split(' ')
        img = caffe.io.load_image( sp[0] )
        img = caffe.io.resize( img, (SIZE, SIZE, 3) ) # resize to fixed size
        # you may apply other input transformations here...
        # Note that the transformation should take img from size-by-size-by-3 and transpose it to 3-by-size-by-size
        # for example
        transposed_img = img.transpose((2,0,1))[::-1,:,:] # RGB->BGR
        X[i] = transposed_img
        y[i] = float(sp[1])
    with h5py.File('train.h5','w') as H:
        H.create_dataset( 'X', data=X ) # note the name X given to the dataset!
        H.create_dataset( 'y', data=y ) # note the name y given to the dataset!
    with open('train_h5_list.txt','w') as L:
        L.write( 'train.h5' ) # list all h5 files you are going to use
    

    并创建train.h5和val.h5(是包含图像的X数据集,Y是否包含标签?) .

    替换我的网络输入图层:

    layers { 
     name: "data" 
     type: DATA 
     top:  "data" 
     top:  "label" 
     data_param { 
       source: "/home/gal/digits/digits/jobs/20181010-191058-21ab/train_db" 
       backend: LMDB 
       batch_size: 64 
     } 
     transform_param { 
        crop_size: 227 
        mean_file: "/home/gal/digits/digits/jobs/20181010-191058-21ab/mean.binaryproto" 
        mirror: true 
      } 
      include: { phase: TRAIN } 
    } 
    layers { 
     name: "data" 
     type: DATA 
     top:  "data" 
     top:  "label" 
     data_param { 
       source: "/home/gal/digits/digits/jobs/20181010-191058-21ab/val_db"  
       backend: LMDB 
       batch_size: 64
     } 
     transform_param { 
        crop_size: 227 
        mean_file: "/home/gal/digits/digits/jobs/20181010-191058-21ab/mean.binaryproto" 
        mirror: true 
      } 
      include: { phase: TEST } 
    }
    

    layer {
      type: "HDF5Data"
      top: "X" # same name as given in create_dataset!
      top: "y"
      hdf5_data_param {
        source: "train_h5_list.txt" # do not give the h5 files directly, but the list.
        batch_size: 32
      }
      include { phase:TRAIN }
    }
    
    layer {
      type: "HDF5Data"
      top: "X" # same name as given in create_dataset!
      top: "y"
      hdf5_data_param {
        source: "val_h5_list.txt" # do not give the h5 files directly, but the list.
        batch_size: 32
      }
      include { phase:TEST }
    }
    

    我猜HDF5不需要mean.binaryproto?

    接下来,输出层应如何更改以输出多个标签概率?我想我需要交叉熵层而不是softmax?这是当前的输出图层:

    layers {
      bottom: "prob"
      bottom: "label"
      top: "loss"
      name: "loss"
      type: SOFTMAX_LOSS
      loss_weight: 1
    }
    layers {
      name: "accuracy"
      type: ACCURACY
      bottom: "prob"
      bottom: "label"
      top: "accuracy"
      include: { phase: TEST }
    }
    

相关问题