预处理是否像输入规范化一样由Tensorflow对象检测API默认进行?
我在任何地方都找不到任何关于它的文档。在DataAugmentations中有一个名为"NormalizeImage"的选项。在动物园中模型的所有配置文件中,我从未见过它被使用过。我训练ssd_mobilenet_v3_small_coco_2020_01_14
将学习转移到我的自定义课程中,而无需使用它,一切正常。 我知道这里有一个类似的问题,但几年后没有答案,网络也不同。
使用以下代码(OpenCV 4.3.0 DNN 模块(进行测试会产生正确的结果:
import cv2 as cv
net = cv.dnn_DetectionModel('model/graph/frozen_inference_graph.pb', 'cvgraph.pbtxt')
net.setInputSize(300, 300)
#net.setInputScale(1.0 / 127.5)
#net.setInputMean((127.5, 127.5, 127.5))
net.setInputSwapRB(True)
frame = cv.imread('test/2_329_985_165605-561561.jpg')
classes, confidences, boxes = net.detect(frame, confThreshold=0.7)
for classId, confidence, box in zip(classes.flatten(), confidences.flatten(), boxes):
print(classId, confidence)
cv.rectangle(frame, box, color=(0, 255, 0))
cv.imshow('out', frame)
cv.waitKey()
在这里使用规范化。在我的情况下使用规范化会产生错误的结果,边界框比它应该的大得多。我猜输入规范化是由张量流在引擎盖下的某个地方执行的?
即使我可能来不及帮助你,我也想回答这个问题,因为我在理解如何定义规范化方面遇到了非常相似的问题。也许它可以帮助其他人。
我什至发布了我自己的问题(在这里(,但一个小时后找到了答案。由于我找不到您使用的模型(tf1 的模型动物园导致ssd_mobilenet_v3_small_coco的死链接(,我假设那里的管道看起来与我使用的管道相似。
在管道配置中定义了功能提取器。
feature_extractor {
type: "ssd_mobilenet_v2_keras"
depth_multiplier: 1.0
...
}
这将使用此功能提取器。在此提取器中,定义了以下预处理函数:
def preprocess(self, resized_inputs):
"""SSD preprocessing.
Maps pixel values to the range [-1, 1].
Args:
resized_inputs: a [batch, height, width, channels] float tensor
representing a batch of images.
Returns:
preprocessed_inputs: a [batch, height, width, channels] float tensor
representing a batch of images.
"""
return (2.0 / 255.0) * resized_inputs - 1.0
如果你做数学计算,你会发现这与
image = (image-127.5)/127.5
只是以不同的方式格式化。我希望这对某人有所帮助!
编辑: 然而,我刚刚意识到这并不能解释为什么 OP 模型在没有预处理的情况下效果更好。我想 OP 预处理必须已经在 cvgraph 中定义,因为它在 opencv 文档中声明。