Advanced Lane Finding Project
Note: this is Udacity Nano Degree project, please refer to Udacity Repository for the project information and requirements.
The goals / steps of this project are the following:
findChessboardCorners()
and calibrateCamera()
funtion to implement the camera calibration.The code for this step in the camera_calibration.py
which located in camera_cal folder.
run the camera_calibration.py
to process the calibration.
In the function calibriate(), the process as below:
* prepare the objp[]
, which is same matrix as chessboard X6
* create list objepiont[]
and imgpionts[]
to hold the 3D and 2D pioints.
* go through all the calibration image to search for conerner. use opencv findChessboardCorners
function.
* use opencv calibratteCamera()
to get mtx
and dist
* write the calibration paramter to a pickle file camera_cal.p
To test if the pickle file which contain the 'mtx' and 'dist' work. use the test()
function to test and visualize the result.
* read the pickle and load the mtx
and dist
* read test image
* use cv2.undistort()
to undistort the test image.
the result as below
pipeline.py
include the class Pipeline, the function pipeline()
which used to handle the image. You could run "pipeline.py" to see the pipeline effect.
The process described below:
use the paremeter from pickle file camera_cal.p (this is done by the function: get_camera_cal()
) use the cv2.undistort
to get the undistort image,the image showed below(resized to 640X360 to fit the file.):
All the image process code is in the image_process.py
in the pipeline it use the funtion import from image_process.py
s_thresh=(170,255)
sx_thresh=(20, 100)
image_threshed = color_grid_thresh(image_undist, s_thresh=s_thresh, sx_thresh=sx_thresh)
This is a combination of color and gradient thresholds to generate a binary image.
in color: it use a HLS's s channel, for gradient, use x direction gradient.
the detialed code is in the image_process.py
, function color_grid_thresh
, after apply the threshold, the image as below.
To implement perspective tranform, first need get the tranform parameter M
and Minv
.
This is done by the view_perspective.py
, just like camera_cal, get the parameter then write into a pickle file for further use.
You could run "view_perspective.py" to see the transform.
The view transform use manully adjust the 4 source piont. after serveral times adjust, the 4 poinst as below.
python
src = np.float32(
[[(img_size[0] / 2) - 63, img_size[1] / 2 + 100],
[((img_size[0] / 6) - 20), img_size[1]],
[(img_size[0] * 5 / 6) + 60, img_size[1]],
[(img_size[0] / 2 + 65), img_size[1] / 2 + 100]])
dst = np.float32(
[[(img_size[0] / 4), 0],
[(img_size[0] / 4), img_size[1]],
[(img_size[0] * 3 / 4), img_size[1]],
[(img_size[0] * 3 / 4), 0]])
The wraped binary image as below
the lane_detection.py
implement the lane-line pixels detection.
the function find_lane_pixels()
use a slide window to find the lane-line pixels.
after get the lane_pixels, use np.polyfit()
to get polynomial paratmeters, this is done in get_polynomial
in the example, it like below. [A B C]
python
[ 1.42425935e-04 -3.09709625e-01 5.13026355e+02]
[ 1.96100345e-04 -2.96906479e-01 1.12235500e+03]
To visualize the search result and fit polynomial, use fit_polynomial()
function. the visualized result as below. show the search window/lane pixels/fit polynimial.
The cacualtion is done in the cal_curv.py
, the function measure_curv()
used to calculate radius.
Firstly, transform the lane piont from pixels to meters, ```python
leftx = leftx * xm_per_pix
lefty = lefty * ym_per_pix
rightx = rightx * xm_per_pix
righty = righty * ym_per_pix
``
then fit these data use
np.polyfit()`
After get the polynomial parameter, use the function R = (1+(2Ay+B)^2)^3/2 / (|2A|)
For the offset, it is similar, tranfer pixel to meter, compare the lane center with picture center to get offse. these are in the function measure_offset()
In the Pipeline
class, use below code to visualzie the lane and caculation. to avoid number quick jump in the screen, display the 15 frames average.
python
def project_fit_lane_info(self, image, color=(0,255,255)):
"""
project the fited lane information to the image
use last 15 frame average data to avoid the number quick jump on screen.
"""
offset = np.mean(self.offset[-15:-1]) if len(self.offset) > self.smooth_number else np.mean(self.offset)
curverad = np.mean(self.radius[-15:-1]) if len(self.radius) > self.smooth_number else np.mean(self.radius)
direction = "right" if offset < 0 else "left"
str_cur = "Radius of Curvature = {}(m)".format(int(curverad))
str_offset = "Vehicle is {0:.2f}m ".format(abs(offset)) + "{} of center".format(direction)
cv2.putText(image, str_cur, (50,60), cv2.FONT_HERSHEY_SIMPLEX,2,color,2)
cv2.putText(image, str_offset, (50,120), cv2.FONT_HERSHEY_SIMPLEX,2,color,2)
The result as below picture.
In the pipeline.py, you could go to line 487 to 498, choice test on one image or a batch of image to see how the pipeline work. ```python if name == 'main': """ image_test_tracker(), test pipeline on one image and show the image on screen images_test_tracker(), test pipeline on images and write the result to related folder """ image_test_tracker("./test_images/test6.jpg", "project", debug_window=False) # image_test_tracker("test_images/challenge/1.jpg", "challenge", debug_window=True) # image_test_tracker("test_images/harder/1.jpg", "harder", debug_window=True)
# images_test_tracker("test_images/", "output_images/", "project", debug_window=True)
# images_test_tracker("test_images/challenge/", "output_images/challenge/", "challenge", debug_window=True)
# images_test_tracker("test_images/harder/", "output_images/harder/", "harder", debug_window=True)
```
To apply the pipeline on the video, you could run the gen_video.py. to generate video. the option is explained in the document description. the code is in line 66-84 ```python if name == "main": """ choise one line to uncoment and run the file, gen the video. the video will be output to ./outpu_videos/temp/ option: subclip = True, just use (0-5) second video, False, use total long video. option: debug_window = True, project the debug window on the up-right corner of the screen to visualize the image handle process and write the fit lane failure/search lane failure image to ./output_videos/temp/images """ # get_image("./test_video/challenge_video.mp4", "./test_images/challenge/", [i for i in range(1,16)]) # get_image("./test_video/harder_challenge_video.mp4", "./test_images/harder/", [i for i in range(1,47)])
gen_video_tracker("project_video.mp4", subclip=True, debug_window=True)
# gen_video_tracker("project_video.mp4", subclip=False, debug_window=False)
# gen_video_tracker("challenge_video.mp4", subclip=True, debug_window=True)
# gen_video_tracker("challenge_video.mp4", subclip=False, debug_window=True)
# gen_video_tracker("harder_challenge_video.mp4", subclip=True, debug_window=True)
# gen_video_tracker("harder_challenge_video.mp4", subclip=False, debug_window=False)
```
With the image process established on single image. We couldn't get the left/right lane correctly in whole video. there is always noise which will affect the lane detection.
For example, in some frame, the lan detection failed, as below picuture shows
The full size picture is link to full size picture
To solve this problem, we need to know what happed when the process not work.
so I add a function project_debug_window()
in the class, and we also need to check the fit lane(fitted polynomial) is OK or not.
To check the lane at y postion 720/bot, 360/mid, 0/top the lane pixel distence and project to the final result picture for debug.
build the function lane_sanity_check()
in lane_detection.py
python
lane_distance_bot = right_fitx[720] - left_fitx[720]
lane_distance_mid = right_fitx[320] - left_fitx[320]
lane_distance_top = right_fitx[0] - left_fitx[0]
The debug picture as below, the full size could find [here]
This is done by the class "Pipeline"'s function project_debug_window()
(./examples/project_detect_fail_with_debug.png)
When lane detect is False. use the recent data to project the lane area and culcualte the lane radius and car offset.
one detect failure and use recent data. As below picture show
Use the Pipeline.pipeline()
, skip the noise frame, the pipeline work well on the project_video.mp4 well.
The project video is here project_video.mp4. The videos with debug window could find here project_video_with_debug_window.mp4.
To solve the challenge video problem. Improve the pipeline with image process.
The challenge vidoe could be find here challenge_video.mp4.
The challenge video with debug window could be found here challenge_video_with_debug_window.
The main change of pipeline for harder_challenge compare with challenge is the image process, the search method is also changed.
The harder challenge vidoe could be find here harder_challenge_video.mp4.
The harder challenge video with debug window could be found here harder_challenge_video_with_debug_window.mp4.
find_lane_pixels()
(helpers/lane_detection.py) is used to search the whole warped image to find the lane pionts.
The pipeline handle the image off-line, so not consider the efficiency issue. In real application, the pipeline must hanle the image before the next image arrive. a quick search method should be applied.
The lane_sanity_check()
(helpers/lane_detection.py) function is very simple. To check if the fitted polynomial lines, just compare the fitted lines three y postions x distence to check if the fitted lines is OK. this is not work very well when the lane curve change dramticlly just like the in the harder_challenge video.
test_video three video for testing the lane detection
pipeline.py the code which use to hande the images. the actual lane dection happend.
Bumps certifi from 2018.8.24 to 2022.12.7.
9e9e840
2022.12.07b81bdb2
2022.09.24939a28f
2022.09.14aca828a
2022.06.15.2de0eae1
Only use importlib.resources's new files() / Traversable API on Python ≥3.11 ...b8eb5e9
2022.06.15.147fb7ab
Fix deprecation warning on Python 3.11 (#199)b0b48e0
fixes #198 -- update link in license9d514b4
2022.06.154151e88
Add py.typed to MANIFEST.in to package in sdist (#196)Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase
.
Bumps pillow from 5.2.0 to 9.3.0.
Sourced from pillow's releases.
9.3.0
https://pillow.readthedocs.io/en/stable/releasenotes/9.3.0.html
Changes
- Initialize libtiff buffer when saving #6699 [
@radarhere
]- Limit SAMPLESPERPIXEL to avoid runtime DOS #6700 [
@wiredfool
]- Inline fname2char to fix memory leak #6329 [
@nulano
]- Fix memory leaks related to text features #6330 [
@nulano
]- Use double quotes for version check on old CPython on Windows #6695 [
@hugovk
]- GHA: replace deprecated set-output command with GITHUB_OUTPUT file #6697 [
@nulano
]- Remove backup implementation of Round for Windows platforms #6693 [
@cgohlke
]- Upload fribidi.dll to GitHub Actions #6532 [
@nulano
]- Fixed set_variation_by_name offset #6445 [
@radarhere
]- Windows build improvements #6562 [
@nulano
]- Fix malloc in _imagingft.c:font_setvaraxes #6690 [
@cgohlke
]- Only use ASCII characters in C source file #6691 [
@cgohlke
]- Release Python GIL when converting images using matrix operations #6418 [
@hmaarrfk
]- Added ExifTags enums #6630 [
@radarhere
]- Do not modify previous frame when calculating delta in PNG #6683 [
@radarhere
]- Added support for reading BMP images with RLE4 compression #6674 [
@npjg
]- Decode JPEG compressed BLP1 data in original mode #6678 [
@radarhere
]- pylint warnings #6659 [
@marksmayo
]- Added GPS TIFF tag info #6661 [
@radarhere
]- Added conversion between RGB/RGBA/RGBX and LAB #6647 [
@radarhere
]- Do not attempt normalization if mode is already normal #6644 [
@radarhere
]- Fixed seeking to an L frame in a GIF #6576 [
@radarhere
]- Consider all frames when selecting mode for PNG save_all #6610 [
@radarhere
]- Don't reassign crc on ChunkStream close #6627 [
@radarhere
]- Raise a warning if NumPy failed to raise an error during conversion #6594 [
@radarhere
]- Only read a maximum of 100 bytes at a time in IMT header #6623 [
@radarhere
]- Show all frames in ImageShow #6611 [
@radarhere
]- Allow FLI palette chunk to not be first #6626 [
@radarhere
]- If first GIF frame has transparency for RGB_ALWAYS loading strategy, use RGBA mode #6592 [
@radarhere
]- Round box position to integer when pasting embedded color #6517 [
@radarhere
]- Removed EXIF prefix when saving WebP #6582 [
@radarhere
]- Pad IM palette to 768 bytes when saving #6579 [
@radarhere
]- Added DDS BC6H reading #6449 [
@ShadelessFox
]- Added support for opening WhiteIsZero 16-bit integer TIFF images #6642 [
@JayWiz
]- Raise an error when allocating translucent color to RGB palette #6654 [
@jsbueno
]- Moved mode check outside of loops #6650 [
@radarhere
]- Added reading of TIFF child images #6569 [
@radarhere
]- Improved ImageOps palette handling #6596 [
@PososikTeam
]- Defer parsing of palette into colors #6567 [
@radarhere
]- Apply transparency to P images in ImageTk.PhotoImage #6559 [
@radarhere
]- Use rounding in ImageOps contain() and pad() #6522 [
@bibinhashley
]- Fixed GIF remapping to palette with duplicate entries #6548 [
@radarhere
]- Allow remap_palette() to return an image with less than 256 palette entries #6543 [
@radarhere
]- Corrected BMP and TGA palette size when saving #6500 [
@radarhere
]
... (truncated)
Sourced from pillow's changelog.
9.3.0 (2022-10-29)
Limit SAMPLESPERPIXEL to avoid runtime DOS #6700 [wiredfool]
Initialize libtiff buffer when saving #6699 [radarhere]
Inline fname2char to fix memory leak #6329 [nulano]
Fix memory leaks related to text features #6330 [nulano]
Use double quotes for version check on old CPython on Windows #6695 [hugovk]
Remove backup implementation of Round for Windows platforms #6693 [cgohlke]
Fixed set_variation_by_name offset #6445 [radarhere]
Fix malloc in _imagingft.c:font_setvaraxes #6690 [cgohlke]
Release Python GIL when converting images using matrix operations #6418 [hmaarrfk]
Added ExifTags enums #6630 [radarhere]
Do not modify previous frame when calculating delta in PNG #6683 [radarhere]
Added support for reading BMP images with RLE4 compression #6674 [npjg, radarhere]
Decode JPEG compressed BLP1 data in original mode #6678 [radarhere]
Added GPS TIFF tag info #6661 [radarhere]
Added conversion between RGB/RGBA/RGBX and LAB #6647 [radarhere]
Do not attempt normalization if mode is already normal #6644 [radarhere]
... (truncated)
d594f4c
Update CHANGES.rst [ci skip]909dc64
9.3.0 version bump1a51ce7
Merge pull request #6699 from hugovk/security-libtiff_buffer2444cdd
Merge pull request #6700 from hugovk/security-samples_per_pixel-sec744f455
Added release notes0846bfa
Add to release notes799a6a0
Fix linting00b25fd
Hide UserWarning in logs05b175e
Tighter test case13f2c5a
Prevent DOS with large SAMPLESPERPIXEL in Tiff IFDDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase
.
Bumps numpy from 1.15.0 to 1.22.0.
Sourced from numpy's releases.
v1.22.0
NumPy 1.22.0 Release Notes
NumPy 1.22.0 is a big release featuring the work of 153 contributors spread over 609 pull requests. There have been many improvements, highlights are:
- Annotations of the main namespace are essentially complete. Upstream is a moving target, so there will likely be further improvements, but the major work is done. This is probably the most user visible enhancement in this release.
- A preliminary version of the proposed Array-API is provided. This is a step in creating a standard collection of functions that can be used across application such as CuPy and JAX.
- NumPy now has a DLPack backend. DLPack provides a common interchange format for array (tensor) data.
- New methods for
quantile
,percentile
, and related functions. The new methods provide a complete set of the methods commonly found in the literature.- A new configurable allocator for use by downstream projects.
These are in addition to the ongoing work to provide SIMD support for commonly used functions, improvements to F2PY, and better documentation.
The Python versions supported in this release are 3.8-3.10, Python 3.7 has been dropped. Note that 32 bit wheels are only provided for Python 3.8 and 3.9 on Windows, all other wheels are 64 bits on account of Ubuntu, Fedora, and other Linux distributions dropping 32 bit support. All 64 bit wheels are also linked with 64 bit integer OpenBLAS, which should fix the occasional problems encountered by folks using truly huge arrays.
Expired deprecations
Deprecated numeric style dtype strings have been removed
Using the strings
"Bytes0"
,"Datetime64"
,"Str0"
,"Uint32"
, and"Uint64"
as a dtype will now raise aTypeError
.(gh-19539)
Expired deprecations for
loads
,ndfromtxt
, andmafromtxt
in npyio
numpy.loads
was deprecated in v1.15, with the recommendation that users usepickle.loads
instead.ndfromtxt
andmafromtxt
were both deprecated in v1.17 - users should usenumpy.genfromtxt
instead with the appropriate value for theusemask
parameter.(gh-19615)
... (truncated)
4adc87d
Merge pull request #20685 from charris/prepare-for-1.22.0-releasefd66547
REL: Prepare for the NumPy 1.22.0 release.125304b
wipc283859
Merge pull request #20682 from charris/backport-204165399c03
Merge pull request #20681 from charris/backport-20954f9c45f8
Merge pull request #20680 from charris/backport-20663794b36f
Update armccompiler.pyd93b14e
Update test_public_api.py7662c07
Update init.py311ab52
Update armccompiler.pyDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase
.
Bumps ipython from 6.5.0 to 7.16.3.
d43c7c7
release 7.16.35fa1e40
Merge pull request from GHSA-pq7m-3gw7-gq5x8df8971
back to dev9f477b7
release 7.16.2138f266
bring back release helper from master branch5aa3634
Merge pull request #13341 from meeseeksmachine/auto-backport-of-pr-13335-on-7...bcae8e0
Backport PR #13335: What's new 7.16.28fcdcd3
Pin Jedi to <0.17.2.2486838
release 7.16.120bdc6f
fix conda buildDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase
.
Bumps opencv-python from 3.4.2.17 to 4.2.0.32.
Sourced from opencv-python's releases.
4.2.0.32
- opencv-python: https://pypi.org/project/opencv-python/
- opencv-contrib-python: https://pypi.org/project/opencv-contrib-python/
- opencv-python-headless: https://pypi.org/project/opencv-python-headless/
- opencv-contrib-python-headless: https://pypi.org/project/opencv-contrib-python-headless/
OpenCV version 4.2.0.
Changes:
- macOS environment updated from xcode8.3 to xcode 9.4
- macOS uses now Qt 5 instead of Qt 4
- Nasm version updated to Docker containers
- multibuild updated
Fixes:
- don't use deprecated brew tap-pin, instead refer to the full package name when installing #267
- replace get_config_var() with get_config_vars() in setup.py #274
- add workaround for DLL errors in Windows Server #264
3.4.9.31
- opencv-python: https://pypi.org/project/opencv-python/
- opencv-contrib-python: https://pypi.org/project/opencv-contrib-python/
- opencv-python-headless: https://pypi.org/project/opencv-python-headless/
- opencv-contrib-python-headless: https://pypi.org/project/opencv-contrib-python-headless/
OpenCV version 3.4.9.
Changes:
- macOS environment updated from xcode8.3 to xcode 9.4
- macOS uses now Qt 5 instead of Qt 4
- Nasm version updated to Docker containers
- multibuild updated
Fixes:
- don't use deprecated brew tap-pin, instead refer to the full package name when installing #267
- replace get_config_var() with get_config_vars() in setup.py #274
- add workaround for DLL errors in Windows Server #264
4.1.2.30
- opencv-python: https://pypi.org/project/opencv-python/
- opencv-contrib-python: https://pypi.org/project/opencv-contrib-python/
- opencv-python-headless: https://pypi.org/project/opencv-python-headless/
- opencv-contrib-python-headless: https://pypi.org/project/opencv-contrib-python-headless/
OpenCV version 4.1.2.
Changes:
... (truncated)
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase
.
Bumps urllib3 from 1.23 to 1.26.5.
Sourced from urllib3's releases.
1.26.5
:warning: IMPORTANT: urllib3 v2.0 will drop support for Python 2: Read more in the v2.0 Roadmap
- Fixed deprecation warnings emitted in Python 3.10.
- Updated vendored
six
library to 1.16.0.- Improved performance of URL parser when splitting the authority component.
If you or your organization rely on urllib3 consider supporting us via GitHub Sponsors
1.26.4
:warning: IMPORTANT: urllib3 v2.0 will drop support for Python 2: Read more in the v2.0 Roadmap
- Changed behavior of the default
SSLContext
when connecting to HTTPS proxy during HTTPS requests. The defaultSSLContext
now setscheck_hostname=True
.If you or your organization rely on urllib3 consider supporting us via GitHub Sponsors
1.26.3
:warning: IMPORTANT: urllib3 v2.0 will drop support for Python 2: Read more in the v2.0 Roadmap
Fixed bytes and string comparison issue with headers (Pull #2141)
Changed
ProxySchemeUnknown
error message to be more actionable if the user supplies a proxy URL without a scheme (Pull #2107)If you or your organization rely on urllib3 consider supporting us via GitHub Sponsors
1.26.2
:warning: IMPORTANT: urllib3 v2.0 will drop support for Python 2: Read more in the v2.0 Roadmap
- Fixed an issue where
wrap_socket
andCERT_REQUIRED
wouldn't be imported properly on Python 2.7.8 and earlier (Pull #2052)1.26.1
:warning: IMPORTANT: urllib3 v2.0 will drop support for Python 2: Read more in the v2.0 Roadmap
- Fixed an issue where two
User-Agent
headers would be sent if aUser-Agent
header key is passed asbytes
(Pull #2047)1.26.0
:warning: IMPORTANT: urllib3 v2.0 will drop support for Python 2: Read more in the v2.0 Roadmap
Added support for HTTPS proxies contacting HTTPS servers (Pull #1923, Pull #1806)
Deprecated negotiating TLSv1 and TLSv1.1 by default. Users that still wish to use TLS earlier than 1.2 without a deprecation warning should opt-in explicitly by setting
ssl_version=ssl.PROTOCOL_TLSv1_1
(Pull #2002) Starting in urllib3 v2.0: Connections that receive aDeprecationWarning
will failDeprecated
Retry
optionsRetry.DEFAULT_METHOD_WHITELIST
,Retry.DEFAULT_REDIRECT_HEADERS_BLACKLIST
andRetry(method_whitelist=...)
in favor ofRetry.DEFAULT_ALLOWED_METHODS
,Retry.DEFAULT_REMOVE_HEADERS_ON_REDIRECT
, andRetry(allowed_methods=...)
(Pull #2000) Starting in urllib3 v2.0: Deprecated options will be removed
... (truncated)
Sourced from urllib3's changelog.
1.26.5 (2021-05-26)
- Fixed deprecation warnings emitted in Python 3.10.
- Updated vendored
six
library to 1.16.0.- Improved performance of URL parser when splitting the authority component.
1.26.4 (2021-03-15)
- Changed behavior of the default
SSLContext
when connecting to HTTPS proxy during HTTPS requests. The defaultSSLContext
now setscheck_hostname=True
.1.26.3 (2021-01-26)
Fixed bytes and string comparison issue with headers (Pull #2141)
Changed
ProxySchemeUnknown
error message to be more actionable if the user supplies a proxy URL without a scheme. (Pull #2107)1.26.2 (2020-11-12)
- Fixed an issue where
wrap_socket
andCERT_REQUIRED
wouldn't be imported properly on Python 2.7.8 and earlier (Pull #2052)1.26.1 (2020-11-11)
- Fixed an issue where two
User-Agent
headers would be sent if aUser-Agent
header key is passed asbytes
(Pull #2047)1.26.0 (2020-11-10)
NOTE: urllib3 v2.0 will drop support for Python 2.
Read more in the v2.0 Roadmap <https://urllib3.readthedocs.io/en/latest/v2-roadmap.html>
_.Added support for HTTPS proxies contacting HTTPS servers (Pull #1923, Pull #1806)
Deprecated negotiating TLSv1 and TLSv1.1 by default. Users that still wish to use TLS earlier than 1.2 without a deprecation warning
... (truncated)
d161647
Release 1.26.52d4a3fe
Improve performance of sub-authority splitting in URL2698537
Update vendored six to 1.16.007bed79
Fix deprecation warnings for Python 3.10 ssl moduled725a9b
Add Python 3.10 to GitHub Actions339ad34
Use pytest==6.2.4 on Python 3.10+f271c9c
Apply latest Black formatting1884878
[1.26] Properly proxy EOF on the SSLTransport test suitea891304
Release 1.26.48d65ea1
Merge pull request from GHSA-5phf-pp7p-vc2rDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase
.