728x90

 

파워 쉘에서 coco data를 이용하여 웹캠으로 화면을 잡을 시 밑에 사진과 같은 결과를 얻을 수 있다.

하지만 특정 class만 화면에 detection 하고 싶으면 image_opencv.cpp이라는 파일에서 draw_detections_cv_v3이라는 함수를 수정해주면 된다.

 

for (i = 0; i < num; ++i) {
                char labelstr[4096] = { 0 };
                int class_id = -1;
                for (j = 0; j < classes; ++j) {
                    int show = strncmp(names[j], "dont_show", 9);
                    if (dets[i].prob[j] > thresh && show) {
                        if (class_id < 0) {
                            strcat(labelstr, names[j]);
                            class_id = j;
                            char buff[20];
                            if (dets[i].track_id) {
                                sprintf(buff, " (id: %d)", dets[i].track_id);
                                strcat(labelstr, buff);
                            }
                            sprintf(buff, " (%2.0f%%)", dets[i].prob[j] * 100);
                            strcat(labelstr, buff);
                            printf("%s: %.0f%% ", names[j], dets[i].prob[j] * 100);
                            if (dets[i].track_id) printf("(track = %d, sim = %f) ", dets[i].track_id, dets[i].sim);
                        }
                        else {
                            strcat(labelstr, ", ");
                            strcat(labelstr, names[j]);
                            printf(", %s: %.0f%% ", names[j], dets[i].prob[j] * 100);
                        }
                    }
                }
           

            

            if (class_id >= 0) {
                int width = std::max(1.0f, show_img->rows * .002f);

위의 코드에서  if (class_id >= 0) { int width = std::max(1.0f, show_img->rows * .002f);  밑에 조건을 걸어주면 특정 class만 화면에서 detection 하는 것이 가능하다.

 

   for (i = 0; i < num; ++i) {
                char labelstr[4096] = { 0 };
                int class_id = -1;
                for (j = 0; j < classes; ++j) {
                    int show = strncmp(names[j], "dont_show", 9);
                    if (dets[i].prob[j] > thresh && show) {
                        if (class_id < 0) {
                            strcat(labelstr, names[j]);
                            class_id = j;
                            char buff[20];
                            if (dets[i].track_id) {
                                sprintf(buff, " (id: %d)", dets[i].track_id);
                                strcat(labelstr, buff);
                            }
                            sprintf(buff, " (%2.0f%%)", dets[i].prob[j] * 100);
                            strcat(labelstr, buff);
                            printf("%s: %.0f%% ", names[j], dets[i].prob[j] * 100);
                            if (dets[i].track_id) printf("(track = %d, sim = %f) ", dets[i].track_id, dets[i].sim);
                        }
                        else {
                            strcat(labelstr, ", ");
                            strcat(labelstr, names[j]);
                            printf(", %s: %.0f%% ", names[j], dets[i].prob[j] * 100);
                        }
                    }
                }
           

            

            if (class_id >= 0) {
                int width = std::max(1.0f, show_img->rows * .002f);
                if (strcmp(names[class_id], "person") != 0)
                    continue;

저의 경우는 coco data중에 person만 detection 되도록 설정을 하였다.

 

위의 이미지와 같이 person만 detection 된 것을 확인 할 수 있다. 위의 경우는 동영상이나 웹캠에서 사용할 수 있는 방법이고, 사진의 경우 image.c에서 위의 방법을 같이 수행하면 된다.

728x90

+ Recent posts