<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta>
      <journal-title-group>
        <journal-title>SEBD</journal-title>
      </journal-title-group>
    </journal-meta>
    <article-meta>
      <title-group>
        <article-title>From RAM3S to SPAF: Towards a Stream Processing Abstracting Framework⋆</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Ilaria Bartolini</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Marco Patella</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Department of Computer Science and Engineering (DISI), Alma Mater Studiorum, University of Bologna</institution>
          ,
          <country country="IT">Italy</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2023</year>
      </pub-date>
      <volume>31</volume>
      <fpage>02</fpage>
      <lpage>05</lpage>
      <abstract>
        <p>We describe the evolution of RAM3S, a software infrastructure for the integration of Big Data stream processing platforms, to SPAF, an abstraction framework able to provide programmers with a simple but powerful API to ease the development of stream processing applications. By using SPAF, the programmer can easily implement real-time complex analyses of massive streams on top of a distributed computing infrastructure, able to manage the volume and velocity of (multimedia) Big Data streams.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;stream processing</kwd>
        <kwd>real-time analysis</kwd>
        <kwd>big data</kwd>
        <kwd>multimedia data streams</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <sec id="sec-1-1">
        <title>1.1. Running Example: Face Recognition</title>
        <p>
          To exemplify the many RAM3S/SPAF
components throughout the paper, we will use
the first RAM 3S application we created [
          <xref ref-type="bibr" rid="ref2">2</xref>
          ],
i.e., automatic facial identification in videos,
see Figure 1. For the purpose of face
recognition, each incoming video is first streamed
as a sequence of frames and each incoming Figure 1: Face recognition use case: known (left)
frame is analyzed to: 1. verify if it contains and unknown (right) face.
a face (we use the well-known Viola–Jones
algorithm [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ]), 2. compare the (possibly)
discovered face against a number of “known” faces, to retrieve the known face most similar to the
input face (using a technique based on principal component analysis using eigenfaces [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ]),
3. “recognizing” the face if there is a high enough similarity score between the newly discovered
face and its most similar known face (otherwise, the face is marked as unknown).
        </p>
        <sec id="sec-1-1-1">
          <title>2. Introducing RAM3S</title>
          <p>
            Several modern applications (e.g., face detection for the automatic identification of “suspect”
people [
            <xref ref-type="bibr" rid="ref11">11</xref>
            ], recognition of suspicious behavior from videos [
            <xref ref-type="bibr" rid="ref8">8</xref>
            ] or audio events [
            <xref ref-type="bibr" rid="ref7">7</xref>
            ]) require a large
amount of data to be analyzed as soon as these are available, so as to exploit their “freshness”. In
such Big Data stream processing paradigm, the eficiency of the system depends on the amount
of data processed, keeping low latency, at the second, or even millisecond, level. For this,
a number of Stream Processing Engines (SPEs) have been introduced, among which Storm,
(http://storm.apache.org), Flink (http://flink.apache.org), Samza (http://samza.apache.org), and
Spark Streaming (http://spark.apache.org). Abstracting by specificities of each SPE (see [
            <xref ref-type="bibr" rid="ref1 ref13 ref9">13, 1, 9</xref>
            ]
for details on Spark, Flink, and Samza respectively), the following common characteristics can
be discovered (see also [
            <xref ref-type="bibr" rid="ref2">2</xref>
            ] for a more detailed comparison of the SPEs considered in RAM3S):
some nodes in the architecture are in charge of receiving the input data stream, thus containing
the data acquisition logic; other nodes perform the actual data processing; finally, data sources
and data processing nodes are connected to realize the data processing architecture, which takes
the form of a Directed Acyclic Graph (DAG), where arcs represent the data flow between nodes.
          </p>
          <p>The initial challenge that led us to the introduction of RAM3S was the implementation of a
number of security-related MM stream processing applications on top of such SPEs, with the
goal of comparing them by way of several performance KPI, such as throughput, scalability,
latency, etc. This required to re-implement every MM stream analysis application on top of
each SPE, leading to huge code replication and other ineficiencies. We were therefore led to
realize a middleware software framework to allow users to avoid having to deal with details of
each specific SPE (such as how fault-tolerance is achieved, how stream data are stored, etc.),
and easily extend already available (centralized) software to a scaled out solution. This way,
we strove to bridge the technological gap between facilities provided by SPEs and advanced
applications (whose implementation to a distributed computing scenario could be daunting).</p>
        </sec>
      </sec>
      <sec id="sec-1-2">
        <title>2.1. RAM3S: Almost a Framework</title>
        <p>
          Our original goal for RAM3S was to create a framework, according to the definition in [
          <xref ref-type="bibr" rid="ref6">6</xref>
          ]: “A
