运行GitHub上的预训练模型--FaceBoxes.pytorch项目

运行Faceboxes.pytorch项目中的test.py遇到的问题

Faceboxes.pytorch项目链接

问题一:缺少cv2模块

ModuleNotFoundError: No module named 'cv2'

解决办法:
Anaconda缺少什么模块就安装什么模块,打开Anaconda prompt
输入:conda install --channel https://conda.anaconda.org/menpo opencv

参考链接

第一次更新失败,因为我的conda未更新,所以我要先更新conda再继续安装cv2模块

问题二:conda需要更新

RemoveError: ‘requests’ is a dependency of conda and cannot be removed from conda’s operating enviro…

解决办法:
输入 conda update --force conda

参考链接

等待conda 顺利更新结束,重新按照问题一的解决办法安装cv2

问题三:缺少utils

ModuleNotFoundError: No module named 'utils'

解决办法:Anaconda缺少什么模块就安装什么模块,打开Anaconda prompt
输入:conda install -c conda-forge python-utils

参考链接

问题四:该模型需要在GPU上运行,但是我的电脑只有CPU,且为AMD显卡无法安装CUDA.

ValueError: Expected a cuda device, but got: cpu

有考虑过是否要换一台电脑,但无奈自己平时用的电脑在学校没带回来,也考虑过要连接远程服务器来解决没有GPU的问题,但是自己没有使用过远程服务器,所以这个办法也是远水救近火,后面经“高人”指点:这些模型肯定是既可以在CPU上运行又可以在GPU上运行的,只不过你要将模型中选择用GPU运行的部分全部改成用CPU运行就行。所以我开始大概的浏览了一遍模型,将网络模型中用cuda的部分都改成了cpu,从而解决了这个问题。

我的解决办法:

  1. 在模型的前面添加:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
  1. 将原模型中的这一句中的“cpu”的默认改成True
 parser.add_argument('--cpu', action="store_true", default=False, help='Use cpu inference')

因为我是代码小白,所以只能把自己看得懂的,且涉及到cpu,gpu的位置进行一下稍微的调整
更改后为:

parser.add_argument('--cpu', action="store_true", default=True, help='Use cpu inference')

PS:
add_argument:用于给定参数,在运行程序时,程序将通过其调用给定的参数来执行程序

ArgumentParser.add_argument(name or flags…[, action][, nargs][,const][, default][, type][, choices][, required][, help][, metavar][,dest])

name of flags :是必须的参数,该参数接受选项参数或者是位置参数。
例:`

parser.add_argument('--dataset', default='PASCAL', type=str, choices=['AFW', 'PASCAL', 'FDDB'], help='dataset')`

例如上面代码中的‘–dataset’数据集,在运行test.py时,若test.py中的args.dataset == “FDDB”,则本次运行将使用FDDB数据集作为测试集,若不给参数时,则使用default=‘PASCAL’默认数据集PASCAL进行测试。
type:为参数类型,例如str, int
choices:用来选择输入参数的范围,例如上面的choices=['AFW', 'PASCAL', 'FDDB']表示输入的数据集只能是‘AFW’‘PASCAL’'FDDB'.
required:用来设置再命令中显示参数,当required为True时,在输入命令时需要显示这个参数
help:用来描述这个选项的作用
action:表式该选项要执行的操作

参考链接

  1. 把“cuda”改成“cpu”
    原代码:
 device = torch.device("cpu" if args.cpu else "cuda")

改成:

device = torch.device("cpu")
  1. 原代码:
net = net.cuda()

改成:

net = net.cpu()
  1. 我觉得最重要的位置是将load_model函数中的原代码改成了CPU,(因为我是代码小白,我不知道这里的代码我改的是否合理,欢迎指出不足,也许我自己以后再看这里的时候会觉得自己很白痴):
    原代码:
def load_model(model, pretrained_path, load_to_cpu):
    print('Loading pretrained model from {}'.format(pretrained_path))
    if load_to_cpu:
        pretrained_dict = torch.load(pretrained_path, map_location=lambda storage, loc: storage)
    else:
        device = torch.cuda.current_device()
        pretrained_dict = torch.load(pretrained_path, map_location=lambda storage, loc: storage.cuda(device))

改成:

def load_model(model, pretrained_path, load_to_cpu):
    print('Loading pretrained model from {}'.format(pretrained_path))
    if load_to_cpu:
        pretrained_dict = torch.load(pretrained_path, map_location='cpu')
    else:
        device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
        pretrained_dict = torch.load(pretrained_path, map_location=lambda storage, loc: storage.cuda(device))

所以总的来说:
工作要部署到服务器上 ,服务器上面没有GPU,所以要将GPU改为CPU处理,于是训练的模型要动一动,在load的时候加上map_location=‘cpu’,然后把所有的.cuda()方法删掉。(只有使用一块gpu训练的模型才可以使用该方法,使用多块GPU的模型转CPU)

GPU->CPU

model = torch.load(‘xxx.pkl’, map_location=‘cpu’)

CPU->GPU1

torch.load(‘gen_500000.pkl’, map_location=lambda storage, loc: storage.cuda(1))

参考链接1
参考链接2

至此,我解决了由GPU转换成CPU来运行模型的问题。

问题五:没有cpu_nms,或import类型错误

import: 在python用import或者from...import来导入相应的模块。模块其实就是一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,直接把相应的模块导入到我们的程序中,我们就可以使用了。这类似于C语言中的include头文件,Python中我们用import导入我们需要的模块。

原来的test.py文件中的from .nms.cpu_nms import cpu_nms, cpu_soft_nms会导致错误,因为没有cpu_nums这个模块,后面我把这一行代码删掉了,且把下面代码中的return进行了稍微的改动。

def nms(dets, thresh, force_cpu=False):
    """Dispatch to either CPU or GPU NMS implementations."""

    if dets.shape[0] == 0:
        return []
    #if cfg.USE_GPU_NMS and not force_cpu:
        #return gpu_nms(dets, thresh, device_id=cfg.GPU_ID)
    else:
        return nms(dets, thresh)
        #原来代码中的return(如下),改成了上面的return,定义的函数和返回的结果不一致
        #return cpu_nms(dets, thresh)

问题六:数据集给定的路径错误

按照GitHub上的FaceBoexes.pytorch项目的安装指引,

$FaceBoxes_ROOT/data/AFW/images/
$FaceBoxes_ROOT/data/PASCAL/images/
$FaceBoxes_ROOT/data/FDDB/images/

我的数据集是需要放在(如上位置)每一个数据集文件夹的images/文件夹下的,但是我把images/文件夹的名字写成了AEW_images/,所以运行该测试代码的时候,模型无法找到测试数据集,所以出现了数据格式不对的错误。

TypeError: src is not a numpy array, neither a scalar

解决办法:将数据集文件夹的名字改成images/,并重新载入

从这个错误中学到的知识:
python路径拼接os.path.join()函数完全教程

解决了这几个问题,test.py在我的电脑中暂时没有报错了,现在要开始学习怎么用这个模型来跑我的数据集并提取特征,小白求好运求毕业~
———————————————
版权声明:本文为CSDN博主「weixin_45654744」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45654744/article/details/105206549

你可能感兴趣的:(深度学习,人脸检测,预训练模型,python,深度学习,pytorch,神经网络,github)