Interface for predicting and mapping benthic habitat (substrates) from any side-scan sonar mosaic.
RockMapper is an open-source Python interface for automatically predicting and mapping rock from any side-scan sonar mosaic(s). RockMapper leverages SegFormer pre-trained models fine-tuned with Segmentation Gym to automatically classify "rocky" substrate- defined as any hard particle greater than 2 mm in size. RockMapper uses the Udden-Wentworth grain size scale when classifying substrate into four classes: other (fines <2mm), gravel (2mm - 64mm), boulder/cobble (>64mm ), and bedrock (unfractured hard substrates) (Wentworth 1922).
Wolfenkoehler, W. A., Bodine, C. S., & Long, J. M. (forthcoming). Evaluating RockMapper: A software to automatically map aquatic substrate from sonar images.
In this study RockMapper was evaluated by comparing output maps to those made by manual methods, allowing future substrate delineators to better understand the potential strengths or limitations of each approach. RockMapper mapping resulted in similar accuracy to manual methods, which ranged between 61-98%, while also saving ~ 11 minutes per hectare of manual delineation time. Additionally, RockMapper appeared to generalize well to new rivers, indicating reproducibility to unseen datasets.
Wolfenkoehler, W., and Long, J., 2026, Substrate classifications of three rivers in eastern Oklahoma: U.S. Geological Survey data release, https://doi.org/10.5066/P1CZGXSF
- Install
Miniforge. - Open the
Miniforgeprompt. - Install
PINGInstaller:pip install --force-reinstall pinginstaller - Install
RockMapper.python -m pinginstaller rockmapper
- Copy the following script to some location on your computer:
'''
Copyright (c) 2025 Cameron S. Bodine
'''
#########
# Imports
import os, sys
import time, datetime
start_time = time.time()
# Set ROCKMAPPER utils dir
USER_DIR = os.path.expanduser('~')
GV_UTILS_DIR = os.path.join(USER_DIR, '.rockmapper')
if not os.path.exists(GV_UTILS_DIR):
os.makedirs(GV_UTILS_DIR)
def gui():
'''
'''
#################
# NEED TO ADD GUI
# FOR DEVELOPMENT
#############################
# Update Parameters
seg_model = 'RockMapper_20250628_v1' # Don't update
inDir = r'Z:\scratch\202506_BrushyDeepKiamichi_Substrate\mosaics'
mosaicFileType = '.tif'
outDirTop = r'Z:\scratch'
projName = 'RockMapperTest'
mapRast = False
mapShp = True
epsg = 32615
windowSize_m = (18, 18)
window_stride = 6
minArea_percent = 0.75
threadCnt = 0.75
predBatchSize = 30
minPatchSize_m2 = 18 # Minimum patch size to keep in final shapefile, in square meters
smoothShp = True # Smooth final shapefile polygons
smoothTol_m = 0.3 # Smoothing tolerance in meters, higher = more smoothing
deleteIntData = True
################
# Run HabiMapper
modelDir = os.path.join(GV_UTILS_DIR, 'models')
# RockMapper
if seg_model == 'RockMapper_20250628_v1':
from rockmapper.rock_mapper import do_work
modelDir = os.path.join(modelDir, seg_model)
print('\n\nMapping habitat with ROCKMAPPER model...\n\n')
do_work(
inDir = inDir,
outDirTop = outDirTop,
projName = projName,
mapRast = mapRast,
mapShp = mapShp,
epsg = epsg,
windowSize_m = windowSize_m,
window_stride = window_stride,
minArea_percent = minArea_percent,
threadCnt = threadCnt,
mosaicFileType=mosaicFileType,
modelDir=modelDir,
predBatchSize=predBatchSize,
deleteIntData=deleteIntData,
minPatchSize = minPatchSize_m2,
smoothShp = smoothShp,
smoothTol_m = smoothTol_m,
)
print("\n\nGrand Total Processing Time: ", datetime.timedelta(seconds = round(time.time() - start_time, ndigits=0)))
return
if __name__ == "__main__":
gui()- Open the file with Visual Studio Code.
- Update the Parameters as necessary:
#############################
# Update Parameters
seg_model = 'RockMapper_20250628_v1' # Don't update
inDir = r'Z:\scratch\202506_BrushyDeepKiamichi_Substrate\mosaics'
mosaicFileType = '.tif'
outDirTop = r'Z:\scratch'
projName = 'RockMapperTest'
mapRast = False
mapShp = True
epsg = 32615
windowSize_m = (18, 18)
window_stride = 6
minArea_percent = 0.75
threadCnt = 0.75
predBatchSize = 30
minPatchSize_m2 = 18 # Minimum patch size to keep in final shapefile, in square meters
smoothShp = True # Smooth final shapefile polygons
smoothTol_m = 0.3 # Smoothing tolerance in meters, higher = more smoothing
deleteIntData = True- Ensure the
rockmapperenvironment is selected as the Interpreter see this. - Run the script in debug mode by pressing
F5.
