Commit 1fa395856fcabddf8f23f8ee90c9bcf2e55f74c3
1 parent
502f9d10
输出结果优化
Showing
3 changed files
with
75 additions
and
20 deletions
src/ai_engine_module/VehiclePlate.cpp
@@ -88,9 +88,29 @@ vector<VehiclePlateResult> VehiclePlate::process(vector<DeviceMemory*> vec_gpuMe | @@ -88,9 +88,29 @@ vector<VehiclePlateResult> VehiclePlate::process(vector<DeviceMemory*> vec_gpuMe | ||
88 | memcpy(res.recg, plate_info.recg, sizeof(PlateNum) * 8); | 88 | memcpy(res.recg, plate_info.recg, sizeof(PlateNum) * 8); |
89 | res.num_score = plate_info.num_score; | 89 | res.num_score = plate_info.num_score; |
90 | res.type = plate_info.type; | 90 | res.type = plate_info.type; |
91 | + | ||
91 | res.state = plate_info.state; | 92 | res.state = plate_info.state; |
92 | res.state_score = plate_info.state_score; | 93 | res.state_score = plate_info.state_score; |
93 | 94 | ||
95 | + int space_char_num = 0; | ||
96 | + for (size_t i = 0; i < 8; i++) | ||
97 | + { | ||
98 | + if (fabs(res.recg[i].maxprob) < 0.0001) { | ||
99 | + space_char_num++ ; | ||
100 | + } | ||
101 | + } | ||
102 | + | ||
103 | + if (res.state == 0) | ||
104 | + { | ||
105 | + if (space_char_num == 0) { | ||
106 | + res.state = 1; | ||
107 | + res.state_score = res.detect_score; | ||
108 | + } else if (space_char_num > 0 && space_char_num < PLATENUM) { | ||
109 | + res.state = 2; | ||
110 | + res.state_score = res.detect_score; | ||
111 | + } | ||
112 | + } | ||
113 | + | ||
94 | vec_res.push_back(res); | 114 | vec_res.push_back(res); |
95 | } | 115 | } |
96 | 116 |
src/ai_platform/header.h
@@ -46,6 +46,8 @@ typedef struct hp_cls_info //分类结果结构体 | @@ -46,6 +46,8 @@ typedef struct hp_cls_info //分类结果结构体 | ||
46 | hp_cls_info() : res_index(0), res_prob(0) {}; | 46 | hp_cls_info() : res_index(0), res_prob(0) {}; |
47 | } hp_cls_info; | 47 | } hp_cls_info; |
48 | 48 | ||
49 | + | ||
50 | +static string vechicle_pendant[] = {"车头", "车尾", "车窗", "司机", "人脸", "安全带", "遮阳板", "年检标", "挂件", "纸巾盒", "转经筒", "打电话", "天窗", "行李架", "吸烟", "车前脸", "车后脸", "后视镜", "临时车牌", "车标", "三角标志", "三角危险", "长方形危险"}; | ||
49 | typedef struct VPDInfo | 51 | typedef struct VPDInfo |
50 | { | 52 | { |
51 | int left_; | 53 | int left_; |
@@ -64,6 +66,8 @@ struct PlateNum | @@ -64,6 +66,8 @@ struct PlateNum | ||
64 | int index; | 66 | int index; |
65 | }; | 67 | }; |
66 | 68 | ||
69 | +static string plate_type[] = {"单排蓝色 ", "单排黄色 ", "单排白色 ", "单排黑色", " 双排黄色 ", "双排白色 ", "新能源黄绿色 ", "新能源白绿色"}; | ||
70 | +static string plate_state[] = {"无车牌", " 正常车牌", " 遮挡车牌"}; | ||
67 | struct VehiclePlateResult { | 71 | struct VehiclePlateResult { |
68 | int left_; | 72 | int left_; |
69 | int top_; | 73 | int top_; |
@@ -79,6 +83,8 @@ struct VehiclePlateResult { | @@ -79,6 +83,8 @@ struct VehiclePlateResult { | ||
79 | float state_score;//车牌状态置信度 | 83 | float state_score;//车牌状态置信度 |
80 | }; | 84 | }; |
81 | 85 | ||
86 | +// 0-black 1-blue 2-brown 3-green 4-grey 5-orange 6-pink 7-purple 8-red 9-silver 10-white 11-yellow | ||
87 | +static string vehicle_color[] = {"black", "blue", "brown", "green", "grey", "orange", "pink", "purple", "red", "silver", "white", "yellow"}; | ||
82 | typedef struct ObjectData { | 88 | typedef struct ObjectData { |
83 | string task_id; //该物体属于的任务ID号 | 89 | string task_id; //该物体属于的任务ID号 |
84 | int task_frame_count; //该物体当前出现的帧号 | 90 | int task_frame_count; //该物体当前出现的帧号 |
src/demo/demo.cpp
@@ -6,6 +6,8 @@ | @@ -6,6 +6,8 @@ | ||
6 | #include <stdlib.h> | 6 | #include <stdlib.h> |
7 | #include <unistd.h> | 7 | #include <unistd.h> |
8 | #include <iostream> | 8 | #include <iostream> |
9 | +#include <fstream> | ||
10 | +#include <string> | ||
9 | 11 | ||
10 | #include "opencv2/opencv.hpp" | 12 | #include "opencv2/opencv.hpp" |
11 | #include "opencv2/imgcodecs/legacy/constants_c.h" | 13 | #include "opencv2/imgcodecs/legacy/constants_c.h" |
@@ -164,8 +166,13 @@ string createTask(void *handle, int gi, bool bFlag = true){ | @@ -164,8 +166,13 @@ string createTask(void *handle, int gi, bool bFlag = true){ | ||
164 | 166 | ||
165 | void show_result(ObjectData obj) | 167 | void show_result(ObjectData obj) |
166 | { | 168 | { |
167 | - printf("%s %d \n", obj.task_id.c_str(), obj.task_frame_count); | ||
168 | - printf("%d %d (%d,%d,%d,%d) %lf \n", obj.index, obj.object_id, obj.left, obj.top, obj.right, obj.bottom, obj.confidence); | 169 | + string str_dir = "./res/result/"; |
170 | + string file_name = obj.task_id + "_" + to_string(obj.object_id) + "_" + obj.str_ts_ms; | ||
171 | + string data_file_name = str_dir + file_name + ".txt"; | ||
172 | + std::ofstream res_file(data_file_name); | ||
173 | + | ||
174 | + res_file << obj.task_id << " " << obj.task_frame_count << endl; | ||
175 | + res_file << obj.index << " " << obj.object_id << " " << obj.left << " " << obj.top << " " << obj.right << " " << obj.bottom << " " << obj.confidence << endl; | ||
169 | 176 | ||
170 | cv::Mat image = cv::imread(obj.ori_pic_path); | 177 | cv::Mat image = cv::imread(obj.ori_pic_path); |
171 | 178 | ||
@@ -175,26 +182,46 @@ void show_result(ObjectData obj) | @@ -175,26 +182,46 @@ void show_result(ObjectData obj) | ||
175 | 182 | ||
176 | if (obj.index == 0) | 183 | if (obj.index == 0) |
177 | {// person | 184 | {// person |
178 | - for (size_t i = 0; i < HP_ATTRI_SIZE; i++) | ||
179 | - { | ||
180 | - auto hp_cls = obj.hp_cls[i]; | ||
181 | - printf("(%d, %f) ", hp_cls.res_index, hp_cls.res_prob); | ||
182 | - } | ||
183 | - printf("\n"); | 185 | + res_file << "person:" << endl; |
186 | + res_file << "hair: " << hair[obj.hp_cls[0].res_index] << " " << obj.hp_cls[0].res_prob << endl; | ||
187 | + res_file << "hair_color: " << hair_color[obj.hp_cls[1].res_index] << " " << obj.hp_cls[1].res_prob << endl; | ||
188 | + res_file << "eye_glass: " << eye_glass[obj.hp_cls[2].res_index] << " " << obj.hp_cls[2].res_prob << endl; | ||
189 | + res_file << "mask: " << mask[obj.hp_cls[3].res_index] << " " << obj.hp_cls[3].res_prob << endl; | ||
190 | + res_file << "up cloth: " << up_cloth[obj.hp_cls[4].res_index] << " " << obj.hp_cls[4].res_prob << endl; | ||
191 | + res_file << "up_cloth_color: " << up_cloth_color[obj.hp_cls[5].res_index] << " " << obj.hp_cls[5].res_prob << endl; | ||
192 | + res_file << "clothing context: " << clothing_text[obj.hp_cls[6].res_index] << " " << obj.hp_cls[6].res_prob << endl; | ||
193 | + res_file << "down cloth: " << down_cloth[obj.hp_cls[7].res_index] << " " << obj.hp_cls[7].res_prob << endl; | ||
194 | + res_file << "down cloth color: " << down_cloth_color[obj.hp_cls[8].res_index] << " " << obj.hp_cls[8].res_prob << endl; | ||
195 | + res_file << "bag: " << bag[obj.hp_cls[9].res_index] << " " << obj.hp_cls[9].res_prob << endl; | ||
196 | + res_file << "sex: " << sex[obj.hp_cls[10].res_index] << " " << obj.hp_cls[10].res_prob << endl; | ||
197 | + res_file << "age: " << age[obj.hp_cls[11].res_index] << " " << obj.hp_cls[11].res_prob << endl; | ||
198 | + res_file << "viewpoint: " << viewpoint[obj.hp_cls[12].res_index] << " " << obj.hp_cls[12].res_prob << endl; | ||
199 | + res_file << "umbrella: " << umbrella[obj.hp_cls[13].res_index] << " " << obj.hp_cls[13].res_prob << endl; | ||
200 | + res_file << "hold_baby: " << hold_baby[obj.hp_cls[14].res_index] << " " << obj.hp_cls[14].res_prob << endl; | ||
201 | + res_file << "person state: " << personstate[obj.hp_cls[15].res_index] << " " << obj.hp_cls[15].res_prob << endl; | ||
202 | + | ||
184 | for (size_t i = 0; i < HUMANREID_FEATURE_SIZE; i++) | 203 | for (size_t i = 0; i < HUMANREID_FEATURE_SIZE; i++) |
185 | { | 204 | { |
186 | auto hp_cls = obj.hp_feature[i]; | 205 | auto hp_cls = obj.hp_feature[i]; |
187 | - printf("%f ", obj.hp_feature[i]); | 206 | + res_file << obj.hp_feature[i] << " "; |
188 | } | 207 | } |
189 | - printf("\n"); | 208 | + res_file << endl; |
190 | } | 209 | } |
191 | else if (obj.index >= 4 && obj.index <= 8) | 210 | else if (obj.index >= 4 && obj.index <= 8) |
192 | {// vehicle | 211 | {// vehicle |
193 | - printf("vehicle color:%d prob:%f \n", obj.vehicle_color_index, obj.vehicle_color_prob); | 212 | + res_file << "vehicle:" << endl; |
213 | + if (obj.vehicle_color_index >= 0) | ||
214 | + { | ||
215 | + res_file << "color:" << vehicle_color[obj.vehicle_color_index] << " " << obj.vehicle_color_prob << endl; | ||
216 | + } | ||
217 | + | ||
194 | for (size_t i = 0; i < obj.vec_vpd_cls.size(); i++) | 218 | for (size_t i = 0; i < obj.vec_vpd_cls.size(); i++) |
195 | { | 219 | { |
196 | auto info = obj.vec_vpd_cls[i]; | 220 | auto info = obj.vec_vpd_cls[i]; |
197 | - printf("%d %f (%d, %d, %d, %d) \n", info.index, info.confidence, info.left_, info.top_, info.width_, info.height_); | 221 | + if (info.index >= 0) |
222 | + { | ||
223 | + res_file << vechicle_pendant[info.index] << " " << info.confidence << " " << info.left_ << " " << info.top_ << " " << info.width_ << " " << info.height_ << endl; | ||
224 | + } | ||
198 | 225 | ||
199 | cv::Rect rc(info.left_, info.top_, info.width_, info.height_); | 226 | cv::Rect rc(info.left_, info.top_, info.width_, info.height_); |
200 | const cv::Scalar color(0, 255, 255); | 227 | const cv::Scalar color(0, 255, 255); |
@@ -202,22 +229,24 @@ void show_result(ObjectData obj) | @@ -202,22 +229,24 @@ void show_result(ObjectData obj) | ||
202 | } | 229 | } |
203 | 230 | ||
204 | auto& plate_info = obj.vehicle_plate; | 231 | auto& plate_info = obj.vehicle_plate; |
205 | - printf("plate : (%d, %d, %d, %d) %f \n", plate_info.left_, plate_info.top_, plate_info.width_, plate_info.height_, plate_info.detect_score ); | 232 | + res_file << "plate:" << plate_info.left_ << " " << plate_info.top_ << " " << plate_info.width_ << " " << plate_info.height_ << " " << plate_info.detect_score << endl; |
206 | cv::Rect rc(plate_info.left_, plate_info.top_, plate_info.width_, plate_info.height_); | 233 | cv::Rect rc(plate_info.left_, plate_info.top_, plate_info.width_, plate_info.height_); |
207 | const cv::Scalar color(0, 255, 0); | 234 | const cv::Scalar color(0, 255, 0); |
208 | cv::rectangle(image, rc, color); | 235 | cv::rectangle(image, rc, color); |
236 | + res_file << "plate number:" ; | ||
209 | for (size_t i = 0; i < 8; i++) | 237 | for (size_t i = 0; i < 8; i++) |
210 | { | 238 | { |
211 | - printf("%s:%f ", plate_info.recg[i].character, plate_info.recg[i].maxprob); | 239 | + res_file << plate_info.recg[i].character << " " << plate_info.recg[i].maxprob << " "; |
212 | } | 240 | } |
213 | - printf("\n"); | ||
214 | - printf("num_score: %f \n", plate_info.num_score); | ||
215 | - printf("type: %d \n", plate_info.type); | ||
216 | - printf("state:%d %f\n", plate_info.state, plate_info.state_score); | 241 | + res_file << endl; |
242 | + res_file << "num_score:" << plate_info.num_score << endl; | ||
243 | + res_file << "type:" << plate_type[plate_info.type] << endl; | ||
244 | + res_file << "state:" << plate_state[plate_info.state] << " " << plate_info.state_score << endl; | ||
217 | } | 245 | } |
218 | - printf("\n"); | 246 | + |
247 | + res_file.close(); | ||
219 | 248 | ||
220 | - string result_path = "./res/result/" + obj.task_id + "_" + to_string(obj.object_id) + "_" + obj.str_ts_ms + ".jpg"; | 249 | + string result_path = str_dir + file_name + ".jpg"; |
221 | cv::imwrite(result_path, image); | 250 | cv::imwrite(result_path, image); |
222 | image.release(); | 251 | image.release(); |
223 | } | 252 | } |