本教程将展示如何使用 Swift 和 CoreML 框架加载预训练的 YOLOv3 模型并在图像中进行物体检测。YOLOv3 是一种高效的实时目标检测模型,它能够快速且准确地识别图像中的多个物体。
环境准备
安装 Xcode
Swift 是 iOS 开发的主流语言,我们需要安装 Xcode 开发环境。可以通过 Apple 官方网站 下载和安装最新版本的 Xcode。
安装 CoreML 模型
我们将使用一个 YOLOv3 模型,可以从 YOLO 官网 下载。然后,使用 CoreML 将 YOLOv3 转换为可以在 iOS 上运行的格式。
项目设置
创建一个新的 iOS 项目,并确保启用了 CoreML 和 Vision 框架。你可以通过 Xcode 的“Link Binary With Libraries”选项来添加这些库。
Swift 代码实现
加载和准备 YOLOv3 模型
首先,将转换好的 YOLOv3 模型添加到你的 Xcode 项目中,并确保它的扩展名为 .mlmodel。CoreML 会自动生成一个适配 Swift 的模型类。
swift
import UIKit
import Vision
import CoreML
class ViewController: UIViewController {
var model: VNCoreMLModel?
override func viewDidLoad() {
super.viewDidLoad()
// 加载 YOLOv3 CoreML 模型
do {
let yoloModel = try YOLOv3(configuration: MLModelConfiguration())
model = try VNCoreMLModel(for: yoloModel.model)
} catch {
print("模型加载失败: \(error.localizedDescription)")
}
}
}
处理图像并进行物体检测
接下来,我们将从图像中提取出物体,并在图像上绘制框来标识物体的位置。
swift
func detectObjects(in image: UIImage) {
guard let model = model else { return }
// 将UIImage转换为CIImage
guard let ciImage = CIImage(image: image) else {
print("无法转换图像")
return
}
// 创建请求
let request = VNCoreMLRequest(model: model) { request, error in
guard let observations = request.results as? [VNRecognizedObjectObservation] else {
print("没有识别结果: \(error?.localizedDescription ?? "未知错误")")
return
}
// 遍历每个检测到的物体
for observation in observations {
let boundingBox = observation.boundingBox
let label = observation.labels.first?.identifier ?? "未知"
let confidence = observation.labels.first?.confidence ?? 0.0
// 打印检测到的信息
print("检测到物体: \(label) 置信度: \(confidence)")
print("位置: \(boundingBox)")
// 在图像上绘制框
drawBoundingBox(boundingBox, label: label)
}
}
// 创建请求处理器
let handler = VNImageRequestHandler(ciImage: ciImage, options: [:])
do {
try handler.perform([request])
} catch {
print("请求失败: \(error.localizedDescription)")
}
}
func drawBoundingBox(_ boundingBox: CGRect, label: String) {
// 将boundingBox转换为视图坐标系
let width = self.view.bounds.width
let height = self.view.bounds.height
let rect = CGRect(x: boundingBox.origin.x * width,
y: (1 - boundingBox.origin.y - boundingBox.height) * height,
width: boundingBox.width * width,
height: boundingBox.height * height)
// 创建一个 UILabel 显示物体标签
let labelView = UILabel(frame: rect)
labelView.text = label
labelView.textColor = .white
labelView.backgroundColor = .black
labelView.textAlignment = .center
labelView.font = UIFont.boldSystemFont(ofSize: 12)
// 在视图上添加标签
self.view.addSubview(labelView)
// 创建一个边框
let border = UIView(frame: rect)
border.layer.borderColor = UIColor.red.cgColor
border.layer.borderWidth = 2
self.view.addSubview(border)
}更多内容访问ttocr.com或联系1436423940
调用物体检测功能
在 viewDidLoad 或其他适当的地方调用物体检测功能并传入图像。
swift
func loadImageAndDetect() {
if let image = UIImage(named: "test_image.jpg") {
detectObjects(in: image)
}
}
测试和运行
运行应用程序
通过 Xcode 运行该应用程序,你可以选择将图像加载到应用中进行物体检测。通过 VNCoreMLRequest,YOLOv3 模型将对图像进行分析,并检测图像中的物体。
结果展示
当模型成功检测到物体时,它将在图像中显示一个边框并标注物体类别(例如“person”、“car”)以及置信度。