在我的应用程序中,我将 VNImageRequestHandler 与自定义 MLModel 一起用于对象检测。
该应用程序适用于 14.5 之前的 iOS 版本。
当 iOS 14.5 到来时,它打破了一切。
try handler.perform([visionRequest])抛出错误时(Error Domain=com.apple.vis Code=11 "encountered unknown exception" UserInfo={NSLocalizedDescription=encountered unknown exception}),pixelBuffer内存被保留并且永远不会释放,它使 AVCaptureOutput 的缓冲区满然后新帧没来。由于内存泄漏,应用程序在一段时间后崩溃。
请注意,在 iOS 14.5 版本之前,检测工作完美,try handler.perform([visionRequest])永远不会抛出任何错误。
这是我的代码:
private func predictWithPixelBuffer(sampleBuffer: CMSampleBuffer) {
guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
return
}
// Get additional info from the camera.
var options: [VNImageOption : Any] = [:]
if let cameraIntrinsicMatrix = CMGetAttachment(sampleBuffer, kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix, nil) {
options[.cameraIntrinsics] = cameraIntrinsicMatrix
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用VNImageRequestHandler(iOS Vision)通过相机检测人脸。当我在横向模式下通过相机指向照片时,它会检测到面部,但使用相反的方向模式。
let detectFaceRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:])
Run Code Online (Sandbox Code Playgroud)
我正在开发一个使用DJI Mavic 2的视频提要并通过机器学习模型运行以识别对象的应用程序。
我使用此示例DJI项目设法使我的应用预览了无人机的提要,但是尝试将视频数据转换为Vision框架可以使用的格式时遇到了很多麻烦。
我使用Apple的这个示例作为创建模型的指南(正在运行!),但看起来我需要创建一个VNImageRequestHandler对象,该对象cvPixelBuffer的类型CMSampleBuffer必须是type 才能使用Vision。
知道如何进行转换吗?有一个更好的方法吗?
class DJICameraViewController: UIViewController, DJIVideoFeedListener, DJISDKManagerDelegate, DJICameraDelegate, VideoFrameProcessor {
// ...
func videoFeed(_ videoFeed: DJIVideoFeed, didUpdateVideoData rawData: Data) {
let videoData = rawData as NSData
let videoBuffer = UnsafeMutablePointer<UInt8>.allocate(capacity: videoData.length)
videoData.getBytes(videoBuffer, length: videoData.length)
DJIVideoPreviewer.instance().push(videoBuffer, length: Int32(videoData.length))
}
// MARK: VideoFrameProcessor Protocol Implementation
func videoProcessorEnabled() -> Bool {
// This is never called
return true
}
func videoProcessFrame(_ frame: UnsafeMutablePointer<VideoFrameYUV>!) …Run Code Online (Sandbox Code Playgroud) 我想知道两个图像有多相似。为此,我使用VNGenerateImageFeaturePrintRequest并从图像生成VNFeaturePrintObservation 。然后,对于两个不同的图像,我使用它们的VNFeaturePrintObservation计算特征距离。不幸的是,iOS 16.0 和 iOS 17.0 的计算距离不同,因此未达到我的阈值。
我尝试获取如下图像的 featurePrintObservation,
let requestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:])
let request = VNGenerateImageFeaturePrintRequest()
do {
try requestHandler.perform([request])
self.feature = request.results?.first
} catch {
print("Vision error: \(error)")
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试计算两个特征之间的距离,如下所示,
try! feature1.computeDistance(&visionDistance, to: feature2)
Run Code Online (Sandbox Code Playgroud)
对于相同的两个图像,iOS 16.0 和 iOS 17.0 的输出结果“visionDistance”是不同的(例如,iOS 16.3.1 中为“ 22.66224 ”,iOS 17.0.1 中为“ 1.2178229 ”)。我想知道VNFeaturePrintObservation在 iOS 17.0 中是否发生了变化,如果发生变化,有什么方法可以通用两个 iPhone 操作系统的计算吗?
我正在使用 iOS Vision 框架通过调用执行 OCR VNRecognizeTextRequest,并尝试在结果VNRecognizedText观察中找到每个单独的字符。但是,当我对boundingBox(for range: Range<String.Index>)任何VNRecognizedText对象以及识别文本内的任何有效范围调用该方法时,我会得到相同的边界框。该边界框对应于整个字符串的边界框。
我是否误解了该boundingBox(for:)方法,或者是否有其他方法可以获取已识别文本观察中单个字符的离散位置信息?
提前致谢!
编辑:
经过更多研究后,我意识到单词组和空格之间存在某种联系。考虑字符串值为“Foo bar”的已识别文本观察。调用boundingBox(for:)“Foo”中的每个字符都会返回完全相同的边界框,根据尺寸,该边界框似乎对应于整个子字符串“Foo”,而不是我们传递到该方法的范围的单个字符boundingBox。然后,在另一位奇怪的行为中,boundingBox空白字符只是原点处的一个空白区域,其边缘与其两侧的子字符串不对应。最后,第二个子字符串的行为与第一个子字符串相同:“bar”中的每个字符都具有相同的边界框。
ios ×5
ios-vision ×5
swift ×4
coreml ×1
dji-sdk ×1
ios11 ×1
ios13 ×1
ios14 ×1
memory-leaks ×1
visionkit ×1