简介
FacenNet是谷歌提出的一种新的人脸识别的方法,该方法在LFW数据集上的准确度已经达到了99.65%。
正文
上个周末,Milo在FaceNet的导入上踩了整整两天的坑,包括开发环境,源代码报错,运行异常等等。希望本文的粗糙填坑可以帮助到更多和Milo一样的人工智障爱好者和初学者。
- 开发环境(显卡:GeForce RTX 2060 6G)
方案一 | 方案二 | 方案三 | |
---|---|---|---|
tensorflow-gpu | 1.13.1 | 1.7.0 | 1.7.0 |
cudatoolkit | 10.0.130 | 9.0 | 8.0 |
cudnn | 7.3.1 | 7.1.2 | 7.1.3 |
python | 3.7.3 | 3.6.8 | 3.6.8 |
结果 | compare.py:成功 validate_on_lfw.py:失败 |
compare.py:失败 validate_on_lfw.py:成功 |
无法调用GPU CPU运行两个文件均成功 |
- 代码需要修改的地方:
但凡需要用到GPU的地方都加上:
# session中 gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=args.gpu_memory_fraction) sess = tf.Session( config=tf.ConfigProto(gpu_options=gpu_options, log_device_placement=False)) # parse_arguments(argv)中 parser.add_argument('--gpu_memory_fraction', type=float, help='Upper bound on the amount of GPU memory that will be used by the process.', default=0.5)
facenet.py中:
# create_input_pipeline(input_queue, image_size, nrof_preprocess_threads, batch_size_placeholder)中,所有代码都缩进到scope内。 with tf.name_scope('tempscope'):
detect_face.py中:
# 87行附近,添加allow_pickle=True。 data_dict = np.load(data_path, allow_pickle=True, encoding='latin1').item() # pylint: disable=no-member
- 坑一:
Attempting to use uninitialized value InceptionResnetV1/Repeat_1/block17_4/Branch_1/Conv2d_0b_1x7/weights
解决方案:启动参数设置成具体的模型.pb文件。如果设置成文件夹,程序会使用ckpt和meta文件,于是就会出现各种Attempting to use uninitialized value的情况。
- 坑二:
Loaded runtime CuDNN library: 7600 (compatibility version 7600) but source was compiled with 7102 (compatibility version 7100). If using a binary install, upgrade your CuDNN library to match. If building from sources, make sure the library loaded at runtime matches a compatible version specified during compile configuration.
解决方案:将cudnn版本降至7.1.2。Milo在Anaconda环境中尝试了各种版本,其中7.1.3和7.0.5不会报这个错,但是7.1.3会自动安装CUDA8.0版本,7.0.5又会出现其他异常,所以在Milo的电脑上只能选择7.1.2版本。
- 坑三:
Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
解决方案:下载官方Tensorflow源文件进行重新编译和安装。(在此,Milo未做处理,因为这是个Warning,当时只做了方案查询,还有大坑需要填。)
- 坑四:
freeze_graph.py用途
总结:在长时间无法解决>>坑二<<的情况下,总感觉应该寻找载入参数的办法。这和常规Python开发真的有很大不同,正常情况下在命令行自定义参数即可,可这是神经网络的参数,如何将模型中的参数载入呢?山穷水复疑无路,柳暗花明又一村!Milo搜索了freeze_graph.py的用途,发现训练好的模型正是通过此文件将参数整合到模型中,最终生成.pb文件。所以,>>坑二<<顺其自然地解决了!
- 坑五:
could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
实际情况一:当tensorflow-gpu版本>1.8时就会出现这个异常。
实际情况二:看到CUDNN_OOXX_OOXX时,在代码中设置session的gpu_options可以解决部分问题。
- 坑六:
InternalError (see above for traceback): Blas SGEMM launch failed
总结:要么显卡太新,要么CUDNN版本问题。
本文内容转自冰部落,仅供学习交流,版权归原作者所有,如涉及侵权,请联系删除。 声明: 本平台/个人所提供的关于股票的信息、分析和讨论,仅供投资者进行研究和参考之用。 我们不对任何股票进行明确的买入或卖出推荐。 投资者在做出投资决策时,应自行进行充分的研究和分析,并谨慎评估自己的风险承受能力和投资目标。 投资有风险,入市需谨慎。请投资者根据自身的判断和风险承受能力,自主决策,理性投资。