1、在训练hourglass的时候,有几个文件需要清楚
annot.h5文件是包含了25925个人的训练集,对应着17408张图片
train.h5是包含了22246个人的训练集,对应着14679张图片
valid.h5是包含了2958个人的验证集,对应着2729张图片
test.h5是包含了11731个人的测试集,对应着6619张图片
注:valid数据集是根据tompson的划分来的,是从训练集的一部分数据来的,那么问题来了,mat标注文件里面一共有24987张图片,上面的(14679+2729+6619=22207张),差了很多,那么差在哪里了呢?
1.1测试集
首先分析测试集,通过数据分析,一共有6908张测试集,很抱歉,由于数据标注的残缺,最后只有6619张图片可以用
数据标注的问题在于两个
1)annorect域缺失,一共244张
2)annorect域存在,但是1x1的struct是空的,一共45张
244+45=289张,而6908-6619=289张,恰好吻合了
注:6908是img_train=0统计出来的
1.2 训练+验证
1)annorect域缺失,一共576张
2)annorect域不为空,但是只有x1,x2,x3,x4的信息,没有关键点信息,一共95张
576+95 = 671张,而18079-2729-14679 = 671,吻合
注:18079是img_train=1统计出来的
2、在图像数量上已经达到了吻合,但是模型训练单位是人,人数上也存在偏差,现在分析
2.1 测试集
h5文件给的是11731个人,但是经过我们的统计,最终的结果却是11776个人,统计代码如下
% for kk = 1:length(RELEASE.annolist(i).annorect)
% person_test_num_all = person_test_num_all+ 1; %i是img_train=0对应的index
% end
那么究竟是什么原因呢
原因是因为对于每一个annorect,虽然从外边看是1x7的结构体,但是进去一看确实这样的
将代码改为
for kk = 1:length(RELEASE.annolist(i).annorect)
if(length(RELEASE.annolist(i).annorect(kk).scale)~=0)
person_test_num_all = person_test_num_all+ 1;
end
end
这样统计出来的就是11731了,好坑
2.2训练集+验证集
首先我们用一开始的方法统计出来的人数一共有29017人,然后用后来的统计一共有28883个人(类似于2.1)
现在开始分析
28883-2958=25925,那么问题来了,train.h5里面是啥啊
tompson提取的2958个人,只是从所对应的图像中选取几个人而已,而不是选取所有的标注得人,所以就差在了这里
例如052475643.jpg这张图片,valid.h5只从这张图片中选取了一个人,但实际上这张图片标注了两个人,train.h5和annot.h5区别就在这里,annot.h5会把剩下的另一个人加入到自己的训练中,但是train.h5则不会,他会将已经选定作为验证的这个人的这张图片都不再参与训练,所以就导致了train.h5只有22246个人,而annot.h5则含有25925个人
3、hourglass采用的是annot.h5和valid.h5作为训练,这个似乎更合理
PyraNet则是采用train.h5和valid.h5作为训练
4、在一些训练中会采用mpii_annotation.json文件,该文件包含了train.h5和valid.h5的整合,因此和PyraNet的训练是一致,
都是没有将全部的训练集用于最后的训练。