FaceBoxes,顾名思义,它本来是用来进行人脸检测(不是人脸识别),并且解决识别小脸的问题。
FaceBoxes是基于SSD、通过anchor密集采样策略,对浅层feature map检测的小尺度目标,其对应anchor做更加密集的anchor采样,使得特征金字塔不同feature map层的anchor有相同的采样密度,在CPU端实时。
其代码地址:FaceBoxes.PyTorch
此处,我是将这个代码用于训练自己的数据(需要是单类的才可以,我这里训练的不是人脸),然后在代码运行的时候出现了下面一些问题:
☕trian.py
1. AssertionError: Invalid device id
ngpu
的default
值改成1
2. FileNotFoundError: [Errno 2] No such file or directory:’./data/WIDER_FACE\annotations\61_Street_Battle_streetfight_61_894.xml’
将此处的路径改成绝对路径,并且将/
改成\\
3. 查无xml文件
此时需要根据自己的数据,制作img_list.txt
文件,文件种每行为图片名和xml文件名
对应的代码如下,直接放在项目里,将其中的路径改成你自己的即可:
# 在data/WIDER_FACE下生成img_list.txt文件,每行为图图片名和对应的xml名
import os
import random
xmlfilepath = 'B:/FaceBoxes.PyTorch-master/data/WIDER_FACE/annotations/' # xml文件路径
imgfilepath = 'B:/FaceBoxes.PyTorch-master/data/WIDER_FACE/images/' # 图片路径
txtsavepath = 'B:/FaceBoxes.PyTorch-master/data/WIDER_FACE' # txt文件最后保存路径
total_xml = os.listdir(xmlfilepath) # 所有的xml文件名列表
total_img = os.listdir(imgfilepath) # 所有的img文件名列表
num = len(total_xml) # 图片个数
list = range(num)
ftxt = open(txtsavepath + '/img_list.txt', 'w')
for i in list:
xmlname = total_img[i] + ' ' + total_xml[i] + '\n'
ftxt.write(xmlname)
ftxt.close()
4. KeyError: Caught KeyError in DataLoader worker process 0. KeyError: ‘shuguo’(此处两个错误)
在wider_voc.py
中的第14行,将图示位置改成自己的标签名字即可
☕test.py
1. ModuleNotFoundError: No module named ‘utils.nms.cpu_nms’
在utils/nms
中的cpu_nms.pyx
(Linux下运行的)文件转换成pyd
文件(Windows下运行的)
在项目里新建一个pyx2pyd.py
文件,代码如下
import sys
import numpy as np
A = sys.path.insert(0, "..")
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
from Cython.Distutils import build_ext
# ext_module = cythonize("TestOMP.pyx")
ext_module = Extension(
"cpu_nms",
["cpu_nms.pyxc"], # 更改为自己想要转换的.pyx文件
extra_compile_args=["/openmp"],
extra_link_args=["/openmp"],
)
setup(
cmdclass={
'build_ext': build_ext},
ext_modules=[ext_module],
# 注意这一句一定要有,不然只编译成C代码,无法编译成pyd文件
include_dirs=[np.get_include()]
)
然后在cmd中输入命令
python pyx2pyd.py build_ext --inplace
转换完成后,发现还需要转换gpu_nms.pyx
文件,但是出现下面的错误
可是没有找到解决办法,要原地爆炸了,于是放弃转换这个了
直接在nms_wrapper.py
文件中做如下图修改
在test.py
文件中做如下修改