/// <summary> /// 特徴量の値を配列にセットする /// </summary> /// <param name="FeatureList"></param> /// <param name="id_list"></param> /// private void SetFeatureListToArray(List<FaceFeature.FeatureValue> FeatureList, ref double[] value_array, LEARNING_TYPE type) { int idx = 0; if (type == LEARNING_TYPE.L_EYE_NOSE) { for (int i = 0; i < FeatureList.Count; i++) { value_array[idx++] = (FeatureList[i].LeftEyeValueL); // value_array[idx++] = (FeatureList[i].LeftEyeValueR); // value_array[idx++] = (FeatureList[i].RightEyeValueL); // value_array[idx++] = (FeatureList[i].RightEyeValueR); value_array[idx++] = (FeatureList[i].NoseLValueL); // value_array[idx++] = (FeatureList[i].NoseLValueR); // value_array[idx++] = (FeatureList[i].MouthLValueL); // value_array[idx++] = (FeatureList[i].MouthLValueR); } } else if (type == LEARNING_TYPE.L_EYE_MOUTH) { for (int i = 0; i < FeatureList.Count; i++) { value_array[idx++] = (FeatureList[i].LeftEyeValueL); // value_array[idx++] = (FeatureList[i].LeftEyeValueR); //value_array[idx++] = (FeatureList[i].RightEyeValueL); // value_array[idx++] = (FeatureList[i].RightEyeValueR); //value_array[idx++] = (FeatureList[i].NoseLValueL); // value_array[idx++] = (FeatureList[i].NoseLValueR); value_array[idx++] = (FeatureList[i].MouthLValueL); // value_array[idx++] = (FeatureList[i].MouthLValueR); } } else if (type == LEARNING_TYPE.R_EYE_MOUTH) { for (int i = 0; i < FeatureList.Count; i++) { //value_array[idx++] = (FeatureList[i].LeftEyeValueL); // value_array[idx++] = (FeatureList[i].LeftEyeValueR); value_array[idx++] = (FeatureList[i].RightEyeValueL); // value_array[idx++] = (FeatureList[i].RightEyeValueR); //value_array[idx++] = (FeatureList[i].NoseLValueL); // value_array[idx++] = (FeatureList[i].NoseLValueR); value_array[idx++] = (FeatureList[i].MouthLValueL); // value_array[idx++] = (FeatureList[i].MouthLValueR); } } }
/// <summary> /// 単体の特徴量構造体を配列に直す 要検討 /// </summary> /// <param name="feature"></param> /// <param name="value_array"></param> private void SetFeatureToArray(FaceFeature.FeatureValue feature, ref double[] value_array, LEARNING_TYPE type) { int idx = 0; if (type == LEARNING_TYPE.L_EYE_NOSE) { value_array[idx++] = (feature.LeftEyeValueL); // value_array[idx++] = (feature.LeftEyeValueR); // value_array[idx++] = (feature.RightEyeValueL); // value_array[idx++] = (feature.RightEyeValueR); value_array[idx++] = (feature.NoseLValueL); // value_array[idx++] = (feature.NoseLValueR); // value_array[idx++] = (feature.MouthLValueL); // value_array[idx++] = (feature.MouthLValueR); } else if (type == LEARNING_TYPE.L_EYE_MOUTH) { value_array[idx++] = (feature.LeftEyeValueL); // value_array[idx++] = (feature.LeftEyeValueR); // value_array[idx++] = (feature.RightEyeValueL); // value_array[idx++] = (feature.RightEyeValueR); //value_array[idx++] = (feature.NoseLValueL); // value_array[idx++] = (feature.NoseLValueR); value_array[idx++] = (feature.MouthLValueL); // value_array[idx++] = (feature.MouthLValueR); } else if (type == LEARNING_TYPE.R_EYE_MOUTH) { //value_array[idx++] = (feature.LeftEyeValueL); // value_array[idx++] = (feature.LeftEyeValueR); value_array[idx++] = (feature.RightEyeValueL); // value_array[idx++] = (feature.RightEyeValueR); //value_array[idx++] = (feature.NoseLValueL); // value_array[idx++] = (feature.NoseLValueR); value_array[idx++] = (feature.MouthLValueL); // value_array[idx++] = (feature.MouthLValueR); } }
/// <summary> /// 学習用のデータファイルを作成する /// </summary> /// <param name="feature_list">特徴量</param> /// <param name="file_name">辞書ファイル名</param> /// <param name="type">辞書タイプ</param> private void makeLearinigFile(List<FaceFeature.FeatureValue> feature_list, string file_name, LEARNING_TYPE type) { //特徴量をMatに移し替える 2個で一つ //2個のfloat * LISTの大きさの配列 double[] feature_array = new double[2 * feature_list.Count]; //特徴量をSVMで扱えるように配列に置き換える SetFeatureListToArray(feature_list, ref feature_array, type); //これがラベル番号 int[] id_array = new int[feature_list.Count]; for (int i = 0; i < id_array.Length; i++) { id_array[i] = feature_list[i].ID; } // dataとresponsesの様子を描画 CvPoint2D32f[] points = new CvPoint2D32f[id_array.Length]; int idx = 0; for (int i = 0; i < id_array.Length; i++) { points[idx].X = (float)feature_array[i * 2]; points[idx].Y = (float)feature_array[i * 2 + 1]; idx++; } //学習データを図にする Debug_DrawInputFeature(points, id_array); //LibSVMで学習させるためのデータを出力 OutPut_FeatureAndID(points, id_array, file_name); }