图像分类之前如何裁剪图像

问题描述 投票:0回答:1

我正在使用 MediaPipe 在相机图像中查找狗的品种(如果有的话)。我首先使用 ObjectDetector,如果它发现一只狗,我会将边界框内的内容发送到 ImageClassifier,并使用经过狗品种训练的 .tflite。裁剪代码如下。

问题:

  1. 我相信我会得到更准确的结果,因为我只将裁剪后的部分而不是整个相机图像发送到 ImageClassifier。对吗?
  2. 裁剪可以变得更快/更智能/更简单吗? (格式为RGBA_8888)
  3. 如果我在边界框上方/下方添加图像的某些部分以使裁剪成为正方形,会提高准确性吗?
  4. 如果我将方形裁剪图像的大小调整为 224 x 224 像素 = 模型的输入形状,这会提高准确性吗?

我确实尝试通过谷歌搜索和实验自己回答这些问题,但没有成功。如果有经验丰富的开发人员提供任何建议,我们将不胜感激。

det = detectionResult.detections()[saveIndex]
// Crop the image: Create a new mpImage with what is inside the bounding box
val l = det.boundingBox().left.toInt()
val t = det.boundingBox().top.toInt()
val w = det.boundingBox().width().toInt()
val h = det.boundingBox().height().toInt()
val size = w * h * 4
val smallBuffer = ByteBuffer.allocateDirect(size)
// Crop mpImage
val wtot = imageProxy.width
smallBuffer.rewind()
byteBuffer.rewind()
var pixel = ByteArray(4)
for (rowNumber in 0..h - 1) {
    for (pixelNumber in 0..w - 1) {
        val offset = (rowNumber + t) * wtot * 4 + (l + pixelNumber) * 4
        pixel[0] = byteBuffer[offset]
        pixel[1] = byteBuffer[offset + 1]
        pixel[2] = byteBuffer[offset + 2]
        pixel[3] = byteBuffer[offset + 3]
        smallBuffer.put(pixel)
    }
}
// Convert smallBuffer to mpImage
smallBuffer.rewind()
val bitmapBuffer2 = Bitmap.createBitmap(
    w, h, Bitmap.Config.ARGB_8888
)
bitmapBuffer2.copyPixelsFromBuffer(smallBuffer)
val mpImage2 = BitmapImageBuilder(bitmapBuffer2).build()

// Run Image Classifier with cropped image as input

val classifierResult: ImageClassifierResult? =
    imageClassifier.classify(mpImage2)
kotlin tensorflow crop image-recognition mediapipe
1个回答
0
投票

回答关于裁剪模型的第一个问题将使用裁剪后的图像产生更好的结果。我制作了许多高质量的数据集,并证明如果裁剪图像以使感兴趣区域中的像素至少占像素的 50%,则模型可以获得更高的精度。 关于您的其他一些问题,这是我生成高质量数据集所遵循的规则。首先,我进行谷歌和必应搜索并下载图像。例如秃鹰的图像。接下来,我有一个 python 内核,它按图像区域对下载的图像进行排序,首先是最大的图像。您希望使用可以获得的最大图像,以便当您将图像裁剪到 ROI 时,生成的裁剪图像相当大。我尝试让每个裁剪图像中至少 50% 的像素来自感兴趣的区域。对于大型复制图像,您现在可以调整它们的大小并保留图像中对模型有用的所有信息。调整大小的图像不需要是正方形的。

© www.soinside.com 2019 - 2024. All rights reserved.