Переглянути джерело

v0.1.9 增加面积大小过滤(通过面积占比系数)

chenhongjiang 1 рік тому
батько
коміт
1d9112d1b8
6 змінених файлів з 45 додано та 6 видалено
  1. 2 1
      ReadMe.txt
  2. 14 0
      config.cpp
  3. 4 0
      data_def_api.h
  4. 5 1
      tcv_conf.yml
  5. 1 1
      tea_cv_api.cpp
  6. 19 3
      tea_sorter.cpp

+ 2 - 1
ReadMe.txt

@@ -6,4 +6,5 @@ v0.1.4 支
 v0.1.5 支持grab图片上下镜像检测
 v0.1.6 去除支持grab图片上下镜像检测,因为夹爪旋转角度只有180度范围
 v0.1.7 恢复支持grab图片上下镜像检测,增加抓取最小间隔设置
-v0.1.8 改用传统方法获取抓取位置
+v0.1.8 改用传统方法获取抓取位置
+v0.1.9 增加面积大小过滤(通过面积占比系数)

+ 14 - 0
config.cpp

@@ -33,6 +33,8 @@ namespace graft_cv{
 			<< "grid_padding_grab" << m_cparam->grid_padding_grab
 			<< "offset_grab" << m_cparam->offset_grab
 			<< "min_distance_grab" << m_cparam->min_distance_grab
+			<< "min_area_ratio_grab" << m_cparam->min_area_ratio_grab
+			<< "max_area_ratio_grab" << m_cparam->max_area_ratio_grab
 
 			<< "model_path_cut" << m_cparam->model_path_cut
 			<< "object_threshold_cut" << m_cparam->object_threshold_cut
@@ -40,6 +42,8 @@ namespace graft_cv{
 			<< "grid_row_cut" << m_cparam->grid_row_cut
 			<< "grid_col_cut" << m_cparam->grid_col_cut
 			<< "grid_padding_cut" << m_cparam->grid_padding_cut
+			<< "min_area_ratio_cut" << m_cparam->min_area_ratio_cut
+			<< "max_area_ratio_cut" << m_cparam->max_area_ratio_cut
 
 			
 			<< "}"; 	
@@ -61,6 +65,9 @@ namespace graft_cv{
 		m_cparam->grid_padding_grab	= (int)node["grid_padding_grab"];
 		m_cparam->offset_grab = (int)node["offset_grab"];
 		m_cparam->min_distance_grab = (double)node["min_distance_grab"];
+		m_cparam->min_area_ratio_grab = (double)node["min_area_ratio_grab"];
+		m_cparam->max_area_ratio_grab = (double)node["max_area_ratio_grab"];
+
 		
 		m_cparam->model_path_cut = (string)node["model_path_cut"];
 		m_cparam->object_threshold_cut = (float)node["object_threshold_cut"];
@@ -68,6 +75,8 @@ namespace graft_cv{
 		m_cparam->grid_row_cut = (int)node["grid_row_cut"];
 		m_cparam->grid_col_cut = (int)node["grid_col_cut"];
 		m_cparam->grid_padding_cut = (int)node["grid_padding_cut"];
+		m_cparam->min_area_ratio_cut = (double)node["min_area_ratio_cut"];
+		m_cparam->max_area_ratio_cut = (double)node["max_area_ratio_cut"];
 		
   }
 	string get_cparam_info(ConfigParam*m_cparam)
@@ -91,6 +100,8 @@ namespace graft_cv{
 			<< "grid_padding_grab:\t" << m_cparam->grid_padding_grab << endl
 			<< "offset_grab:\t" << m_cparam->offset_grab << endl
 			<< "min_distance_grab:\t" << m_cparam->min_distance_grab << endl
+			<< "min_area_ratio_grab:\t" << m_cparam->min_area_ratio_grab << endl
+			<< "max_area_ratio_grab:\t" << m_cparam->max_area_ratio_grab << endl
 
 
 			<< "model_path_cut:\t" << m_cparam->model_path_cut << endl
@@ -99,6 +110,9 @@ namespace graft_cv{
 			<< "grid_row_cut:\t" << m_cparam->grid_row_cut << endl
 			<< "grid_col_cut:\t" << m_cparam->grid_col_cut << endl
 			<< "grid_padding_cut:\t" << m_cparam->grid_padding_cut << endl
+			<< "min_area_ratio_cut:\t" << m_cparam->min_area_ratio_cut << endl
+			<< "max_area_ratio_cut:\t" << m_cparam->max_area_ratio_cut << endl
+
 
 			<< "}" << endl; 	
 		return buff.str();

+ 4 - 0
data_def_api.h

@@ -26,6 +26,8 @@ typedef struct{
 	int grid_padding_grab;
 	int offset_grab; //抓取点相对参考点(标注的点5)的偏移像素数
 	double min_distance_grab;//抓取两个目标最小中心距离,像素距离
+	double min_area_ratio_grab; //识别目标最小面积比率,最小面积和整个图的面积比
+	double max_area_ratio_grab; //识别目标最大面积比率,最大面积和整个图的面积比
 
 	std::string model_path_cut;
 	float object_threshold_cut;
@@ -33,6 +35,8 @@ typedef struct{
 	int grid_row_cut;
 	int grid_col_cut;
 	int grid_padding_cut;
+	double min_area_ratio_cut; 
+	double max_area_ratio_cut;
 
 } ConfigParam;
 

+ 5 - 1
tcv_conf.yml

@@ -14,9 +14,13 @@ conf_parameters:
    grid_padding_grab: 100
    offset_grab: 100
    min_distance_grab: 501.
-   model_path_cut: "D:/projects/graft/py_code/retina_tea5/TeaDetector_op9.onnx"
+   min_area_ratio_grab: 0.0
+   max_area_ratio_grab: 0.1
+   model_path_cut: "D:/projects/graft/py_code/retina_tea5/TeaDetector_cut_20231203001648.onnx"
    object_threshold_cut: 4.4999998807907104e-01
    nms_threshold_cut: 5.0000000000000000e-01
    grid_row_cut: 1
    grid_col_cut: 1
    grid_padding_cut: 50
+   min_area_ratio_cut: 0.0
+   max_area_ratio_cut: 0.25

+ 1 - 1
tea_cv_api.cpp

@@ -18,7 +18,7 @@ extern CRITICAL_SECTION g_cs;
 namespace graft_cv
 {
 
-	char *g_version_str = "0.1.8";
+	char *g_version_str = "0.1.9";
 
 	//configure
 	string g_conf_file = "./tcv_conf.yml";	

+ 19 - 3
tea_sorter.cpp

@@ -152,13 +152,29 @@ int CTeaSort::detect(
 	vector<Bbox> droplets;
 	vector<int> keep;
 	nms_bbox(droplets_raw, m_drop_detector.GetNmsThreshold(), keep);
-	//width(height) filter
-	for (int i : keep) {		
-		droplets.push_back(droplets_raw[i]);
+	//nms keep and area filter
+	double min_area_th = m_cp.min_area_ratio_grab;
+	double max_area_th = m_cp.max_area_ratio_grab;
+	if (m_dtype == img_type::tea_cut) {
+		min_area_th = m_cp.min_area_ratio_cut;
+		max_area_th = m_cp.max_area_ratio_cut;
+	}
+	for (int i : keep) {
+		Bbox&tbox = droplets_raw[i];
+		double area_ratio = static_cast<double>(tbox.y2 - tbox.y1) * static_cast<double>(tbox.x2 - tbox.x1);
+		area_ratio = fabs(area_ratio);
+		area_ratio /= static_cast<double>(m_raw_img.rows);
+		area_ratio /= static_cast<double>(m_raw_img.cols);
+		tbox.area = area_ratio;
+		if (area_ratio < min_area_th || area_ratio > max_area_th) { continue; }
+		droplets.push_back(tbox);
 	}
 	if (m_pLogger) {
 		stringstream buff_;
 		buff_ << m_imgId << m_dtype_str << "after nms, keep tea number is " << droplets.size();
+		for (auto&tbox : droplets) {
+			buff_ << "\nscore:" << tbox.score << ", area_ratio:" << tbox.area << ", left_top:(" << tbox.x1 << "," << tbox.y1 << "), bottom_rigt:(" << tbox.x2 << "," << tbox.y2 << ")";
+		}
 		m_pLogger->INFO(buff_.str());		
 	}