<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vraj Patel</title>
    <description>The latest articles on DEV Community by Vraj Patel (@vrajpatell).</description>
    <link>https://dev.to/vrajpatell</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4107662%2F5aa2fb82-f28b-4bef-b82a-42d3f8e6fbff.jpg</url>
      <title>DEV Community: Vraj Patel</title>
      <link>https://dev.to/vrajpatell</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vrajpatell"/>
    <language>en</language>
    <item>
      <title>What Can You Build with OpenTrace ML? Traffic Forecasts, Road Maps, and Python/Go Inference</title>
      <dc:creator>Vraj Patel</dc:creator>
      <pubDate>Thu, 03 Sep 2026 09:06:09 +0000</pubDate>
      <link>https://dev.to/vrajpatell/opentrace-ml-help-build-privacy-aware-road-intelligence-in-python-dfh</link>
      <guid>https://dev.to/vrajpatell/opentrace-ml-help-build-privacy-aware-road-intelligence-in-python-dfh</guid>
      <description>&lt;p&gt;I’m building OpenTrace ML, an open-source Python and Go toolkit for developers experimenting with traffic forecasting, road observations, and GPS/map workflows.&lt;/p&gt;

&lt;p&gt;In simple terms: it helps you turn a road-damage observation into something you can place on a map, compare models that predict traffic counts, and move a trained linear forecasting model from Python into Go.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Status checked October 7, 2026:&lt;/strong&gt; main is at &lt;code&gt;a2cdb42&lt;/code&gt;. The capabilities below are already merged; this article refresh is not a new software release. The project remains pre-alpha.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/vrajpatell/opentrace-ml" rel="noopener noreferrer"&gt;Repository&lt;/a&gt; · &lt;a href="https://github.com/vrajpatell/opentrace-ml/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contributor guide&lt;/a&gt; · &lt;a href="https://github.com/vrajpatell/opentrace-ml/discussions/5" rel="noopener noreferrer"&gt;Discussions&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Compare traffic forecasts before choosing a model
&lt;/h2&gt;

&lt;p&gt;OpenTrace ML includes persistence, daily seasonal-naive, incremental linear, and CPU neural forecasting models. The neural model is a small scikit-learn multilayer perceptron that uses recent traffic counts and calendar features. Input and target scaling are learned from training data only.&lt;/p&gt;

&lt;p&gt;A useful first project is a notebook that compares all four models on the same chronological folds and plots error by forecast lead. Rolling backtests validate timestamp alignment and reject duplicates, gaps, and invalid targets.&lt;/p&gt;

&lt;p&gt;Start with the repository’s original synthetic data, which needs no external dataset download:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/vrajpatell/opentrace-ml.git
&lt;span class="nb"&gt;cd &lt;/span&gt;opentrace-ml
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'.[dev]'&lt;/span&gt;
python examples/benchmark_traffic_models.py &lt;span class="nt"&gt;--synthetic-demo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Windows PowerShell, activate the environment with &lt;code&gt;.venv\Scripts\Activate.ps1&lt;/code&gt; instead.&lt;/p&gt;

&lt;p&gt;To use your own hourly CSV with &lt;code&gt;date_time&lt;/code&gt; and &lt;code&gt;traffic_volume&lt;/code&gt; columns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;opentrace_ml&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;NeuralTrafficForecaster&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;opentrace_ml.datasets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;select_hourly_traffic_window&lt;/span&gt;

&lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;traffic.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parse_dates&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date_time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;select_hourly_traffic_window&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;samples&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;720&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;NeuralTrafficForecaster&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fit_frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;forecast&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forecast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date_time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hours&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;periods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forecast&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example needs 720 consecutive hourly observations. The window helper collapses agreeing duplicate readings, rejects conflicting ones, and never fills gaps. Output columns are &lt;code&gt;timestamp&lt;/code&gt; and &lt;code&gt;predicted_traffic_volume&lt;/code&gt;. Neural learning is batch-based: fit again to learn new data. Forecasts are traffic counts for one series, not travel-time or ETA predictions.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Train a linear model in Python and forecast in Go
&lt;/h2&gt;

&lt;p&gt;Python handles training; a data-only JSON snapshot carries the scaler, linear coefficients, intercept, and lag history to the native Go execution core.&lt;/p&gt;

&lt;p&gt;From the repository root, with a supported Go toolchain installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python examples/export_traffic_model.py &lt;span class="nt"&gt;--synthetic-demo&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; /tmp/opentrace-traffic.json
&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;go &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; go run ./examples/forecast /tmp/opentrace-traffic.json &lt;span class="se"&gt;\&lt;/span&gt;
  2026-09-04T00:00:00Z 2026-09-04T01:00:00Z&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is linear-model inference. Neural export and Go neural inference are still open work. See the &lt;a href="https://github.com/vrajpatell/opentrace-ml/blob/main/docs/STAGE_5.md" rel="noopener noreferrer"&gt;portable inference guide&lt;/a&gt; for the contract and parity tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Turn road observations into a map layer
