Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add nvCOMP & Use Hybrid Depth Compression #339

Merged
merged 36 commits into from
Aug 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
6893ef1
Added an NVComp demo
TomaszTB Jul 29, 2024
0451664
Added demo that uses SVO data
TomaszTB Jul 31, 2024
e73c817
Changed default data type to char
TomaszTB Jul 31, 2024
25d8b2c
Added CUDATools
TomaszTB Jul 31, 2024
5057ecf
WIP - CUDA improved use of Streams
TomaszTB Jul 31, 2024
f262141
Improved error reporting
TomaszTB Aug 1, 2024
d1fba1c
Added CUDAStreamManager
TomaszTB Aug 1, 2024
2fd402e
Improved stream usage & error printing
TomaszTB Aug 1, 2024
bef4893
Added comment explaining CUDAStreamManager's purpose
TomaszTB Aug 1, 2024
d31069d
Moved nvjpeg error checker to CUDATools
TomaszTB Aug 1, 2024
365269a
Changed all memory functions to async version
TomaszTB Aug 1, 2024
c9c4317
Removed CUDAStreamManager shutdown hook
TomaszTB Aug 2, 2024
79139dd
Merged with feature/improve-cuda-image-encoder
TomaszTB Aug 2, 2024
fb5ac2e
Cleaned up NVCompSVODemo file
TomaszTB Aug 2, 2024
63565d5
Reset ZEDColorDepthImagePublisher to develop
TomaszTB Aug 2, 2024
e69553d
Added compression tools test
TomaszTB Aug 2, 2024
a55f09b
Fixed test
TomaszTB Aug 2, 2024
e04e33b
Merge branch 'develop' into feature/add-nvcomp
TomaszTB Aug 3, 2024
330ea86
WIP - adding depth compression
TomaszTB Aug 5, 2024
d9b3bf8
WIP - depth compression
TomaszTB Aug 5, 2024
d980f1b
Merge branch 'develop' into feature/add-nvcomp
TomaszTB Aug 9, 2024
d6526ff
Depth encoding works on GPU
TomaszTB Aug 9, 2024
b4d813a
Added hybrid depth compression to NVCompSVODemo
TomaszTB Aug 9, 2024
9e8ca13
Added quality parameter to JPEGProcessor constructor
TomaszTB Aug 9, 2024
f8e744b
WIP - full jpeg depth compression
TomaszTB Aug 12, 2024
8b37352
Cleaned up CUDACompressionTools
TomaszTB Aug 12, 2024
c8f444e
Reduced jpg quality to improve compression ratio
TomaszTB Aug 12, 2024
8d4a719
Merge branch 'develop' into feature/add-nvcomp
TomaszTB Aug 12, 2024
f684286
Added hybrid depth compression to UI
TomaszTB Aug 12, 2024
eef7916
Improved switch statement
TomaszTB Aug 12, 2024
8e680a6
Added resource file for demo
TomaszTB Aug 12, 2024
c884d0d
Using CUDACompressionTools instead of custom compression method for d…
TomaszTB Aug 12, 2024
5a28f3e
Merge branch 'develop' into feature/add-nvcomp
Aug 14, 2024
3cd8bad
Fixed shutdown hang
Aug 14, 2024
125b77d
Added raw files to lfs
TomaszTB Aug 14, 2024
0cf33fe
Add .raw files to LFS
ds58 Aug 14, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@
*.dylib filter=lfs diff=lfs merge=lfs -text
*.glb filter=lfs diff=lfs merge=lfs -text
*.bin filter=lfs diff=lfs merge=lfs -text
*.raw filter=lfs diff=lfs merge=lfs -text
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import us.ihmc.communication.ROS2Tools;
import us.ihmc.log.LogTools;
import us.ihmc.perception.comms.ImageMessageFormat;
import us.ihmc.perception.cuda.CUDACompressionTools;
import us.ihmc.perception.opencv.OpenCVTools;
import us.ihmc.perception.tools.NativeMemoryTools;
import us.ihmc.pubsub.DomainFactory.PubSubImplementation;
Expand All @@ -33,6 +34,7 @@ public class RDXROS2ImageMessageVisualizer extends RDXROS2OpenCVVideoVisualizer<
private final ImageMessage imageMessage = new ImageMessage();
private final SampleInfo sampleInfo = new SampleInfo();
private final Object syncObject = new Object();
private CUDACompressionTools compressionTools;
private int imageWidth;
private int imageHeight;
private int numberOfPixels;
Expand Down Expand Up @@ -105,46 +107,40 @@ private void queueRenderImage(Subscriber<ImageMessage> subscriber)

