From d892dff4cac95f1b6692d7821a2006679a554aaf Mon Sep 17 00:00:00 2001 From: houxiao <houxiao@454eff88-639b-444f-9e54-f578c98de674> Date: 星期三, 28 六月 2017 09:56:10 +0800 Subject: [PATCH] modify proto --- FaceServer/make.sh | 6 + FaceServer/main_face_daemon.cpp | 42 ++++++++++ FaceServer/face_daemon_proto.h | 5 + FaceServer/test_client_compare.cpp | 155 ++++++++++++++++++++++++++++++++++++++ FaceServer/proto_hton_ntoh.cpp | 2 5 files changed, 208 insertions(+), 2 deletions(-) diff --git a/FaceServer/face_daemon_proto.h b/FaceServer/face_daemon_proto.h index 4bc6e34..6bc5689 100644 --- a/FaceServer/face_daemon_proto.h +++ b/FaceServer/face_daemon_proto.h @@ -19,6 +19,7 @@ FDC_SENSETIMEFACEDETECT_PB, FDC_SENSETIMEFACEDETECT_RESULT_JSON, FDC_SENSETIMEFACEDETECT_SAVE, + FDC_SENSETIMEFACEDETECT_COMPARE, FDC__LAST, }; }; @@ -29,6 +30,7 @@ int16_t mb_type; // MB_Frame::MBFType int16_t width; int16_t height; + int16_t size; uint8_t buff[0]; void hton(); @@ -51,8 +53,9 @@ { int32_t db_id; int32_t st_id; // sensetime id + int16_t confidence; // 1000 times of float confidence - FDP_FaceDetectResult(int32_t _db_id, int32_t _st_id) : db_id(_db_id), st_id(_st_id) + FDP_FaceDetectResult(int32_t _db_id, int32_t _st_id) : db_id(_db_id), st_id(_st_id), confidence(0) {} void hton(); diff --git a/FaceServer/main_face_daemon.cpp b/FaceServer/main_face_daemon.cpp index e4783ab..7e0f27e 100644 --- a/FaceServer/main_face_daemon.cpp +++ b/FaceServer/main_face_daemon.cpp @@ -34,7 +34,7 @@ ss << "\"result\":["; for(fdr_vec_t::const_iterator iter = result.begin(); iter != result.end(); ++iter) { - ss << "[" << WRAPPER_TEXT(iter->db_id) << "," << WRAPPER_TEXT(iter->st_id) << "]"; + ss << "[" << WRAPPER_TEXT(iter->db_id) << "," << WRAPPER_TEXT(iter->st_id) << "," << WRAPPER_TEXT(iter->confidence) << "]"; if (iter != std::prev(result.end())) ss << ","; } @@ -137,6 +137,43 @@ return send_SensetimeFaceDetectResultJson(client, result, ret); } +bool ev_proc_SensetimeFaceDetectCompare(EVClientStub& client) +{ + EVPHeader* evpHeader = (EVPHeader*)client.recvBuff; + FDP_Image* fdpImage1 = (FDP_Image*)(client.recvBuff + sizeof(EVPHeader)); + fdpImage1->ntoh(); + + STFaceImage stfaceImg1; + stfaceImg1.db_id = fdpImage1->db_id; + stfaceImg1.mb_type = fdpImage1->mb_type; + stfaceImg1.width = fdpImage1->width; + stfaceImg1.height = fdpImage1->height; + stfaceImg1.size = fdpImage1->size; + stfaceImg1.buff = fdpImage1->buff; + + FDP_Image* fdpImage2 = (FDP_Image*)(client.recvBuff + sizeof(EVPHeader) + sizeof(FDP_Image) + fdpImage1->size); + fdpImage2->ntoh(); + + STFaceImage stfaceImg2; + stfaceImg2.db_id = fdpImage2->db_id; + stfaceImg2.mb_type = fdpImage2->mb_type; + stfaceImg2.width = fdpImage2->width; + stfaceImg2.height = fdpImage2->height; + stfaceImg2.size = fdpImage2->size; + stfaceImg2.buff = fdpImage2->buff; + + LOGP(DEBUG, "stfaceImg2 db_id=%d, mb_type=%d, width=%d, height=%d, size=%d", + (int)stfaceImg2.db_id, (int)stfaceImg2.mb_type, (int)stfaceImg2.width, (int)stfaceImg2.height, (int)stfaceImg2.size); + + char imgfn[100 * 1024]; + static int i = 0; + sprintf(imgfn, "IMG_%d_%d_w%d_h%d.rgb565", stfaceImg1.db_id, ++i, stfaceImg1.width, stfaceImg1.height); + FILE * pFile = fopen(imgfn, "wb"); + fwrite(stfaceImg1.buff, sizeof(char), stfaceImg1.size, pFile); + fclose(pFile); + pFile = nullptr; +} + bool ev_dispatcher_proto_pb(EVClientStub& client) { LOG_DEBUG << "ev_dispatcher_proto_pb" << LOG_ENDL; @@ -181,6 +218,9 @@ case FaceDaemonCommand::FDC_SENSETIMEFACEDETECT_SAVE: return ev_proc_SensetimeFaceDetectSave(client); break; + case FaceDaemonCommand::FDC_SENSETIMEFACEDETECT_COMPARE: + return ev_proc_SensetimeFaceDetectCompare(client); + break; default: LOG_WARN << "Unknown command" << LOG_ENDL; ev_send_status_packet(client, EVPStatus::EVPS_COMMAND_ERROR); diff --git a/FaceServer/make.sh b/FaceServer/make.sh index 670e598..c47180b 100644 --- a/FaceServer/make.sh +++ b/FaceServer/make.sh @@ -37,6 +37,7 @@ g++ test_client_detect.cpp $CFLAGS $CPPFLAGS g++ test_client_add.cpp $CFLAGS $CPPFLAGS +g++ test_client_compare.cpp $CFLAGS $CPPFLAGS g++ -g -std=c++11 \ logger.o \ @@ -59,4 +60,9 @@ $LDFLAGS -o test_client_add # +g++ -g -std=c++11 \ + test_client_compare.o proto_hton_ntoh.o logger.o \ + $LDFLAGS -o test_client_compare +# + #export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/protobuf/inst/lib:/opt/opencv/inst/lib:/opt/st_face/libs/linux-x86_64 diff --git a/FaceServer/proto_hton_ntoh.cpp b/FaceServer/proto_hton_ntoh.cpp index 02ce433..6abf5c2 100644 --- a/FaceServer/proto_hton_ntoh.cpp +++ b/FaceServer/proto_hton_ntoh.cpp @@ -40,6 +40,7 @@ mb_type = htons(mb_type); width = htons(width); height = htons(height); + size = htons(size); } void FDP_Image::ntoh() @@ -48,6 +49,7 @@ mb_type = ntohs(mb_type); width = ntohs(width); height = ntohs(height); + size = ntohs(size); } void FDP_FaceDetectPB::hton() diff --git a/FaceServer/test_client_compare.cpp b/FaceServer/test_client_compare.cpp new file mode 100644 index 0000000..833808d --- /dev/null +++ b/FaceServer/test_client_compare.cpp @@ -0,0 +1,155 @@ +/************************************ + * For msmr + * server.c + * tesing the speed of bufferevent_write + * 2015-02-03 + * author@tom +************************************/ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <event2/event.h> +#include <event2/bufferevent.h> +#include <event2/buffer.h> +#include <netinet/tcp.h> +#include <arpa/inet.h> + +#include <unistd.h> + +#include "ev_proto.h" +#include "face_daemon_proto.h" + +#include <iostream> +#include <logger.h> +#include <MaterialBuffer.h> + +Logger g_logger(std::cout); + +/* +void make_msg(char* mesg, int& length) +{ + EVPHeader* evpHeader = new (mesg) EVPHeader; + evpHeader->proto = EVPProto::EVPP_PROTOBUF; + evpHeader->cmd = FaceDaemonCommand::FDC_SENSETIMEFACEDETECT_PB; + evpHeader->size = length; + + FILE* pFile = fopen("facelist-3.pb", "rb"); + size_t fsize = fread(mesg + sizeof(EVPHeader), 1, length - sizeof(EVPHeader), pFile); + fclose(pFile); +} +*/ + +void make_msg(char* mesg, int& length) +{ + EVPHeader* evpHeader = new (mesg) EVPHeader; + evpHeader->proto = EVPProto::EVPP_RAW_BIN; // 1 + evpHeader->cmd = FaceDaemonCommand::FDC_SENSETIMEFACEDETECT_COMPARE; // 133 + evpHeader->size = sizeof(EVPHeader); + + FDP_Image* fdpImage1 = nullptr; + { + fdpImage1 = new (mesg + evpHeader->size) FDP_Image; + + fdpImage1->db_id = 0; // -1 + fdpImage1->mb_type = MB_Frame::MBFT_JPEG; // 7 + fdpImage1->width = 291; + fdpImage1->height = 194; + + FILE* pFile = fopen("compare1.jpg", "rb"); + fdpImage1->size = fread(fdpImage1->buff, 1, length, pFile); + fclose(pFile); + pFile = nullptr; + + fdpImage1->hton(); + evpHeader->size += sizeof(FDP_Image) + fdpImage1->size; + } + + FDP_Image* fdpImage2 = nullptr; + { + fdpImage2 = new (mesg + evpHeader->size) FDP_Image; + + fdpImage2->db_id = 0; // -1 + fdpImage2->mb_type = MB_Frame::MBFT_RGB565; // 14 + fdpImage2->width = 52; + fdpImage2->height = 52; + + FILE* pFile = fopen("face-13-w52-h52.rgb565", "rb"); + fdpImage2->size = fread(fdpImage2->buff, 1, length, pFile); + fclose(pFile); + pFile = nullptr; + + fdpImage1->hton(); + evpHeader->size += sizeof(FDP_Image) + fdpImage2->size; + } + + length = evpHeader->size; + evpHeader->hton(); +} + +int main() +{ + // build the message to be sent + int length = 1024 * 1024; // the size of message + char* mesg = (char*)malloc((length+1)*sizeof(char)); // Look out the end mark '/0' of a C string + if (mesg == NULL) + exit(1); + int i; + //for (i=0; i<length; i++) + // strcat(mesg, "a"); + + make_msg(mesg, length); + + printf("%s\n", mesg); + printf("%d\n", (int)strlen(mesg)); + + // build socket + int port = 15436; + + struct sockaddr_in server_addr; + memset(&server_addr, 0, sizeof(server_addr)); + server_addr.sin_family = AF_INET; + server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); + server_addr.sin_port = htons(port); + + // build event base + struct event_base* base = event_base_new(); + + // set TCP_NODELAY to let data arrive at the server side quickly + evutil_socket_t fd; + fd = socket(AF_INET, SOCK_STREAM, 0); + struct bufferevent* conn = bufferevent_socket_new(base,fd,BEV_OPT_CLOSE_ON_FREE); + int enable = 1; + if(setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (void*)&enable, sizeof(enable)) < 0) + printf("ERROR: TCP_NODELAY SETTING ERROR!\n"); + //bufferevent_setcb(conn, NULL, NULL, NULL, NULL); // For client, we don't need callback function + bufferevent_enable(conn, EV_WRITE); + if(bufferevent_socket_connect(conn,(struct sockaddr*)&server_addr,sizeof(server_addr)) == 0) + printf("connect success\n"); + + // start to send data + bufferevent_write(conn,mesg,length); + // check the output evbuffer + struct evbuffer* output = bufferevent_get_output(conn); + + event_base_dispatch(base); + + char readbuf[10]; + int readbufsize = read(fd, readbuf, sizeof(readbuf)); + while(readbufsize>0) + { + readbuf[readbufsize] = '\0'; + printf("%s", readbuf); + readbufsize = read(fd, readbuf, sizeof(readbuf)); + } + printf("\n"); + + free(mesg); + mesg = NULL; + + bufferevent_free(conn); + event_base_free(base); + + printf("Client program is over\n"); + + return 0; +} \ No newline at end of file -- Gitblit v1.8.0