2019年4月22日 星期一

使用Keras卷積神經網路辨別肺部醫學影像(三)

上一章「使用Keras卷積神經網路辨別肺部醫學影像(二)」

由上一個步驟已經得到了兩個分別裝著男性肺部影像與女性肺部影像的資料夾。


接著我們將把這些影像壓縮成一個.npy檔。

至於為什麼要做壓縮呢,因為後續進行訓練的時候,如果是一張一張影像慢慢讀進程式,會拖累執行的效能。而且比起一個檔案,數千張的影像檔在攜帶上也不方便,全部壓縮在一個檔案是很方便的。

現在,我們建立一個python程式,命名為small128.py

程式碼及註解如下:
import array
import numpy as np
import cv2
import glob
#建立影像清單
imglist=[]
#計數器
filecount=0
#設定圖片寬度
imgwidth=128
#設定圖片高度
imgheight=128
#迭代女性資料夾中的影像
for filestr in glob.glob('image_F/*.png'):
    #利用opencv讀取影像檔
    #參數中的IMREAD_GRAYSCALE代表是以灰階模式讀取而非全彩
    img = cv2.imread(filestr,cv2.IMREAD_GRAYSCALE)
    #將影像縮放為128x128的大小
    img=cv2.resize(img,(imgwidth,imgheight))
    #將每個像素的值由0-255的整數轉換為0-1的浮點數
    img=img/255.0
    #將處理過後的影像放入影像清單中
    imglist.append(img)
    #計算目前處理了幾張影像
    filecount=filecount+1
    #進度條,查看目前程式跑到哪了
    if filecount%100==0:
        print(filecount,end=' ')
    #設定只放入4500張影像
    if filecount>=4500:
        break
#迭代男性資料夾中的影像
for filestr in glob.glob('image_M/*.png'):
    #利用opencv讀取影像檔
    #參數中的IMREAD_GRAYSCALE代表是以灰階模式讀取而非全彩
    img = cv2.imread(filestr,cv2.IMREAD_GRAYSCALE)
    #將影像縮放為128x128的大小
    img=cv2.resize(img,(imgwidth,imgheight))
    #將每個像素的值由0-255的整數轉換為0-1的浮點數
    img=img/255.0
    #將處理過後的影像放入影像清單中
    imglist.append(img)
    #計算目前處理了幾張影像
    filecount=filecount+1
    #進度條,查看目前程式跑到哪了
    if filecount%100==0:
        print(filecount,end=' ')
    #設定只放入4500張影像(加上女性的影像共9000張)
    if filecount>=9000:
        break
#將影像清單轉換成Array
img_array=np.array(imglist)
#儲存影像
np.save("size128_F4500_M4500.npy",img_array)

我們一開始建立影像清單,並設定好影像的大小(影像越大,訓練時就需要消耗更多的資源,所以建議縮小影像),我們將影像統一縮放為長128px、寬128px的大小
imglist=[]
imgwidth=128
imgheight=128

接著我們利用OpenCV讀取影像(需import cv2)。
img = cv2.imread(filestr,cv2.IMREAD_GRAYSCALE)
讀取時我們將原本的彩色影像轉換成灰階影像(全彩的影像每個像素需佔用24位元的大小,灰階的影像只需佔用8個位元),此動作並不會降低訓練的準確度,因為這些肺部影像本來就是黑白的。

接著我們使用OpenCV的resize函數,將影像縮放為一開始設定好的128x128的大小,此部分不再多加贅述。
img=cv2.resize(img,(imgwidth,imgheight))

接著我們將每個像素的值標準化(將介於0~255的整數標準化為0~1.0的浮點數),這個動作可以提高訓練的準確率。
img=img/255.0

然後將處理完的影像依序加入影像清單中。
imglist.append(img)

接著將影像清單轉換成訓練時需要的格式。
img_array=np.array(imglist)

最後,將這些影像儲存在一個size128_F4500_M4500.npy的檔案中。
np.save("size128_F4500_M4500.npy",img_array)

執行後,會得到一個npy檔,裡面裝著4500張男性影像和4500張女性影像。

在下一個章節,我們將建立訓練模型,開始建構這個計畫的核心程式。

2019年4月20日 星期六

CSS選擇器的權重大小一覽

閱讀這篇文章前   請先具備

CSS Selectors

實際撰寫與嘗試的經驗

在開發時,常常會發現給標籤添加樣式,卻沒效果的這種情況

這種情況分成兩種
1.選擇器寫錯、選錯標籤
2.選對了、但被其他的樣式覆蓋掉了

CSS的樣式被覆蓋的現象、就是權重問題

對權重問題理解不夠深的話,很容易就進入一段時間沒有產出的情況

#被覆蓋的樣式可透過F12看到,他們是被槓掉的

那麼來寫一下範例

body{
    margin: 0;
}
選到了body標籤,此時的權重假設為1、代表他能幹掉權重小於1的樣式

此時打開F12,會發現body{margin: 8px;}被幹掉了,這個樣式是chrome瀏覽器的預設樣式
也就是說body本身就有預設的margin,這個樣式被稱為預設樣式,權重為0

接著
body{
    margin: 0;
}
body{
    margin: 5px;
}

此時,body的margin為5px
在相同權重下,後面添加的樣式會幹掉前面的,我們假設他為1.1

再來
body{
    margin: 0;
}
body{
    margin: 5px;
}

html  body{
    margin: 10px;
}

此時,body的margin為10px
標籤是有疊加權重的,選到html底下的body,也就是說途中標籤選取器經過(但不選取)html,選到底下的body,此時的權重會是2,也就是1+1,但很重要的事情是,不管這個權重怎麼加,也不會超過class或id這兩種選取器

