深度學習一行一行敲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 | 机器学习 | 源码阅读 |