CNN-for-Image-Retrieval ---------------用CNN做图像检索(问题解决)

资料汇总

代码: https://github.com/willard-yuan/CNN-for-Image-Retrieval

作者博文: http://yongyuan.name/pic/

注意

作者对代码的运行有详细的介绍,然而可能因为python版本更新之类的原因,现在跑下来有一些的错误(搞得十分头疼),现在我把我实现这个项目的步骤以及我遇到的问题及解决方法记录下来,方便我后期查阅,也希望能帮到大家。

最终图像检索效果:

第一步   

下载代码及数据集

1.代码:   https://github.com/willard-yuan/CNN-for-Image-Retrieval

 CNN-for-Image-Retrieval ---------------用CNN做图像检索(问题解决)_第1张图片

2. CNN特征   256feat2048Norml.mat    https://pan.baidu.com/s/1cG8f6Kmqk4KA_iNuss4oAw

3. 缩略图  thumbnails       https://pan.baidu.com/s/1hHiJT78vHA9GArMBO6YIkg

256feat2048Norml.mat 和thumbnails 下载完都放在 /web 中

CNN-for-Image-Retrieval ---------------用CNN做图像检索(问题解决)_第2张图片

4.在web/service.conf中设置自己的web根目录(tools.staticdir.root) 和端口号等(如果没有端口号被占用的问题就不用改端口号);   并把第二个【/】删掉 ,不然之后运行的时候还会报错,提示 / 已存在。我这边改完之后是这样:

CNN-for-Image-Retrieval ---------------用CNN做图像检索(问题解决)_第3张图片

5.接下来就是装一些程序的依赖包。主要有CherryPy (我下的是18.0.1,别下载3.2.4,会出一些莫名其妙的问题)、scipy 等。。一般运行之后,如果有落下什么包,都会提示的,缺什么直接pip install 就行。

6.运行

直接运行 以下代码即可

python searchEnginePython.py

如果没有出错的话 登录127.0.0.1:8080 就可以了

CNN-for-Image-Retrieval ---------------用CNN做图像检索(问题解决)_第4张图片

 

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了!!

你可能感兴趣的:(CNN,图像检索)