&lt;/h2&gt;

&lt;p&gt;The library can parse Pascal VOC road-damage annotations, adapt callable detectors, interpolate detections onto a timestamped GPS trace, and export GeoJSON. A small offline example uses an original annotation fixture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python examples/road_damage_route_demo.py tests/fixtures/rdd_sample.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You could build a survey-layer viewer or an evaluation report with per-class precision, recall, F1, and TP/FP/FN counts. The library supplies the components; you supply your application and any appropriately licensed detector or data.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Experiment with private trace preparation and map matching
&lt;/h2&gt;

&lt;p&gt;GPX preparation requires explicit consent, pseudonymizes trip IDs, and cleans samples. An engine-independent map-matching contract represents matched and unmatched observations. Route scoring combines damage, congestion, uncertainty, and distance signals.&lt;/p&gt;

&lt;p&gt;These are experimental building blocks. A trip pseudonym does not make location data anonymous. The aggregation/export gate is still open work. OpenTrace does not automatically edit OpenStreetMap, and road-damage detections are not an authorized source for OSM edits.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the benchmark actually says
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/vrajpatell/opentrace-ml/blob/main/docs/NEURAL_FORECASTING.md" rel="noopener noreferrer"&gt;documented initial experiment&lt;/a&gt; used one September 2018 window from the UCI Metro Interstate Traffic Volume dataset: 720 hours, 480 initial training hours, and ten 24-hour test folds.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;MAE, traffic counts&lt;/th&gt;
&lt;th&gt;MAPE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Persistence&lt;/td&gt;
&lt;td&gt;2276.82&lt;/td&gt;
&lt;td&gt;107.57%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seasonal, 24 steps&lt;/td&gt;
&lt;td&gt;543.00&lt;/td&gt;
&lt;td&gt;26.35%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Online linear&lt;/td&gt;
&lt;td&gt;3308.64&lt;/td&gt;
&lt;td&gt;99.99%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Neural MLP&lt;/td&gt;
&lt;td&gt;470.01&lt;/td&gt;
&lt;td&gt;33.05%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are recorded historical results, not a fresh benchmark run. All ten neural fits reached the iteration cap. The seasonal baseline had lower percentage error, and the online model needs investigation. One window does not establish general accuracy; the synthetic demo only demonstrates execution.&lt;/p&gt;

&lt;p&gt;The source code is Apache-2.0. External datasets, maps, and weights keep their own licenses and attribution requirements; see &lt;a href="https://github.com/vrajpatell/opentrace-ml/blob/main/DATA_LICENSES.md" rel="noopener noreferrer"&gt;DATA_LICENSES.md&lt;/a&gt;. There is no bundled pretrained detector, production map matcher, hosted API, or complete routing service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choose a small contribution
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ML evaluation:&lt;/strong&gt; propose two additional evaluation windows and check continuity before tuning models — &lt;a href="https://github.com/vrajpatell/opentrace-ml/issues/20" rel="noopener noreferrer"&gt;#20&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streaming ML:&lt;/strong&gt; reproduce and investigate online scaling/underfitting — &lt;a href="https://github.com/vrajpatell/opentrace-ml/issues/21" rel="noopener noreferrer"&gt;#21&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Go and neural networks:&lt;/strong&gt; propose a versioned, data-only neural export contract — &lt;a href="https://github.com/vrajpatell/opentrace-ml/issues/22" rel="noopener noreferrer"&gt;#22&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GIS:&lt;/strong&gt; add a tiny offline OSM fixture with provenance — &lt;a href="https://github.com/vrajpatell/opentrace-ml/issues/3" rel="noopener noreferrer"&gt;#3&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Computer vision:&lt;/strong&gt; build an optional RTMDet adapter — &lt;a href="https://github.com/vrajpatell/opentrace-ml/issues/4" rel="noopener noreferrer"&gt;#4&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPS and privacy:&lt;/strong&gt; help with recording-gap segmentation &lt;a href="https://github.com/vrajpatell/opentrace-ml/issues/8" rel="noopener noreferrer"&gt;#8&lt;/a&gt; or reviewed aggregation &lt;a href="https://github.com/vrajpatell/opentrace-ml/issues/10" rel="noopener noreferrer"&gt;#10&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A reproducible bug report, a clear example, or a focused documentation improvement is a useful contribution. Comment on an issue with your proposed scope before starting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What would make this useful in your work: a forecast-comparison notebook, a Python/Go integration, or a road-observation map? What would you need to trust its results?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Disclosure: This article was prepared with AI assistance and checked against the repository documentation.&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>python</category>
      <category>opensource</category>
      <category>go</category>
    </item>
  </channel>
</rss>
