整个ssd的安装和训练可以按照官方的例子。
需要注意的是需要编译ssd相关的代码,可以通过两种方式进行:
- 直接把ssd目录下的operator中的文件复制到src/operator,然后再编译
- 设置config.mk,把
EXTRA_OPERATORS
改成EXTRA_OPERATORS = example/ssd/operator
,然后再进行编译。
接着便是运行demo,看能否正确运行,运行前需要下载相关的model和dataset。并且放在正确的位置。
下面是制作自己的数据集进行训练:
- 数据集制作
- 修改训练相关文件
训练和测试
1.数据集的制作可以参考这篇文章。结束之后可以把数据替换掉VOC2007里面的相应数据。
2.修改训练相关的文件,需要修改的参数无非是数据的类别数量和标签名。- dataset/pascal_voc.py(在最新版本0.12.1,classes 修改在文件夹dataset/name)
demo.py(模型训练结束后用到)
3.训练和测试
# cd /path/to/mxnet/example/ssd
python train.py
#python train.py --year 2007
测试
# play with examples:
python demo.py --epoch 0 --images ./data/demo/yourImageName.jpg --thresh 0.5
可能会遇到的问题:
AttributeError: 'module' object has no attribute 'MultiBoxPrior' #20
#是否编译好ssd,路径是否配置正确
运行demo.py出现以下错误
/ndarray.cc:231: Check failed: from.shape() == to->shape() operands shape mismatch
Traceback (most recent call last):
File "demo.py", line 95, in
ctx, args.nms_thresh, args.force_nms)
File "demo.py", line 41, in get_detector
data_shape, mean_pixels, ctx=ctx)
File "/home/ubuntu/mxnet/example/ssd_LPR/detect/detector.py", line 39, in init
self.mod.set_params(args, auxs)
File "/home/ubuntu/mxnet/python/mxnet/module/base_module.py", line 503, in set_params
allow_missing=allow_missing, force_init=force_init)
File "/home/ubuntu/mxnet/python/mxnet/module/module.py", line 198, in init_params
_impl(name, arr, arg_params)
File "/home/ubuntu/mxnet/python/mxnet/module/module.py", line 188, in _impl
cache_arr.copyto(arr)
File "/home/ubuntu/mxnet/python/mxnet/ndarray.py", line 533, in copyto
return _internal._copyto(self, out=other)
File "/home/ubuntu/mxnet/python/mxnet/ndarray.py", line 1225, in unary_ndarray_function
c_array(ctypes.c_char_p, [c_str(str(i)) for i in kwargs.values()])))
File "/home/ubuntu/mxnet/python/mxnet/base.py", line 77, in check_call
raise MXNetError(py_str(_LIB.MXGetLastError()))
mxnet.base.MXNetError: [15:02:26] src/ndarray/ndarray.cc:231: Check failed: from.shape() == to->shape() operands shape mismatch
#参考[解决方法](https://github.com/zhreshold/mxnet-ssd/issues/33)
#有可能是类别为1的时候CLASSE=(‘label1’),正确为CLASSE=(‘label1’,)
参考文献:
[1] https://github.com/dmlc/mxnet/tree/master/example/ssd
[2] http://blog.csdn.net/yiweibian/article/details/54847882
[3] https://github.com/zhreshold/mxnet-ssd/issues/33