资料汇总
代码: https://github.com/willard-yuan/CNN-for-Image-Retrieval
作者博文: http://yongyuan.name/pic/
注意
作者对代码的运行有详细的介绍,然而可能因为python版本更新之类的原因,现在跑下来有一些的错误(搞得十分头疼),现在我把我实现这个项目的步骤以及我遇到的问题及解决方法记录下来,方便我后期查阅,也希望能帮到大家。
最终图像检索效果:
第一步
下载代码及数据集
1.代码: https://github.com/willard-yuan/CNN-for-Image-Retrieval
2. CNN特征 256feat2048Norml.mat https://pan.baidu.com/s/1cG8f6Kmqk4KA_iNuss4oAw
3. 缩略图 thumbnails https://pan.baidu.com/s/1hHiJT78vHA9GArMBO6YIkg
256feat2048Norml.mat 和thumbnails 下载完都放在 /web 中
4.在web/service.conf中设置自己的web根目录(tools.staticdir.root) 和端口号等(如果没有端口号被占用的问题就不用改端口号); 并把第二个【/】删掉 ,不然之后运行的时候还会报错,提示 / 已存在。我这边改完之后是这样:
5.接下来就是装一些程序的依赖包。主要有CherryPy (我下的是18.0.1,别下载3.2.4,会出一些莫名其妙的问题)、scipy 等。。一般运行之后,如果有落下什么包,都会提示的,缺什么直接pip install 就行。
6.运行
直接运行 以下代码即可
python searchEnginePython.py
如果没有出错的话 登录127.0.0.1:8080 就可以了
PS: 没有问题是不存在的!
问题1:
numpy.random.shuffle(self.ndx)
File "mtrand.pyx", line 4851, in mtrand.RandomState.shuffle
File "mtrand.pyx", line 4854, in mtrand.RandomState.shuffle
TypeError: 'range' object does not support item assignment
问题提示说 range不支持这项任务,也就是说range用法有出错。 range返回值的问题
解决1:
找到23行左右
self.ndx = range(self.nbr_images)
将这行代码改成以下代码即可。
self.ndx = list(range(self.nbr_images))
问题2
queryID = self.imNamelist.index(query.split("/")[-1])
TypeError: "xxx.jpg" not in the list
这个是编码方面的问题 我看了前面的代码,imNamelist 里面存的数据是字节型的 而query.spilt("/")[-1]这个是字符型,因此没法匹配。
解决2
把query.spilt("/")[-1] 改成字节型
也就是把78行左右的这段代码
queryID = self.imNamelist.index(query.split("/")[-1])
改成如下
queryID = self.imNamelist.index(bytes(query.split("/")[-1], encoding = "utf8"))
问题3
TypeError: Can't convert 'bytes' object to str implicitly
这个也是编码的问题,编码没有一致
解决3
把以下的代码
imlist = [self.path+self.imNamelist[index] for i,index in enumerate(rank_ID[0:self.maxres])]
改成
imlist = [self.path+self.imNamelist[index].decode() for i,index in enumerate(rank_ID[0:self.maxres])]
这样改完基本就OK了!!