初试iOS coreML

2017年7月 暑假

之前一直被各种事缠着,今天终于静下心来学习了苹果的Core ML 。

WWDC2017,苹果推出了Core ML, 初入IOS开发,硬生生看完了苹果关于Core  ML的介绍视频,地址https://developer.apple.com/videos/play/wwdc2017/703/

被视频中的那个识别图片Demo吸引住,就去苹果官网https://developer.apple.com/machine-learning/下载了第四个机器学习模型VGG16。

在Xcode -beta中新建一个项目MyCoreMLDemo,把下载好的模型直接拖入项目中。

在这里说一下自己对机器学习模型的理解:我们可以把训练好的模型看作一个函数,关注模型的输入参数类型和输出参数类型。

VGG16的输入参数类型:image<RGB,224,224>. ----一张224*224的图片(这个要特别注意,不然会报错:

Input image feature image does not match model description);

输出类型:classLabelProbs Dictionary<String,Double> 和 classLable   String

只要简单的三行代码,我们就可以使用VGG16模型:

一、建立模型对象

let model = VGG16.init()

二、输入数据

三、输出预测

研究VGG16的代码后发现,VGG16提供一个接口:

func prediction(image: CVPixelBuffer) throws -> VGG16Output {

        let input_ = VGG16Input(image: image)

        return try self.prediction(input: input_)

    }

这个函数封装了输入,并返回预测结果。这样更简便,像这样调用:

let outPut = try? model.prediction(image: buffer(from: imageView.image!)!)

但要注意的是,输入参数类型为 CVPixeBuffer(像素数据),而我提供的是照片,因此需要将图片转换成像素数据,google了一下,找到了下面的转换函数:

func buffer(from image: UIImage) -> CVPixelBuffer? {

        let attrs = [kCVPixelBufferCGImageCompatibilityKey: kCFBooleanTrue, kCVPixelBufferCGBitmapContextCompatibilityKey: kCFBooleanTrue] as CFDictionary

        var pixelBuffer : CVPixelBuffer?

        let status = CVPixelBufferCreate(kCFAllocatorDefault, Int(image.size.width), Int(image.size.height), kCVPixelFormatType_32ARGB, attrs, &pixelBuffer)

        guard (status == kCVReturnSuccess) else {

            return nil

        }

        

        CVPixelBufferLockBaseAddress(pixelBuffer!, CVPixelBufferLockFlags(rawValue: 0))

        let pixelData = CVPixelBufferGetBaseAddress(pixelBuffer!)

        

        let rgbColorSpace = CGColorSpaceCreateDeviceRGB()

        let context = CGContext(data: pixelData, width: Int(image.size.width), height: Int(image.size.height), bitsPerComponent: 8, bytesPerRow: CVPixelBufferGetBytesPerRow(pixelBuffer!), space: rgbColorSpace, bitmapInfo: CGImageAlphaInfo.noneSkipFirst.rawValue)

        

        context?.translateBy(x: 0, y: image.size.height)

        context?.scaleBy(x: 1.0, y: -1.0)

        

        UIGraphicsPushContext(context!)

        image.draw(in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height))

        UIGraphicsPopContext()

        CVPixelBufferUnlockBaseAddress(pixelBuffer!, CVPixelBufferLockFlags(rawValue: 0))

        

        return pixelBuffer

    }


(得找个时间研究一下)

这样就可以玩玩VGG16了。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值