framework is a set of cooperating classes that make up a reusable design for a specific class of
software. . . You customize a framework to a particular application by creating application-specific
subclasses of abstract classes from the framework.” A framework, therefore, determines the
overall architecture of an application and focuses on the reusability of a solution architecture
and its extensibility, so that it can evolve through future integrations.
        </p>
        <p>The current version of
RAM3S allows to experiment
with the various SPEs (namely,
Spark Streaming, Storm, Flink,
and Samza) by providing a
separate “generic” application
for each of them. Each of
such applications allows
the execution of a specific Figure 2: RAM3S programming interface and its instantiation for
example on the respective face recognition.</p>
        <p>SPE. RAM3S interposes an
abstraction layer based on
interfaces between the generic and the example applications (see Figure 2). Such interfaces
model aspects of both data streaming and data processing: The Receiver interface represents
the external system from which the application receives data; its receive method
accommodates the logic of receiving the single processable object from the external system. The
Analyzer interface represents the container of all the processing logic of the application; its
analyze methods takes a MM object as input, generating a single object as result. Finally,
the ApplicationFactory interface is responsible for representing the application as a unit;
in essence, it serves as a collector for the Analyzer implementation and for the Receiver
implementation, by instantiating the concrete Analyzer and Receiver type classes defined
in the application context.</p>
        <p>Let us now consider how RAM3S interfaces public static void main(String[] args) {
are used by a generic application. The purpose ApplicaSteicounrFiatcytFoarcytofrayc.tcolrayss=.newInstance();
of such application is to map the application RAencaeliyvzeerr raencaeliyvzeerr == ffaaccttoorryy..ccrreeaatteeRAencaeliyvzeerr(());;
(defined in terms of the above interfaces) to /.*..Boilerplate Code specific for the SPE */
the relevant SPE, thus executing its logic on }
the underlying runtime framework.</p>
        <p>Generic application code is always com- Figure 3: Code of a generic RAM3S application.
pletely specified within the main method and
has a recurring structure, presented in Figure 3. The concrete factory is used to create the
Receiver and Analyzer; then such objects have to be translated into objects and procedures
specific of the underlying SPE, as exposed by its APIs; the purpose of this step is to concretely
establish the connection to the specific data processing infrastructure and to implement the
application logic. Clearly, this is so-called boilerplate code, peculiar to the underlying SPE, that
has to be repeated, almost verbatim, for each specific application.</p>
        <p>
          A final component of RAM 3S is the one used to support diferent message brokers [
          <xref ref-type="bibr" rid="ref4">4</xref>
          ].
The abstraction layer devoted to message brokers consists of the messageBroker package
shown in Figure 4. This package includes interfaces for the abstract representation of “readers”
and “writers” (Reader and Writer interfaces) and concrete classes for the implementation of
interfaces for a specific message broker (the figure reports only those for Apache Kafka, i.e.,
KafkaReader and KafkaWriter). For each stream processing framework (Figure 4 depicts
the example of Flink), an additional layer is needed to map the Reader and Writer classes
into, respectively, the source and destination of data processed by the application.
        </p>
        <p>From the analysis we have presented, we can conclude that, at present, RAM3S allows
diferent stream processing applications to be executed in a facilitated manner, but is not yet
able to allow the definition of a new application without having to write part of the code of
RAM3S itself. This drawback places RAM3S in the role of a “quasi-framework”. On the other
hand, the message broker support is independent of the application code (thus satisfying the
reusability requirement) and makes it possible to decouple the implementation of the read and
write “adapters” of a certain message broker from the underlying stream processing engine
(thus also ofering extensibility). In the next section, we will introduce SPAF, whose main goal
is to enable the use of RAM3S according to the original intent, namely to facilitate the creation
of new stream processing applications, while ofering both reusability and extensibility.</p>
        <sec id="sec-1-2-1">
          <title>3. From RAM3S to SPAF</title>
          <p>Before describing the concepts that have been used to define our Stream Processing Abstraction
