海思芯片的nnie加速器可谓是黑科技了,可以在不到100元的2个gpu核的芯片上跑yolov3,对于我等菜狗来说吸引力很大,但是一般在x86或英伟达arm板上运行的darknet可执行文件是没法在芯片上运行的,需要严格执行以下步骤:
1、将darknet模型转换为caffemodel
海思h35系列目前只支持caffe模型,因此需要先将darknet转换为caffemodel,这里要参考大神的转换代码,前人栽树后人乘凉。https://github.com/ChenYingpeng/darknet2caffe
①caffe模型缺少上采样层,目前需要在网上下载并手动加入layer文件夹中,一起编译caffe。
②运行darknet2caffe.py,9012年了,Python2可能会出很多问题了,但是大神的代码是用Python2写的,建议用python3运行,同时更改其中的一些api。
darknet2caffe.py:
elif block['type'] == 'convolutional':
batch_normalize = int(block['batch_normalize'])
if block.has_key('name'):
# 改为if 'name' in block:
# 由于python3的字典api变化,本文中的has key均要修改
conv_layer_name = block['name']
bn_layer_name = '%s-bn' % block['name']
scale_layer_name = '%s-scale' % block['name']
else:
conv_layer_name = 'layer%d-conv' % layer_id
bn_layer_name = 'layer%d-bn' % layer_id
scale_layer_name = 'layer%d-scale' % layer_id
if batch_normalize:
start = load_conv_bn2caffe(buf, start, params[conv_layer_name], params[bn_layer_name], params[scale_layer_name])
else:
start = load_conv2caffe(buf, start, params[conv_layer_name])
layer_id = layer_id+1
pooling_param['pad'] = str((int(block['size'])-1)/2)
改为pooling_param['pad'] = str(int(int(block['size']-1)/2))
否则pad不是整数将会报错
prototxt.py:
def print_block(block_info, prefix, indent):
blanks = ''.join([' ']*indent)
print >>fp, '%s%s {' % (blanks, prefix)
for key,value in block_info.items():
if type(value) == OrderedDict:
print_block(value, key, indent+4)
elif type(value) == list:
for v in value:
print >> fp, '%s %s: %s' % (blanks, key, format_value(v))
else:
print >> fp, '%s %s: %s' % (blanks, key, format_value(value))
print >> fp, '%s}' % blanks
props = net_info['props']
layers = net_info['layers']
print >> fp, 'name: \"%s\"' % props['name']
print >> fp, 'input: \"%s\"' % props['input']
print >> fp, 'input_dim: %s' % props['input_dim'][0]
print >> fp, 'input_dim: %s' % props['input_dim'][1]
print >> fp, 'input_dim: %s' % props['input_dim'][2]
print >> fp, 'input_dim: %s' % props['input_dim'][3]
print >> fp, ''
>>已经不符合潮流了,要改为:
def print_block(block_info, prefix, indent):
blanks = ''.join([' ']*indent)
print('%s%s {' % (blanks, prefix), file=fp)
for key,value in block_info.items():
if type(value) == OrderedDict:
print_block(value, key, indent+4)
elif type(value) == list:
for v in value:
print('%s %s: %s' % (blanks, key, format_value(v)), file=fp)
else:
print('%s %s: %s' % (blanks, key, format_value(value)), file=fp)
print('%s}' % blanks, file=fp)
props = net_info['props']
layers = net_info['layers']
print('name: \"%s\"' % props['name'], file=fp)
print('input: \"%s\"' % props['input'], file=fp)
print('input_shape {', file=fp)
print(' dim: %s' % props['input_dim'][0], file=fp)
print(' dim: %s' % props['input_dim'][1], file=fp)
print(' dim: %s' % props['input_dim'][2], file=fp)
print(' dim: %s' % props['input_dim'][3], file=fp)
print('}', file=fp)
转换的代码已从python2.7转换到python3.5,打包在darknet2caffe包中。
2、将caffemodel转换为wk模型(安装ruyi studio)
①推荐使用Windows系统,首先安装MinGW-W64,从 http://gnuwin32.sourceforge.net/packages/wget.htm 网页下载 wget 安装包(选择 Complete package, except sources),保存到新建的文件夹RuyiStudio下,如图:
下载得到 wget-1.11.4-1-setup.exe,双击安装,将会得到一个GnuWin32文件夹。将 GnuWin32文件夹中wget.exe 所在目录(GnuWin32\bin)添加到用户环境变量 PATH 中,用于从网页下载相关包。(在计算机高级选项中添加环境变量)
②配置python3.5环境,在python官方网站上下载python35安装包并自动安装。
③配置caffe环境,从 https://github.com/willyd/caffe-builder/releases 下载libraries_v140_x64_py35_1.1.0.tar.bz2 并放置在ruyi_env_setup-2.0.41文件夹下。如图:
点击 ruyi_env_setup-2.0.41文件夹下的setup_python.bat 进行安装, setup_python.bat 脚本会调用 python_bat 文件夹下的setup_download_python.bat、 setup_extract_python.bat 和 setPath_python.bat,下载python, caffe 的依赖包,并配置环境变量。
注意在完成之后要重启电脑。
3、将caffemodel转换为wk模型(使用ruyi studio)
Ruyi studio的安装包已备好在文件夹中,定位到.\SVP_PC\HiSVP_PC_V1.2.2.2\tools\nnie\windows,解压缩RuyiStudio-2.0.41.zip,然后双击RuyiStudio.exe即可。
打开之后,加入示例项目(software/data/detection/yolov3),在左侧栏中右键点击yolov3_inst.cfg,选择open with mapper。
填入所需路径之后,点击主页面上方工具栏的make wk按钮即可。生成的wk模型按照海思提供的文档与例程,便可以运行yolo模型了,速度还可以,未作处理的开源模型速度目前是4.5fps,充满希望啊!
经过一顿操作之后能达到10fps了。。。