iOS MachineLearning 系列(7)—— 图片相似度分析

简介: 图片相似度分析是Vision框架中提供的高级功能。其本质是计算图片的特征值,通过特征值的比较来计算出图片特征差距,从而可以获取到图片的相似程度。在实际应用中,图片的相似度分析有着广泛的应用。如人脸对比识别,相似物品的搜索和识别等。

iOS MachineLearning 系列(7)—— 图片相似度分析

图片相似度分析是Vision框架中提供的高级功能。其本质是计算图片的特征值,通过特征值的比较来计算出图片特征差距,从而可以获取到图片的相似程度。在实际应用中,图片的相似度分析有着广泛的应用。如人脸对比识别,相似物品的搜索和识别等。

进行图片相似度计算前,首先需要对图片的特征值进行分析。使用VNGenerateImageFeaturePrintRequest类创建图片特征分析请求。定义如下:

open class VNGenerateImageFeaturePrintRequest : VNImageBasedRequest {
    // 图片的裁切和缩放配置
    open var imageCropAndScaleOption: VNImageCropAndScaleOption
    // 结果列表
    open var results: [VNFeaturePrintObservation]? { get }
}

VNFeaturePrintObservatio结果实例中封装了特征数据:

open class VNFeaturePrintObservation : VNObservation {
    // 特征类型
    open var elementType: VNElementType { get }
    // 特征元素数量
    open var elementCount: Int { get }
    // 特征数据
    open var data: Data { get }
    // 进行差距比较
    open func computeDistance(_ outDistance: UnsafeMutablePointer<Float>, to featurePrint: VNFeaturePrintObservation) throws
}

其中computeDistance方法即用来进行两个分析结果的特征差距计算。对于完全一样的图片,计算的差距为0,差距越大,表明图片的相似度越小。

下面提供了完整的Demo代码:

import UIKit
import Vision

class ImageFeatureViewController: UIViewController {
    
    let image1 = UIImage(named: "cat1")!
    let image2 = UIImage(named: "cat2")!
    let image3 = UIImage(named: "dog1")!
    let image4 = UIImage(named: "dog2")!
    lazy var imageView1 = UIImageView(image: image1)
    lazy var imageView2 = UIImageView(image: image2)
    lazy var imageView3 = UIImageView(image: image3)
    lazy var imageView4 = UIImageView(image: image4)
    

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        
        view.addSubview(imageView1)
        view.addSubview(imageView2)
        view.addSubview(imageView3)
        view.addSubview(imageView4)
        
        let width = (self.view.frame.width - 60) / 2
        let h1 = width / (image1.size.width / image1.size.height)
        let h2 = width / (image2.size.width / image2.size.height)
        let h3 = width / (image3.size.width / image3.size.height)
        let h4 = width / (image4.size.width / image4.size.height)
        
        imageView1.frame = CGRect(x: 20, y: 100, width: width, height: h1)
        imageView2.frame = CGRect(x: width + 40, y: 100, width: width, height: h2)
        imageView3.frame = CGRect(x: 20, y: max(h1, h2) + 120, width: width, height: h3)
        imageView4.frame = CGRect(x: width + 40, y: max(h1, h2) + 120, width: width, height: h4)
        // 进行特征值分析
        sendRequest(image: image1, number: 1)
        sendRequest(image: image2, number: 2)
        sendRequest(image: image3, number: 3)
        sendRequest(image: image4, number: 4)           
    }
    
    func sendRequest(image: UIImage, number: Int) {
        let handler = VNImageRequestHandler(cgImage: image.cgImage!, orientation: .up)
        let request = VNGenerateImageFeaturePrintRequest { result, error in
            guard error == nil else {
                print(error!)
                return
            }
            let r = result as! VNGenerateImageFeaturePrintRequest
            if number == 1 {
                self.result1 = r.results?.first
            }
            if number == 2 {
                self.result2 = r.results?.first
            }
            if number == 3 {
                self.result3 = r.results?.first
            }
            if number == 4 {
                self.result4 = r.results?.first
            }
            if let result1 = self.result1, let result2 = self.result2, let result3 = self.result3, let result4 = self.result4 {
                // 进行相似性对比
                var distance12 = Float(0)
                try! result1.computeDistance(&distance12, to: result2)
                var distance13 = Float(0)
                try! result1.computeDistance(&distance13, to: result3)
                var distance34 = Float(0)
                try! result3.computeDistance(&distance34, to: result4)
                print("图1与图2相似差距:", distance12)
                print("图1与图3相似差距:", distance13)
                print("图3与图4相似差距:", distance34)
                DispatchQueue.main.async {
                    let l = UILabel()
                    l.text = "图1与图2相似差距:\(distance12)\n图1与图3相似差距:\(distance13)\n图3与图4相似差距:\(distance34)"
                    l.font = .boldSystemFont(ofSize: 22)
                    self.view.addSubview(l)
                    l.frame = CGRect(x: 0, y: max(self.imageView3.frame.height, self.imageView4.frame.height) + self.imageView3.frame.origin.y, width: self.view.frame.width, height: 100)
                    l.numberOfLines = 0
                }
            }
        }
        try? handler.perform([request])
    }
    
    var result1: VNFeaturePrintObservation?
    var result2: VNFeaturePrintObservation?
    var result3: VNFeaturePrintObservation?
    var result4: VNFeaturePrintObservation?

}

