2016年科大網絡程序設計課程即將結束,來總結一下這門課程給我帶來的收穫。首先在這裏要感謝孟老師的教導,孟寧老師授課方式很特別,採用項目驅動方式,由學生在老師的帶動下主動開發,在這門課程中,班裏70多個學生共同完成了這個項目。很慚愧,我對這個項目並無什麼直接的貢獻。我學習了python和一些機器學習算法,對CNN,RNN,深度學習框架及圖像處理有了些瞭解。python
項目介紹mysql
基於深度學習神經網絡等機器學習技術實現一個醫學輔助診斷的專家系統原型,體現爲對血常規檢驗報告的OCR識別,而後將識別的數據傳入神經網絡中預測年齡和性別。算法
項目要求sql
1.將血常規檢驗報告的圖片識別出年齡、性別及血常規檢驗的各項數據,獲得一個json數據存儲到了MongoDB數據庫中,如識別出的結果與圖片不一致,可人工修正。mongodb
2.搭建神經網絡學習血常規檢驗的各項數據及對應的年齡性別,而且最後能根據血常規數據預測年齡和性別。數據庫
安裝包:json
# 安裝numpy sudo apt-get install python-numpy # http://www.numpy.org/ # 安裝opencv sudo apt-get install python-opencv # http://opencv.org/ ##安裝OCR和預處理相關依賴 sudo apt-get install tesseract-ocr sudo pip install pytesseract sudo apt-get install python-tk sudo pip install pillow # 安裝Flask框架、mongo sudo pip install Flask sudo apt-get install mongodb # 若是找不到能夠先sudo apt-get update sudo service mongodb started sudo pip install pymongo #安裝pandas和 scikit-learn sudo apt-get install python-numpy cython python-scipy python-matplotlib pip install -U scikit-learn(若是不行就加sudo) pip install pandas
view.py --Web 端上傳圖片到服務器,存入mongodb並獲取oid。 imageFilter.py --對圖像透視裁剪和OCR進行了簡單的封裝,以便於模塊間的交互,規定適當的接口.是整個ocr中最重要的模塊. classifier.py --用於斷定裁剪矯正後的報告和裁剪出檢測項目的編號 imgproc.py --將識別的圖像進行處理二值化等操做,提升識別率 包括對中文和數字的處理
先對整張圖片作預處理。 瀏覽器
#灰度化 img_gray = cv2.cvtColor(self.img, cv2.COLOR_BGR2GRAY) #高斯平滑 img_gb = cv2.GaussianBlur(img_gray, (gb_param,gb_param), 0) #閉運算 closed = cv2.morphologyEx(img_gb, cv2.MORPH_CLOSE, kernel) #開運算 opened = cv2.morphologyEx(closed, cv2.MORPH_OPEN, kernel) #canny算子邊緣檢測 edges = cv2.Canny(opened, canny_param_lower , canny_param_upper)
因爲整張圖有英文,中文,數字,符號等混雜在一塊兒,因此要直接識別實現難度至關大。因此首先要對圖片進行裁剪成單個的小方塊。定位圖片是關鍵。服務器
將黑線看成識別的特徵網絡
# 調用findContours提取輪廓 contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 求得最小外接矩形 def getbox(i): rect = cv2.minAreaRect(contours[i]) box = cv2.cv.BoxPoints(rect) box = np.int0(box) return box
# 由三條線來肯定表頭的位置和表尾的位置 line_upper, line_lower = findhead(line[2],line[1],line[0]) # 由表頭和表尾肯定目標區域的位置 # 利用叉乘的不可交換性肯定起始點 total_width = line_upper[1]-line_upper[0] total_hight = line_lower[0]-line_upper[0] cross_prod = cross(total_width, total_hight) if cross_prod <0: temp = line_upper[1] line_upper[1] = line_upper[0] line_upper[0] = temp temp = line_lower[1] line_lower[1] = line_lower[0] line_lower[0] = temp
隨機森林是一個樹型分類器{h(x,k),k=1,…}的集合。其中元分類器h(x,k)是用CART算法構建的沒有剪枝的分類迴歸樹;x是輸入向量;k是獨立同分布的隨機向量,決定了單顆樹的生長過程;森林的輸出採用簡單多數投票法(針對分類)或單顆樹輸出結果的簡單平均(針對迴歸)獲得。
利用隨機森林訓練模型
年齡模型:
min_max_scaler = preprocessing.MinMaxScaler() x_train, x_test, y_train, y_test = train_test_split(train_data, train_labels, test_size=0.2) #clf = RandomForestRegressor(n_estimators=25) #clf.fit(x_train, y_train) clf = joblib.load("./age/age_model.m") y_pred = clf.predict(x_test) print "MAE:",metrics.mean_absolute_error(y_test, y_pred) joblib.dump(clf, "./age/age_model.m")
性別模型:
min_max_scaler = preprocessing.MinMaxScaler() x_train, x_test, y_train, y_test = train_test_split(train_data, train_labels, test_size=0.2) #clf = RandomForestClassifier(n_estimators=25) clf = joblib.load("./sex/sex_model.m") #clf.fit(x_train, y_train) y_pred = clf.predict(x_test) # clf = RandomForestClassifier(n_estimators=25) # clf.fit(x_train, y_train) # y_pred = clf.predict(x_test) p = np.mean(y_pred == y_test) print precision_score(y_test, y_pred, average='macro') print recall_score(y_test, y_pred, average='macro') print f1_score(y_test, y_pred, average='macro')
將模型集成到診斷系統中
elif app.config['MODEL'] == 'rf': clf_age = joblib.load("./age/age_model.m") clf_sex = joblib.load("./sex/sex_model.m") age = clf_age.predict(arr) sex = clf_sex.predict(arr) result = { "sex": int(sex), "age": int(age) }
cd BloodTestReportOCR python view.py # upload圖像,在瀏覽器打開http://yourip:8080
選擇圖片上傳
生成報告
進行預測
機器時是面對一個具體問題,從給定的數據中產生模型的算法,感悟到在學習時,要有意識甚至刻意的的創建起知識架構,從而在面對一個問題時,纔能有完整的求解思路。機器學習纔開始接觸,還要好多
算法須要學習,須要知道這些算法在什麼場合下使用,以及這些算法的優缺點,以及調參經驗等等。