你的食物變質沒?用AI演算法來檢測一下吧

來自專欄我是程序員6 人贊了文章

摘要:本文使用AI演算法檢測披薩是否變質,為食品檢測提供一個新的思路。

最近一條幼兒園採用過期食物的新聞引起了社會的強烈關注,對於食品安全而言,國家一直是嚴格要求的,尤其是對於嬰幼兒食品安全的標準,部分已經超越了國際上的標準。但可能是由於無法嚴格地執行到每一個地方且檢測周期較長,造成這一現象的出現,著實有些令人憤怒。程序員,用代碼改變世界的一群人,今天向大家介紹用AI演算法來檢測食物是否過期,希望能夠在以後普及應用到食物安全的初步檢測之中,下面以披薩為例。

在俄羅斯最大的披薩連鎖店「Dodo Pizza」的最新Dbrain用例中,首席數據科學家Arthur Kuzin解釋了開發的AI演算法如何通過簡訊控制披薩質量,將披薩麵糰打分1到10分。下面詳細解釋如何教AI演算法來評估披薩質量!

本文重點關注以下內容:i)僅從少數標記樣本中獲取完整數據集的標記; ii)將方框拉伸到對象的分割掩模(將方框的方形掩模應用於任何形狀)。

想法

Dodo pizza有許多活躍的客戶,在完成訂單後,他們同意分享他們對披薩質量的看法。為了簡化反饋環節及其處理過程,Dbrain開發了一個AI演算法驅動的應用程序來檢查披薩質量。此應用程序類似於聊天機器人,客戶上傳照片後可以獲得得分為1到10的等級評分。

問題陳述

當程序員收到開發請求時,就著手開發一種可以客觀地確定麵糰質量的演算法。問題在於確定披薩烘焙過程是何時停止的,披薩外皮上的白色氣泡與產品的變質相關。

數據挖掘

該數據集收集了披薩烘焙的照片,還包括了一些不相關的圖像。如果配方不正確,披薩外皮上就會出現白色氣泡。此外,專家還對麵糰質量進行了二元標記。因此,得到數據集之後,演算法的開發就只是時間問題了。

這些數據集的照片是在不同的手機上、在不同的光線條件下以及從不同的角度拍攝得到的。整個數據集有17k張的披薩標本圖像,而整個數據集的圖片總數為60k張。 由於該任務需求非常簡單明了,因此用不同的方法來處理數據是一個很好的操練場。那麼,以下就是我們解決任務所需要的:
  • 1.選擇能夠看到披薩外殼的照片;
  • 2.區分所選照片中的披薩外皮與背景區域;
  • 3.在選定區域訓練神經網路。

數據過濾

此外,我自己標記了一小部分照片,而不是向其他人解釋我真正需要的東西,因為,如果你想要做得好,自己就需要對數據進行處理,以下就是我所做的:

  • 1.標記了50張有披薩外皮圖像,標記了50張沒有披薩外皮圖像:

  • 2.使用resnet-152網路在imagenet11k上預訓練權重等參數,在全連接層後提取特徵;

  • 3.將兩個類別的特徵的平均值作為基準點;
  • 4.計算從該基準點與剩餘的60k圖片的所有特徵之間的距離;
  • 5.確定前300個與正類別相關的樣本,後500個與負類別相關的樣本;

  • 6.基於這些樣本的特徵訓練LightGBM;
  • 7.使用此模型在整個數據集上預測出標籤;

這與我在kaggle比賽中用作基線的方法大致相同。

前傳

大約一年前,我和Evgeny Nizhibitsky一起參加了「海獅」 kaggle比賽。任務是從無人機拍攝的圖像上統計海豹的個數。標記只是給出了屍體的坐標,但在某些時候, Vladimir Iglovikov用方框標記了它們,並在社區慷慨地進行了分享。

我決定通過分割來解決這個任務,在第一階段只將海豹方框作為目標。經過幾次訓練迭代後,很容易找到一些硬樣品,但是效果不好。

對於此示例,可以選擇沒有海豹的大區域,手動將蒙版設置為零,還可以添加到訓練集。因此,Evgeny和我訓練了一個模型,該模型已經學會了分割大型海豹鰭。

披薩外皮檢測和提取

再次回到主題披薩,為了識別所選和過濾後的圖像上的外殼,最佳選在標籤上做文章。通常,一些貼標機工作對同一樣本的工作方式是不同的,但當時我們已經對這種情況應用了一致性演算法並將其用於方框中。這就是為什麼我只是做了幾個例子就把它交給了貼標機。最後,獲得了500個樣本,這些樣本特別突出了披薩外皮區域。

為了識別所選過濾照片上的外殼,我為貼標機做了幾個例子。 第一次迭代模型訓練的結果仍然是錯誤的,預測的可信度定義如下:1 ——(灰色區域的面積)/(掩膜的面積)

接下來,為了完成獲得接近掩模方框的下一次迭代,在小的樣本集上用TTA預測掩模。這在某種程度上可以被認為是WAAAAGH式的知識蒸餾,但更為正確地將其稱之為偽標籤。

然後,我人為地確定某個閾值,用於形成新訓練集的置信度,還可以選擇出標記出集成失敗的最複雜樣本。我認為這將是有用的,並在自己休息時標記了20張圖片。

最終模型訓練

最後——模型的訓練。為了準備樣品,我用掩膜提取了披薩外皮區域。此外,我通過擴大掩膜並將其應用於圖片以去除背景來略微充氣掩膜,因為它不包含有關麵糰質量的任何信息。然後我從Imagenet中調整了幾個模型。我總共收集了大約14k張合適的樣本,此外,沒有訓練整個神經網路,而只訓練最後一組全連接層層以防止過擬合。

最終發現模型為Inception-Resnet-v2時效果最好,其ROC-AUC達到0.700。如果沒有進行處理並在沒有掩膜的原始圖像上訓練模型的話,那麼得到的ROC-AUC將為0.58左右。

驗證

在開發解決方案時,DODO披薩回傳了下一批數據,並且使用這些數據測試了整個模型,結果ROC-AUC達到了0.83。

上述結果表明,我們仍然無法完全保證在沒有錯誤的情況下管理披薩的質量。考慮到錯誤出現的原因,我再一次訓練了模型並取得了積極的成果。我們現在看一下錯誤:

從上圖可以看出,它們與披薩外皮標籤的錯誤有關,因為有些標記為正常的披薩有明顯的變質跡象。

這裡的誤差是由於第一個模型未能選擇正確的樣本,這導致難以確定正常披薩的關鍵特徵。解決這個問題後,模型的性能會有所提升。

結論

我的同事有時會取笑我幾乎所有的分割任務都是通過使用Unet完成,但我仍然希望他們會喜歡它,因為Unet網路是一種相當強大和方便的方法,它可以使得模型誤差可視化,且表現優異,可以節省處理數據集的時間。此外,整個模型看起來非常簡單,應用十分方便。

以上是整個演算法流程及實驗記錄,現在是時候吃一塊比薩餅放鬆一下了,乾杯!

以上為譯文,由阿里云云棲社區組織翻譯。

譯文鏈接

文章原標題《Your Pizza is Good: How to Teach AI to Evaluate Food Quality》

譯者:海棠,審校:Uncle_LLD。

文章為簡譯,更為詳細的內容,請查看原文。

更多技術乾貨敬請關注云棲社區知乎機構號:阿里云云棲社區 - 知乎

本文為雲棲社區原創內容,未經允許不得轉載。


推薦閱讀:
查看原文 >>
相关文章