Release Notes: Adaptive Vision Studio 5.0
- New: It is now possible to create separate sub-programs that will be executed when a specific event occurs in the HMI. These sub-programs are called "event handlers". Full details are included in the documentation, below are the quick notes only:
- Event handlers run in parallel with the main program loop.
- Communication between event handlers and the main program loop can be performed through Global Parameters or Global Queues.
- Typical events are: ImpulseButton.Click, VideoBox.MouseMove, TrackBar.ValueChanged.
- New: There is a new button in the Properties window that switches it from properties to event configuration:
- Deprecated: Outputs of HMI controls that indicated events with boolean or conditional data are no longer recommended. Use real events instead.
- New: It is now possible to create multiple sub-programs that run in parallel. These sub-programs are called "Worker Tasks".
- "Main" is the default Worker Task.
- When you have multiple enabled Worker Tasks, they will start running in parallel when you click the "Run (F5)" button (). To run only one selected task click the "Run Single Worker (Ctrl+F6)" button ().
- It is not possible to create new parallel tasks dynamically. All parallel tasks are create when the program starts.
- New: The combo-box in the main toolbar now selects one Worker Task, which execution we will be controlling and debugging. The other workers will run in parallel, but cannot be paused or executed step-by-step.
- Improved: The TCP/IP toolset has been adapted for possible multi-threaded work.
- Improved: The "Third Party" image acquisition toolset was marked as single-thread only. For multiple-thread image acquisition we recommend GigE Vision and GenICam tools which are fully thread-safe.
- New: It is now possible to use GigEVision_GrabImage filter in one Parallel Task and invoke GigeVision_ExecuteCommand in an event handler to issue a software trigger. This style of programming opens up many new options and broadens the scope of potential applications.
- New: Besides Global Parameters, Queues are also available for use now. A queue extends a global parameter by buffering multiple elements between a producer and a consumer threads. You can put elements to a queue in one worker task and remove them in another worker task. For example, in one task you may generate candidate objects for inspection and in another task you may process these candidates one by one. These two things will run in parallel (as a pipeline).
- Note: You will need a multi-threaded runtime license to use multiple Worker Tasks with data analysis tools. In order to run an unlimited number of threads, you will need to purchase a license for 4,8 or 10 core CPU. If you only use other Worker Tasks for HMI Events or for I/O communication, a basic runtime license should be sufficient.
BETA VERSION: Exception handling in multiple Worker Tasks is not functional yet.
- New: The Program Editor may be now divided into four sections for any Task macrofilter:
- INITIALIZE - intended for filters, which will be executed only once, before the main loop.
- ACQUIRE - this is a place for image (data) acquisition filters; loop generators.
- PROCESS - intended for the data processing tools, more typically ones that take an image and calculate the inspection result.
- FINALIZE - this section is executed once, after the main loop is finished; most typically we close network connections or save settings to a file here.
- Deprecated: There is no more need to create separate macrofilters for Initialize and MainLoop (as was earlier a recommended idiom).
- New: Step and Variant Step macrofilters can also have sections, but these are limited to INITIALIZE and PROCESS. The INITIALIZE section defined here will be executed right after initialization of the containing Task macrofilter.
- Improved: Thanks to sections, many applications that required macrofilters in the past now can be streamlined into a one-screen program.
- Improved: Thanks to sections, we can preserve outputs of filters after the last iteration. No more disappearing results when the program is finished.
- New: When loading an old program, Studio will ask the user to choose or reject automatic conversion to sections. Note that this will often give only partial results.
- Improved: With the sections feature simplifying the application structure, the notion of a "program iteration" has been refined. Now, an iteration of the program is always the iteration of its top-level task. This impacts:
- the behavior of the "Iterate (F6)" button.
- the calculation of "iterations per second" on the status bar.
- the way the Pause button works in the runtime application (now it pauses after a full iteration is completed and not in a random place).
- Coming in 5.1: "Offline mode", in which the outputs of the ACQUIRE section will be replaced with an Image List / Filmstrip window. This will simplify working with the same project on the production site and during development/testing. Currently, we still recommend having two different programs for this purpose, which use the same inspection sub-programs.
- New: Minimal View. We have completely re-designed the program editor for easy use in basic applications. Connections are hidden, but many programs can be created in a single view, without macrofilters. This simplifies application development, especially directly on the production and by the end users.
- Note: We do not recommend Minimal View for large or complicated projects. The Compact view is still preferable for advanced users.
- Changed: To allow switching between Minimal and Compact views, we have changed the way output labels are displayed in the Compact view. Now they are directly in the place of the filter's output (in 4.12 they were displayed as an additional element on a side of the filter).
- Improved: The "Results" window has been re-defined. In version 4.12 it was highly hierarchical. Now it displays a more flat list of filter outputs for easier operation. In short, the elements of the Result control correspond closely to visible outputs of the selected filter, including labeled outputs. (*)
- Changed: Adaptive Vision Studio Smart is now intended to be used in Minimal Program View and with the Results control for setting Pass/Fail limits.
- Improved: In the previous versions we had two controls for selecting filters: Filter Catalog and Toolbox. This was sometimes misleading. We have merged the two controls into a single one. If you want to get back the old Filter Catalog view, click this icon:
- Improved: All message boxes in the application have been thoroughly revised for clarity and consistency.
- Improved: Many data types can be displayed in both textual and graphical way. If the choice it not obvious the user is now asked to decide.
- Improved: All example programs were revised. In many cases we got rid of subprograms for the sake of simplicity that is now possible with sections.
- Improved: The Search tool (for finding filters in a program) has been re-implemented. Now you can easily find multiple instances and browse though them using a "Find Results" window.
- New: The new text editor for formulas brings the formulas editing experience much closer to editing code:
- To create a new expression just press Enter and type "outName = ..." instead of clicking "Add output...".
- You can define the type of an output within the text editor using the following syntax: "outValue : Integer = ...".
- You can even define data labels this way. Just skip the "out" prefix.
- New: There is a new powerful mechanism for suggesting function and parameter names.
- Changed: From now on, pressing Enter will always create a new line in a formula. Use Ctrl+Enter or Esc to finish editing.
- New: When using labels, you can directly refer to them in your expressions. There is no need to create a formula input for them anymore.
- New: It is now possible to use array expressions in formulas (this is sometimes also referred to as broadcasting). It makes it possible to use simple operators to perform operations on entire arrays, element by element. You can optionally add "" to arrays to resolve any ambiguities. For example:
- inValues + 1 // adds one to each element of the array inValue
- count(inValues == 5) // finds the number of elements equal to five
- all(inValues1 < inValues2) // checks if all corresponding elements in inValue1 are lower than in inValue2
- New: A lot of new functions are available:
- min, max for 3 and 4 arguments
- flatten - transforms a two-dimensional array into a flat, one-dimensional one (concatenates the elements one after another)
- removeNils - removes all Nil elements from an array
- select - creates a sub-array from elements fulfilling some condition (use it instead of Classify... filters)
- findFirst, findLast, findAll - for searching in arrays
- indexOfMin, indexOfMax - returning the index of the smallest or the biggest element
- minElement, maxElement - returning the smallest or the biggest element
- New: It is also possible to perform basic geometrical calculations inside a formula now:
- distance - measures the distance between points or between a point and a line
- angleNorm, angleDiff, angleTurn - for easy operations on angles (modulo arithmetic)
- project - point on line projection
- area - returns the area of different geometrical primitives
- normalize - returns a vector with the same direction but with length equal to one
- dot - calculates the dot product of two vectors
- New: There are also several new data properties: Segment.Direction, Segment.Length, Segment.Center, Line2D.Orientation, Vector2D.Length, Vector2D.Direction.
- New: There is a new "if-then-elif-else" syntax for conditional expressions. It may be more preferable than the C-style "?:" operator.
- Changed: .Length property for arrays has been changed to .Count. Manual update will be required. This was necessary to avoid ambiguity with a new property Segment2D.Length.
Library for modern C++
- Improved: We now use C++14 in public headers, thus dropping support for Microsoft Visual Studio 2013. Versions 2015 and later are supported.
- Improved: The new version of our library is based on modern C++. We use the following features:
- noexcept / override / final - for our class methods, where appropriate
- move semantics in all our containers
- std::thread for implementation of Parallel Tasks
- Note: We use non-standard atl::Array (instead of std::vector), atl::String (instead of std::wstring) and atl::Optional/Conditional (instead of std::optional) classes due to the follwing reasons: (a) binary compatibility between platforms as well as between C++ and C# code, including serialization to files, (b) custom memory management with optimization of raw memory buffer re-use, (c) std::optional cannot hold references, (d) std::wstring does not have a fixed character type.
Deep Learning Add-on
- New: We added a Heatmap type which makes visualization much easier. Before we used Images for that, but now the Heatmap type also remembers its key thresholds making the visualzation very straigthforward. You do not need to use the VisualizeHeatmap filter anymore.
- New: All anomaly detection tools are now supported on the WEAVER inference engine. Speed-up factors as compared to version 4.12 are:
- DA1/global: 6.5x
- DA1/featurewise: 5.2x
- DA2: 20x
- DA1/global: 3.1x
- DA1/featureswise: 11x
- DA2: 14x
- New: Instance segmentation tools are now supported on the WEAVER inference engine (NOT AVAILBLE IN BETA VERSION).
- Improved: We optimized the WEAVER more on the RTX series of nVidia GPU. Typical speed-up factor on this platform is 1.2x as compared to version 4.12.
- Improved: We finished optimizeation of the CPU back-end of WEAVER. Comparing to the version 4.12 (the first release of WEAVER), the speed-up factors are:
- Feature Detection: 1.7x
- Point Location: 1.7x
- Object Classification: 1.5x
- Changed: Model editors are now being installed with Deep Learning Add-on only (before they were also installed with Studio and Library installers).
- Changed: The list of images is now displayed on the left side of the editor window. This follow the general UX principle that GUI elements should be put in order from left to right and from top to bottom in accordance to how they are typically used.
- Changed: Set Minimum Feature Size in Detect Anomalies 2 to 32. Executing Detect Anomalies 2 models with lower Feature Size is not supported.
New and improved tools
- New: It is now possible to compensate for the thickness of a calibration target in Camera Calibration.
- New: The image drawing tools were revised: now, there are three variants: _SingleColor, _TwoColors, _MultiColor. The new multi-color variant is especially useful for drawing results of detection of multiple classes of objects.
- New: A new filter, DrawCrosshairs, is good for drawing the results of Point Location tools.
- New: For subpixel-precise template matching there is now a set of revised tools, EnhanceObjectMatch.
- New: Sharr operator has been added to gradient computing filters.
- New: New filters: CreatePathRegion, CropImageToQuadrangle and CropRegionToQuadrangle.
- New: More advanced image in-painting methods were added. See a new filter: InpaintImage_Telea.
- Improved: Many filters were further optimized, e.g. RegionUnion_OfArray, SmoothProfile_Gauss.
- Improved: The Golden Template 2 filter is now the default for comparing images against a predefined template.
Improved code reading
- Improved: We are releasing new highly optimized reader for Data Matrix codes. Its performance and reliability puts it among the top players on the market.
- Improved: QR Code readers have been optimized, giving typically 2-3 times better execution times.
- Changed: ShapeRegion type has been re-designed. In 4.12 it could be a rectangle or a circle. Now it is a union of Rectangle, Circle, Polygon or (any) Region.
- Changed: CheckPresence filters now use the new ShapeRegion type on the inRoi input.
- Changed: Filters that use the new ShapeRegion type instead of Region are: ExtractBlobs, LocateObjects (for inSearchRegion), InpaintImage.
-- This highly improves user-experience, especially when a ROI needs to be adjusted at production.
-- One can now use the new ShapeRegion type everywhere by adding CreateShapeRegionRegion.
- Changed: If you were using ShapeRegionEditor as an HMI Control, you need to manually replace it with ShapeRegionDeprecated.
- Changed: To avoid possible confusion we also renamed filters working with closed paths like ShapeArea, ShapeElongation etc.. Now these are PolygonArea, PolygonElongation etc.
- Changed: Histograms are now represented with 64-bit floating point numbers (WAS: integers). Therefore, it is possible to use histograms also as general probability density distributions, which was not possible in previous versions. Each histogram is represented by DomainStart (Real) + BinSize (Real) + BinCount (Integer) + the bins (DoubleArray).
- Improved: Histograms now support cyclic domains, e.g. when considering a histogram of directions (0..360 degrees), the value 0 and the value 360 are considered the same. This is important, for example, when smoothing a histogram.
- New: Modules of macrofilters (.AVLIB) can now be encrypted. Thanks to this, you can implement subprograms and share them with other people (usually the customers) without being afraid of revealing your know-how.
- New: At quantities of 25+, runtime licenses for both Studio and Library are now modular. If you need 1 or 2 modules only, you can get a better price.
- New: The list of modules actually used in the current project can be found in the Statistics window.
- New: The module of each tool is now clearly displayed in documentation, and also when selecting a tool from the Toolbox:
- New: Now both Studio and Library Runtime are licensed by default for one process and according to the number of physical processor cores (hyper-threading does not count).