使用ResNet在iOS上進行AI圖像分類

2021-01-07 源碼搜藏

在這裡,我們將設置您的示例應用程式,設置模型,弄清楚如何處理應用程式中的分類請求,並將轉換後的ResNet模型添加到項目中。

介紹

深度神經網絡在諸如圖像分類等任務上非常出色。擁有一半像樣的GPU的任何人現在都可以輕鬆獲得十年前耗資數百萬美元的結果以及整個研究團隊。但是,深度神經網絡有一個缺點。它們可能非常沉重且緩慢,因此它們並不總是在行動裝置上運行良好。幸運的是,Core ML提供了一個解決方案:它使您能夠創建在iOS設備上運行良好的苗條模型。

在本系列文章中,我們將向您展示如何以兩種方式使用Core ML。首先,您將學習如何將預先訓練的圖像分類器模型轉換為Core ML並在iOS應用中使用它。然後,您將訓練自己的機器學習(ML)模型並將其用於製作Not Hotdog應用程式-就像您在HBO的矽谷所見過的那樣。

在上一篇文章中將ResNet模型轉換為Core ML格式後,我們現在將在一個簡單的iOS應用程式中使用它。

設置示例應用程式

為了專注於手頭的主要任務-展示轉換後的ResNet模型的用法-我們將「借用」 Apple開發人員站點上可用的示例圖像分類應用程式。當您使用Xcode打開下載的應用程式項目時,將顯示簡短的「切題」說明:

看看-此說明可能會回答您的很多問題。要在iOS設備上運行示例應用程式,您需要執行設置團隊和唯一捆綁包標識符的常規步驟。我們建議您在真實設備上運行該應用程式,以便能夠使用該設備的相機。

該示例應用程式具有

ImageClassificationViewController

處理ML處理的三種主要方法。

設置模型

模型設置和分配給延遲初始化的classificationRequest變量:

lazy var classificationRequest: VNCoreMLRequest = { do { /* Use the Swift class `MobileNet` Core ML generates from the model. To use a different Core ML classifier model, add it to the project and replace `MobileNet` with that model's generated Swift class. */ let model = try VNCoreMLModel(for: MobileNet().model) let request = VNCoreMLRequest(model: model, completionHandler: { [weak self] request, error in self?.processClassifications(for: request, error: error) }) request.imageCropAndScaleOption = .centerCrop return request } catch { fatalError("Failed to load Vision ML model: \(error)") } }()

上面的代碼片段中最重要的一行是模型分配(let model = (…))。在許多情況下,這是切換到其他模型時唯一要更新的行。

注意VN類名稱中的前綴。這意味著這些類是Vision框架的一部分。該框架提供了高級API,旨在處理計算機視覺任務,例如面部和身體檢測,矩形檢測,身體和手姿勢檢測,文本檢測等。除了這些內部使用Apple創建的模型的高級API之外,Vision框架還公開了使用自定義Core ML模型進行ML圖像分析時非常方便的API。

雖然您可以直接使用Core ML,但是擁有Vision層可以減輕一些瑣碎的任務,例如圖像縮放和裁切,色彩空間和方向的轉換等。

在我們的示例應用程式中,一行代碼可以處理所有必需的任務:request.imageCropAndScaleOption = .centerCrop

每次模型分類完成時,processClassifications都會調用該方法來相應地更新UI。

在您的應用程式中處理分類請求

updateClassifications其他應用程式組件調用下一個方法,以啟動圖像分類:

func updateClassifications(for image: UIImage) { classificationLabel.text = "Classifying..." let orientation = CGImagePropertyOrientation(image.imageOrientation) guard let ciImage = CIImage(image: image) else { fatalError("Unable to create \(CIImage.self) from \(image).") } DispatchQueue.global(qos: .userInitiated).async { let handler = VNImageRequestHandler(ciImage: ciImage, orientation: orientation) do { try handler.perform([self.classificationRequest]) } catch { /* This handler catches general image processing errors. The `classificationRequest`'s completion handler `processClassifications(_:error:)` catches errors specific to processing that request. */ print("Failed to perform classification.\n\(error.localizedDescription)") } } }

此方法接受單個參數,image並classificationRequest以線程安全的方式在內部調用先前配置的參數。

顯示分類結果

最後一種「主要」方法負責使用分類結果更新UI:

