This commit is contained in:
王老板 2024-10-30 02:51:17 +08:00
parent 631a201472
commit 15715f1555
7 changed files with 33 additions and 33 deletions

View File

@ -724,7 +724,7 @@ We also explore the stop-gradient strategy for the O2O classification subhead. A
\textbf{Ablation study on NMS-free block in dense scenarios.} Despite demonstrating the feasibility of replacing NMS with the O2O classification subhead in sparse scenarios, the shortcomings of NMS in dense scenarios remain. To investigate the performance of the NMS-free block in dense scenarios, we conduct experiments on the CurveLanes dataset, as detailed in Table \ref{aba_NMS_dense}. \textbf{Ablation study on NMS-free block in dense scenarios.} Despite demonstrating the feasibility of replacing NMS with the O2O classification subhead in sparse scenarios, the shortcomings of NMS in dense scenarios remain. To investigate the performance of the NMS-free block in dense scenarios, we conduct experiments on the CurveLanes dataset, as detailed in Table \ref{aba_NMS_dense}.
In the traditional NMS post-processing \cite{clrernet}, the default IoU threshold is set to 50 pixels. However, this default setting may not always be optimal, especially in dense scenarios where some lane predictions might be erroneously eliminated. Lowering the IoU threshold increases recall but decreases precision. To find the most effective IoU threshold, we experimented with various values and found that a threshold of 15 pixels achieves the best trade-off, resulting in an F1-score of 86.81\%. In contrast, the NMS-free paradigm with the O2O classification subhead achieves an overall F1-score of 87.29\%, which is 0.48\% higher than the optimal threshold setting in the NMS paradigm. Additionally, both precision and recall are improved under the NMS-free approach. This indicates the O2O classification subhead with proposed GNN block is capable of learning both explicit geometric distance and implicit semantic distances between anchors, thus providing a more effective solution for dense scenarios compared to traditional NMS post-processing. In the traditional NMS post-processing \cite{clrernet}, the default IoU threshold is set to 50 pixels. However, this default setting may not always be optimal, especially in dense scenarios where some lane predictions might be erroneously eliminated. Lowering the IoU threshold increases recall but decreases precision. To find the most effective IoU threshold, we experimented with various values and found that a threshold of 15 pixels achieves the best trade-off, resulting in an F1-score of 86.81\%. In contrast, the NMS-free paradigm with the O2O classification subhead achieves an overall F1-score of 87.29\%, which is 0.48\% higher than the optimal threshold setting in the NMS paradigm. Additionally, both precision and recall are improved under the NMS-free approach. This indicates the O2O classification subhead with proposed GNN block is capable of learning both explicit geometric distance and implicit semantic distances between anchors, thus providing a more effective solution for dense scenarios compared to traditional NMS post-processing. More visualization outcomes can be seen in Appendix \ref{vis_appendix}.
\section{Conclusion and Future Work} \section{Conclusion and Future Work}
In this paper, we propose Polar R-CNN to address two key issues in anchor-based lane detection methods. By incorporating a local and global polar coordinate system, our Polar R-CNN achieves improved performance with fewer anchors. Additionally, the introduction of the O2O classification subhead with GNN block allows us to replace the traditional NMS post-processing, and the NMS-free paradigm demonstrates superior performance in dense scenarios. Our model is highly flexible and the number of anchors can be adjusted based on the specific scenario. Polar R-CNN is also deployment-friendly due to its simple structure, making it a potential new baseline for lane detection. Future work could explore new label assignment, anchor sampling strategies and complicated model structures, such as large kernels and attention mechanisms. We also plan to extend Polar R-CNN to video instance and 3D lane detection tasks, utilizing advanced geometric modeling techniques. In this paper, we propose Polar R-CNN to address two key issues in anchor-based lane detection methods. By incorporating a local and global polar coordinate system, our Polar R-CNN achieves improved performance with fewer anchors. Additionally, the introduction of the O2O classification subhead with GNN block allows us to replace the traditional NMS post-processing, and the NMS-free paradigm demonstrates superior performance in dense scenarios. Our model is highly flexible and the number of anchors can be adjusted based on the specific scenario. Polar R-CNN is also deployment-friendly due to its simple structure, making it a potential new baseline for lane detection. Future work could explore new label assignment, anchor sampling strategies and complicated model structures, such as large kernels and attention mechanisms. We also plan to extend Polar R-CNN to video instance and 3D lane detection tasks, utilizing advanced geometric modeling techniques.
@ -893,7 +893,7 @@ This criteria is also referred to as the \textit{dual confidence selection} in t
\begin{table*}[htbp] \begin{table*}[htbp]
\centering \centering
\caption{Infos and hyperparameters for five datasets. For the CULane dataset, $*$ denotes the actual number of training samples used to train our model. Labels for some validation/test sets are missing; therefore, selected different splits (test or validation set) are selected for different datasets.} \caption{Infos and hyperparameters for five datasets. For the CULane dataset, $*$ denotes the actual number of training samples used to train the model. Labels for some validation/test sets are missing and different splits (\textit{i.e.} validation and test set) are selected for different datasets.}
\begin{adjustbox}{width=\linewidth} \begin{adjustbox}{width=\linewidth}
\begin{tabular}{l|l|ccccc} \begin{tabular}{l|l|ccccc}
\toprule \toprule

