-
Notifications
You must be signed in to change notification settings - Fork 99
Description
最近仔细看了第五个案例的代码,发现model_server.py这个文件里有可以优化的地方。
起因是我觉得案例中使用的模型太过简单了,至少应该换成CNN实现一遍,原本以为不难,但是过程中还是遇到了不少问题,想要分享交流一下。
1.model_server.py中会从前端的form中获取图片的base64代码,但是代码中使用了svg这种比较少见的格式,并且现将其转化为svg图片存在本地,然后读到内存里转化为png,突出一个不优雅...
我研究了一下form中可获取的格式,其实可以直接获取png的图片的,只要在web.html中修改成
var image=$("#canvas").jSignature("getData", "image");
原来是
var image=$("#canvas").jSignature("getData", "svgbase64");
这样直接可以得到png这种格式的base64编码。这个例子中,知道了一个冷知识,原来不同图片格式的base64编码并不相通。
2.model_server.py中获取的图片是RGBA格式的,这点在我自己写代码的时候狠狠教育了我,按照往常的经验,cv2读取的图片完全是一篇黑色。原来是这从网页上获取的图片渲染的色彩完全靠第三个维度,即透明度,去实现。当默认读取0,1,2这三个维度的时候就无法呈现图像了。
起初我无法理解作者为什么要新建一个空白画布再复制上去,现在明白了。
经过一番折腾,也给出一种更加优雅的方式:
https://stackoverflow.com/questions/55677216/how-to-convert-an-rgba-image-to-grayscale-in-python
获得一个冷知识:RGBA的图片要单独拿出来试验一下,很多库函数没有支撑好。RGB图像处理的经验往往失效。
可以看出作者的实战经验是及其丰富的,即便不算优雅,但也是一种解决方案,让我大开眼界。
综上,base64转ndarray格式的代码如下:
import base64
import io
io_img = io.BytesIO(base64.b64decode(imgstr)) # 转化为二进制并读入内存
img = 255 - np.array(Image.open(io_img))[:, :, 3] # Image库读取io对象,取出alpha维度,再黑白翻转
Image.fromarray(img) # 查看图片,jupyter环境下
或者使用cv2
byte_img = (base64.b64decode(imgstr)) # 得到图片二进制格式
flatten_img = np.frombuffer(byte_img, np.uint8) # np将二进制转化为一维数组
img = cv2.imdecode(flatten_img, cv2.IMREAD_UNCHANGED) # 以保留Alpha的方式读取图片
img = 255 - img[:, :, 3]
我印象中svglib这个库安装的时候不是很讨喜,需要一些不常见的依赖
还有一个细节是在实践中认识到的,腐蚀操作要和黑白翻转操作相对应,先后顺序是有讲究的。
===============================================================
同时也产生了一些其他问题,比如说算法模型里常常需要使用高维度的张量,比如说[[[],[],...],...]这样的三维张量,这时候flink sql似乎支持得不是很好。解决方案是展平,然后交由UDF函数处理。
在这个过程中,我传入kafka的数据类似这样:[-0.4242129623889923, -0.4242129623889923, 0.6449587345123291, ... ]长度大约几千,在从kafka导入flink的时候出错了,我写的数据类型是ARRAY,但一直无法被识别。