之前有个项目用了OV,最近有个项目像节省成本不配显卡测试下cpu or intel-gpu推理效果,于是
迅速改动了之前项目代码,测试,然后奇怪的事情发生了,总是处理效果非常差,效果该有的地方没有,不该有的地方都有(你懂的),然后茫然,找朋友测试下,正常,然后就疑惑了,到底有啥区别,看了下他的代码,除了新版本的外,基本和我的思路一样,然后我想肯定我的代码有问题,然后猛然发现了一句:
net.input_info[input_blob].precision = "U8"
holy shit,
之前项目,是输入的是原图,然后再转模型的时候做了--mean_value [127.5,127.5,127.5] --scale 127.5。 而本项目我是外侧做的预处理,然后内部输入是归一化后的图像,所以根本不是U8,所以精度查了很多,不过惊奇的发现虽然该网络效果不好,U8后竟然对边界的寻找找的位置还可以,所以提供了个思路,如果单纯用最小的网络可以实现找边算法,标注根本不需要标注边,普通标注缺陷竟然可以u8后找到边沿,一个不错的课题。
所以一定注意,
不同的网络,有的输入是U8,有的是外部预处理,不需要这步,瞬间检测出缺陷来了。
附录检测图:
左上为原图,右上为检测图,左下为正确检测图,右下为u8后的错误图。
另外测试前端处理时间:opencv比transform稍快2ms。
测试openvino 直接onnx模型和openvino FP32 xml模型时间:测试发现:
当openvino加载onnx比xml的慢20ms左右,,,整体差别不太大
另外测试 batch=1 和batch=2 和batch=1 丢两次时间差异较大:
分别如下:
很奇怪的事情是batch=1,一张图很快204ms,batch=2,两张图482ms,但是batch=1,丢两次先后执行丢进去然后就出现了一次514 一次484的情况。代码如下:
for j in range(images.shape[0]):
s_time = get_time()
res = exec_net.infer(inputs={input_blob: images[j]})
e_time = get_time()
print(f'processtime is {e_time - s_time}')
另外测试openvino –reverse_input_channels 和 在外侧转bgr 结果不一致,很奇怪外部做了bgr转rgb,和转义模型的时候转--reverse_input_channels理论上一致,但是测试下来问题很大,检测的直接不对了,此问题未想明白。