Framework, SPAF, it is useful to recollect the original requirements for RAM3S: Facilitate
the creation of stream processing applications: the SPAF API should explicitly expose the
pivotal concepts of stream processing and, more importantly, allow the application to be defined
by writing code as close as possible to a description in natural language. Checking type-safety
at compile time would be also helpful. Framework independence: here, the target user is not
the programmer of applications, rather the developer who wants to extend SPAF to work with
a diferent SPE. Such programming interface is called Service Provider Interface (SPI) and is
a programming pattern supported natively by Java. Connector independence: it should be
possible to integrate, in a pluggable manner, new connector providers (e.g., message queues, file
systems, databases), again exposing a SPI to be implemented by developers. SPAF will therefore
expose a dual abstraction layer: one for SPEs and one for input/output supports. Connector
abstraction actually concerns the application programmer as well, since the SPAF API should
relieve the programmer of the implementation details regarding the use of each connector’s
libraries and allow him to specify sources and destinations in a declarative manner.</p>
          <p>In the first version of SPAF, a number of simplifying assumptions has been introduced to ease
implementation of the previously described requisites: 1. Connectors will be limited to message
queues, as provided by well-known message brokers such as Apache Kafka and RabbitMQ.
2. Streams will be composed exclusively by key-value pairs. 3. No support will be provided
for storing intermediate computation results, i.e., stream processing will be stateless. 4. The
processors operating on streams will accept a single input stream and a single output stream;
essentially, it will be possible to define only “linear” topologies. 5. It will be possible to specify
only the logical topology (definition of the transformation process from input to output) and
not the physical topology, i.e., defining of how various computational elements of the logical
topology (sources, transformation operators, destinations) are distributed on the physical nodes.</p>
        </sec>
      </sec>
      <sec id="sec-1-3">
        <title>3.1. SPAF Architecture</title>
        <p>grammer to configure the execution environment in an abstract way (on the API side) and to
implement such configurations in a provider-specific way (on the SPI side).</p>
        <p>A Topology defines the computational logic of a stream processing application, that is,
how the input data are transformed into the output data. As said, in the first version of SPAF
only linear topologies are supported. We conceived the framework to accept specifications of
the logic of Processor nodes also via lambda-functions and present a fluent API to compose
the topology. To achieve this, we exploited a “creational-type” design pattern called Builder,
allowing complex objects (like a topology) to be constructed step by step; this could also re-used
in future versions of SPAF, where it may be convenient to change the way the topology is
represented (e.g., to support DAG topologies).</p>
        <p>The concept of Application basically coincides with the one of Topology, essentially
adding descriptive information only. Conceptually, however, a stream processing application
could define more than one topology: this is why the two entities are separated, although, in
this first version of SPAF, there is a 1-1 relationship between Application and Topology.</p>
        <p>Source and Sink clearly denote the source and destination, respectively, for data in a stream
processing application, while a Processor represents a node in the Topology, implementing
a processing step that is used to transform data, thus realizing the actual data processing logic.
Processors can be thought as “black boxes” with a single input and a single output, where
data transformation can be defined arbitrarily through the process method. The additional
init method can be defined in those cases needing a one-of initialization of the Processor.</p>
        <p>Finally, the Element entity represents the only data type that can be streamed in a SPAF
Topology. The Element class is somewhat hidden from the application programmer, while its
use appears evident in the SPI layer, for both SPEs and connectors.</p>
      </sec>
      <sec id="sec-1-4">
        <title>3.2. Developing an Application using SPAF</title>
        <p>To create an application in SPAF, it is necessary to follow some steps, mostly independent
of the specific streaming application logic to be created. In the following, we will exemplify
the creation of an application for the use case of face recognition in videos (see Section 1.1):
As it will be clear, the application-specific code can be easily distinguished from the generic
SPAF-based code. The code needed for the complete specification of a SPAF application has
actually a dual nature: some declarative code, included in a configuration file, needed to specify
the customization of SPAF entities, like Context, Source, or Sink, and some procedural code,
used to instantiate SPAF classes and to specify the actual stream processing application logic;
this is included in the main method of the application and, again, is mainly boilerplate code.</p>
        <p>Figure 7 shows, for the specific use case, (left) a possible config file, with specification of