Binary file not shown.

Before

Width:  |  Height:  |  Size: 266 KiB

After

Width:  |  Height:  |  Size: 254 KiB

View File

@ -13,30 +13,30 @@ mpl.rcParams['legend.fontsize'] = 22
alpha = 0.7 alpha = 0.7
plt.figure(figsize=(8.5, 8)) plt.figure(figsize=(8.5, 8))
# 2*7 # 2×7
x_2x7 = [10, 14] x_2x7 = [10, 14]
y_2x7 = [80.075, 80.083] y_2x7 = [80.075, 80.083]
plt.plot(x_2x7, y_2x7, 'o-', color='blue', alpha=alpha, markersize=12, linewidth=4, label="2*7") plt.plot(x_2x7, y_2x7, 'o-', color='blue', alpha=alpha, markersize=12, linewidth=4, label="2×7")
# 2*10 # 2×10
x_2x10 = [10, 15, 20] x_2x10 = [10, 15, 20]
y_2x10 = [80.549, 80.585, 80.59] y_2x10 = [80.549, 80.585, 80.59]
plt.plot(x_2x10, y_2x10, 's-', color='green', alpha=alpha, markersize=12, linewidth=4, label="2*10") plt.plot(x_2x10, y_2x10, 's-', color='green', alpha=alpha, markersize=12, linewidth=4, label="2×10")
# 4*10 # 4×10
x_4x10 = [10, 15, 20, 25, 30, 35, 40] x_4x10 = [10, 15, 20, 25, 30, 35, 40]
y_4x10 = [80.3, 80.824, 80.805, 80.799, 80.798, 80.796, 80.794] y_4x10 = [80.3, 80.824, 80.805, 80.799, 80.798, 80.796, 80.794]
plt.plot(x_4x10, y_4x10, 'd-', color='red', alpha=alpha, markersize=12, linewidth=4, label="4*10") plt.plot(x_4x10, y_4x10, 'd-', color='red', alpha=alpha, markersize=12, linewidth=4, label="4×10")
# 5*12 # 5×12
x_5x12 = [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60] x_5x12 = [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60]
y_5x12 = [79.742, 80.809, 80.9, 80.924, 80.919, 80.92, 80.921, 80.924, 80.923, 80.923, 80.924] y_5x12 = [79.742, 80.809, 80.9, 80.924, 80.919, 80.92, 80.921, 80.924, 80.923, 80.923, 80.924]
plt.plot(x_5x12, y_5x12, 'v-', color='purple', alpha=alpha, markersize=12, linewidth=4, label="5*12") plt.plot(x_5x12, y_5x12, 'v-', color='purple', alpha=alpha, markersize=12, linewidth=4, label="5×12")
# 6*18 # 6×18
x_6x13 = [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 78] x_6x13 = [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 78]
y_6x13 = [78.576, 80.53, 80.907, 80.953, 80.955, 80.958, 80.956, 80.958, 80.963, 80.965, 80.962, 80.962, 80.962, 80.962] y_6x13 = [78.576, 80.53, 80.907, 80.953, 80.955, 80.958, 80.956, 80.958, 80.963, 80.965, 80.962, 80.962, 80.962, 80.962]
plt.plot(x_6x13, y_6x13, 'p-', color='orange', alpha=alpha, markersize=12, linewidth=4, label="6*13") plt.plot(x_6x13, y_6x13, 'p-', color='orange', alpha=alpha, markersize=12, linewidth=4, label="6×13")
plt.grid(True, linestyle='-', alpha=0.5) plt.grid(True, linestyle='-', alpha=0.5)