if (incomingCompressedImageBuffer == null)
{
switch (ImageMessageFormat.getFormat(imageMessage))
ImageMessageFormat imageMessageFormat = ImageMessageFormat.getFormat(imageMessage);
LogTools.info("Creating Image Message Visualizer for {} with type {}", topic.getName(), imageMessageFormat.name());

bytesIfUncompressed = imageMessageFormat.getBytesPerPixel() * numberOfPixels;
incomingCompressedImageBuffer = NativeMemoryTools.allocate(bytesIfUncompressed);
incomingCompressedImageBytePointer = new BytePointer(incomingCompressedImageBuffer);

switch (imageMessageFormat)
{
case GRAY_PNG_8UC1 ->
{
LogTools.info("Creating Image Message Visualizer for {} with type PNG_8UC1", topic.getName());
bytesIfUncompressed = numberOfPixels;
incomingCompressedImageBuffer = NativeMemoryTools.allocate(bytesIfUncompressed);
incomingCompressedImageBytePointer = new BytePointer(incomingCompressedImageBuffer);

compressedBytesMat = new Mat(1, 1, opencv_core.CV_8UC1);
decompressedImage = new Mat(imageHeight, imageWidth, opencv_core.CV_8UC1);
}
case DEPTH_PNG_16UC1 ->
{
LogTools.info("Creating Image Message Visualizer for {} with type DEPTH_PNG_16UC1", topic.getName());
bytesIfUncompressed = numberOfPixels * 2;
incomingCompressedImageBuffer = NativeMemoryTools.allocate(bytesIfUncompressed);
incomingCompressedImageBytePointer = new BytePointer(incomingCompressedImageBuffer);

compressedBytesMat = new Mat(1, 1, opencv_core.CV_8UC1);
decompressedImage = new Mat(imageHeight, imageWidth, opencv_core.CV_16UC1);
normalizedScaledImage = new Mat(imageHeight, imageWidth, opencv_core.CV_32FC1);
}
case COLOR_JPEG_YUVI420 ->
case DEPTH_HYBRID_ZSTD_JPEG_16UC1 ->
{
LogTools.info("Creating Image Message Visualizer for {} with type COLOR_JPEG_YUVI420", topic.getName());
bytesIfUncompressed = numberOfPixels * 3;
incomingCompressedImageBuffer = NativeMemoryTools.allocate(bytesIfUncompressed);
incomingCompressedImageBytePointer = new BytePointer(incomingCompressedImageBuffer);
decompressedImage = new Mat(imageHeight, imageWidth, opencv_core.CV_16UC1);
normalizedScaledImage = new Mat(imageHeight, imageWidth, opencv_core.CV_32FC1);

compressionTools = new CUDACompressionTools();
}
case COLOR_JPEG_YUVI420 ->
{
compressedBytesMat = new Mat(1, 1, opencv_core.CV_8UC1);
decompressedImage = new Mat(imageHeight, imageWidth, opencv_core.CV_8UC3);
}
case COLOR_JPEG_BGR8 ->
{
LogTools.info("Creating Image Message Visualizer for {} with the type COLOR_JPEG_BGR8", topic.getName());
bytesIfUncompressed = numberOfPixels * 3;
incomingCompressedImageBuffer = NativeMemoryTools.allocate(bytesIfUncompressed);
incomingCompressedImageBytePointer = new BytePointer(incomingCompressedImageBuffer);

compressedBytesMat = new Mat(1, 1, opencv_core.CV_8UC1);
decompressedImage = new Mat(imageHeight, imageWidth, opencv_core.CV_8UC3);
}
Expand All @@ -164,9 +160,16 @@ private void queueRenderImage(Subscriber<ImageMessage> subscriber)
sequenceDiscontinuityPlot.update(imageMessage.getSequenceNumber());
}

compressedBytesMat.cols(numberOfBytes);
compressedBytesMat.data(incomingCompressedImageBytePointer);
opencv_imgcodecs.imdecode(compressedBytesMat, opencv_imgcodecs.IMREAD_UNCHANGED, decompressedImage);
if (ImageMessageFormat.getFormat(imageMessage) == ImageMessageFormat.DEPTH_HYBRID_ZSTD_JPEG_16UC1)
{
compressionTools.decompressDepth(incomingCompressedImageBytePointer, decompressedImage);
}
else
{
compressedBytesMat.cols(numberOfBytes);
compressedBytesMat.data(incomingCompressedImageBytePointer);
opencv_imgcodecs.imdecode(compressedBytesMat, opencv_imgcodecs.IMREAD_UNCHANGED, decompressedImage);
}

synchronized (this) // synchronize with the update method
{
Expand All @@ -178,7 +181,7 @@ private void queueRenderImage(Subscriber<ImageMessage> subscriber)
{
OpenCVTools.convertGrayToRGBA(decompressedImage, getOpenCVVideoVisualizer().getRGBA8Mat());
}
case DEPTH_PNG_16UC1 ->
case DEPTH_PNG_16UC1, DEPTH_HYBRID_ZSTD_JPEG_16UC1 ->
{
OpenCVTools.clampTo8BitUnsignedChar(decompressedImage, normalizedScaledImage, 0.0, 255.0);
OpenCVTools.convertGrayToRGBA(normalizedScaledImage, getOpenCVVideoVisualizer().getRGBA8Mat());
Expand Down Expand Up @@ -222,6 +225,8 @@ public void destroy()
unsubscribe();
super.destroy();
getOpenCVVideoVisualizer().destroy();
if (compressionTools != null)
compressionTools.destroy();
}

public void renderStatistics()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import org.bytedeco.opencv.global.opencv_imgcodecs;
import perception_msgs.msg.dds.ImageMessage;
import us.ihmc.perception.BytedecoImage;
import us.ihmc.perception.comms.ImageMessageFormat;
import us.ihmc.perception.cuda.CUDACompressionTools;
import us.ihmc.perception.opencl.OpenCLManager;
import us.ihmc.ros2.ROS2Topic;
import us.ihmc.tools.thread.SwapReference;
Expand All @@ -14,6 +16,7 @@
*/
public class RDXROS2ColoredPointCloudVisualizerDepthChannel extends RDXROS2ColoredPointCloudVisualizerChannel
{
private CUDACompressionTools compressionTools;
private SwapReference<BytedecoImage> depth16UC1ImageSwapReference;

public RDXROS2ColoredPointCloudVisualizerDepthChannel(ROS2Topic<ImageMessage> topic)
Expand All @@ -31,16 +34,27 @@ protected void initialize(OpenCLManager openCLManager)
getFrequencyText().ping();
return depth16UC1Image;
});

if (ImageMessageFormat.getFormat(imageMessage) == ImageMessageFormat.DEPTH_HYBRID_ZSTD_JPEG_16UC1)
compressionTools = new CUDACompressionTools();
}

