Skip to content

学习有感 #26

@yinghaodang

Description

@yinghaodang

最近仔细看了第五个案例的代码,发现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,但一直无法被识别。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions