机器学习 Machine Learing 项目地址
####机器学习的分类
有监督学习 – 准确,但是费时间
给机器一个对应关系 (指着一个手机 告诉机器他是手机) — 训练 (给训练数据贴标签label)
训练完成后 指着手机问它是什么 — 输入
告诉我们它是手机 — 输出 output
无监督学习
不给出对应关系 只是扔一堆东西给机器, 机器最终只能辨别出哪些东西是一类, 哪些不是一类, 仅此而已
半监督学习
增强学习 alphaGo
使用苹果提供的Core ML2 苹果也提供了一些训练好的数据,可以在项目中直接使用
苹果机器学习官网地址
目前苹果开放的一些可用的人工智能库
我们先用官网提供的一些训练模型尝试下使用,再去网上找一些Pyton训练好的模型来使用
我们在官网找到想要使用的模型 MobileNetV2FP16
然后下载到本地 导入到项目中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 // // ViewController.swift // ML // // Created by MoneyLee on 2020/8/21. // Copyright © 2020 MoneyLee. All rights reserved. // import UIKit //机器学习必须引用的 import CoreML //视界 图像类的工具 import Vision class ViewController: UIViewController { @IBOutlet weak var showImgV: UIImageView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } @IBAction func camreClick(_ sender: UIBarButtonItem) { let picker = UIImagePickerController() picker.delegate = self picker.sourceType = .camera present(picker, animated: true, completion: nil) } } extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let img = info[.originalImage] as? UIImage { showImgV.image = img navigationItem.title = "识别中..." //转化为CIImage guard let ciImg = CIImage(image: img) else { fatalError("不能把图像转化为CIImage") } //加载训练好的模型 guard let model = try? VNCoreMLModel(for: MobileNetV2FP16().model) else { fatalError("加载ML Model失败") } //创建识别请求 let request = VNCoreMLRequest(model: model) { (req, error) in //请求的回调 res 识别的结果 guard let res = req.results else { // fatalError("图像识别失败") self.navigationItem.title = "图片识别失败" return } let classifcations = res as! [VNClassificationObservation] if classifcations.isEmpty { print("没有识别成功") self.navigationItem.title = "没有识别成功" } else { //取识别概率最大的结果 print(classifcations.first!.identifier) self.navigationItem.title = classifcations.first!.identifier } } //苹果的model图像是正方型, 我们将获取的图像转换为正方型 有助于识别, 默认是原图 request.imageCropAndScaleOption = .centerCrop //执行识别请求 do { try VNImageRequestHandler(ciImage: ciImg).perform([request]) } catch { print("执行图像识别请求失败, 原因是: \(error.localizedDescription)") } } picker.dismiss(animated: true, completion: nil) } }
项目地址
如何转化网上第三方的Model转化为MLModel 供iOS使用 使用官网提供的 ML Tools转化三方Model
下载工具地址
文档地址
使用coremltools Python软件包将第三方培训库(例如TensorFlow 和PyTorch)的模型 转换为Core ML 格式。然后,您可以使用Core ML将模型集成到您的应用程序中。
Core ML为所有模型提供统一的表示形式。您的应用程序使用Core ML API和用户数据在用户设备上进行预测并微调模型。严格在用户设备上运行模型将消除对网络连接的任何需求,这有助于保持用户数据的私密性和您的应用程序的响应速度。
Core ML通过利用CPU,GPU和神经引擎来优化设备上的性能,同时最大程度地减少其内存占用空间和功耗。
该coremltools Python包 是第三方模型转换到核心ML格式的主要方式。
使用coremltools,您可以执行以下操作:
将训练有素的模型从TensorFlow 和PyTorch 等框架转换为Core ML格式。
读取,写入和优化Core ML模型。
通过使用Core ML进行预测来验证macOS中的转换/创建。
您可以将训练有素的模型从以下框架转换为Core ML格式:
coremltools支持Python 2和Python3。我们建议您使用Conda 或virtualenv 安装Python 3.6或更高版本。
📘Python 2.7支持 由于Python 核心团队不再支持Python 2 ,因此我们建议使用Python 3以获得coremltools的最佳体验。到2020年底,我们将继续完全支持Python 2.7,但是coremltools的未来版本可能不支持Python 2.7。请相应地计划您的迁移。
跟着这些步骤:
安装pip 软件包安装程序,以便可以使用它安装coremltools。
安装Python软件包管理器以为coremltools创建一个Python环境。我们建议使用Conda, 因为它是安装所有必需依赖项(例如numpy)的最可靠方法。您可以改为使用virtualenv 。
使用为其提供的软件包指南安装用于转换的第三方源软件包(例如TensorFlow 和PyTorch )。该coremltools包中不 包括第三方源代码包。
python正常有自带的 但是版本低 建议升级下 再安装个pip包管理工具 都自行百度吧 很简单
安装转换工具 coremltools
sudo pip3 install -U coremltools
我的是pip3
查找共享模型 caffe提供的开源模型
找到可以识别各种花的模型 CaffeNet fine-tuned for Oxford flowers dataset
找到其网站上的下载地址 可能需要翻墙 或者下载比较缓慢
比较大 推荐使用下载工具 Motrix
我们最终需要三个文件
我们获得下面这3个文件
我们需要对其中的 class_labels.py修改下 我们需要一个.txt文件 并且内部的数据需要整理成如下格式
我们可以把前后的多余字符去掉,然后利用字符串分隔,再通过控制台打印的方式快速得到这个数据,然后复制到文件内,可以使用我demo内的StringTool工具来处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import UIKitstruct StringTool { func printUsigString (fileName: String, fileType: String) -> String { let path = Bundle .main.path(forResource: fileName, ofType: fileType) let url = URL (fileURLWithPath: path!) do { let data = try Data (contentsOf: url) let str = NSString (data:data ,encoding: String .Encoding .utf8.rawValue)! as String let result : Array = str.components(separatedBy: "', '" ) for item in result { print (item) } return str } catch { print ("读取本地数据出现错误: \(error.localizedDescription)" ) } return "获取失败" } }
最终我们得到这3个文件
oxford102.caffemodel: 被训练好的模型
class_labels: 转化输出
deploy.prototxt: 转化输入
我们该如何转换呢
转化caffe模型
####coremltools.converters.caffe.convert
coremltools.converters.caffe.``convert
(模型, image_input_names = [] ,is_bgr = 假, red_bias = 0.0, blue_bias = 0.0, green_bias = 0.0, gray_bias = 0.0, image_scale = 1.0, class_labels = 无, predicted_feature_name = 无, model_precision = ‘FLOAT32’ )
将Caffe模型转换为Core ML格式。参量型号:str | (str,str)| (str,str,str)| (str,str,dict) 经过训练的Caffe神经网络模型,可以表示为:磁盘上经过训练的Caffe模型(.caffemodel)的路径两个路径的元组,其中第一个路径是.caffemodel文件的路径,第二个路径是deploy.prototxt的路径。三个路径的元组,其中第一个路径是训练后的.caffemodel文件的路径,第二个路径是deploy.prototxt的路径,而第三个路径是平均图像二进制文件的路径,从输入中减去数据图像作为预处理步骤。.caffemodel和.prototxt的两个路径的元组,以及以图像输入名称为键的dict和以图像binaryprotos为值的路径。键应与通过参数“ image_input_name”提供的输入名称相同。
1 coremltools.converters.caffe.convert(model, image_input_names=[], class_labels=None, predicted_feature_name=None, model_precision='float32')
image_input_names=[]
这个参数是什么呢 打开deploy.prototxt文件
这里的input对应的参数就是我们要传入的
class_labels=None
这个参数放什么呢 就是我们class_labels文件的路径
再python环境下执行转换操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Python 3.7.9 (v3.7.9:13c94747c7, Aug 15 2020, 01:31:08) [Clang 6.0 (clang-600.0.57)] on darwin >>> import coremltools >>> >>> coreml_model = coremltools.converters.caffe.convert(('oxford102.caffemodel','deploy.prototxt'), image_input_names='data', class_labels='class_labels.txt') ================= Starting Conversion from Caffe to CoreML ====================== Layer 0: Type: 'Input', Name: 'input'. Output(s): 'data'. Ignoring batch size and retaining only the trailing 3 dimensions for conversion. Layer 1: Type: 'Convolution', Name: 'conv1'. Input(s): 'data'. Output(s): 'conv1'. Layer 2: Type: 'ReLU', Name: 'relu1'. Input(s): 'conv1'. Output(s): 'conv1'. Layer 3: Type: 'Pooling', Name: 'pool1'. Input(s): 'conv1'. Output(s): 'pool1'. Layer 4: Type: 'LRN', Name: 'norm1'. Input(s): 'pool1'. Output(s): 'norm1'. Layer 5: Type: 'Convolution', Name: 'conv2'. Input(s): 'norm1'. Output(s): 'conv2'. Layer 6: Type: 'ReLU', Name: 'relu2'. Input(s): 'conv2'. Output(s): 'conv2'.
注意在三个文件所在的文件夹路径内操作终端, 因为其中有个属性是文件路径, 因为我们在当前的文件夹内 所以可以输入文件名就行了
指定完成后
1 2 3 4 5 6 7 8 ================= Summary of the conversion: =================================== Detected input(s) and shape(s) (ignoring batch size): 'data' : 3, 227, 227 Network Input name(s): 'data'. Network Output name(s): 'prob'. >>>
给model取个名字
1 >>> coreml_model.save('oxford102.mlmodel')
查看文件内是否生成成功
把这个模型导入到项目内
使用到的资源文件 因为下载比较慢可以在百度云下载
1 链接:https://pan.baidu.com/s/1_WXy4jiTOkusapYv37S3rw 密码:8bvu
如何自己制作MLModel 苹果为我们提供了这个方式
创建ML
我们将要构建一个model 来区分狗和猫
首先我们需要获取大量狗和猫的图片
Test文件夹是存放我们用来验证结果的猫狗图片, 训练数据和测试数据分别占比 80% 20%
我们收集猫狗图片分别导入到4个文件夹内
训练及测试数据下载地址
1 链接:https://pan.baidu.com/s/1aUDT5HbXgjEOmAuOluY9DA 密码:rvae
创建一个playground, 必须是mac的 而且左下角切换为手动执行模式
我们将两个包图片的文件夹整合到一个文件夹内拖拽到里面
再将测试的数据文件夹同样拖拽到里面 就完成了制作
识别成功率100%
其实上面的方法即将被弃用了, 苹果已经在新版的XCode中集成了 create ML这个工具
通过这个工具更简单方便
然后点击上方的 Train开始训练
然后怎么将训练好的mode导出呢 我找了找没找到. 我勒个去. 只好这么做了, 找到工程文件, 右键显示包内容
这在里面呢
为什么如此简单呢, CreateMLUI这个库利用苹果的照片app和siri等苹果产品优化好的机器学习架构和一些优化好的算法已经提供给了我们, 使我们训练模型变得异常简单.我们只需要使用这个平台就可以实现一些需求 比如汽车识别,车牌识别和表情识别等等
如何提高我们的准确率呢?
可以利用各种角度 各种光线将测试数据图片进行旋转 或者明暗调节
有很多网站已经为我们提供了测试数据集 datasets
比较出名的是 Kaggle 谷歌旗下的 各行各业的数据集供我们使用 地址
自然语言Model的处理 我们这次搞一个自然语言的项目, 分辨好坏话, 比如美团的评论, 通过顾客的评语, 自动分类出是好评还是差评
但是因为中文的训练很麻烦, 对电脑的要求也很高,我们用英文进行编写
我们分辨是否是垃圾短信
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import Cocoa import CreateML //总数据 let data = try MLDataTable(contentsOf: URL(fileURLWithPath: "/Users/moneylee/Documents/Temp/spam.csv")) //把总数据分为训练数据和测试数据 let (trainingData,testingData) = data.randomSplit(by: 0.8, seed: 5) //开始训练--并得出情感识别器(sentimentClassifier)-也就是训练出来的mlmodel let sentimentClassifier = try MLTextClassifier(trainingData: trainingData, textColumn: "text", labelColumn: "label") //设置mlmodel元数据 let metadata = MLModelMetadata(author: "Lebus", shortDescription: "A model trained to classify spam SMS", version: "1.0") //保持mlmodel try sentimentClassifier.write(to: URL(fileURLWithPath: "/Users/moneylee/Documents/Temp/spam.mlmodel"), metadata: metadata) //识别是否是垃圾短信 try sentimentClassifier.prediction(from: "hi,how are you?") try sentimentClassifier.prediction(from: "Had your mobile 11 months or more? U R entitled to Update to the latest colour mobiles with camera for Free! Call The Mobile Update Co FREE on 08002986030")
如何使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import UIKitimport NaturalLanguageclass ViewController : UIViewController { override func viewDidLoad () { super .viewDidLoad() guard let model = try ? NLModel (mlModel: spam().model) else { fatalError ("加载mlmodel失败" ) } if let str = model.predictedLabel(for : "feel free to call 021-55558888 for more information" ){ print (str) } } }
中文情感语录数据集
自然语言关联项目的数据集下载地址
1 链接:https://pan.baidu.com/s/1axNkcjwNE4bkpFPFJXYhLQ 密码:ubti