00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef APPPSYCHO_SCORE_CLASSIC_SEARCHARRAY_C_DEFINED
00039 #define APPPSYCHO_SCORE_CLASSIC_SEARCHARRAY_C_DEFINED
00040
00041 #include "Image/CutPaste.H"
00042 #include "Image/Image.H"
00043 #include "Image/MathOps.H"
00044 #include "Image/Range.H"
00045 #include "Image/ShapeOps.H"
00046 #include "Raster/GenericFrame.H"
00047 #include "Raster/PfmParser.H"
00048 #include "Raster/Raster.H"
00049 #include "Util/StringConversions.H"
00050 #include "Util/StringUtil.H"
00051 #include "Util/log.H"
00052
00053 #include "GUI/XWinManaged.H"
00054 #include "Image/Normalize.H"
00055 #include "Image/DrawOps.H"
00056
00057 #include <cstdio>
00058 #include <fstream>
00059 #include <string>
00060 #include <vector>
00061
00062 static int fixnum(const double x, const std::vector<double>& vals)
00063 {
00064 int fixnum = 1;
00065 for (size_t i = 0; i < vals.size(); ++i)
00066 if (vals[i] >= x) ++fixnum;
00067 return fixnum;
00068 }
00069
00070 int main(int argc, char** argv)
00071 {
00072 if (argc != 6)
00073 {
00074 fprintf(stderr, "usage: %s salmap dims keyfile scorefile stimimage\n", argv[0]);
00075 return -1;
00076 }
00077
00078 const std::string salmapfile = argv[1];
00079 const Dims rescaledims = fromStr<Dims>(argv[2]);
00080 const std::string keyfile = argv[3];
00081 const std::string scorefile = argv[4];
00082 const Image<byte> stimimage = Raster::ReadGray(argv[5]);
00083
00084
00085
00086 const Image<float> salmap0 = PfmParser(salmapfile).getFrame().asFloat();
00087 const Image<float> salmap = rescaleBilinear(salmap0, rescaledims);
00088
00089
00090
00091 std::vector<double> bgmeanvals;
00092 std::vector<double> bgmaxvals;
00093 std::vector<double> fgmeanvals;
00094 std::vector<double> fgmaxvals;
00095
00096 std::ifstream ifs(keyfile.c_str());
00097 if (!ifs.is_open())
00098 LFATAL("couldn't open '%s' for reading", keyfile.c_str());
00099
00100 std::string line;
00101 while (std::getline(ifs, line))
00102 {
00103 if (line[0] == '%')
00104 continue;
00105
00106 std::vector<std::string> toks;
00107 split(line, " ", std::back_inserter(toks));
00108 if (toks.size() != 5)
00109 LFATAL("malformed line: '%s'", line.c_str());
00110
00111 const int x0 = fromStr<int>(toks[1]);
00112 const int y0 = fromStr<int>(toks[2]);
00113 const int x1 = fromStr<int>(toks[3]);
00114 const int y1 = fromStr<int>(toks[4]);
00115
00116
00117
00118
00119
00120
00121 const Rectangle r = Rectangle::tlbrO(y0, x0, y1, x1)
00122 .getOverlap(salmap.getBounds());
00123
00124 const Image<float> patch = crop(salmap, r, false);
00125
00126 const float patchmean = mean(patch);
00127 const Range<float> patchrange = rangeOf(patch);
00128
00129 if (fromStr<int>(toks[0]) == 0)
00130 {
00131 bgmeanvals.push_back(patchmean);
00132 bgmaxvals.push_back(patchrange.max());
00133
00134
00135
00136 }
00137 else if (fromStr<int>(toks[0]) == 1)
00138 {
00139 fgmeanvals.push_back(patchmean);
00140 fgmaxvals.push_back(patchrange.max());
00141
00142
00143
00144 }
00145 else
00146 LFATAL("invalid fg value '%s'", toks[0].c_str());
00147 }
00148
00149 ifs.close();
00150
00151 const Image<double> bgmean(&bgmeanvals[0], bgmeanvals.size(), 1);
00152 const Image<double> bgmax(&bgmaxvals[0], bgmaxvals.size(), 1);
00153 const Image<double> fgmean(&fgmeanvals[0], fgmeanvals.size(), 1);
00154 const Image<double> fgmax(&fgmaxvals[0], fgmaxvals.size(), 1);
00155
00156 const double mean_bgmean = mean(bgmean);
00157 const double mean_bgmax = mean(bgmax);
00158 const double std_bgmean = stdev(bgmean);
00159 const double std_bgmax = stdev(bgmax);
00160 const double mean_fgmean = mean(fgmean);
00161 const double mean_fgmax = mean(fgmax);
00162
00163 FILE* fwarn = fopen("warnings.txt", "a");
00164 if (fwarn == 0)
00165 LFATAL("couldn't open 'warnings.txt' for appending");
00166 bool bad = false;
00167 #define CHECKNAN(x) if (isnan(x)) { bad = true; fprintf(fwarn, "nan: %s (args = %s %s %s %s)\n", #x, argv[1], argv[2], argv[3], argv[4]); }
00168 CHECKNAN(mean_bgmean);
00169 CHECKNAN(mean_bgmax);
00170 CHECKNAN(std_bgmean);
00171 CHECKNAN(std_bgmax);
00172 CHECKNAN(mean_fgmean);
00173 CHECKNAN(mean_fgmax);
00174 fclose(fwarn);
00175
00176 if (bad) exit(0);
00177
00178 double mean_nitems = 0.0;
00179 double mean_fgmean_zscore = 0.0;
00180 double mean_fgmax_zscore = 0.0;
00181 double mean_fgmean_over_mean_bgmean = 0.0;
00182 double mean_fgmax_over_mean_bgmax = 0.0;
00183 double mean_fgmean_minus_mean_bgmean = 0.0;
00184 double mean_fgmax_minus_mean_bgmax = 0.0;
00185 double mean_fgmean_fixnum = 0.0;
00186 double mean_fgmax_fixnum = 0.0;
00187 int n = 0;
00188
00189 std::ifstream scorefs(scorefile.c_str());
00190 if (scorefs.is_open())
00191 {
00192 while (std::getline(scorefs, line))
00193 {
00194 std::vector<std::string> toks;
00195 split(line, " ", std::back_inserter(toks));
00196 if (toks.size() != 9)
00197 LFATAL("malformed line in score file: '%s'", line.c_str());
00198
00199 ++n;
00200 mean_nitems += fromStr<double>(toks[0]);
00201 mean_fgmean_zscore += fromStr<double>(toks[1]);
00202 mean_fgmax_zscore += fromStr<double>(toks[2]);
00203 mean_fgmean_over_mean_bgmean += fromStr<double>(toks[3]);
00204 mean_fgmax_over_mean_bgmax += fromStr<double>(toks[4]);
00205 mean_fgmean_minus_mean_bgmean += fromStr<double>(toks[5]);
00206 mean_fgmax_minus_mean_bgmax += fromStr<double>(toks[6]);
00207 mean_fgmean_fixnum += fromStr<double>(toks[7]);
00208 mean_fgmax_fixnum += fromStr<double>(toks[8]);
00209 }
00210 scorefs.close();
00211 }
00212
00213 FILE* f = fopen(scorefile.c_str(), "a");
00214 if (f == 0)
00215 LFATAL("couldn't open '%s' for appending", scorefile.c_str());
00216
00217 fprintf(f, "%12d %12g %12g %12g %12g %12g %12g %12d %12d\n",
00218 int(bgmeanvals.size()+fgmeanvals.size()),
00219 mean((fgmean - mean_bgmean) / std_bgmean),
00220 mean((fgmax - mean_bgmax) / std_bgmax),
00221 mean_fgmean / mean_bgmean,
00222 mean_fgmax / mean_bgmax,
00223 mean_fgmean - mean_bgmean,
00224 mean_fgmax - mean_bgmax,
00225 fixnum(mean_fgmean, bgmeanvals),
00226 fixnum(mean_fgmax, bgmaxvals));
00227 fprintf(stderr, "current: %12d %12g %12g %12g %12g %12g %12g %12d %12d\n",
00228 int(bgmeanvals.size()+fgmeanvals.size()),
00229 mean((fgmean - mean_bgmean) / std_bgmean),
00230 mean((fgmax - mean_bgmax) / std_bgmax),
00231 mean_fgmean / mean_bgmean,
00232 mean_fgmax / mean_bgmax,
00233 mean_fgmean - mean_bgmean,
00234 mean_fgmax - mean_bgmax,
00235 fixnum(mean_fgmean, bgmeanvals),
00236 fixnum(mean_fgmax, bgmaxvals));
00237 fclose(f);
00238
00239 mean_nitems += int(bgmeanvals.size()+fgmeanvals.size());
00240 mean_fgmean_zscore += mean((fgmean - mean_bgmean) / std_bgmean);
00241 mean_fgmax_zscore += mean((fgmax - mean_bgmax) / std_bgmax);
00242 mean_fgmean_over_mean_bgmean += mean_fgmean / mean_bgmean;
00243 mean_fgmax_over_mean_bgmax += mean_fgmax / mean_bgmax;
00244 mean_fgmean_minus_mean_bgmean += mean_fgmean - mean_bgmean;
00245 mean_fgmax_minus_mean_bgmax += mean_fgmax - mean_bgmax;
00246 mean_fgmean_fixnum += fixnum(mean_fgmean, bgmeanvals);
00247 mean_fgmax_fixnum += fixnum(mean_fgmax, bgmaxvals);
00248
00249 ++n;
00250
00251 mean_nitems /= n;
00252 mean_fgmean_zscore /= n;
00253 mean_fgmax_zscore /= n;
00254 mean_fgmean_over_mean_bgmean /= n;
00255 mean_fgmax_over_mean_bgmax /= n;
00256 mean_fgmean_minus_mean_bgmean /= n;
00257 mean_fgmax_minus_mean_bgmax /= n;
00258 mean_fgmean_fixnum /= n;
00259 mean_fgmax_fixnum /= n;
00260
00261 FILE* fsum = fopen(("sum-"+scorefile).c_str(), "w");
00262 if (fsum == 0)
00263 LFATAL("couldn't open 'sum-%s' for writing", scorefile.c_str());
00264 fprintf(fsum, "%-70s %3d %12g %12g %12g %12g %12g %12g %12g %12g %12g\n",
00265 ("sum-"+scorefile).c_str(),
00266 n,
00267 mean_nitems,
00268 mean_fgmean_zscore,
00269 mean_fgmax_zscore,
00270 mean_fgmean_over_mean_bgmean,
00271 mean_fgmax_over_mean_bgmax,
00272 mean_fgmean_minus_mean_bgmean,
00273 mean_fgmax_minus_mean_bgmax,
00274 mean_fgmean_fixnum,
00275 mean_fgmax_fixnum);
00276 fprintf(stderr, "overall: %3d %12g %12g %12g %12g %12g %12g %12g %12g %12g\n",
00277 n,
00278 mean_nitems,
00279 mean_fgmean_zscore,
00280 mean_fgmax_zscore,
00281 mean_fgmean_over_mean_bgmean,
00282 mean_fgmax_over_mean_bgmax,
00283 mean_fgmean_minus_mean_bgmean,
00284 mean_fgmax_minus_mean_bgmax,
00285 mean_fgmean_fixnum,
00286 mean_fgmax_fixnum);
00287 fclose(fsum);
00288
00289
00290
00291
00292 }
00293
00294
00295
00296
00297
00298
00299
00300
00301 #endif // APPPSYCHO_SCORE_CLASSIC_SEARCHARRAY_C_DEFINED