新版caffe去除了一些函数,又添加了新的函数.先具体说一下imagedatalayer的改变.
新版的caffe应该是添加了多gpu,多cpu同时读取的功能.
1.ImageDataLayer:
停止读取线程
2.DataLayerSetUp:总的来说,是要确定上层的shape,所以这里会读取一张图片进行推断.
1)读取图片信息并判断合理性
2)读取记录label信息的文件
3)遍历文件,并将图片名字和label信息以pair的形式放到lines_里面.其中lines_是<string,int>类型的vector,所以默认的imagedatalayer只能读取一个label(lines_读取完毕
4)是否进行shuffle
5)设置lines_id_(有的时候我们会skip某些图片,这个时候id就不是从0开始了
6)读取一张图片并根据data_transformer_推断出top_shape(此时的top_shape的batch_size还是1,因为我们值读取了一张图片)
7)强制是top_shape的batchsize变为正确的,并设置top[0]和相应的prefetch_[i].data_(prefetch_是来自于集成的baseprefetchingdatalayer的,属于Batch类,Batch是一个类,内部有blob类型的data_,label_变量)(top_shape设置完毕,prefetch_[i].data_的shape设置完毕)
8)设置prefetch_[i].label_以及top[1]的shape为(1,batch_size),再次说明label只能是1个.
3.load_batch:根据线程读取内容,加快速度
1)检查数据是否存在
2)获取parameter的基本信息,读取图片,推断top_shape并且正确设置batch->data_的shape以及trasformed_data_的shape
3)获取batch->data_以及batch->label_的指针:prefetch_data以及prefetch_label
4)获取lines_的大小,设置lines_size
5)根据batch_size不断循环,在每一次循环中:
a)确认line_size>lines_id_
b)读取图片,根据item_id获取在batch_data_中的offset
c)设置transformed_data_为prefetch_data+offset的值(有什么用呢??下面有将读取的image根据这个transform进行Transform,这样就将img里面的信息读取到了prefetch_data里面了??不是很清楚,不过应该是这样)
d)将lines里面记录在second里面的label信息保存到prefetch_label里面.至此,我们将读取到的信息成功保存到了batch->data_和batch->label_里面了.
e)line_id++,并且如果超过lines_size重新归零,并决定是否shuffle
从上面过程可以看出来,么有了forward的过程,整个数据保存到batch里面就结束了!!(具体batch如何传到下面的层应该由另外的文件来控制.