View File

@ -17,30 +17,30 @@ mpl.rcParams['legend.fontsize'] = 22
alpha = 0.7 alpha = 0.7
plt.figure(figsize=(8.5, 8)) plt.figure(figsize=(8.5, 8))
# 2*7 # 2×7
x_2x7 = [10, 14] x_2x7 = [10, 14]
y_2x7 = [87.343, 85.597] y_2x7 = [87.343, 85.597]
plt.plot(x_2x7, y_2x7, 'o-', color='blue', alpha=alpha, markersize=12, linewidth=4, label="2*7") plt.plot(x_2x7, y_2x7, 'o-', color='blue', alpha=alpha, markersize=12, linewidth=4, label="2×7")
# 2*10 # 2×10
x_2x10 = [10, 15, 20] x_2x10 = [10, 15, 20]
y_2x10 = [88.174, 88.044, 88.036] y_2x10 = [88.174, 88.044, 88.036]
plt.plot(x_2x10, y_2x10, 's-', color='green', alpha=alpha, markersize=12, linewidth=4, label="2*10") plt.plot(x_2x10, y_2x10, 's-', color='green', alpha=alpha, markersize=12, linewidth=4, label="2×10")
# 4*10 # 4×10
x_4x10 = [10, 15, 20, 25, 30, 35, 40] x_4x10 = [10, 15, 20, 25, 30, 35, 40]
y_4x10 = [89.599, 88.822, 88.516, 88.428, 88.390, 88.379, 88.376] y_4x10 = [89.599, 88.822, 88.516, 88.428, 88.390, 88.379, 88.376]
plt.plot(x_4x10, y_4x10, 'd-', color='red', alpha=alpha, markersize=12, linewidth=4, label="4*10") plt.plot(x_4x10, y_4x10, 'd-', color='red', alpha=alpha, markersize=12, linewidth=4, label="4×10")
# 5*12 # 5×12
x_5x12 = [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60] x_5x12 = [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60]
y_5x12 = [89.968, 89.221, 88.893, 88.805, 88.757, 88.740, 88.735, 88.733, 88.729, 88.728, 88.729] y_5x12 = [89.968, 89.221, 88.893, 88.805, 88.757, 88.740, 88.735, 88.733, 88.729, 88.728, 88.729]
plt.plot(x_5x12, y_5x12, 'v-', color='purple', alpha=alpha, markersize=12, linewidth=4, label="5*12") plt.plot(x_5x12, y_5x12, 'v-', color='purple', alpha=alpha, markersize=12, linewidth=4, label="5×12")
# 6*18 # 6×18
x_6x13 = [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 78] x_6x13 = [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 78]
y_6x13 = [90.845, 89.979, 89.492, 89.237, 89.101, 89.055, 89.018, 88.999, 88.996, 88.992, 88.983, 88.982, 88.982, 88.982] y_6x13 = [90.845, 89.979, 89.492, 89.237, 89.101, 89.055, 89.018, 88.999, 88.996, 88.992, 88.983, 88.982, 88.982, 88.982]
plt.plot(x_6x13, y_6x13, 'p-', color='orange', alpha=alpha, markersize=12, linewidth=4, label="6*13") plt.plot(x_6x13, y_6x13, 'p-', color='orange', alpha=alpha, markersize=12, linewidth=4, label="6×13")
plt.grid(True, linestyle='-', alpha=0.5) plt.grid(True, linestyle='-', alpha=0.5)
plt.xlabel("Anchor Proposal Number", fontsize=30) # 横坐标名字 plt.xlabel("Anchor Proposal Number", fontsize=30) # 横坐标名字

View File