@Override
protected void decompress()
{
synchronized (decompressionInputSwapReference)
{
opencv_imgcodecs.imdecode(decompressionInputSwapReference.getForThreadTwo().getInputMat(),
opencv_imgcodecs.IMREAD_UNCHANGED,
depth16UC1ImageSwapReference.getForThreadOne().getBytedecoOpenCVMat());
if (ImageMessageFormat.getFormat(imageMessage) == ImageMessageFormat.DEPTH_HYBRID_ZSTD_JPEG_16UC1)
{
compressionTools.decompressDepth(decompressionInputSwapReference.getForThreadTwo().getInputPointer(),
depth16UC1ImageSwapReference.getForThreadOne().getBytedecoOpenCVMat());
}
else
{
opencv_imgcodecs.imdecode(decompressionInputSwapReference.getForThreadTwo().getInputMat(),
opencv_imgcodecs.IMREAD_UNCHANGED,
depth16UC1ImageSwapReference.getForThreadOne().getBytedecoOpenCVMat());
}
}
depth16UC1ImageSwapReference.swap();
}
Expand All @@ -51,6 +65,14 @@ protected Object getDecompressionAccessSyncObject()
return depth16UC1ImageSwapReference;
}

@Override
public void destroy()
{
super.destroy();
if (compressionTools != null)
compressionTools.destroy();
}

public BytedecoImage getDepth16UC1Image()
{
return depth16UC1ImageSwapReference.getForThreadTwo();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ public enum ImageMessageFormat
COLOR_JPEG_BGR8(3),
COLOR_PNG_RGB8(3), // TODO: Implement receiver and visualizer
DEPTH_PNG_16UC1(2),
DEPTH_HYBRID_ZSTD_JPEG_16UC1(2),
GRAY_PNG_8UC1(1)
;

Expand Down
Loading
Loading