可以看到,上面两只猫的相似差距为12,猫和狗的相似差距为26,两只狗的相似差距为8。

目录
相关文章
|
27天前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统无疑是主角。它们各自拥有独特的特点和优势,为开发者提供了不同的开发环境和工具。本文将深入浅出地探讨安卓和iOS开发环境的主要差异,包括开发工具、编程语言、用户界面设计、性能优化以及市场覆盖等方面,旨在帮助初学者更好地理解两大平台的开发特点,并为他们选择合适的开发路径提供参考。通过比较分析,我们将揭示不同环境下的开发实践,以及如何根据项目需求和目标受众来选择最合适的开发平台。
34 2
|
9天前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
|
16天前
|
安全 Linux Android开发
探索安卓与iOS的安全性差异:技术深度分析
本文深入探讨了安卓(Android)和iOS两个主流操作系统平台在安全性方面的不同之处。通过比较它们在架构设计、系统更新机制、应用程序生态和隐私保护策略等方面的差异,揭示了每个平台独特的安全优势及潜在风险。此外,文章还讨论了用户在使用这些设备时可以采取的一些最佳实践,以增强个人数据的安全。
|
1月前
|
IDE 开发工具 Android开发
安卓与iOS开发环境对比分析
本文将探讨安卓和iOS这两大移动操作系统在开发环境上的差异,从工具、语言、框架到生态系统等多个角度进行比较。我们将深入了解各自的优势和劣势,并尝试为开发者提供一些实用的建议,以帮助他们根据自己的需求选择最适合的开发平台。
29 1
|
2月前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
【8月更文挑战第20天】在移动应用开发的广阔天地中,Android和iOS两大平台各自占据着重要的位置。本文将深入探讨这两种操作系统的开发环境,从编程语言到开发工具,从用户界面设计到性能优化,以及市场趋势对开发者选择的影响。我们旨在为读者提供一个全面的比较视角,帮助理解不同平台的优势与挑战,并为那些站在选择十字路口的开发者提供有价值的参考信息。
|
2月前
|
开发框架 Android开发 Swift
安卓与iOS应用开发对比分析
【8月更文挑战第20天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。本文将深入探讨这两大操作系统在开发环境、编程语言、用户界面设计、性能优化及市场分布等方面的差异和特点。通过比较分析,旨在为开发者提供一个宏观的视角,帮助他们根据项目需求和目标受众选择最合适的开发平台。同时,文章还将讨论跨平台开发框架的利与弊,以及它们如何影响着移动应用的开发趋势。
|
2月前
|
安全 搜索推荐 Android开发
安卓与iOS应用开发的对比分析
【8月更文挑战第20天】在移动应用开发领域,安卓和iOS两大平台各领风骚。本文通过深入探讨两者的开发环境、编程语言、用户界面设计、应用市场及分发机制等方面的差异,揭示了各自的优势和挑战。旨在为开发者提供决策支持,同时帮助理解为何某些应用可能优先选择在一个平台上发布。
30 2
|
2月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的大舞台上,安卓与iOS两大操作系统各占半壁江山。本文将深入浅出地比较两者的开发环境,从开发工具、编程语言到用户界面设计等多个维度进行剖析,旨在为初入行的开发者们提供一盏明灯,帮助他们选择适合自己的开发路径。通过实例分析和数据支持,我们将揭示这两个平台的独特优势和潜在挑战,以及它们如何影响应用的性能和用户体验。
59 1
|
2月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓与iOS两大平台各占半壁江山。本文通过浅显的语言和直观的比喻,探讨了这两大操作系统在开发环境上的差异与特点,旨在为初入行的开发者们提供一个清晰的指南。我们将从开发工具、编程语言、用户界面设计以及生态系统四个方面进行比较,帮助读者理解每个平台的优势与局限。
|
2月前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的大潮中,安卓和iOS两大平台各自展现出独特的开发环境和生态系统。本文将从开发者的角度出发,深入探讨这两个平台在编程语言、开发工具、用户界面设计以及市场分布等方面的不同特点。通过比较分析,旨在为移动应用开发者提供一份实用的参考,帮助他们在项目初期做出更加明智的平台选择。