最近在跟2019年CVPR中一篇行人检测的论文,开始看其代码。作者用的开发环境是keras=2.1.6,tensorflow=1.4.1。环境比较古老了,自己试了一下1.6的TF也还能兼容。但是代码是用python2写的,我这里配置基本都是基于python3的,所以准备自己把代码转为python3。这一转还发现不少坑,记录一下。
论文地址:
https://arxiv.org/abs/1904.02948v1(有v2版本的了)
github:
https://github.com/liuwei16/CSP
cPickle和_pickle
作者用的数据集是caltech,这个数据集需要先把视频切成一帧一帧的图像。可以参考知乎上的这个回答进行预处理,作者给的少了几个函数。处理完之后,作者的思路是用cPickle这个包打包好数据,然后自己写一个generator来生生成训练数据。
第一个坑:cPickle在python3中无法导入
报错代码:
import cPickle
查了一下资料,cPickle在python3里面已经有内置的实现了,直接使用_pickle即可。
因此只要将前面的修改一下
import _pickle as cPickle
我懒得去代码里面 一个个改cPickle 了,所以就用了上面的方式。下文中所有的cp都代指python2里面的cPikcle,p就代指python3里面的_pickel。
第二个坑 cp存下来的数据,p无法直接load
报错代码:
ped_data = cPickle.load(fid)
这个问题主要产生的原因是:
“python3最重要的新特性大概要算对文本和二进制数据做了更为清晰的区分,文本总是unicode字符集,有str类型表示,二进制数据则有bytes类型表示。python3不会以任何隐式的方式混用str和bytes,正是这是的这两者的区别特别明显,你不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然)”
第一次参考博文之后,降上面的代码调整如下:
ped_data = cPickle.load(fid,encoding = 'utf-8')
这样读是可以读了,但是在后续的工作中还是会出现问题:所有的str都被读成了bytes类型。如果是一条数据的话,可以通过:
ped_data = ped_data.decode(encoding = 'utf-8')
来解决,自己眉头一皱觉得这个方法太蠢了,继续查,后来发现有一种读的方式:
ped_data = cPickle.load(fid,encoding = 'iso-8859-1')
使用这种编码制度,可以直接读成str型。这样数据就可以用起来了。
目前先debug了这些,然后作者自己还有一个生成数据的代码,这块是用于训练自己的数据的地方。7.23上午调试了一下,发现不是很好用,也是在cp和p的转换之间有点问题。等第一批数据跑完了把这里啃一下。