the context (using Flink as SPE), of the application, and of the input and output connectors
(using Kafka), and (right) the code of the main method of the FaceRecognition application.
It is clear that most of the code is indeed boilerplate, i.e., repeated with no variation across
diferent applications. The only specific part is at step 3., where we declare that this application
is composed of three main phases: 1) detection of faces in each image, 2) recognition of detected
faces, and 3) (possible) marking of recognized faces (note that these correspond exactly with
the three steps illustrated in Section 1.1). Obviously, the programmer should also write the code
for each individual Processor, but this is absolutely independent of the underlying stream
context {
flink {
local = true
web-ui = true
} web-ui-port = 10081
sink {
type = kafka
bootstrap-servers = "kafka:9092"
} topic = RECOGNIZED_FACES
// 1. configuration and creation of the execution environment
Config config = ConfigFactory.load();</p>
        <p>Context context = StreamProcessing.createContextFactory().createContext(config);
} S/o/ur2c.e&lt;dSetfriinnigt,ioSntroifngi&gt;npsuoturacned =ouSttpruetamsPtrroecaemsssing.createSource(config);
appnlaimceat=io"nFa{ce Recognition" /S/in3k&lt;.Sdtnreofidniengsi,)tSitorninogf&gt;tshienklo=giSctarleatmoPproolcoegsysi(nig.e..c,reahotewSdiankt(acionnftirg)a;nsformed in processing
} dataset-path = "/tmp/training-faces/" Topology topology = new Topology()</p>
        <p>.setSource("Source", source)
