iOS 可以利用 Core ML 及其它一些图像处理框架来分类图片。以下是一个使用 Core ML 进行图片分类的示例代码:
首先,需要导入 Core ML 模型。假设你已经有了一个训练好的 Core ML 模型文件(后缀为 .mlmodel)。
```swift
import CoreML
```
然后,创建一个图像分类器的实例:
```swift
class ImageClassifier {
let model: MobileNetV2 // 假设 MobileNetV2 是你的模型
init() {
guard let model = try? MobileNetV2(configuration: MLModelConfiguration()) else {
fatalError("Failed to load the core ml model")
}
self.model = model
}
func classify(image: UIImage, completion: @escaping (String?, Error?) -> Void) {
// 将图像转换为 Core ML 可处理的格式
guard let pixelBuffer = image.pixelBuffer(width: 224, height: 224) else {
completion(nil, NSError(domain: "ImageClassifier", code: 1, userInfo: ["error": "Failed to create pixel buffer"]))
return
}
// 创建一个 Core ML 请求
let request = VNCoreMLRequest(model: model) { [weak self] request, error in
guard let results = request.results as? [VNClassificationObservation], let topResult = results.first else {
completion(nil, NSError(domain: "ImageClassifier", code: 2, userInfo: ["error": "Failed to classify the image"]))
return
}
completion(topResult.identifier, nil)
}
// 执行图像分类请求
do {
let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: .up)
try handler.perform([request])
} catch {
completion(nil, error)
}
}
}
```
注意上述代码中使用了一个 UIImage 的扩展方法 `pixelBuffer(width:height:)`,该方法可以将 UIImage 转换为 `CVPixelBuffer`:
```swift
extension UIImage {
func pixelBuffer(width: Int, height: Int) -> CVPixelBuffer? {
let attrs = [kCVPixelBufferCGImageCompatibilityKey: kCFBooleanTrue,
kCVPixelBufferCGBitmapContextCompatibilityKey: kCFBooleanTrue] as CFDictionary
var pixelBuffer: CVPixelBuffer?
let status = CVPixelBufferCreate(kCFAllocatorDefault, width, height, kCVPixelFormatType_32ARGB, attrs, &pixelBuffer)
guard status == kCVReturnSuccess, let buffer = pixelBuffer else {
return nil
}
CVPixelBufferLockBaseAddress(buffer, .init(rawValue: 0))
defer { CVPixelBufferUnlockBaseAddress(buffer, .init(rawValue: 0)) }
let context = CGContext(data: CVPixelBufferGetBaseAddress(buffer),
width: width,
height: height,
bitsPerComponent: 8,
bytesPerRow: CVPixelBufferGetBytesPerRow(buffer),
space: CGColorSpaceCreateDeviceRGB(),
bitmapInfo: CGImageAlphaInfo.noneSkipFirst.rawValue)
guard let cgImage = self.cgImage, let cgContext = context else {
return nil
}
cgContext.draw(cgImage, in: CGRect(x: 0, y: 0, width: width, height: height))
return buffer
}
}
```
使用示例如下:
```swift
let image = UIImage(named: "exampleImage")
let classifier = ImageClassifier()
classifier.classify(image: image) { result, error in
if let error = error {
print("Classification error: \(error.localizedDescription)")
} else if let result = result {
print("Image classified as \(result)")
}
}
```
这是一个简单的示例,实际使用中可能需要根据你的模型的输入和输出进行一些调整。