func processClassifications(for request: VNRequest, error: Error?) { DispatchQueue.main.async { guard let results = request.results else { self.classificationLabel.text = "Unable to classify image.\n\(error!.localizedDescription)" return } // The `results` will always be `VNClassificationObservation`s, as specified by the Core ML model in this project. let classifications = results as! [VNClassificationObservation] if classifications.isEmpty { self.classificationLabel.text = "Nothing recognized." } else { // Display top classifications ranked by confidence in the UI. let topClassifications = classifications.prefix(2) let descriptions = topClassifications.map { classification in // Formats the classification for display; e.g. "(0.37) cliff, drop, drop-off". return String(format: " (%.2f) %@", classification.confidence, classification.identifier) } self.classificationLabel.text = "Classification:\n" + descriptions.joined(separator: "\n") } } }

此方法顯示模型可信度最高的前兩個預測標籤(let topClassifications =classifications.prefix(2))。

其餘方法處理相機和捕獲的圖片。它們不是特定於ML的。

Inspec MobileNet模型

如果單擊資源管理器中的MobileNet.mlmodel文件,則可以檢查模型詳細信息:

除了「輸入和輸出」定義外,此處還提供了大量的元數據:作者,詳細說明和許可證。

將模型添加到應用程式

現在是時候將我們轉換後的ResNet模型添加到項目中了。最簡單的方法是將其從Finder中拖放到Xcode的資源管理器中。請記住,這僅將模型連結到應用程式。該模型並未物理複製到項目文件夾中。如果要將新模型與應用程式的其餘部分保留在一起,則需要在連結之前手動將其複製到那裡。

完成此步驟後,您可以查看ResNet模型描述:

在我們的情況下,僅指定名稱,類型,大小,輸入和輸出。如果您考慮分發模型,則應考慮使用有意義的信息填充這些欄位。這可以使用coremltoolsPython庫完成。

使用轉換後的ResNet模型運行您的應用

要使用您拖放到Xcode項目中的轉換後的模型,我們需要在ImageClassificationViewController.swift文件中更改一行代碼:

因為在轉換過程中我們選擇「 13」作為最低iOS版本,所以您需要相應地更改目標平臺設置:

完成上述更改後,您可以使用ResNet模型立即運行預測:

MobileNet和ResNet模型之間的區別很明顯:MobileNet返回具有置信度概率的標籤(由於softmax層),而ResNet返回「原始」,未縮放的神經網絡輸出。如果需要,可以通過在ResNet模型中添加自定義層或通過對應用程式中返回的結果計算softmax來解決此問題。

摘要

現在,我們有一個示例應用程式,可以與轉換後的ResNet圖像分類模型一起正常運行。事實證明,iOS 13設備不僅能夠成功運行簡化的「移動」 ML模型,而且還能夠成功運行原始(大型)模型。

看起來我們可以在iOS應用中使用任何圖像分類模型(包括轉換後的模型)。為了達到本系列的目標,我們現在需要的是一個可以檢測熱狗的模型。MobileNet和ResNet模型都已經能夠檢測熱狗,但是這裡有趣的任務是了解它們如何實現。

相關焦點

  • 獨家 | kaggle季軍新手筆記:利用fast.ai對油棕人工林圖像進行快速分類(附代碼)
    最後,對數據進行轉換,使用flip_vert = True翻轉圖像有助於模型識別圖像。利用imagenet_stats對圖像歸一化處理。注意:這是一種轉移學習技術,我要說的是需要保持操作儘可能簡單。圖像預覽不管有沒有油棕種植園,衛星圖像是這樣的:顯示2批圖像
  • VGGNet、ResNet、Inception和Xception圖像分類及對比
    在這種背景下,目標是訓練一個模型,可以將輸入圖像分類為 1000 個獨立的對象類別。本節將使用由超過 120 萬幅訓練圖像、50000 幅驗證圖像和 100000 幅測試圖像預訓練出的模型。Xception 使用了一種叫作深度可分離卷積運算的新概念,它可以在包含 3.5 億個圖像和 17000 個類的大型圖像分類數據集上勝過 Inception-v3。由於 Xception 架構具有與 Inception-v3 相同的參數數量,因此性能提升不是由於容量的增加,而是由於更高效地使用了模型參數。
  • 【乾貨】PyTorch實例:用ResNet進行交通標誌分類
    ResNet for Traffic Sign Classification With PyTorch德國交通標誌識別基準數據集:可能是自動駕駛汽車領域最受歡迎的圖像分類數據集。 自動駕駛車輛需要對交通標誌進行檢測和分類,以了解應用於路段的交通規則。 也許,這個數據集太小而且不完整,無法用於實際應用。
  • ResNet - 2015年 ILSVRC 的贏家(圖像分類,定位及檢測)
    -2015-image-classification-localization-detection-e39402bfa5d8在本文,我們ResNet進行了回顧。跳過連接可以實現更深入的網絡,最終ResNet成為ILSVRC 2015在圖像分類,檢測和定位方面的贏家,和MS COCO 2015檢測和分割的獲勝者。ILSVRC 2015圖像分類排名ImageNet是一個包含超過1500萬個標記的高解析度圖像的數據集,包含大約22,000個類別。 ILSVRC在1000個類別中的每一個中使用大約1000個圖像的ImageNet子集。
  • Serverless 架構下 Python 輕鬆搞定圖像分類
    簡介: 本文將會通過一個有趣的 Python 庫,快速將圖像分類的功能搭建在雲函數上,並且和 API 網關結合,對外提供 API 功能,實現一個 Serverless 架構的「圖像分類 API」。前言圖像分類是人工智慧領域的一個熱門話題。通俗解釋就是,根據各自在圖像信息中所反映的不同特徵,把不同類別的目標區分開來的圖像處理方法。
  • 使用卷積神經網絡進行圖像分類
    為什麼使用CNN進行圖像分類?圖像分類通過從圖像中提取特徵,以觀察數據集中的某些模式。由於可訓練參數變得非常大,因此使用ANN進行圖像分類最終會在計算上造成很高的成本。例如,如果我們有一張50 X 50的貓圖像,並且我們想在該圖像上訓練傳統的ANN,以將其分類為狗或貓,則可訓練參數變為–(50 * 50)* 100圖像像素乘以隱藏層 + 100 偏差+ 2 * 100 輸出神經元+ 2 偏差= 2,50,302我們在使用CNN時使用了過濾器,過濾器根據其用途而存在許多不同類型。過濾器通過在神經元之間執行局部連接模式來幫助我們利用特定圖像的空間局部性。
  • 快速訓練殘差網絡 ResNet-101,完成圖像分類與預測,精度高達 98%|...
    即在預訓練模型的基礎上,採用101層的深度殘差網絡ResNet-101,對如下圖所示的花數據集進行訓練,快速實現了對原始圖像的分類和預測,最終預測精確度達到了驚人的98%。遷移學習(1) 遷移學習簡介什麼是遷移學習呢?
  • U-Net 和 ResNet:長短跳躍連接的重要性(生物醫學圖像分割)
    在RoR中,通過使用長短跳躍連接,圖像分類準確性得到提高。實驗結果證明了使用長短跳躍連接的有效性。這一次,作者還提供了一種通過分析網絡中的權重來展示其有效性的方法,而不僅僅是展示實驗結果。儘管這項工作的目的是進行生物醫學圖像分割,但通過觀察網絡內的權重,我們可以更好地理解長短跳躍連接。它發布於2016年DLMIA(醫學圖像分析中的深度學習),引用次數超過100次。
  • Serverless 實戰:用 20 行 Python 代碼輕鬆搞定圖像分類和預測
    圖像分類是人工智慧領域的一個熱門話題,通俗來講,就是根據各自在圖像信息中反映的不同特徵,把不同類別的目標區分開。圖像分類利用計算機對圖像進行定量分析,把圖像或圖像中的每個像元或區域劃歸為若干個類別中的某一種,代替人的視覺判讀。
  • 使用FastAI 和即時頻率變換進行音頻分類
    目前深度學習模型能處理許多不同類型的問題,對於一些教程或框架用圖像分類舉例是一種流行的做法,常常作為類似「hello, world」 那樣的引例。FastAI 是一個構建在 PyTorch 之上的高級庫,用這個庫進行圖像分類非常容易,其中有一個僅用四行代碼就可訓練精準模型的例子。
  • 1500萬個標記圖像、2萬多個分類!如今的AI圖像分類器還是「睜眼瞎」
    十年前,ImageNet的開發團隊便從網際網路上抓取了數百萬張圖像,以此成為了亞馬遜機械土耳其人的世界上最大的學術用戶。他們利用了一些零碎的人力以每分鐘平均50張圖像的速度進行抓取後分成數千個類別。研究人員Paglen說,該項目的一部分也是為了突出ImageNet項目的一些缺陷,比如會以「種族歧視」、「人格冒犯」的方式對人們進行分類。曾在Twitter上出現的一個有趣的例子:一些男性在上傳了本人的照片後,接著就被隨機標記為「強姦嫌疑人」,據外媒表示,這其中的原因無法解釋。
  • 如何用PyTorch訓練圖像分類器
    PyTorch並想學習如何進行基本的圖像分類,那麼你可以參考本教程。它將介紹如何組織訓練數據,使用預訓練神經網絡訓練模型,然後預測其他圖像。為此,我將使用由Google地圖中的地圖圖塊組成的數據集,並根據它們包含的地形特徵對它們進行分類。我會在另一篇文章中介紹如何使用它(簡而言之:為了識別無人機起飛或降落的安全區域)。但是現在,我只想使用一些訓練數據來對這些地圖圖塊進行分類。下面的代碼片段來自Jupyter Notebook。
  • Google最新開源Inception-ResNet-v2,藉助殘差網絡進一步提升圖像...
    聯合編譯:Blake、高斐2016年8月31日,Google團隊宣布針對TensorFlow開源了最新發布的TF-slim資料庫,它是一個可以定義、訓練和評估模型的輕量級的軟體包,也能對圖像分類領域中幾個主要有競爭力的網絡進行檢驗和定義模型
  • 如果我們想要更好的目標分割,我們最好使用resnet-50的網絡結構
    卷積網絡是研究圖像分類的非常有效的方法,它能夠產生豐富的學習框架,能夠做很多複雜的預測。但是,在什麼情況下它非常有效呢?解決不同任務需要不同的方法。我們已經研究過人臉識別(single-identitydetection)。
  • 圖像分割中的深度學習:U-Net 體系結構
    例如,我們無法使用手機上的攝像頭來收集生物醫學圖像。因此,我們需要更系統的方法來收集數據。此外,在數據標記過程中,僅僅依靠開發人員/工程師是不夠的 , 這需要大量具備專業知識和經驗的人員對相關圖像進行分類,對於醫療診斷等高度專業化的領域尤其如此。另一個關鍵點是通過類標籤在經典卷積神經網絡中提供有關一般圖像的教育。但是,有些問題需要了解基於像素的方法的局部或位置。
  • 【深度學習】使用 Pytorch 進行多類圖像分類
    訓練中有大約 14k 圖像,測試中有 3k,預測中有 7k。這是一個多類圖像分類問題,目標是將這些圖像以更高的精度分類到正確的類別中。添加我們自己的分類器層現在要將下載的預訓練模型用作我們自己的分類器,我們必須對其進行一些更改,因為我們要預測的類數可能與模型已訓練的類數不同。另一個原因是有可能(幾乎在所有情況下)模型已經過訓練以檢測某些特定類型的事物,但我們想使用該模型檢測不同的事物。
  • 如何優化你的圖像分類模型效果?
    一種不錯的方式是先用小的尺寸,如64 x 64進行訓練,再用這個模型的參數,在128 x 128尺寸上進行訓練,如此以往。每個較大的模型都在其體系結構中包含以前較小的模型層和權重。我們取兩張圖像,然後使用這些圖像的張量進行線性組合。 混合增強 λ是服從beta分布的隨機採樣。
  • 零基礎入門深度學習(七):圖像分類任務之VGG、GoogLeNet和ResNet
    由於卷積核比較小,可以堆疊更多的卷積層,加深網絡的深度,這對於圖像分類任務來說是有利的。VGG模型的成功證明了增加網絡的深度,可以更好的學習圖像中的特徵模式。GoogLeNet是2014年ImageNet比賽的冠軍,它的主要特點是網絡不僅有深度,還在橫向上具有「寬度」。由於圖像信息在空間尺寸上的巨大差異,如何選擇合適的卷積核大小來提取特徵就顯得比較困難了。空間分布範圍更廣的圖像信息適合用較大的卷積核來提取其特徵,而空間分布範圍較小的圖像信息則適合用較小的卷積核來提取其特徵。
  • 手把手教你在小數據集下使用Keras進行圖像分類
    AI 前線導讀:這是一篇實戰類的文章,旨在向讀者介紹計算機視覺的外圍應用:圖像分類問題。現在我們翻譯了 Rising Odegua 這篇基於 keras 進行圖像分類的文章。在本文,作者介紹了如何在數據集較小的情況下,如何使用 keras 進行圖像分類。
  • 理解並實現 ResNet(Keras)
    這些函數使用Keras來實現帶有ReLU激活函數的Convolution和Batch Norm層。殘差連接實現上就是這行代碼: X = Add()([X, X_shortcut])。這裡需要注意的一件重要的事情是殘差連接是應用在ReLU激活函數之前,正如上圖所示。研究人員發現這樣可以得到最好的結果。