soubtroycopetes{t=rakapf-skaervers = "kafka:9092" ....saaaedddtdddSPPPirrrnoookccc(eee"sssSsssiooorrrnk((("""",FFFaaascccieeenMRDkaee)rct;koeegcrnt"io,zre"n,re"nw,ePnweeFrwasoFcnaeDFceaecRteeecMcaotrgioknniintPrgioPorncoPecrsseooscser(os)rs(o,)r,("Sco"oFnuarfccieegR)"e,)co"gFaniczeeDer"t)ector")
} topic = FACES A/p/pl4i.cactrieoantiaopnploifcatthieonap=plniecwatAipopnlication()
.withName(config.getString("application.name"))
.withTopology(topology);
// 5. launch of the application
context.run(application);
processing infrastructure (following the original goal of RAM3S). Step 3. also demonstrates the
use of the Builder pattern, where each Processor refers to its predecessor through its id.</p>
        <p>A dimension of fundamental importance, which should be taken into account when choosing
any development tool, is the so-called “learning curve”, which relates the level of knowledge
and the time invested in learning a new thing. SPAF plays the role of the “guide” that takes the
programmer through the discovery of stream processing concepts, providing a logical path that
facilitates their understanding and thus making the learning curve of stream processing less
daunting. SPAF is therefore able to make life easier for the inexperienced programmer who
must venture into the world of stream processing for the first time, and have that journey less
treacherous (like Virgil, accompanying Dante through the “hell” of stream processing).</p>
      </sec>
    </sec>
    <sec id="sec-2">
      <title>4. Discussion</title>
      <p>In the previous section, where we described the main SPAF concepts and
illustrated how they are used to implement a specific stream processing
application, we deliberately omitted several issues that have been tackled
in the design and implementation of SPAF, like the relationship between
SPEs and connectors, or the one between type-safety and serialization.</p>
      <p>
        Additional details on the SPAF technicalities can be found in [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. In
this final section, we want to highlight two interesting concepts, both
related to the constructions of DAG-shaped topologies, namely the SPAF Figure 8: Mapping
representation of topologies and the so-called super-topologies. topologies.
      </p>
      <p>When considering the representation of topologies in SPAF, we should
remind that the key operation for a topology is how the SPAF stream processing layer (see
Figure 5) is able to map the Topology entity in the corresponding topology of the underlying
SPE (who will then autonomously map it to a physical topology on computing nodes). Since
this version of SPAF only accepts linear topologies, this mapping is extremely simple, being
implemented as a loop visiting all topology nodes in an ordered way. Refactoring the Source,
Processor, and Sink entities (Figure 6) currently used to build topologies, an abstract
entity TopologyNode, exposing a common interface, could be created. In this way, Sources,
Processors, and Sinks could be considered as TopologyNode instances, allowing to use
polymorphism to implement simple (and elegant) algorithms for mapping topologies, e.g., by
exploiting a Visitor pattern based on a topological sort of the DAG.</p>
      <p>Finally, we consider the use of multiple
SPAF applications, in a simultaneous and
coordinated manner, with the aim of solving a
stream processing problem in a “highly
distributed” way (we will soon clarify what we
mean by this adjective). The main idea is
based on the decomposition of the stream
processing problem into sub-problems, and
in solving them through the use of multiple,
independent but cooperative, SPAF projects.</p>
      <p>Each SPAF application will define a certain
logical topology able of solve a certain
subproblem; each topology will receive data via
the connectors provided by SPAF, process Figure 9: Super-topologies in SPAF.
them, and send the processed data back to
the outside world. In this scenario, message queues are used as means of communication
between the topologies of individual projects. In other words, we can implement a topology
of topologies (see Figure 9). Individual topologies, in fact, can be thought as “black boxes”,
processing nodes of a DAG, receiving and sending data via the arcs connecting them, the latter
realized by diferent message queues. What we just described corresponds precisely to the
definition of topology given in Section 3.1, but at a higher level, thus the name of super-topology,
where the prefix super- is to be understood in the Latin sense of “that stands above”.</p>
      <p>In the diagram of Figure 9, it is shown how to conceptually realize a SPAF super-topology. It
will be necessary to provide “border” sources and sinks (shown in blue and yellow, respectively),
functioning as the input and outputs of the entire super-topology. The processing (red) nodes
of the super-topology will instead correspond to a single SPAF application each, defining its
own Source and Sink, and will consist of a (currently, only linear) Topology of Processors.
Communication between the nodes of the super-topology, i.e., between SPAF applications, is
realized by way of appropriate message queues between node pairs (these are represented by
red arcs in the figure and exemplified on the right). Obviously, each topology will have to be
configured to receive and send data to the right message queues, whether they are “border”
(in the example, topologies T1, T2, T4 and T5) or “internal” (T3). The use of super-topologies
in SPAF opens up some interesting scenarios: 1. each SPAF application, i.e., each node in the
super-topology, can be executed by a potentially diferent SPE, since each application can in
fact specify the desired SPAF provider independently from the others; 2. it follows that each
SPAF application, i.e., each node of the super-topology, can potentially be executed on a cluster
of nodes by itself; for this, we previously used the term “highly distributed” execution.
The authors thank Nicolò Scarpa for implementing SPAF and maintaining the GitHub
repository.1 Most of the figures, as well as the analogy between SPAF and Virgil, have been created
by Nicolò, and elaborated by the authors.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>A.</given-names>
            <surname>Alexandrov</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Bergmann</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Ewen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.-C.</given-names>
            <surname>Freytag</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Hueske</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Heise</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O.</given-names>
            <surname>Kao</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Leich</surname>
          </string-name>
          ,
          <string-name>
            <given-names>U.</given-names>
            <surname>Leser</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Markl</surname>
          </string-name>
          , et al.
          <article-title>The Stratosphere Platform for Big Data Analytics</article-title>
          .
          <source>VLDB Journal</source>
          <volume>23</volume>
          (
          <year>2014</year>
          ),
          <fpage>939</fpage>
          -
          <lpage>964</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>I.</given-names>
            <surname>Bartolini</surname>
          </string-name>
          and
          <string-name>
            <given-names>M.</given-names>
            <surname>Patella</surname>
          </string-name>
          .
          <article-title>A General Framework for Real-time Analysis of Massive Multimedia Streams</article-title>
          .
          <source>Multimedia Systems</source>
          <volume>24</volume>
          (
          <year>2018</year>
          ),
          <fpage>391</fpage>
          -
          <lpage>406</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>I.</given-names>
            <surname>Bartolini</surname>
          </string-name>
          and
          <string-name>
            <given-names>M.</given-names>
            <surname>Patella</surname>
          </string-name>
          .
          <article-title>Real-Time Stream Processing in Social Networks with RAM3S</article-title>
          .
          <source>Future Internet</source>
          <volume>11</volume>
          (
          <year>2019</year>
          ),
          <fpage>249</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>I.</given-names>
            <surname>Bartolini</surname>
          </string-name>
          and
          <string-name>
            <given-names>M.</given-names>
            <surname>Patella</surname>
          </string-name>
          .
          <source>The Metamorphosis (of RAM3S)</source>
          .
          <source>Applied Sciences</source>
          <volume>11</volume>
          (
          <issue>24</issue>
          ) (
          <year>2021</year>
          ),
          <fpage>11584</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>I.</given-names>
            <surname>Bartolini</surname>
          </string-name>
          and
          <string-name>
            <given-names>M.</given-names>
            <surname>Patella. A Stream Processing Abstraction Framework</surname>
          </string-name>
          .
          <article-title>Submitted for publication</article-title>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>E.</given-names>
            <surname>Gamma</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Helm</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Johnson</surname>
          </string-name>
          , and
          <string-name>
            <given-names>J.</given-names>
            <surname>Vlissides</surname>
          </string-name>
          . Design Patterns:
          <article-title>Elements of Reusable Object-Oriented Software</article-title>
          .
          <source>Addison-Wesley</source>
          ,
          <year>1994</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>K.</given-names>
            <surname>Łopatka</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Kotus</surname>
          </string-name>
          ,
          <article-title>and</article-title>
          <string-name>
            <given-names>A.</given-names>
            <surname>Czyżewski</surname>
          </string-name>
          . Detection,
          <article-title>Classification and Localization of Acoustic Events in the Presence of Background Noise for Acoustic Surveillance of Hazardous Situations</article-title>
          .
          <source>Multimedia Tools and Applications</source>
          <volume>75</volume>
          (
          <year>2016</year>
          ),
          <fpage>10407</fpage>
          -
          <lpage>10439</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>C.</given-names>
            <surname>Mu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Xie</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Yan</surname>
          </string-name>
          , T. Liu, and
          <string-name>
            <given-names>P.</given-names>
            <surname>Li</surname>
          </string-name>
          .
          <article-title>A Fast Recognition Algorithm for Suspicious Behavior in High Definition Videos</article-title>
          .
          <source>Multimedia Systems</source>
          <volume>22</volume>
          (
          <year>2016</year>
          ),
          <fpage>275</fpage>
          -
          <lpage>285</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>S.A.</given-names>
            <surname>Noghabi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Paramasivam</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Pan</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Ramesh</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Bringhurst</surname>
          </string-name>
          ,
          <string-name>
            <surname>I. Gupta</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R.H.</given-names>
            <surname>Campbell</surname>
          </string-name>
          .
          <source>Samza: Stateful Scalable Stream Processing at LinkedIn. Proceedings of the VLDB Endowment</source>
          <volume>10</volume>
          (
          <year>2017</year>
          ),
          <fpage>1634</fpage>
          -
          <lpage>1645</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>M.</given-names>
            <surname>Tang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Pongpaichet</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R.</given-names>
            <surname>Jain</surname>
          </string-name>
          .
          <article-title>Research Challenges in Developing Multimedia Systems for Managing Emergency Situations</article-title>
          .
          <source>Proceedings of the 24th ACM international conference on Multimedia (ACM MM</source>
          <year>2016</year>
          ), Amsterdam, The Netherlands,
          <fpage>15</fpage>
          -
          <lpage>19</lpage>
          October 2016; pp.
          <fpage>938</fpage>
          -
          <lpage>947</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>M.</given-names>
            <surname>Turk</surname>
          </string-name>
          and
          <string-name>
            <given-names>A.P.</given-names>
            <surname>Pentland</surname>
          </string-name>
          .
          <article-title>Face Recognition Using Eigenfaces</article-title>
          .
          <source>In Proceedings of the 1991 Conference on Computer Vision and Pattern Recognition (CVPR</source>
          <year>1991</year>
          ), Lahaina,
          <string-name>
            <surname>HI</surname>
          </string-name>
          , USA,
          <fpage>3</fpage>
          -
          <lpage>6</lpage>
          June 1991; pp.
          <fpage>586</fpage>
          -
          <lpage>591</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>P.</given-names>
            <surname>Viola</surname>
          </string-name>
          and
          <string-name>
            <given-names>M.</given-names>
            <surname>Jones</surname>
          </string-name>
          .
          <article-title>Rapid Object Detection Using a Boosted Cascade of Simple Features</article-title>
          .
          <source>In Proceedings of the 2001 Conference on Computer Vision and Pattern Recognition (CVPR</source>
          <year>2001</year>
          ), Kauai,
          <string-name>
            <surname>HI</surname>
          </string-name>
          , USA,
          <fpage>8</fpage>
          -
          <issue>14</issue>
          <year>December 2001</year>
          ; pp.
          <fpage>511</fpage>
          -
          <lpage>518</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>M.</given-names>
            <surname>Zaharia</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Chowdhury</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.J.</given-names>
            <surname>Franklin</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Shenker</surname>
          </string-name>
          ,
          <string-name>
            <given-names>and I.</given-names>
            <surname>Stoica</surname>
          </string-name>
          . Spark:
          <article-title>Cluster Computing with Working Sets</article-title>
          .
          <source>In Proceedings of the 2nd USENIX Conference on Hot Topics in Cloud Computing (HotCloud '10)</source>
          , Boston, MA, USA, 22 June 2010; p.
          <fpage>10</fpage>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>