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。

目录
相关文章
|
4天前
|
搜索推荐 Android开发 iOS开发
安卓与iOS系统的用户界面设计对比分析
本文通过对安卓和iOS两大操作系统的用户界面设计进行对比分析,探讨它们在设计理念、交互方式、视觉风格等方面的差异及各自特点,旨在帮助读者更好地理解和评估不同系统的用户体验。
33 1
|
4天前
|
JSON JavaScript 安全
iOS应用程序数据保护:如何保护iOS应用程序中的图片、资源和敏感数据
iOS应用程序数据保护:如何保护iOS应用程序中的图片、资源和敏感数据
27 1
|
4天前
|
Android开发 数据安全/隐私保护 iOS开发
安卓与iOS系统的发展趋势与比较分析
【2月更文挑战第6天】 在移动互联网时代,安卓和iOS系统作为两大主流移动操作系统,各自呈现出不同的发展趋势。本文将从技术角度出发,对安卓和iOS系统的发展方向、特点及未来趋势进行比较分析,以期为读者提供更深入的了解和思考。
46 4
|
4天前
|
存储 缓存 安全
基于iOS平台的高效图片缓存策略实现
【4月更文挑战第22天】 在移动应用开发中,图片资源的加载与缓存是影响用户体验的重要因素之一。尤其对于iOS平台,由于设备存储空间的限制以及用户对流畅性的高要求,设计一种合理的图片缓存策略显得尤为关键。本文将探讨在iOS环境下,如何通过使用先进的图片缓存技术,包括内存缓存、磁盘缓存以及网络请求的优化,来提高应用的性能和响应速度。我们将重点分析多级缓存机制的设计与实现,并对可能出现的问题及其解决方案进行讨论。
|
4天前
|
存储 缓存 算法
实现iOS平台的高效图片缓存策略
【4月更文挑战第22天】在移动应用开发中,图片资源的处理是影响用户体验的重要因素之一。特别是对于图像资源密集型的iOS应用,如何有效地缓存图片以减少内存占用和提升加载速度,是开发者们面临的关键挑战。本文将探讨一种针对iOS平台的图片缓存策略,该策略通过结合内存缓存与磁盘缓存的机制,并采用先进的图片解码和异步加载技术,旨在实现快速加载的同时,保持应用的内存效率。
|
4天前
|
存储 缓存 iOS开发
基于iOS的高效图片缓存策略实现
【4月更文挑战第9天】在移动应用开发中,图片资源的加载与缓存是影响用户体验的重要因素之一。特别是对于iOS平台,合理设计图片缓存策略不仅能够提升用户浏览图片时的流畅度,还能有效降低应用程序的内存压力。本文将介绍一种针对iOS环境优化的图片缓存技术,该技术通过多级缓存机制和内存管理策略,实现了图片快速加载与低内存消耗的目标。我们将从系统架构、关键技术细节以及性能评估等方面展开讨论,为开发者提供一套实用的图片缓存解决方案。
24 0
|
4天前
|
存储 缓存 iOS开发
实现iOS平台的高效图片缓存策略
【4月更文挑战第4天】在移动应用开发中,图片资源的加载与缓存是影响用户体验的关键因素之一。尤其对于iOS平台,由于设备存储和内存资源的限制,设计一个高效的图片缓存机制尤为重要。本文将深入探讨在iOS环境下,如何通过技术手段实现图片的高效加载与缓存,包括内存缓存、磁盘缓存以及网络层面的优化,旨在为用户提供流畅且稳定的图片浏览体验。
|
4天前
|
安全 搜索推荐 Android开发
Android 与 iOS 的比较分析
【2月更文挑战第5天】 Android 和 iOS 是目前市场上两种最流行的移动操作系统,它们都拥有自己的特点和优势。本文将会分别从操作系统设计、应用生态、安全性等方面对这两种操作系统进行比较和分析,希望能够帮助读者更好地选择适合自己的移动设备。
|
4天前
|
JSON JavaScript 安全
iOS 应用程序数据保护:如何保护 iOS 应用程序中的图片、资源和敏感数据
iOS 应用程序数据保护:如何保护 iOS 应用程序中的图片、资源和敏感数据
|
8月前
|
缓存 iOS开发
iOS LaunchScreen.storyboard 启动页设置图片不显示
iOS LaunchScreen.storyboard 启动页设置图片不显示
148 0