一:我們需要在Main.storyboard中拉出來label和button和imageView
如下圖所示 :
1:在紅框的位置選取button和label和imageView
image
2:之后將imageView拖拉進(jìn)去挚歧,如下圖所示
image
3:接下來党晋,我們按照上面的方法來把button和label也放到imageView的上面褐筛,最終的效果圖如下:
image
4:然后我們?yōu)榱诉m配大多數(shù)的iphone機型刑枝,我們來給button添加限制條件
我們先給imageView添加限制條件吧松靡!
在左下角的第二個按鈕我們限制圖片的width和height分別為374和816,距離手機上部距離為40匀油,下部距離為6凑懂,左右距離為20
image
5:我們給label和button也加上這樣的限制
image
image
6:為了能夠直觀地看到button和label我們來改變這兩個控件的顏色
在background中設(shè)置它的屬性
image
7:完成之后,我們點擊那個雙圓圈按鈕切換到雙頁面虽惭,按住control鍵拖拉storyboard中的控件到代碼里面橡类,并且設(shè)置按鈕的名字。
image
image
完成了storyboard之后芽唇,在代碼端是下面這個樣式
image
二:接下來我們的操作
(1):我們把訓(xùn)練好的模型導(dǎo)入到我們的project中(拖拉到頁面右端)
image
(2):接下來我們給兩個button添加點擊事件
//當(dāng)點擊拍照時調(diào)用takephoto這個方法
camer_button.addTarget(self, action: #selector(takephoto), for: .touchUpInside)
//當(dāng)點擊從相冊中選擇的時候調(diào)用chooseImageFromLibrary這個方法
photos_button.addTarget(self, action: #selector(chooseImageFromLibrary), for: .touchUpInside)
(4):接著我們在chooseImageFromLibrary中實現(xiàn)從相冊中獲取圖片的功能
@objc func chooseImageFromLibrary(_ sender: Any) {
//判斷是否可以打開相冊
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary) {
//調(diào)用打開相冊權(quán)限的函數(shù)
let imagePicker = UIImagePickerController()
//設(shè)置代理
imagePicker.delegate = self
//設(shè)置控制器的類型---相冊
imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary
//圖片不允許編輯
imagePicker.allowsEditing = false
//跳轉(zhuǎn)到控制器---相冊
self.present(imagePicker,animated: true,completion: nil)
}
}
三:我們選取圖片之后顾画,開始通過我們導(dǎo)入的模型來分析選中的圖片,我們在imagePickerController這個函數(shù)中實現(xiàn)
//獲取圖片后的操作
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
//獲取圖像
if let pickedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
display_label.text = "分析中"
//圖片填充模式--等比例縮放圖片
image.contentMode = .scaleToFill
image.layer.masksToBounds = true
//在imageView上顯示獲取到的圖片
image.image = pickedImage
//加載模型
guard let model = try? VNCoreMLModel(for:ImageClassifier().model) else {
fatalError("無法加載訓(xùn)練模型")
}
//創(chuàng)建一個模型請求
let requset = VNCoreMLRequest(model: model) {
[weak self] requesst,error in guard let results = requesst.results as? [VNClassificationObservation],
let topResult = results.first else {
fatalError("失敗")
}
//主線程更新UI
DispatchQueue.main.async {
print(topResult)
//顯示識別的結(jié)果
self!.display_label.text = "識別的結(jié)果是:\(Int(topResult.confidence*100))%是\(topResult.identifier)"
//if topResult.confidence < 0.99{
// self!.display_label.text = "識別的結(jié)果是:\(Int(topResult.confidence*100))%是\(topResult.identifier)"
//}
//else {
// self!.display_label.text = "識別的結(jié)果是:非貓非狗"
}
}
}
//將獲取到的圖片轉(zhuǎn)換為CIImage類型作為參數(shù)傳遞給模型
guard let ciImage = CIImage(image: pickedImage) else {
fatalError("不能獲取選擇到的圖片")
}
//運行圖片分類識別器
let handler = VNImageRequestHandler(ciImage: ciImage)
DispatchQueue.global().async {
do {
try handler.perform([requset])
}
catch {
print(error)
}
}
}
picker.dismiss(animated: true, completion: nil)
}
最后,也是最重要的事情匆笤,需要在Info.plist中加入調(diào)用相機的權(quán)限
image