深度學習一行一行敲faster rcnn-keras版(2.3,網路測試)
對源碼進行逐句解析,盡量說的很細緻。
歡迎各位看官捧場!
源碼地址:keras版本faster rcnn
想了解這篇文章的前後內容出門左拐:faster rcnn代碼理解-keras(目錄)
視頻目錄:深度學習一行一行敲faster rcnn-keras版(視頻目錄)
網路測試流程圖:
這章是關於--test_frcnn.py的:(三、classifer網路邊框分類與回歸)
-------------------------------①------------------------------
[P_cls, P_regr] = model_classifier_only.predict([F, ROIs])n
進行類別預測和邊框回歸
1. P_cls:該邊框屬於某一類別的概率
2. P_regr:每一個類別對應的邊框回歸梯度
3. F:rpn網路得到的卷積後的特徵圖
4. ROIS:處理得到的區域預選框
-------------------------------②------------------------------
for ii in range(P_cls.shape[1]):n
遍歷每一個預選寬(P_cls.shape[1]:預選框的個數)
if np.max(P_cls[0, ii, :]) < bbox_threshold or np.argmax(P_cls[0, ii, :]) == (P_cls.shape[2] - 1):n continuen
如果該預選框的最大概率小於設定的閾值(即預測的肯定程度大於一定的值,我們才認為這次的類別的概率預測是有效的)
或者最大的概率出現在背景上,則認為這個預選框是無效的,進行下一次預測。
cls_name = class_mapping[np.argmax(P_cls[0, ii,:])]n
不屬於上面的兩種情況,取最大的概率處為此邊框的類別得到其名稱。
if cls_name not in bboxes:n bboxes[cls_name] = []n probs[cls_name] = []n
創建兩個list,用於存放不同類別對應的邊框和概率
(x, y, w, h) = ROIs[0, ii, :]nn cls_num = np.argmax(P_cls[0, ii, :])n try:n (tx, ty, tw, th) = P_regr[0, ii, 4 * cls_num:4 * (cls_num + 1)]n tx /= C.classifier_regr_std[0]n ty /= C.classifier_regr_std[1]n tw /= C.classifier_regr_std[2]n th /= C.classifier_regr_std[3]n x, y, w, h = roi_helpers.apply_regr(x, y, w, h, tx, ty, tw, th)n except:n passn
1. 得到該預選框的信息
2. 得到類別對應的編號
3. 根據類別編號得到該類的邊框回歸梯度
4. 對回歸梯度進行規整化【?為什麼要這麼做】
5. 對預測的邊框進行修正
bboxes[cls_name].append([C.rpn_stride*x,C.rpn_stride*y, C.rpn_stride*(x+w), C.rpn_stride*(y+h)])nprobs[cls_name].append(np.max(P_cls[0, ii, :]))n
向相應的類裡面添加信息。【?為什麼要乘 C.rpn_stride,邊框的預測都是在特徵圖上進行的要將其映射到規整後的原圖上】
for key in bboxes:n bbox = np.array(bboxes[key])n new_boxes,new_probs = roi_helpers.non_max_suppression_fast(bbox, np.array(probs[key]),overlap_thresh=0.5)n
遍歷bboxes里的類,取出某一類的bbox,合併一些重合度較高的選框(剩下來的這些框就是最終識別的結果了)【深度學習faster rcnn代碼-keras與tensorflow版(3.2,non_max_suppression_fast函數)】
-------------------------------③------------------------------
for jk in range(new_boxes.shape[0]):n (x1, y1, x2, y2) = new_boxes[jk, :]nn (real_x1, real_y1, real_x2, real_y2) = get_real_coordinates(ratio, x1, y1, x2, y2)nn cv2.rectangle(img, (real_x1, real_y1), (real_x2, real_y2),n (int(class_to_color[key][0]), int(class_to_color[key][1]), int(class_to_color[key][2])), 2)n
得到新的預選框,然後將其映射到原圖上(訓練和測試的圖片都是經過規整化的),畫框
註:cv2.rectangle五個參數,圖片名稱、兩個對角點坐標、顏色數組、線寬
textLabel = {}: {}.format(key, int(100 * new_probs[jk]))nall_dets.append((key, 100 * new_probs[jk]))nn(retval, baseLine) = cv2.getTextSize(textLabel, cv2.FONT_HERSHEY_COMPLEX, 1, 1)ntextOrg = (real_x1, real_y1 - 0)nncv2.rectangle(img, (textOrg[0] - 5, textOrg[1] + baseLine - 5),n (textOrg[0] + retval[0] + 5, textOrg[1] - retval[1] - 5), (0, 0, 0), 2)ncv2.rectangle(img, (textOrg[0] - 5, textOrg[1] + baseLine - 5),n (textOrg[0] + retval[0] + 5, textOrg[1] - retval[1] - 5), (255, 255, 255), -1)ncv2.putText(img, textLabel, textOrg, cv2.FONT_HERSHEY_DUPLEX, 1, (0, 0, 0), 1)n
這段代碼是為了向預選框上加上類別和文字
1. 得到框對應的類和相應的概率text(【註:符串格式化(format)】)
2. all_dets只是後來做顯示用
3. 得到文本的相關信息(註:getTextSize的用法)
4. 確定文本框的左上點,文本框的邊框大小,文本框的底色,加上文字
5. 需要說明的是:cv2畫框和添加文本是直接在圖片上進行的是改變圖片的
print(Elapsed time = {}.format(time.time() - st))nprint(all_dets)ncv2.imshow(img, img)ncv2.waitKey(0)ncv2.imwrite(./results_imgs/{}.png.format(idx),img)n
1. 列印出測試一張圖片需要的時間(【註:time.time()即得到當前的時間】)
2. 列印所有的識別信息
3. 顯示與保存圖片圖片,需要特別注意的是cv2.imshow的第一個參數是顯示框名稱,第二個才是圖片(【註:cv2.waitKey(0)暫停程序,顯示該圖片知道關閉顯示窗口】)
至此test_frcnn.py文件算是解析完成啦!
最後當然是附上測試的最終效果圖啦!
歡迎關注公眾號:huangxiaobai880
https://www.zhihu.com/video/919290317457461248
推薦閱讀:
※Python數據挖掘實踐—KNN分類
※[科普]如何使用高大上的方法調參數
※在神經網路中weight decay起到的做用是什麼?momentum呢?normalization呢?
※美國數據挖掘研究生?
TAG:深度学习DeepLearning | 机器学习 | 源码阅读 |