基礎觀念都有了、那接下來就一併列出吧

body{//1

}
body{//1.1

}
html body{//2

}
html body{//2.1,因為後寫的關係,所以增加0.1

}
.body{//10,你沒看錯,就是10,但標籤選取器的權重怎麼疊加都幹不掉這個10

}
html .body{//1+10=11

}
.html .body{//10+10=20

}
.html .body{//10+10=20,與上方權重相同,因為後寫的關係,所以為20.1

}
#body{//100

}
#html .body{//100+10=110

}
.html #body{//10+100=110,與上方權重相同,因為後寫的關係,所以為110.1,如果後寫的是#html .body,那麼#html .body就能幹掉.html #body

}
#html #body{//100+100=200

}

#html #div div .body{//100+100+1+10=211

}

行內樣式//權重1000
<body margin='20px'></body>

body{
    margin: 0px !important;//這樣寫,權重10000
}

2019年4月19日 星期五

使用Keras卷積神經網路辨別肺部醫學影像(二)


本例將辨識肺部X光照片所屬的性別,會利用一個資料檔(.csv)和十二個包含影像檔(.png)的資料夾。


使用Excel開啟附屬的csv檔,查看各張影像的訊息。從資料中可以取出圖片的檔名,疾病、年齡、性別等資料。


從影像資料夾中,可找到資料表中各個影像檔的檔名。

首先,要將資料檔進行分類,先建立兩個空的資料夾,命名為
「image_F」(女性)「image_M」(男性)


接著建立image_M.py檔,將男性影像歸類到指定資料夾。

程式碼及註解如下:

import csv
import os
import glob
from shutil import copyfile
# 開啟 CSV 檔案
with open('Data_Entry_2017.csv', newline='') as csvfile:
    # 讀取 CSV 檔案內容
    rows = csv.DictReader(csvfile)
    #計數器
    count=0
    # 以迴圈輸出每一列
    for row in rows:
        if row['Patient Gender']=='M':#如果性別欄位的值是M
            src='images/'+row['Image Index']#取得影像路徑
            dst='image_M/'+row['Image Index']#目標影像路徑
            if  os.path.exists(src):#如果檔案存在
                    copyfile(src, dst)#將影像複製到目標資料夾   
                    count=count+1#計錄目前的進度
                    if count%100==0:#顯示進度
                        print(count)

接著執行程式,過程中會顯示進度。



接著複製程式碼到image_F.py檔。


注意反白處,要將F更改為M:

import csv
import os
import glob
from shutil import copyfile
# 開啟 CSV 檔案
with open('Data_Entry_2017.csv', newline='') as csvfile:
    # 讀取 CSV 檔案內容
    rows = csv.DictReader(csvfile)
    #計數器
    count=0
    # 以迴圈輸出每一列
    for row in rows:
        if row['Patient Gender']=='F':#如果性別欄位的值是M
            src='images/'+row['Image Index']#取得影像路徑
            dst='image_F/'+row['Image Index']#目標影像路徑
            if  os.path.exists(src):#如果檔案存在
                    copyfile(src, dst)#將影像複製到目標資料夾   
                    count=count+1#計錄目前的進度
                    if count%100==0:#顯示進度
                        print(count)

接著執行後,得到了兩個分別裝著男性肺部影像與女性肺部影像的資料夾。
下一回將示範如何將數千個影像檔打包為一個資料檔。
下一章「使用Keras卷積神經網路辨別肺部醫學影像(三)」

使用Keras卷積神經網路辨別肺部醫學影像(一)

本系列文章將使用Keras卷積神經網路(CNN)辨別肺部醫學影像。

在開始之前,需要額外準備以下Python套件:
  • numpy
  • opencv
  • keras

同時亦需準備一定數量的影像檔(.jpeg、.png)與資料檔(.csv):



本範例所採用的檔案來自於這個網站:

https://nihcc.app.box.com/v/ChestXray-NIHCC

我們先從簡單的範例開始,下一篇將以辨識肺部X光照片所屬的性別為例。

下一章「使用Keras卷積神經網路辨別肺部醫學影像(二)」

2019年4月4日 星期四

標籤的秘密

上一回介紹的是h1~h6的標籤

h開頭的標籤有著標題的意思,也能達到改變文字大小與粗細的效果

標籤的秘密就是在於它有著一體雙效的力量,"意思"與"造型"

絕大多數的標籤都具有意思,比方說strong標籤的意思是重點強調,p標籤的意思是段落

造型方面,前者能讓文字變得更粗,後者能讓畫面變寬敞變好看

但是實際做網站的時候呢,造型方面會由CSS統一負責,而html只要負責意思的部分就好了。

所以說,不要為了讓畫面變寬敞而使用p標籤,不要為了讓文字變粗而使用strong標籤,不要為了讓字變大而使用h1標籤,而是要依照意義使用。
之後再統一由CSS來做造型的修改

這樣才能兼顧到網站的SEO與視覺畫面,行銷和設計師才不會哭哭喔

html標籤介紹 h1到h6

h1~h6的標籤

h1的標籤字體很大很粗
h2的字體比h1小一點  也比較細一點
h6的字體最小最細

h1是長這樣的

hi我是h1

h6是長這樣的
hi我是h6
h1的意義是網站主標題
這個標籤在網站內的權重是非常大的
搜尋引擎在抓網站內容的時候會被這個標籤吸取注意力
所以不要重複使用h1標籤
這樣搜尋引擎會不知道這個網站的哪裡是重點
用法:h1 整個網站一個 h2:每個頁面一個 h3:每個頁面多個