# 專題總審簡報逐字稿 ###### tags: `總審` --- ![](https://i.imgur.com/NasOhml.png) --- ### 簡介白內障 ![](https://i.imgur.com/t8wAsM8.png) 根據世界衛生組織2021年更新的《失明和視力障礙》報導指出,全世界至少有22億人為視力障礙者,其中超過10億人的視力問題是可以被預防或尚未得到解決。在視力問題中,全球罹患白內障人數,更是高達七千萬人,隨著人口高齡化,加上中低發展國家所需的醫療設備短缺,白內障仍然會是一大問題,也是我們所面臨的挑戰。 ![](https://i.imgur.com/YAmhtrj.png) - 白內障的成因為水晶體囊膜受到損傷或蛋白質發生變性,造成透明清澈的水晶體變得混濁。而造成白內障的原因有許多種,年齡、遺傳或者是外力撞擊都有可能會造成白內障。所以我們可以將白內障歸為下列幾類,老年性、外傷性、併發性、代謝性、藥物性及先天性。其中又以老年性的比例為最高,約佔了50%以上,也是導致失明的常見原因之一。 - 截至今日,沒有藥物能夠治療白內障,目前唯一的手段是透過手術將混濁晶體摘除。此外,目前也沒有藥物能預防白內障的發生,我們僅能透過定期檢查,並配合醫師指示來減緩病情或者接受治療。 ### 如何預防 ![](https://i.imgur.com/6f2lTLd.png) - 白內障無法預防,但是根據醫師指出我們能透過幾種方法降低白內障的發生,例如: 定期檢查、 遠離紫外線、 攝取含豐富抗氧化物質的蔬菜水果,均衡的飲食以及避免抽菸。 - 其中定期檢查是最重要的預防之道 > - https://www.ymuh.ym.edu.tw/tw/departments/health-care/other/ophthalmology/vision.html?showall=1 > - https://www.dr-eye.com.tw/eye-conditions/cataract > - https://wlshosp.org.tw/%E8%A1%9B%E6%95%99%E5%9C%92%E5%9C%B0/%E7%9C%BC%E7%A7%91/%E7%99%BD%E5%85%A7%E9%9A%9C%E7%B0%A1%E4%BB%8B/ ### 研究動機與問題 ![](https://i.imgur.com/HT4n02J.png) 但是現有眼科醫療院所的診斷技術中,裂隙燈為最常見的判斷白內障的儀器,但是裂隙燈不易攜帶、檢測時間較長,且昂貴;這些儀器特性使得在部分醫療環境中產生很多不便。 ![](https://i.imgur.com/yClyalH.png) 因此我們希望讓民眾透過智慧型手機或是電腦等可攜式設備,輕鬆簡易的自我檢測眼睛狀況。對於醫療人員則可以作為輔助參考,或在環境受限的情況下作為初步檢測的工具。 ### 文獻探討 ![](https://i.imgur.com/tDoMGyv.png) 我們蒐集了過去使用機器學習進行白內障檢測的研究,如圖所示。可以看到...... :::danger 找出誰跟我們一樣用眼睛表面 SVM, KNN ←15 16→ CNN-squeezenet, k-平均演算法, 單層感知器 ::: ### 卷積神經網路模型的建置 ![](https://i.imgur.com/rTrYaKw.png) 我們這個專題主要使用左邊這個Keras來進行CNN的模型建置,他是基於TensorFlow所開發的高層API。不僅能夠快速地實現模型搭建,在數據的輸入輸出也很方便,適合機器學習的初學者使用。 而我們的網頁是使用React來建置的。 ![](https://i.imgur.com/mlFzkvs.png) 本研究中的訓練資料集來源為krishnabojha在github上發表,其患有白內障張數為4,514,無患有白內障張數為5,154;測試資料集來源為piygot5在github上發表,其患有白內障張數為89,無患有白內障張數為43 ![](https://i.imgur.com/HlQi5O1.png) 為了避免樣本有偏差問題,在切割上,我們運用80/20法則,將訓練資料集隨機分成數份相同大小的樣本,並將四份做為訓練集,一份做為驗證集。 ~~透過此方式切割後,訓練集照片總數為8,068張,其中患有白內障為3,714張,無罹患白內障為4,354張;驗證集照片總數為1,600張,其中患有白內障為800張,無罹患白內障為800張。~~ ![](https://i.imgur.com/YjIJxST.png) 從Jindal的研究中指出圖像需經過預處理,而Jagadale的研究提出霍夫圓轉換是偵測晶體中心和半徑的最佳偵測方式,能為特徵提取帶來更好的效果,因此我們嘗試對照片進行預處理。 然而我們做資料前處理的過程中,碰到的困難是:相同半徑套用於不同的照片下,結果不盡相同,而且使用者拍攝的距離,也會影響著半徑的變化。如下圖所示,如果使用相同半徑,右邊能正確偵測,但是左邊卻會偵測出錯誤的圓,可能是反光,可能是雜點。 經過多次試驗,仍然沒辦法得出全面適切的半徑。另外在嘗試的過程中我們發現:對資料集進行預處理後,對我們設計的模型準確度不會有實質提升,所以本研究最後不進行預處理。 :::success 誰講得請找出來~~ 要強調我們研究的過程 ::: ![](https://i.imgur.com/4DuDeOD.png) 在Imran(2019)及Qian(2018)的paper中提到,當面對資料集不夠多或是比例不平衡時,可以透過資料增強(Data Augmentation)的方法來增加資料量,也能提升模型表現。 在Keras中也有一個工具叫ImageDataGenerator可以呼叫。這個工具中我們有調整的參數如圖中四個。分別是rescale、shear_range、zoom_range、horizontal_filp。 Rescale 將資料做正規化。因原圖像矩陣輸入包括0-255的RGB係數,龐大的數值對建模和運算時間上都有相當大的負擔,故我們使用這他來將數值轉換為0-1,對模型的穩定性和收斂性較佳 Shear_range 錯位變換。功能是讓所有點的x坐標(或者y坐標)保持不變,而對應的y坐標(或者x坐標)則按比例發生平移。 Zoom_range 對照片調整大小。若參數介於0跟1之間,會對照片放大,若大於1,照片則會縮小。 Horizontal_flip 用於隨機對照片水平翻轉、左右翻轉 因為驗證的時候不需要對資料做任何增加,只需要對資料做正規化,藉此確保穩定性。 ![](https://i.imgur.com/SgKl6s5.png) 卷積神經網路CNN是現今最為廣泛使用在處理圖像上的神經網路模型[2021survey那篇有超過50%都使用CNN],它是模仿人類大腦的認知方式所建立的模型。譬如我們辨識一個圖像,通常會先注意到顏色鮮明的點、線、面,之後將它們構成一個個不同的形狀(眼睛、鼻子、嘴巴...),那這種抽象的過程就是當初CNN作者Yann當初在設計演算法的方式。 CNN主要辨識重要特徵的地方就在前面這幾層,卷積、池化、扁平這些。那後面這個是全連結層。 前面三層主要在做特徵的截取,後面全連結層主要在做權重的學習。 這種網路架構主要有兩個優點: **不需手動進行照片前處理**,模型能自動辨別重要特徵。 在前面這幾層的**權重是固定的**,減少運算的時間以及能量。 一個網路的架構,也並非所有前面提到的層都必需要用到,但通常越多層的架構,學習的越好。 但是同時,當架構越多層時,會消耗較多的運算時間 ![](https://i.imgur.com/lhL1ebY.png) 這是本研究建立模型的示意圖,以及流程圖。 首先資料進行輸入,經過卷積層、激活函數、池化層,如此再重複一遍, 然後就到我們的扁平層。 扁平層就是把多維的圖像矩陣,壓扁成為一維矩陣。 作為全連結層的輸入,經過隱藏層的學習。輸出我們的模型結果。 ![](https://i.imgur.com/WfHwPcz.png) 接下來我會為各位一一介紹各層在做什麼,還有我們在設計模型時,每層中調整的參數。 首先,卷積層用於提取圖像中的各局部特徵。 ~~低階層的卷積層在提取圖像中的微小特徵,如點或線;高階層的卷積層在提取圖像中的主要特徵,這是建構在低階層之上,藉此識別圖像中的形狀或物體。~~ 透過特定大小之卷積核(Kernel Map)在圖片上進行滑動擷取特徵,而此滑動步長可為特定值,這些特定值都是由設計模型者自行設定。 ~~特別需要提一點是,卷積核(Kernel_Map)一般設定為正方形、邊長奇數,便於尋找中心點。若此參數設定越大,每次做卷積運算的範圍會越大,同時取出的特徵圖會較為粗糙。反之,設定越小,能夠抓到越精細的特徵圖,但也會需要花較多的運算時間。~~ 下方的這個是我們的程式碼 模型名稱設定為classifier 32指的是filter:是卷積層輸出之維度,就是經過這個卷積層計算後,會輸出32張特徵圖 3指的是kernel_size:卷積核的尺寸大小 1指的是stride:滑動步長,就是每計算完一次卷積運算後,會向旁邊移動多少格再繼續做下一個運算 64*64指的是input_size:就是我們輸入的圖像大小要設定為多少pixel。旁邊的3就是channel,輸入的圖像是RGB3原色的。 我們這裏設定Relu為激活函數 ~~Padding 設定邊緣是否進行補零 本研究為valid不補零,輸出特徵圖會較小~~ 旁邊的數學式中,_𝐾_𝑙+1和_𝑏_𝑙+1分別代表卷積核(Kernel Map)和偏差值(Bias),_𝐹_𝑙_和_𝐹_𝑙+1分別為第l層和l+1層的特徵圖。 ![](https://i.imgur.com/0kGNfI7.png) 前面一頁有提到激活函數,那以上這兩者是我們在訓練模型中使用到的兩個激活函數,這兩個函數都是用來進行非線性轉換,學習較複雜的非線性特徵。 Sigmoid常用在分類兩個class時使用,而我們建立的模型是要來做分類是否罹患白內障,罹患與無罹患兩種結果,故我們使用sigmoid。對比,如果是要分類多class的時候則使用softmax Relu則將小於零的數值變為零,藉此將不重要的特徵消除 ![](https://i.imgur.com/lSD3YeS.png) 前面做完卷積運算後,會根據卷積運算後的特徵圖(Feature Map)來提取特定視窗大小的最大特徵值,輸出降維的特徵圖。 此動作主要是在把重要的特徵值取出,並減少每個輸出特徵圖之尺寸, 除了可以減少運算時間,也可以避免過度擬合(Overfitting)的問題。 下方程式碼中,設定池化窗格大小為2*2,~~他的用意跟前面卷積層的卷積核kernel_size意義相同,都在調整每次做運算的大小。設定越大結果越粗糙,設定越小結果越精細,但會更耗時。~~ 旁邊的數學式中,_𝐹_𝑙_和_𝐹_𝑙+1分別為第l層和l+1層的特徵圖,𝑀𝑎𝑥−𝑝𝑜𝑜𝑙𝑖𝑛𝑔__為池化運算。 ![](https://i.imgur.com/0pMrxyX.png) 池化層結束後,我們來到扁平層。 這裡會將輸入的多維特徵圖壓扁為一維的輸出,作為卷積網路連結到全連結層的輸入,此層無參數設定。 數學式中,其中_𝑛_𝐻_𝑙−1、_𝑛_𝑊_𝑙−1和_𝑛_𝐶_𝑙−1分別代表扁平層中的特徵圖高度(Height)和寬度(Width)以及維度(Channel)之神經元數。 ![](https://i.imgur.com/d4cty0G.png) 將扁平層輸出的一維特徵圖輸入到此層後,神經網路會自動去調整權重及偏差值,去學習出最佳的模型。 ![](https://i.imgur.com/ZOUVisS.png) 剛才學習權重以及偏差值的方法就是模型編譯的部分。 除了要設定優化器、損失函數還有衡量尺度 本研究的優化器使用adam,用它來計算每次權重要更新多少。 損失函數使用binary_crossentropy,計算實際與損失的距離。 衡量尺度使用acc,使用準確度來定義模型的好壞。 ![](https://i.imgur.com/yGJcvV6.png) 將模型架構設定好後,就可以設定我們要輸入的資料型態,以及訓練次數等。 ![](https://i.imgur.com/Ude7Ynx.png) 這裡我們使用了一個工具,也是使我們模型變好的一個工具。 他會在可每次訓練後都與先前的模型做比對。 如果有變好,就存下新的模型。如果變差,就拋棄新的模型,以舊的為主。 cP_Model_Name保存模型的路徑 Monitor被監測的數據 (為什麼要val_loss?) Verbose在訓練過程中是否顯示詳細資訊 Save_best_only僅保留最佳模型 Mode被監控值要最大或最小,auto則自動判斷 Period每幾個epoch要檢查一次監控值 ### 實驗結果 ![](https://i.imgur.com/NpnOpFf.png) ![](https://i.imgur.com/srmmJPQ.png) ![](https://i.imgur.com/99VD9wn.png) ![](https://i.imgur.com/TMYs9z3.png) ![](https://i.imgur.com/K4WTLDU.png) ### 結語 ![](https://i.imgur.com/JBDLl0W.png) 本研究希望能藉由智慧行動裝置讓使用者更快且方便的辨識出是否有罹患白內障的可能性,並藉此提升民眾對於白內障這項眼睛疾病的認識。若有罹患的可能性,應儘速就醫,並與眼科醫師安排合適的治療。 我們主要是利用眼球外觀照片進行白內障的檢測,與以往研究不同的是,只要透過眼球外觀照片就可以進行初步診斷。我們所提出的卷積神經網路(CNN)模型,測試集的平均準確率高達百分之90.8,並且在使用實際民眾眼球外觀照片的測試中,平均準確率高達百分之百。由以上結果可以了解我們所建立的模型是相當穩健的,是有效且方便的辨識工具,能夠有效地從未知的圖像中檢測出是否患有白內障。 :::danger ### 反光背景 - 進行實驗時,初期認為鏡頭拍攝照片的反光接近白色,可能會對判斷有所影響而出現誤差,因此希望對使用者輸入的照片自動進行處理。現有相關技術之處理方式約分為四種:多角度照片重疊互補、霧化反光區域、物質表面特徵處理、調整曝光時間。其中比較可行的是照片重疊互補。其餘方法有過度調整、參數設定難以找到平衡範圍、設備不適用等可能失去原有特徵等問題。 - 經過討論,專業人士提供以下建議:建模前刪除反光覆蓋瞳孔的照片、使用者輸入照片如果重疊到瞳孔區域,建議重新拍照。**最後我們決定限制使用者輸入照片的條件,在網頁中提供操作說明及警語**。 ::: ### 未來展望 ![](https://i.imgur.com/jb7POm1.png) 本研究的模型目前取用網路上的資料來做建模,希望未來能與相關醫療院所合作,使用更多臨床眼球圖像,輔助我們做出更好的模型,提供更精確且更完善的工具。此外目前建構之模型,還無法依照白內障嚴重程度進行分類,這將會是我們未來繼續探討的方向。 至於反光問題,在進行實驗時,初期認為鏡頭拍攝照片的反光接近白色,可能會對判斷有所影響而出現誤差,經過討論後,我們決定限制使用者輸入照片的條件,而未來希望能夠對模型輸入圖像反光限制,降低對輸入圖像的限制,讓民眾更方便的使用此資源。 我們相信此模型能以低成本、高方便性,且有效地提供醫療人員於環境設備不足或面對大量需求的情況下,可以更快速的做出判斷並且掌握其中的潛在患者,期許在未來能成為遠距醫療決策輔助的工具。 ### DEMO ![](https://i.imgur.com/KzHsbaJ.png) :::info 拍攝各步驟之注意事項 - Step1: 點擊 **開始檢測** 進入檢測頁面後 - Step2: 點擊 **拍攝照片**,拍攝眼睛照片或從相簿中 **選擇眼睛照片** - **拍攝時,避免面向光源,造成判別失準** - Step3: 照片成功載入後,透過切割框,框出欲檢測眼睛之特定範圍 - **裁切時,將瞳孔圓形部分對準畫面中央,保持瞳孔圓形完整** ![](https://i.imgur.com/iwuRtyj.png) - **正確框出範圍有助於辨識的準確** - **最後,再次確認照片瞳孔部位是否有光線白點產生。如果有,務必重新拍攝** - **判別完成後,由使用者決定是否上傳,作為模型優化研究使用** ![](https://i.imgur.com/jKOcLrX.png) [video demo part](https://hackmd.io/AQq2iHaeTrG2BzKK7ds0dA#Demo) :::