From: Pierre M. <sid...@us...> - 2005-07-01 17:05:21
|
Update of /cvsroot/robotflow/RobotFlow/Probes/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24999 Modified Files: SkinColorGMMTrain.cc Log Message: Removed non skin modelling, added load and show button, added parameters for multiple thresholds testing. Index: SkinColorGMMTrain.cc =================================================================== RCS file: /cvsroot/robotflow/RobotFlow/Probes/src/SkinColorGMMTrain.cc,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** SkinColorGMMTrain.cc 23 Jun 2005 20:57:32 -0000 1.1 --- SkinColorGMMTrain.cc 1 Jul 2005 17:05:05 -0000 1.2 *************** *** 63,67 **** * @parameter_type string * @parameter_value ./ColorGMM ! * @parameter_description File basename for the models to be saved. * * @parameter_name NUM_SKIN_GAUSSIANS --- 63,67 ---- * @parameter_type string * @parameter_value ./ColorGMM ! * @parameter_description Filename for the models to be saved. * * @parameter_name NUM_SKIN_GAUSSIANS *************** *** 70,87 **** * @parameter_description Number of gaussians to use in the skin mixture model. * ! * @parameter_name NUM_NONSKIN_GAUSSIANS ! * @parameter_type int ! * @parameter_value 3 ! * @parameter_description Number of gaussians to use in the non skin mixture model. ! * ! * @parameter_name SKIN_LOG_LIKELIHOOD_THRESHOLD * @parameter_type float ! * @parameter_value 10.0 ! * @parameter_description Log likelihood threshold to consider a pixel as skin. * ! * @parameter_name NON_SKIN_LOG_LIKELIHOOD_THRESHOLD * @parameter_type float ! * @parameter_value 10.0 ! * @parameter_description Log likelihood threshold to consider a pixel as non skin. * * @input_name IN_IMAGE --- 70,82 ---- * @parameter_description Number of gaussians to use in the skin mixture model. * ! * @parameter_name MEAN_SKIN_LOG_LIKELIHOOD_THRESHOLD * @parameter_type float ! * @parameter_value 5.3 ! * @parameter_description Mean log likelihood threshold to consider a pixel as skin. * ! * @parameter_name SKIN_LOG_LIKELIHOOD_THRESHOLD_INC * @parameter_type float ! * @parameter_value 0.1 ! * @parameter_description Increment for the mean log likelihood threshold. This is to test multiple thresholds. * * @input_name IN_IMAGE *************** *** 95,115 **** END*/ - static const char k_SCGMMTP_modelColorName[2][5] = {"blue", "red"}; - class SkinColorGMMTrain : public BufferedNode { friend void on_save_button_clicked (GtkButton *button, SkinColorGMMTrain *cSelection); friend void on_add_button_clicked (GtkButton *button, SkinColorGMMTrain *cSelection); friend void on_init_button_clicked (GtkButton *button, SkinColorGMMTrain *cSelection); friend void on_adapt_button_clicked (GtkButton *button, SkinColorGMMTrain *cSelection); - friend void on_model_button_clicked (GtkButton *button, SkinColorGMMTrain *cSelection); friend gboolean pixbuf_event_function (GnomeCanvasItem *canvasitem, GdkEvent *event, SkinColorGMMTrain *cSelection); public: SkinColorGMMTrain(string nodeName, ParameterSet params) ! : BufferedNode(nodeName, params), m_hasInit(false), m_hasSkinGMM(false), ! m_hasNonSkinGMM(false), m_saving(false), m_adding(false), ! m_initializing(false), m_adapting(false), m_useSkinModel(true), m_skip(0), ! m_pixbuf_item(NULL), m_last_count(-1) { try { --- 90,110 ---- END*/ class SkinColorGMMTrain : public BufferedNode { + friend void on_load_button_clicked (GtkButton *button, SkinColorGMMTrain *cSelection); + friend void on_load_button_clicked_ok (GtkButton *button, SkinColorGMMTrain *cSelection); + friend void on_load_button_clicked_cancel (GtkButton *button, SkinColorGMMTrain *cSelection); friend void on_save_button_clicked (GtkButton *button, SkinColorGMMTrain *cSelection); + friend void on_show_button_clicked (GtkButton *button, SkinColorGMMTrain *cSelection); friend void on_add_button_clicked (GtkButton *button, SkinColorGMMTrain *cSelection); friend void on_init_button_clicked (GtkButton *button, SkinColorGMMTrain *cSelection); friend void on_adapt_button_clicked (GtkButton *button, SkinColorGMMTrain *cSelection); friend gboolean pixbuf_event_function (GnomeCanvasItem *canvasitem, GdkEvent *event, SkinColorGMMTrain *cSelection); public: SkinColorGMMTrain(string nodeName, ParameterSet params) ! : BufferedNode(nodeName, params), m_hasInit(false), ! m_saving(false), m_adding(false), m_initializing(false), m_adapting(false), m_show(true), ! m_skip(0), m_pixbuf_item(NULL), m_last_count(-1) { try { *************** *** 125,131 **** m_outModelName = object_cast<string>(parameters.get("OUT_MODEL_FILENAME")); m_numSkinGaussians = dereference_cast<int>(parameters.get("NUM_SKIN_GAUSSIANS")); ! m_numNonSkinGaussians = dereference_cast<int>(parameters.get("NUM_NONSKIN_GAUSSIANS")); ! m_skinProbThresh = dereference_cast<float>(parameters.get("SKIN_LOG_LIKELIHOOD_THRESHOLD")); ! m_nonSkinProbThresh = dereference_cast<float>(parameters.get("NON_SKIN_LOG_LIKELIHOOD_THRESHOLD")); m_numPixels = m_width*m_height; --- 120,125 ---- m_outModelName = object_cast<string>(parameters.get("OUT_MODEL_FILENAME")); m_numSkinGaussians = dereference_cast<int>(parameters.get("NUM_SKIN_GAUSSIANS")); ! m_meanSkinProbThresh = dereference_cast<float>(parameters.get("MEAN_SKIN_LOG_LIKELIHOOD_THRESHOLD")); ! m_skinProbThreshInc = dereference_cast<float>(parameters.get("SKIN_LOG_LIKELIHOOD_THRESHOLD_INC")); m_numPixels = m_width*m_height; *************** *** 147,151 **** m_numDims = 2; m_skinGMM = RCPtr<GMM>(new GMM(m_numSkinGaussians, m_numDims, NewDiagonalCovariance)); - m_nonSkinGMM = RCPtr<GMM>(new GMM(m_numNonSkinGaussians, m_numDims, NewDiagonalCovariance)); m_tmpData = Vector<float>::alloc(2); } --- 141,144 ---- *************** *** 220,223 **** --- 213,224 ---- gtk_widget_show (hbox1); gtk_box_pack_start (GTK_BOX (vbox2), hbox1, TRUE, TRUE, 0); + + //LOAD + load_button = gtk_button_new_with_label (_("Load")); + gtk_widget_ref (load_button); + gtk_object_set_data_full (GTK_OBJECT (window1), "load_button", load_button, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (load_button); + gtk_box_pack_start (GTK_BOX (hbox1), load_button, FALSE, FALSE, 0); //SAVE *************** *** 229,233 **** gtk_box_pack_start (GTK_BOX (hbox1), save_button, FALSE, FALSE, 0); ! //ADD BUTTON add_button = gtk_button_new_with_label (_("Add Pixels")); gtk_widget_ref (add_button); --- 230,242 ---- gtk_box_pack_start (GTK_BOX (hbox1), save_button, FALSE, FALSE, 0); ! //SHOW ! show_button = gtk_button_new_with_label (_("Show")); ! gtk_widget_ref (show_button); ! gtk_object_set_data_full (GTK_OBJECT (window1), "show_button", show_button, ! (GtkDestroyNotify) gtk_widget_unref); ! gtk_widget_show (show_button); ! gtk_box_pack_start (GTK_BOX (hbox1), show_button, FALSE, FALSE, 0); ! ! //ADD add_button = gtk_button_new_with_label (_("Add Pixels")); gtk_widget_ref (add_button); *************** *** 237,241 **** gtk_box_pack_start (GTK_BOX (hbox1), add_button, FALSE, TRUE, 0); ! //INIT BUTTON init_button = gtk_button_new_with_label (_("Init")); gtk_widget_ref (init_button); --- 246,250 ---- gtk_box_pack_start (GTK_BOX (hbox1), add_button, FALSE, TRUE, 0); ! //INIT init_button = gtk_button_new_with_label (_("Init")); gtk_widget_ref (init_button); *************** *** 245,249 **** gtk_box_pack_start (GTK_BOX (hbox1), init_button, FALSE, TRUE, 0); ! //ADAPT BUTTON adapt_button = gtk_button_new_with_label (_("Adapt")); gtk_widget_ref (adapt_button); --- 254,258 ---- gtk_box_pack_start (GTK_BOX (hbox1), init_button, FALSE, TRUE, 0); ! //ADAPT adapt_button = gtk_button_new_with_label (_("Adapt")); gtk_widget_ref (adapt_button); *************** *** 252,263 **** gtk_widget_show (adapt_button); gtk_box_pack_start (GTK_BOX (hbox1), adapt_button, FALSE, TRUE, 0); - - //MODEL BUTTON - model_button = gtk_button_new_with_label (_("Switch Model")); - gtk_widget_ref (model_button); - gtk_object_set_data_full (GTK_OBJECT (window1), "model_button", model_button, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (model_button); - gtk_box_pack_start (GTK_BOX (hbox1), model_button, FALSE, TRUE, 0); //creating pixbuf item --- 261,264 ---- *************** *** 275,281 **** --- 276,288 ---- //connecting signals + gtk_signal_connect (GTK_OBJECT (load_button), "clicked", + GTK_SIGNAL_FUNC (on_load_button_clicked), + this); gtk_signal_connect (GTK_OBJECT (save_button), "clicked", GTK_SIGNAL_FUNC (on_save_button_clicked), this); + gtk_signal_connect (GTK_OBJECT (show_button), "clicked", + GTK_SIGNAL_FUNC (on_show_button_clicked), + this); gtk_signal_connect (GTK_OBJECT (add_button), "clicked", GTK_SIGNAL_FUNC (on_add_button_clicked), *************** *** 287,293 **** GTK_SIGNAL_FUNC (on_adapt_button_clicked), this); - gtk_signal_connect (GTK_OBJECT (model_button), "clicked", - GTK_SIGNAL_FUNC (on_model_button_clicked), - this); gtk_signal_connect(GTK_OBJECT(m_pixbuf_item), "event", GTK_SIGNAL_FUNC(pixbuf_event_function), --- 294,297 ---- *************** *** 341,356 **** } ! memcpy(m_curFrame->imageData, object_cast<Image>(m_imageRef).get_data(), m_numBytesInFrame); ! if (m_adding) { ! cout << "Adding pixels to model " << m_useSkinModel << endl; ! if (m_useSkinModel) { ! AddPixelsToGMM((const unsigned char *)(m_curFrame->imageData), &m_skinData); ! } ! else { ! AddPixelsToGMM((const unsigned char *)(m_curFrame->imageData), &m_nonSkinData); ! } m_adding = false; --- 345,356 ---- } ! if (m_show) { ! memcpy(m_curFrame->imageData, object_cast<Image>(m_imageRef).get_data(), m_numBytesInFrame); ! } if (m_adding) { ! cout << "Adding pixels to color model." << endl; ! AddPixelsToGMM((const unsigned char *)(m_curFrame->imageData), &m_skinData); m_adding = false; *************** *** 358,387 **** if (m_initializing) { ! cout << "Initializing model " << m_useSkinModel << endl; ! if (m_useSkinModel) { ! InitGMM(m_skinGMM.get(), &m_skinData); ! m_hasSkinGMM = true; ! } ! else { ! InitGMM(m_nonSkinGMM.get(), &m_nonSkinData); ! m_hasNonSkinGMM = true; ! } - if (m_hasSkinGMM && m_hasNonSkinGMM) { - m_hasInit = true; - } m_initializing = false; } if (m_adapting) { ! cout << "Adapting model " << m_useSkinModel << endl; ! if (m_useSkinModel) { ! AdaptGMM(m_skinGMM.get(), &m_skinData); ! } ! else { ! AdaptGMM(m_nonSkinGMM.get(), &m_nonSkinData); ! } m_adapting = false; --- 358,373 ---- if (m_initializing) { ! cout << "Initializing color model." << endl; ! InitGMM(m_skinGMM.get(), &m_skinData); ! m_hasInit = true; m_initializing = false; } if (m_adapting) { ! cout << "Adapting color model." << endl; ! AdaptGMM(m_skinGMM.get(), &m_skinData); m_adapting = false; *************** *** 389,393 **** if (m_saving) { ! cout << "Saving models." << endl; SaveModels(); --- 375,379 ---- if (m_saving) { ! cout << "Saving model." << endl; SaveModels(); *************** *** 402,456 **** CvRect roi; - m_skinProbThresh = 2.0f; - SegmentSkin((const unsigned char *)(m_curFrame->imageData), (unsigned char *)(m_tmpFrame->imageData)); - - cvSmooth(m_tmpFrame, m_maskFrame, CV_MEDIAN, 3, 0); roi.x = 0; roi.y = 0; roi.width = m_width/3; roi.height = m_height/2; - cvSetImageROI(m_outFrame,roi); - cvResize(m_maskFrame, m_outFrame, CV_INTER_CUBIC); - - m_skinProbThresh = 5.0f; - SegmentSkin((const unsigned char *)(m_curFrame->imageData), (unsigned char *)(m_tmpFrame->imageData)); - - cvSmooth(m_tmpFrame, m_maskFrame, CV_MEDIAN, 3, 0); - roi.x += roi.width; - cvSetImageROI(m_outFrame,roi); - cvResize(m_maskFrame, m_outFrame, CV_INTER_CUBIC); - - m_skinProbThresh = 5.1f; - SegmentSkin((const unsigned char *)(m_curFrame->imageData), (unsigned char *)(m_tmpFrame->imageData)); - - cvSmooth(m_tmpFrame, m_maskFrame, CV_MEDIAN, 3, 0); - roi.x += roi.width; - cvSetImageROI(m_outFrame,roi); - cvResize(m_maskFrame, m_outFrame, CV_INTER_CUBIC); - - m_skinProbThresh = 5.2f; - SegmentSkin((const unsigned char *)(m_curFrame->imageData), (unsigned char *)(m_tmpFrame->imageData)); ! cvSmooth(m_tmpFrame, m_maskFrame, CV_MEDIAN, 3, 0); ! roi.x = 0; ! roi.y += roi.height; ! cvSetImageROI(m_outFrame,roi); ! cvResize(m_maskFrame, m_outFrame, CV_INTER_CUBIC); ! ! m_skinProbThresh = 5.3f; ! SegmentSkin((const unsigned char *)(m_curFrame->imageData), (unsigned char *)(m_tmpFrame->imageData)); ! ! cvSmooth(m_tmpFrame, m_maskFrame, CV_MEDIAN, 3, 0); ! roi.x += roi.width; ! cvSetImageROI(m_outFrame,roi); ! cvResize(m_maskFrame, m_outFrame, CV_INTER_CUBIC); ! ! m_skinProbThresh = 5.4f; ! SegmentSkin((const unsigned char *)(m_curFrame->imageData), (unsigned char *)(m_tmpFrame->imageData)); ! cvSmooth(m_tmpFrame, m_maskFrame, CV_MEDIAN, 3, 0); ! roi.x += roi.width; ! cvSetImageROI(m_outFrame,roi); ! cvResize(m_maskFrame, m_outFrame, CV_INTER_CUBIC); roi.x = 0; --- 388,415 ---- CvRect roi; roi.x = 0; roi.y = 0; roi.width = m_width/3; roi.height = m_height/2; ! float curThresh = m_meanSkinProbThresh - 2*m_skinProbThreshInc; ! for (int m=0; m<6; m++) { ! SegmentSkin( ! (const unsigned char *)(m_curFrame->imageData), ! (unsigned char *)(m_tmpFrame->imageData), ! curThresh); ! cvSmooth(m_tmpFrame, m_maskFrame, CV_MEDIAN, 3, 0); ! cvSetImageROI(m_outFrame,roi); ! cvResize(m_maskFrame, m_outFrame, CV_INTER_LINEAR); ! ! roi.x += roi.width; ! if (m == 2) { ! roi.x = 0; ! roi.y += roi.height; ! } ! ! curThresh += m_skinProbThreshInc; ! } roi.x = 0; *************** *** 474,478 **** void SegmentSkin(const unsigned char *i_srcImg, ! unsigned char *o_skinMask) { unsigned char val; --- 433,437 ---- void SegmentSkin(const unsigned char *i_srcImg, ! unsigned char *o_skinMask, float i_thresh) { unsigned char val; *************** *** 486,498 **** float skinlogLikelihood = -m_skinGMM->score(&((*m_tmpData)[0])).score; - //float nonSkinlogLikelihood = -m_nonSkinGMM->score(&((*m_tmpData)[0])).score; - - //cout << "nonSkinlogLikelihood=" << nonSkinlogLikelihood << endl; - //cout << "skinlogLikelihood=" << skinlogLikelihood << " nonSkinlogLikelihood=" << nonSkinlogLikelihood << endl; - //float logLikelihood = skinlogLikelihood; ! if (/*skinlogLikelihood > m_skinProbThresh && ! nonSkinlogLikelihood < m_nonSkinProbThresh*/ ! skinlogLikelihood > m_skinProbThresh) { *p_maskPtr++ = 255; } --- 445,450 ---- float skinlogLikelihood = -m_skinGMM->score(&((*m_tmpData)[0])).score; ! if (skinlogLikelihood > i_thresh) { *p_maskPtr++ = 255; } *************** *** 603,618 **** skinModelFile.close(); - - string nonSkinFilename = m_outModelName + "NonSkin.txt"; - ofstream nonSkinModelFile(nonSkinFilename.c_str(), ios::out); - - if (!nonSkinModelFile) { - throw new GeneralException (string("SkinColorGMMTrain::WriteModels : unable to open file: ") + - nonSkinFilename,__FILE__,__LINE__); - } - - m_skinGMM->printOn(nonSkinModelFile); - - nonSkinModelFile.close(); } catch (BaseException *e) { --- 555,558 ---- *************** *** 647,651 **** bool m_hasSkinGMM; - bool m_hasNonSkinGMM; bool m_hasInit; bool m_adding; --- 587,590 ---- *************** *** 653,657 **** bool m_adapting; bool m_saving; ! bool m_useSkinModel; int m_skip; --- 592,596 ---- bool m_adapting; bool m_saving; ! bool m_show; int m_skip; *************** *** 672,680 **** GtkWidget *canvas1; GtkWidget *hbox1; GtkWidget *save_button; GtkWidget *add_button; GtkWidget *init_button; GtkWidget *adapt_button; ! GtkWidget *model_button; GnomeCanvasItem *m_pixbuf_item; --- 611,621 ---- GtkWidget *canvas1; GtkWidget *hbox1; + GtkWidget *load_button; GtkWidget *save_button; + GtkWidget *show_button; GtkWidget *add_button; GtkWidget *init_button; GtkWidget *adapt_button; ! GtkWidget *m_file_selection; GnomeCanvasItem *m_pixbuf_item; *************** *** 691,705 **** int m_numSkinGaussians; - int m_numNonSkinGaussians; int m_numDims; ! float m_skinProbThresh; ! float m_nonSkinProbThresh; RCPtr<GMM> m_skinGMM; - RCPtr<GMM> m_nonSkinGMM; Vector<float> *m_tmpData; Vector<Vector<float> > m_skinData; - Vector<Vector<float> > m_nonSkinData; }; void on_save_button_clicked (GtkButton *button, --- 632,690 ---- int m_numSkinGaussians; int m_numDims; ! float m_meanSkinProbThresh; ! float m_skinProbThreshInc; RCPtr<GMM> m_skinGMM; Vector<float> *m_tmpData; Vector<Vector<float> > m_skinData; }; + void on_load_button_clicked (GtkButton *button, SkinColorGMMTrain *cSelection) + { + cSelection->m_file_selection = gtk_file_selection_new ("Select GMM Model"); + + gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(cSelection->m_file_selection)); + + //callbacks + gtk_signal_connect(GTK_OBJECT (GTK_FILE_SELECTION(cSelection->m_file_selection)->ok_button), + "clicked", GTK_SIGNAL_FUNC(on_load_button_clicked_ok), cSelection); + + gtk_signal_connect(GTK_OBJECT (GTK_FILE_SELECTION(cSelection->m_file_selection)->cancel_button), + "clicked", GTK_SIGNAL_FUNC(on_load_button_clicked_cancel), cSelection); + + gtk_widget_show(GTK_WIDGET(cSelection->m_file_selection)); + } + + void on_load_button_clicked_ok (GtkButton *button, SkinColorGMMTrain *cSelection) + { + const char *filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION(cSelection->m_file_selection)); + + try { + ifstream infile(filename); + + ObjectRef myModel; + + infile >> myModel; + + cSelection->m_skinGMM = myModel; + + infile.close(); + } + catch (BaseException *e) { + cerr<<"Unable to load model file : " << filename << endl; + delete e; + } + + cout << "Model file loaded : " << filename << endl; + + gtk_widget_destroy(cSelection->m_file_selection); + } + + void on_load_button_clicked_cancel (GtkButton *button, SkinColorGMMTrain *cSelection) + { + //do nothing + gtk_widget_destroy(cSelection->m_file_selection); + } + void on_save_button_clicked (GtkButton *button, *************** *** 709,712 **** --- 694,703 ---- } + void on_show_button_clicked (GtkButton *button, + SkinColorGMMTrain *cSelection) + { + cSelection->m_show = !cSelection->m_show; + } + void on_add_button_clicked (GtkButton *button, SkinColorGMMTrain *cSelection) *************** *** 727,736 **** } - void on_model_button_clicked (GtkButton *button, - SkinColorGMMTrain *cSelection) - { - cSelection->m_useSkinModel = !cSelection->m_useSkinModel; - } - gboolean pixbuf_event_function( GnomeCanvasItem *canvasitem, --- 718,721 ---- *************** *** 754,763 **** if (!cSelection->m_imageRef->isNil()) { int colorNameIdx; - if (cSelection->m_useSkinModel) { - colorNameIdx = 0; - } - else { - colorNameIdx = 1; - } item = gnome_canvas_item_new ( --- 739,742 ---- *************** *** 769,773 **** "y2",item_y, "outline_color", ! k_SCGMMTP_modelColorName[colorNameIdx], NULL); --- 748,752 ---- "y2",item_y, "outline_color", ! "blue", NULL); |