@ -13,30 +13,30 @@ mpl.rcParams['legend.fontsize'] = 22
alpha = 0.7 alpha = 0.7
plt.figure(figsize=(8.5, 8)) plt.figure(figsize=(8.5, 8))
# 2*7 # 2×7
x_2x7 = [10, 14] x_2x7 = [10, 14]
y_2x7 = [73.924, 74.002] y_2x7 = [73.924, 74.002]
plt.plot(x_2x7, y_2x7, 'o-', color='blue', alpha=alpha, markersize=12, linewidth=4, label="2*7") plt.plot(x_2x7, y_2x7, 'o-', color='blue', alpha=alpha, markersize=12, linewidth=4, label="2×7")
# 2*10 # 2×10
x_2x10 = [10, 15, 20] x_2x10 = [10, 15, 20]
y_2x10 = [74.138, 74.290, 74.305] y_2x10 = [74.138, 74.290, 74.305]
plt.plot(x_2x10, y_2x10, 's-', color='green', alpha=alpha, markersize=12, linewidth=4, label="2*10") plt.plot(x_2x10, y_2x10, 's-', color='green', alpha=alpha, markersize=12, linewidth=4, label="2×10")
# 4*10 # 4×10
x_4x10 = [10, 15, 20, 25, 30, 35, 40] x_4x10 = [10, 15, 20, 25, 30, 35, 40]
y_4x10 = [72.750, 74.147, 74.330, 74.381, 74.406, 74.411, 74.410] y_4x10 = [72.750, 74.147, 74.330, 74.381, 74.406, 74.411, 74.410]
plt.plot(x_4x10, y_4x10, 'd-', color='red', alpha=alpha, markersize=12, linewidth=4, label="4*10") plt.plot(x_4x10, y_4x10, 'd-', color='red', alpha=alpha, markersize=12, linewidth=4, label="4×10")
# 5*12 # 5×12
x_5x12 = [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60] x_5x12 = [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60]
y_5x12 = [71.603, 73.847, 74.226, 74.327, 74.353, 74.366, 74.371, 74.378, 74.380, 74.380, 74.382] y_5x12 = [71.603, 73.847, 74.226, 74.327, 74.353, 74.366, 74.371, 74.378, 74.380, 74.380, 74.382]
plt.plot(x_5x12, y_5x12, 'v-', color='purple', alpha=alpha, markersize=12, linewidth=4, label="5*12") plt.plot(x_5x12, y_5x12, 'v-', color='purple', alpha=alpha, markersize=12, linewidth=4, label="5×12")
# 6*18 # 6×18
x_6x13 = [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 78] x_6x13 = [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 78]
y_6x13 = [69.227, 72.876, 73.825, 74.077, 74.174, 74.210, 74.232, 74.249, 74.260, 74.265, 74.267, 74.267, 74.267, 74.268] y_6x13 = [69.227, 72.876, 73.825, 74.077, 74.174, 74.210, 74.232, 74.249, 74.260, 74.265, 74.267, 74.267, 74.267, 74.268]
plt.plot(x_6x13, y_6x13, 'p-', color='orange', alpha=alpha, markersize=12, linewidth=4, label="6*13") plt.plot(x_6x13, y_6x13, 'p-', color='orange', alpha=alpha, markersize=12, linewidth=4, label="6×13")
plt.grid(True, linestyle='-', alpha=0.5) plt.grid(True, linestyle='-', alpha=0.5)
plt.xlabel("Anchor Proposal Number", fontsize=30) # 横坐标名字 plt.xlabel("Anchor Proposal Number", fontsize=30) # 横坐标名字

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

After

Width:  |  Height:  |  Size: 162 KiB

View File

@ -39,7 +39,7 @@ for label, props in data.items():
# 设置标题和标签 # 设置标题和标签
plt.grid(True, linestyle='-', alpha=0.5) plt.grid(True, linestyle='-', alpha=0.5)
plt.xlabel('Anchor Proposal Number', fontsize=16) plt.xlabel('Anchor Number', fontsize=16)
plt.ylabel('F1@50 (%)', fontsize=16) plt.ylabel('F1@50 (%)', fontsize=16)
# 添加图例,并调整图例中的标记大小 # 添加图例,并调整图例中的标记大小