在《vrn-master》可以下载 vrn-unguided.t7 模型(没有安装 torch7,运行不了)。
在《vrn-torch-to-keras-master》提供一个 Keras 模型下载地址: vrn-unguided-keras.h5 (drive.google)
和一个 Tensorflow 的 pb 模型:vrn-tensorflow.pb (drive.google)。
我只下了vrn-unguided-keras.h5(翻墙软件的免费流量用完)。百度网盘:链接:https://pan.baidu.com/s/1pwnehTkflFXtb2hO6wMr7g
提取码:4uzk
start_time = time.time()
model = load_model('vrn-unguided-keras.h5', custom_objects=custom_objects)
end_time = time.time()
print('载入模型用时: %f秒' % (end_time - start_time))
这个h5模型载入是比较慢的(解压缩慢?),需要100多秒。
按《keras_to_tensorflow-master》转换成 vrn-unguided-keras.h5.pb。
start_time = time.time()
with open('vrn-unguided-keras.h5.pb', "rb") as f:
output_graph_def = graph_pb2.GraphDef()
output_graph_def.ParseFromString(f.read())
_ = tf.import_graph_def(output_graph_def, name="")
end_time = time.time()
print('载入模型用时: %f秒' % (end_time - start_time))
这个快一点了,只要 20 多秒。
然后前传:
start_time = time.time()
sess = tf.Session()
x = sess.graph.get_tensor_by_name('input_1:0')
y = sess.graph.get_tensor_by_name('activation_274/Sigmoid:0')
img = cv2.imread('joey.jpg')
img = cv2.resize(img, (192, 192))
b,g,r = cv2.split(img)
img = cv2.merge([r,g,b])
img = np.swapaxes(img, 2, 0)
img = np.swapaxes(img, 2, 1)
img = np.array([img])
out_layer_name='pred0'
pred = sess.run(y, feed_dict={x: img})
vol = pred[0] * 255
end_time = time.time()
print('运行模型用时: %f秒' % (end_time - start_time))
这里用时38秒(cpu).
由于 Example-Usage.ipynb 没有保存数据。
这里先把它的输出200x192x192转换成灰度图:
start_time = time.time()
print(vol.shape)
gray = np.zeros((192, 192))
#------------------------------------------
#3维
for i in range(vol.shape[0]):#图像通道数200
v_2d=vol[i, :, :] #取出一个通道
w=v_2d.shape[0] #图像宽高
h=v_2d.shape[1]
for Ii in range(w):
for Ji in range(h):
if v_2d[Ii,Ji] > 1 : #每一个体素转为深度值(灰度0:200)
gray[Ii,Ji] = i
#------------------------------------------
cv2.imwrite('gray.png',gray)
end_time = time.time()
print('转换成灰度图用时: %f秒' % (end_time - start_time))
这个转换用掉了将近100 秒。估计这个遍历太慢了。
效果图:
输入图
输出灰度图
再用ArtCAM 2008 (雕刻软件)打开灰度图:
旋转一下:
由于是上层覆盖下层,这个转换是没有鼻孔的,当然一般的雕刻机也只能雕成这样了。(转换成点云可能会好点)
这个精度也是比较低的。实际上网络内部只生成了48x48的点图,还要除掉四周空位,最少1/4吧,可能只有1500个或更小的点用在脸上,最后是双线性放大到192x192的。
如果有人能用96x96 或者192x192 训练出模型应该就差不多了。
先这样吧。