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
00039
00040
00041
00042 #include "Beowulf/Beowulf.H"
00043 #include "Component/ModelManager.H"
00044 #include "Image/ColorOps.H"
00045 #include "Image/Image.H"
00046 #include "Image/ImageSet.H"
00047 #include "Image/MathOps.H"
00048 #include "Image/Pixels.H"
00049 #include "Image/PyramidOps.H"
00050 #include "Image/ShapeOps.H"
00051 #include "Image/Transforms.H"
00052 #include "Image/fancynorm.H"
00053 #include "Parallel/pvisionTCP-defs.H"
00054 #include "Util/Assert.H"
00055 #include "Util/Timer.H"
00056 #include "Util/Types.H"
00057 #include "Util/sformat.H"
00058
00059 #include <cstdlib>
00060 #include <signal.h>
00061 #include <time.h>
00062 #include <unistd.h>
00063
00064 static bool goforever = true;
00065
00066
00067 void terminate(int s) { LERROR("*** INTERRUPT ***"); goforever = false; }
00068
00069
00070 void computeCMAP(TCPmessage& msg, const PyramidType ptyp,
00071 const float ori, const float coeff,
00072 const int slave, nub::soft_ref<Beowulf>& b);
00073
00074
00075 void computeCMAP2(TCPmessage& msg, const PyramidType ptyp,
00076 const float ori, const float coeff,
00077 const int slave, nub::soft_ref<Beowulf>& b);
00078
00079
00080 void computeCMAP(const Image<float>& fima, const PyramidType ptyp,
00081 const float ori, const float coeff,
00082 const int slave, nub::soft_ref<Beowulf>& b, const int32 id);
00083
00084
00085
00086
00087 #define sml 2
00088 #define delta_min 3
00089 #define delta_max 4
00090 #define level_min 0
00091 #define level_max 2
00092 #define maxdepth (level_max + delta_max + 1)
00093 #define normtyp (VCXNORM_MAXNORM)
00094
00095
00096
00097 #define NBOUT 10
00098
00099
00100 #define IWEIGHT 1.0
00101 #define CWEIGHT 1.0
00102 #define OWEIGHT 1.0
00103 #define FWEIGHT 1.5
00104
00105
00106 int main(const int argc, const char **argv)
00107 {
00108 MYLOGVERB = LOG_INFO;
00109
00110
00111 ModelManager manager("Parallel Vision TCP Version 2 - Slave");
00112
00113
00114 nub::soft_ref<Beowulf>
00115 beo(new Beowulf(manager, "Beowulf Slave", "BeowulfSlave", false));
00116 manager.addSubComponent(beo);
00117
00118
00119 if (manager.parseCommandLine(argc, argv, "", 0, 0) == false) return(1);
00120
00121
00122 signal(SIGHUP, terminate); signal(SIGINT, terminate);
00123 signal(SIGQUIT, terminate); signal(SIGTERM, terminate);
00124 initRandomNumbers();
00125
00126
00127 TCPmessage rmsg;
00128 TCPmessage smsg;
00129 Image<float> outmap[NBOUT];
00130 int32 outframe[NBOUT];
00131 int nbcmap[NBOUT];
00132 for (int i = 0; i < NBOUT; i ++) { outframe[i] = -1; nbcmap[i] = 0; }
00133 Image<float> previma;
00134 Timer tim;
00135
00136
00137 manager.start();
00138
00139
00140 while(goforever)
00141 {
00142 int32 rframe, raction, rnode = -1;
00143 if (beo->receive(rnode, rmsg, rframe, raction, 3))
00144 {
00145
00146 tim.reset();
00147
00148
00149 switch(raction)
00150 {
00151 case BEO_INIT:
00152 {
00153
00154
00155 for (int i = 0; i < NBOUT; i ++)
00156 { outframe[i] = -1; nbcmap[i] = 0; }
00157
00158 }
00159 break;
00160 case BEO_RETINA:
00161 {
00162
00163 Image<PixRGB<byte> > ima = rmsg.getElementColByteIma();
00164
00165
00166 Image<byte> lum = luminance(ima);
00167 smsg.reset(rframe, BEO_LUMINANCE);
00168 smsg.addImage(lum);
00169 beo->send(0, smsg);
00170
00171
00172 Image<byte> r, g, b, y; getRGBY(ima, r, g, b, y, (byte)25);
00173 smsg.reset(rframe, BEO_REDGREEN);
00174 smsg.addImage(r); smsg.addImage(g);
00175 beo->send(1, smsg);
00176 smsg.reset(rframe, BEO_BLUEYELLOW);
00177 smsg.addImage(b); smsg.addImage(y);
00178 beo->send(2, smsg);
00179 }
00180 break;
00181 case BEO_LUMINANCE:
00182 {
00183
00184 rmsg.setAction(BEO_ORI0);
00185 beo->send(3, rmsg);
00186 rmsg.setAction(BEO_ORI45);
00187 beo->send(4, rmsg);
00188 rmsg.setAction(BEO_ORI90);
00189 beo->send(5, rmsg);
00190 rmsg.setAction(BEO_ORI135);
00191 beo->send(6, rmsg);
00192
00193
00194 rmsg.setAction(BEO_FLICKER);
00195 beo->send(8, rmsg);
00196
00197
00198 computeCMAP(rmsg, Gaussian5, 0.0, IWEIGHT, 7, beo);
00199 }
00200 break;
00201 case BEO_FLICKER:
00202 {
00203
00204 Image<byte> ima = rmsg.getElementByteIma();
00205 Image<float> fima = ima;
00206
00207
00208 if (previma.initialized() == false) previma = fima;
00209 previma -= fima;
00210 computeCMAP(previma, Gaussian5, 0.0, FWEIGHT, 7,
00211 beo, rframe);
00212 previma = fima;
00213 }
00214 break;
00215 case BEO_REDGREEN:
00216 computeCMAP2(rmsg, Gaussian5, 0.0, CWEIGHT, 7, beo);
00217 break;
00218 case BEO_BLUEYELLOW:
00219 computeCMAP2(rmsg, Gaussian5, 0.0, CWEIGHT, 7, beo);
00220 break;
00221 case BEO_ORI0:
00222 computeCMAP(rmsg, Oriented5, 0.0, OWEIGHT, 7, beo);
00223 break;
00224 case BEO_ORI45:
00225 computeCMAP(rmsg, Oriented5, 45.0, OWEIGHT, 7, beo);
00226 break;
00227 case BEO_ORI90:
00228 computeCMAP(rmsg, Oriented5, 90.0, OWEIGHT, 7, beo);
00229 break;
00230 case BEO_ORI135:
00231 computeCMAP(rmsg, Oriented5, 135.0, OWEIGHT, 7, beo);
00232 break;
00233 case BEO_CMAP:
00234 {
00235
00236 Image<float> ima = rmsg.getElementFloatIma();
00237
00238
00239
00240 int32 oldestidx = 0;
00241 int32 oldestframe = std::numeric_limits<int32>::max();
00242 int32 curridx = -1;
00243 for (int32 i = 0; i < NBOUT; i ++)
00244 {
00245 if (outframe[i] < oldestframe)
00246 { oldestframe = outframe[i]; oldestidx = i; }
00247 if (outframe[i] == rframe)
00248 { curridx = i; break; }
00249 }
00250
00251
00252
00253 if (curridx == -1)
00254 {
00255
00256 curridx = oldestidx;
00257
00258 if (nbcmap[curridx])
00259 {
00260 LINFO("Dropping frame %d!", outframe[curridx]);
00261 std::string junk;
00262 for (int i = 0; i < NBOUT; i ++)
00263 junk += sformat("%d/%d ", outframe[i], nbcmap[i]);
00264
00265 LINFO("BUFFER = [ %s]", junk.c_str());
00266 }
00267
00268 outframe[curridx] = rframe; nbcmap[curridx] = 0;
00269 outmap[curridx].resize(ima.getWidth(),
00270 ima.getHeight(), true);
00271 }
00272
00273
00274 outmap[curridx] += ima; nbcmap[curridx] ++;
00275
00276
00277 if (nbcmap[curridx] == NBCMAP2)
00278 {
00279 outmap[curridx] =
00280 maxNormalize(outmap[curridx], 0.0f, 9.0f, normtyp);
00281 inplaceClamp(outmap[curridx], 0.0f, 255.0f);
00282
00283
00284 smsg.reset(outframe[curridx], BEO_WINNER);
00285 Image<byte> smap = outmap[curridx];
00286
00287 smsg.addImage(smap);
00288 beo->send(-1, smsg);
00289 nbcmap[curridx] = 0;
00290
00291 }
00292 }
00293 break;
00294 default:
00295 LERROR("Bogus action %d -- IGNORING.", raction);
00296 break;
00297 }
00298 if (rframe % 101 == 0)
00299 LINFO("Action %d, frame %d processed in %llums",
00300 raction, rframe, tim.get());
00301 }
00302 }
00303
00304
00305 manager.stop();
00306 return 0;
00307 }
00308
00309
00310 void computeCMAP(TCPmessage& msg, const PyramidType ptyp,
00311 const float ori, const float coeff,
00312 const int slave, nub::soft_ref<Beowulf>& b)
00313 {
00314 Image<byte> ima = msg.getElementByteIma();
00315 Image<float> fima = ima;
00316
00317 computeCMAP(fima, ptyp, ori, coeff, slave, b, msg.getID());
00318 }
00319
00320
00321 void computeCMAP2(TCPmessage& msg, const PyramidType ptyp,
00322 const float ori, const float coeff,
00323 const int slave, nub::soft_ref<Beowulf>& b)
00324 {
00325 Image<byte> ima1 = msg.getElementByteIma();
00326 Image<byte> ima2 = msg.getElementByteIma();
00327 Image<float> fima = ima1 - ima2;
00328
00329 computeCMAP(fima, ptyp, ori, coeff, slave, b, msg.getID());
00330 }
00331
00332
00333 void computeCMAP(const Image<float>& fima, const PyramidType ptyp,
00334 const float ori, const float coeff,
00335 const int slave, nub::soft_ref<Beowulf>& b, const int32 id)
00336 {
00337
00338 ImageSet<float> pyr = buildPyrGeneric(fima, 0, maxdepth, ptyp, ori);
00339
00340
00341 Image<float> cmap(pyr[sml].getDims(), ZEROS);
00342
00343
00344 for (int delta = delta_min; delta <= delta_max; delta ++)
00345 for (int lev = level_min; lev <= level_max; lev ++)
00346 {
00347 Image<float> tmp = centerSurround(pyr, lev, lev + delta, true);
00348 tmp = downSize(tmp, cmap.getWidth(), cmap.getHeight());
00349 inplaceAddBGnoise(tmp, 255.0);
00350 tmp = maxNormalize(tmp, MAXNORMMIN, MAXNORMMAX, normtyp);
00351 cmap += tmp;
00352 }
00353 if (normtyp == VCXNORM_MAXNORM)
00354 cmap = maxNormalize(cmap, MAXNORMMIN, MAXNORMMAX, normtyp);
00355 else
00356 cmap = maxNormalize(cmap, 0.0f, 0.0f, normtyp);
00357
00358
00359 cmap *= coeff;
00360
00361
00362
00363
00364 TCPmessage smsg(id, BEO_CMAP);
00365 smsg.addImage(cmap);
00366 b->send(slave, smsg);
00367 }
00368
00369
00370
00371
00372
00373