# 醫學影像辨識系統 ## 電機工程專題 **** ## 簡介及目標 有鑑於現今醫學資源十分豐富,技術也相當先進,但由於人眼的辨識能力有限,有時醫生無法單純利用雙眼來判斷病徵為何,難以馬上進行診療,造成需要更多時間來觀察。   因此我們希望可以藉由科技的力量,來輔助醫生進行治療。我們建立一套內視鏡影像辨識系統,希望利用內視鏡取得體內病徵的影像,將此病徵圖與資料庫內的影像進行相似度辨析,取得與各症狀間的相似度對比,以幫助醫生做前置的病徵判別,加速病患的症狀治療。 **** ## 系統架構 ![](https://i.imgur.com/sX2uaUS.jpg) **** ## 系統簡介及操作方式 **首先先利用內視鏡取得病人內部的圖片,來到主畫面** ![](https://i.imgur.com/Ao8g6id.png) **接著選擇圖片並點選上傳** ![](https://i.imgur.com/SB4gumQ.jpg) **上傳成功則會顯示Uplaod success** ![](https://i.imgur.com/FkJ0KSb.jpg) **接著選擇要比對的類別** ![](https://i.imgur.com/m9ElVO9.jpg) **按下開始進行比對** ![](https://i.imgur.com/LqGDb1v.jpg) **當進入這個畫面就代表成功囉** ![](https://i.imgur.com/E4Zq40q.jpg) **** ## 比對結果 在圖片的上方會顯示正在比對的圖片的病徵為何,並且顯示比對的**變異數**為何,變異數**越小**時代表兩張圖片**越相似**。 [![](http://img.youtube.com/vi/zH7zFDiOoiw/0.jpg)](https://www.youtube.com/watch?v=zH7zFDiOoiw&feature=youtu.be&ab_channel=yayayo "") **** ## 困難及解決 1.在建立資料庫時將圖片儲存為BLOB檔,但發現C\+\+程式可以取得該圖片,但無法將其轉為C++程式中可以執行的格式,而C\+\+中所執行出的圖片結果,亦無法有效轉為資料庫BLOB的圖片儲存格式。 **sol: 當初我們並不瞭解BLOB檔,亦無法確認利用字串所抓取的內容,後來發現jpg檔本身也是個二進位檔的格式,因此可將資料庫中的BLOB檔以字串形式存入,再以二進位的方式將檔案輸出為jpg的格式。 而將圖片利用mysql語法上傳至資料庫時,因為mysql語法需要以16進位的方式上傳,上傳到資料庫的過程中再轉為二進位的格式做儲存,所以在C++程式中需要將jpg檔轉為16進位儲存。** 2.當C++程式執行完特徵點辨識後,雖然有顯示圖片比對的結果,但程式會被迫中斷,無法往下繼續執行。 **sol: 試圖上網搜尋此錯誤訊息,後來發現與記憶體的配置有關,在建立DMatch的vector時,發現在執行完函式後,需釋放vector的記憶體,因為visual studio2015版本,存在一個bug,會遺失該記憶體的位置,導致無法釋放,因此程式才會終止。因此我們將vector建立為全域變數,即可讓程式執行到最後才不會被中斷。** 3.在c\++讀取圖片轉為二進位檔時,必須取得長度資訊,然而c++無法得到利用char\*讀取到的字串長度,因為char\*指標指向字串開頭,此格式並無'\0'作為判斷結束的依據,無法得知字串結尾。 **sol: 後來發現mysql在提取資料後,也有提取每個資料的長度並存在另一個array中,最後在函式庫中也有找到對應的函式,再進行之後的分析。** 4.一開始將特徵點比對完利用相似的特徵點連線顯示到圖片的時候,發現我們需要一個方式好讓使用者快速的知道兩張圖的相似度,可是我們沒辦法知道演算法裡面如何去計算相似度,也沒有提供一個函式讓我們得知相似度。 **sol: 因為目前缺乏醫學相關專業人員提供醫學上症狀的特有差異性的知識,因此我們盡可能使用現有的資源來做相似度最佳化的設計,後來發現DMATCH之中有一項參數是線段的長度,所以我們就想了一個粗略的相似度計算方式,因為假如兩張圖相似處長的不一樣時,他的線段會非常的雜亂,並且有長有短,如果有發現相同的地方的話,特徵點會較集中且都指向同一個地方,所以線段基本上會差不多長,所以就算出線段長的變異數,當變異數越大時代表線段越雜亂,反之則越集中。** 5.在將由內視鏡取得圖片上傳到server後,我們必須藉由網頁來呼叫我們的比對c++主程式,也就是由php來呼叫外部程式,在網路上查了很久,發現主要有三個函式,system()、exec()、shell_exec(),但看到的使用方法都是直接呼叫 .exe檔,都沒有帶變數進去,但是我們必須將類別丟進去才能比對到相對的資料庫。 **sol: 由於在網路上找了很多相關的資料都沒有我們想要的使用方法,一開始就覺得會不會是真的只能單純呼叫執行檔不能帶變數進去,後來經過不斷的測試,發現其實它的使用方法和工作站很相似,(xx.exe a b ….);直接將變數打在後面就可以了。** **** ## 未來展望 由於我們沒有醫學背景,無法了解醫生是如何去判斷病徵的,缺乏有效的演算法,所以希望未來這套系統能與醫界的相關技術人員有更進一步的合作,以提升演算法的精確度,能真正實際應用到醫療體系中。 **** ## 我的貢獻 使用者端網頁HTTP架設、GUI設計與美編
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up