欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CSP代码阅读挖坑记录

程序员文章站 2024-01-01 13:27:10
...

最近在跟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的转换之间有点问题。等第一批数据跑完了把这里啃一下。

上一篇:

下一篇: