运用tensorflow2在人脸识别中遇到的问题和bug
之前做科创项目时遇到的一些问题的解决方案,特此记录。
bug1:TensorFlow2与TensorFlow1不兼容的问题。
这是目前最为常见的问题,由于卷积神经网络最火的时间在18年,当时产出了大量优质的项目和开源代码供使用。但如果今日想要复现当时的成果时,会遭遇TensorFlow和python版本更新后不兼容的问题。
推测当时版本:TensorFlow1,python3.6
根据网上报错的解答,可以得知TensorFlow1.13版本不兼容python3.7环境,偌使用python3.7环境,建议将TensorFlow更新至1.15。
本机环境采用的TensorFlow2.0版本
解决方案:
既然问题已经非常明显了,当遇到报错提示为(此类型通用)
AttributeError: module 'tensorflow' has no attribute
意味着TensorFlow2中不再有改模块。
给出两种解决方案:
1、卸载当前版本TensorFlow,回到源代码版本的TensorFlow
2、将以下代码进行修改:
1 | import tensorflow as tf |
改为:
1 | import tensorflow.compat.v1 as tf |
此法可以解决90%的报错。但是有一个例外,也就是contrib模块。
此模块的解决方案:建议回TensorFlow1+python3.6,或者根据官方文档及上述引用链接自行修改。
4月20日更新:
contrib模块中的slim已经没了,如果需要调用slim模块,需要
1 | pip install tf_slim |
将配置文件中的
1 | slim = tf.contrib.slim() |
全部改为
1 | slim = tf_slim() |
且加上关闭TensorFlow2功能的相关语句。
参考链接:
bug2:cv2.imread()读取图片返回none。
读取图片返回空,会直接导致后期图片处理出问题,例如:
1 | cv2.error: OpenCV(3.4.3) C:\projects\opencv-python\opencv\modules\imgproc\src\resize.cpp:4044: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize’ |
解决方案:
原因1:图片路径形式书写错误
\在程序中为转义符号,不可用错
OpenCV读取路径单路径即可,不需要 //
错误的形式:C:\Users\Desktop\test
正确的应该:C:/Users/Desktop/test/
原因2:图片路径没有写全
具体图片精确到 .jpg/.png
具体文件夹精确到:test/
正确的应该:C:/Users/Desktop/test/
原因3:路径中带中文
路径中绝对绝对绝对绝对绝对绝对不要有任何中文!!!特别是python3环境下
原因4:图片数量不一致
你有多少图片,就搞多少图片,别自己变图片出来。
主要在循环遍历时才会遇到这个问题
参考链接:
bug3:checkpoint文件内部设置。
以我的为参考:
1 | G:/science/trainmodel/model-600 |
注意 ‘ / ‘ 以及模型不带后缀。
另外,训练时生成模型使用的函数:
1 | saver.save(sess, 'G:/science/trainmodel/model') |
中的路径部分采用windows格式的 ‘ / ‘即可,我之前写python路径写顺手了,直接写了全部 // ,直接GG
bug4:saver.restore恢复模型报错
经典坑位之一,附上我的代码:
1 | saver.restore(sess, tf.train.latest_checkpoint('G:/science/trainmodel')) |
tf.train一行指调用生成的最后一个模型,还有多种参数可以按需使用。
路径单双斜杠均不受影响。