Hello World! ב-C++

  1. צריך לוודא שבמכשיר מותקנת גרסה תקינה של MediaPipe Framework. הוראות ההתקנה

  2. כדי להריץ את הדוגמה של hello world:

    $ git clone https://github.com/google/mediapipe.git
    $ cd mediapipe
    
    $ export GLOG_logtostderr=1
    # Need bazel flag 'MEDIAPIPE_DISABLE_GPU=1' as desktop GPU is not supported currently.
    $ bazel run --define MEDIAPIPE_DISABLE_GPU=1 \
        mediapipe/examples/desktop/hello_world:hello_world
    
    # It should print 10 rows of Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    
  3. בדוגמה hello world נעשה שימוש בתרשים MediaPipe פשוט בפונקציה PrintHelloWorld(), שמוגדר בפרוטו של CalculatorGraphConfig.

    absl::Status PrintHelloWorld() {
      // Configures a simple graph, which concatenates 2 PassThroughCalculators.
      CalculatorGraphConfig config = ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
        input_stream: "in"
        output_stream: "out"
        node {
          calculator: "PassThroughCalculator"
          input_stream: "in"
          output_stream: "out1"
        }
        node {
          calculator: "PassThroughCalculator"
          input_stream: "out1"
          output_stream: "out"
        }
      )");
    

    אפשר ליצור המחשה חזותית של התרשים באמצעות MediaPipe Visualizer על ידי הדבקת התוכן של InvoiceGraphConfig שבהמשך בכלי הוויזואליזציה. כאן אפשר לקבל עזרה לגבי כלי הוויזואליזציה.

        input_stream: "in"
        output_stream: "out"
        node {
          calculator: "PassThroughCalculator"
          input_stream: "in"
          output_stream: "out1"
        }
        node {
          calculator: "PassThroughCalculator"
          input_stream: "out1"
          output_stream: "out"
        }
    

    התרשים הזה מורכב ממקור קלט אחד של גרף (in) וזרם פלט אחד של גרף (out) ו-2 מקורות PassThroughCalculator שמחוברים בסדרה.

    תרשים עולם hello_world

  4. לפני הרצת התרשים, אובייקט OutputStreamPoller מחובר לזרם הפלט כדי לאחזר מאוחר יותר את פלט התרשים, והרצת גרף מתחילה ב-StartRun.

    CalculatorGraph graph;
    MP_RETURN_IF_ERROR(graph.Initialize(config));
    MP_ASSIGN_OR_RETURN(OutputStreamPoller poller,
                        graph.AddOutputStreamPoller("out"));
    MP_RETURN_IF_ERROR(graph.StartRun({}));
    
  5. בדוגמה הזו נוצרת 10 חבילות (כל חבילה מכילה את המחרוזת "שלום עולם!" עם ערכי חותמת זמן שנעים בין 0, 1, ... 9) באמצעות הפונקציה MakePacket, מוסיפה כל חבילה לתרשים דרך זרם הקלט in, ולבסוף סוגרת את מקור הקלט כדי לסיים את הרצת התרשים.

    for (int i = 0; i < 10; ++i) {
      MP_RETURN_IF_ERROR(graph.AddPacketToInputStream("in",
                         MakePacket<std::string>("Hello World!").At(Timestamp(i))));
    }
    MP_RETURN_IF_ERROR(graph.CloseInputStream("in"));
    
  6. באמצעות האובייקט OutputStreamPoller, הדוגמה מאחזרת את כל 10 החבילות מזרם הפלט, מוציאה את תוכן המחרוזת מכל חבילה ומדפיסה אותו ביומן הפלט.

    mediapipe::Packet packet;
    while (poller.Next(&packet)) {
      LOG(INFO) << packet.Get<string>();
    }