<?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: Syahrul Al-Rasyid</title>
    <description>The latest articles on DEV Community by Syahrul Al-Rasyid (@cag000).</description>
    <link>https://dev.to/cag000</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F222947%2Fb1fd7f27-3c13-4599-811a-9fcfebad2b9b.jpg</url>
      <title>DEV Community: Syahrul Al-Rasyid</title>
      <link>https://dev.to/cag000</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cag000"/>
    <language>en</language>
    <item>
      <title>GPU Performance Comparison: RTX 50 Series vs Jetson Modules</title>
      <dc:creator>Syahrul Al-Rasyid</dc:creator>
      <pubDate>Tue, 07 Oct 2025 09:27:04 +0000</pubDate>
      <link>https://dev.to/cag000/gpu-performance-comparison-rtx-50-series-vs-jetson-modules-2dp4</link>
      <guid>https://dev.to/cag000/gpu-performance-comparison-rtx-50-series-vs-jetson-modules-2dp4</guid>
      <description>&lt;h2&gt;
  
  
  Complete Specifications Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;RTX 5080&lt;/th&gt;
&lt;th&gt;RTX 5070&lt;/th&gt;
&lt;th&gt;RTX 5060&lt;/th&gt;
&lt;th&gt;RTX 5050&lt;/th&gt;
&lt;th&gt;Jetson AGX Orin 32GB&lt;/th&gt;
&lt;th&gt;Jetson Orin NX 16GB&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CUDA Cores&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10,752&lt;/td&gt;
&lt;td&gt;6,144&lt;/td&gt;
&lt;td&gt;3,840&lt;/td&gt;
&lt;td&gt;2,560&lt;/td&gt;
&lt;td&gt;2,048&lt;/td&gt;
&lt;td&gt;1,024&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tensor Cores&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;336 (5th Gen)&lt;/td&gt;
&lt;td&gt;192 (5th Gen)&lt;/td&gt;
&lt;td&gt;120 (5th Gen)&lt;/td&gt;
&lt;td&gt;80 (5th Gen)&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI Performance (INT8)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~1,800 TOPS*&lt;/td&gt;
&lt;td&gt;~1,150 TOPS*&lt;/td&gt;
&lt;td&gt;~770 TOPS*&lt;/td&gt;
&lt;td&gt;~500 TOPS*&lt;/td&gt;
&lt;td&gt;275 TOPS&lt;/td&gt;
&lt;td&gt;100 TOPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FP32 Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;56.3 TFLOPS&lt;/td&gt;
&lt;td&gt;30.9 TFLOPS&lt;/td&gt;
&lt;td&gt;19.2 TFLOPS&lt;/td&gt;
&lt;td&gt;12.8 TFLOPS&lt;/td&gt;
&lt;td&gt;5.32 TFLOPS&lt;/td&gt;
&lt;td&gt;2.62 TFLOPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FP16 Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;112.6 TFLOPS&lt;/td&gt;
&lt;td&gt;61.8 TFLOPS&lt;/td&gt;
&lt;td&gt;38.4 TFLOPS&lt;/td&gt;
&lt;td&gt;25.6 TFLOPS&lt;/td&gt;
&lt;td&gt;10.65 TFLOPS&lt;/td&gt;
&lt;td&gt;5.24 TFLOPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16GB GDDR7&lt;/td&gt;
&lt;td&gt;12GB GDDR7&lt;/td&gt;
&lt;td&gt;8GB GDDR7&lt;/td&gt;
&lt;td&gt;8GB GDDR6&lt;/td&gt;
&lt;td&gt;32GB LPDDR5&lt;/td&gt;
&lt;td&gt;16GB LPDDR5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory Bandwidth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;960 GB/s&lt;/td&gt;
&lt;td&gt;672 GB/s&lt;/td&gt;
&lt;td&gt;448 GB/s&lt;/td&gt;
&lt;td&gt;336 GB/s&lt;/td&gt;
&lt;td&gt;204.8 GB/s&lt;/td&gt;
&lt;td&gt;102.4 GB/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory Bus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;256-bit&lt;/td&gt;
&lt;td&gt;192-bit&lt;/td&gt;
&lt;td&gt;128-bit&lt;/td&gt;
&lt;td&gt;128-bit&lt;/td&gt;
&lt;td&gt;256-bit&lt;/td&gt;
&lt;td&gt;128-bit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TDP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;360W&lt;/td&gt;
&lt;td&gt;220W&lt;/td&gt;
&lt;td&gt;170W&lt;/td&gt;
&lt;td&gt;100W&lt;/td&gt;
&lt;td&gt;15W - 60W&lt;/td&gt;
&lt;td&gt;10W - 25W&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Architecture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Blackwell&lt;/td&gt;
&lt;td&gt;Blackwell&lt;/td&gt;
&lt;td&gt;Blackwell&lt;/td&gt;
&lt;td&gt;Blackwell&lt;/td&gt;
&lt;td&gt;Ampere&lt;/td&gt;
&lt;td&gt;Ampere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Process Node&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TSMC 4nm&lt;/td&gt;
&lt;td&gt;TSMC 4nm&lt;/td&gt;
&lt;td&gt;TSMC 4nm&lt;/td&gt;
&lt;td&gt;TSMC 4nm&lt;/td&gt;
&lt;td&gt;Samsung 8nm&lt;/td&gt;
&lt;td&gt;Samsung 8nm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CPU&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;12-core ARM Cortex-A78AE&lt;/td&gt;
&lt;td&gt;8-core ARM Cortex-A78AE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Form Factor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PCIe Desktop&lt;/td&gt;
&lt;td&gt;PCIe Desktop&lt;/td&gt;
&lt;td&gt;PCIe Desktop&lt;/td&gt;
&lt;td&gt;PCIe Desktop&lt;/td&gt;
&lt;td&gt;SOM Module&lt;/td&gt;
&lt;td&gt;SOM Module&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Target Use Case&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gaming/Workstation&lt;/td&gt;
&lt;td&gt;Gaming/Workstation&lt;/td&gt;
&lt;td&gt;Gaming/Desktop&lt;/td&gt;
&lt;td&gt;Budget Gaming&lt;/td&gt;
&lt;td&gt;Edge AI/Robotics&lt;/td&gt;
&lt;td&gt;Edge AI/Embedded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Price (MSRP)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$999&lt;/td&gt;
&lt;td&gt;$549&lt;/td&gt;
&lt;td&gt;$299&lt;/td&gt;
&lt;td&gt;~$199&lt;/td&gt;
&lt;td&gt;~$699&lt;/td&gt;
&lt;td&gt;~$449&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance Per Watt Analysis
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Device&lt;/th&gt;
&lt;th&gt;AI TOPS per Watt&lt;/th&gt;
&lt;th&gt;FP32 TFLOPS per Watt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RTX 5080&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~5.0&lt;/td&gt;
&lt;td&gt;0.156&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RTX 5070&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~5.2&lt;/td&gt;
&lt;td&gt;0.140&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RTX 5060&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~4.5&lt;/td&gt;
&lt;td&gt;0.113&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RTX 5050&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~5.0&lt;/td&gt;
&lt;td&gt;0.128&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Jetson AGX Orin 32GB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;9.2&lt;/strong&gt; (at 30W)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0.177&lt;/strong&gt; (at 30W)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Jetson Orin NX 16GB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;10.0&lt;/strong&gt; (at 10W)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0.262&lt;/strong&gt; (at 10W)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Key Observations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  RTX 50 Series Advantages:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Raw Performance&lt;/strong&gt;: Significantly higher compute power for gaming and heavy workloads&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Bandwidth&lt;/strong&gt;: Much faster GDDR7 memory for graphics-intensive tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ray Tracing&lt;/strong&gt;: Advanced 4th generation RT cores&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DLSS 4&lt;/strong&gt;: Multi-frame generation technology&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ecosystem&lt;/strong&gt;: Full desktop/workstation software compatibility&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Jetson Advantages:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Power Efficiency&lt;/strong&gt;: 10-36x more power efficient per TOPS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrated System&lt;/strong&gt;: Built-in ARM CPU, no separate processor needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compact Form Factor&lt;/strong&gt;: Small SOM (System-on-Module) design&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thermal Design&lt;/strong&gt;: Fanless operation possible at lower TDP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge Deployment&lt;/strong&gt;: Purpose-built for robotics, autonomous vehicles, IoT&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total Cost of Ownership&lt;/strong&gt;: Lower power costs for 24/7 operation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use Case Recommendations:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Choose RTX 50 Series if you need:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High-end gaming performance&lt;/li&gt;
&lt;li&gt;Content creation (video editing, 3D rendering)&lt;/li&gt;
&lt;li&gt;ML training workloads&lt;/li&gt;
&lt;li&gt;Desktop/workstation applications&lt;/li&gt;
&lt;li&gt;Maximum raw compute power&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Choose Jetson if you need:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Edge AI inference deployment&lt;/li&gt;
&lt;li&gt;Robotics and autonomous systems&lt;/li&gt;
&lt;li&gt;Low-power 24/7 operation&lt;/li&gt;
&lt;li&gt;Embedded applications&lt;/li&gt;
&lt;li&gt;Battery-powered devices&lt;/li&gt;
&lt;li&gt;Industrial/automotive applications&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Note: TOPS ratings marked with * for RTX 50 series are estimated based on tensor core specifications. NVIDIA doesn't typically publish INT8 TOPS for gaming GPUs as they're optimized for different workloads than embedded AI platforms.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🚀 Simplifying FastRTC Detector with Ultralytics Best Practices</title>
      <dc:creator>Syahrul Al-Rasyid</dc:creator>
      <pubDate>Wed, 10 Sep 2025 07:06:17 +0000</pubDate>
      <link>https://dev.to/cag000/simplifying-fastrtc-detector-with-ultralytics-best-practices-4cc8</link>
      <guid>https://dev.to/cag000/simplifying-fastrtc-detector-with-ultralytics-best-practices-4cc8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;“Simplicity is the ultimate sophistication.” – Steve Jobs&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When you build an ML pipeline, complexity creeps in fast.&lt;br&gt;
That’s what happened to our &lt;strong&gt;FastRTC detector&lt;/strong&gt;—a YOLO-based module for detection + tracking + OCR.&lt;/p&gt;

&lt;p&gt;It worked. But it was &lt;strong&gt;over-engineered&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 The Problem
&lt;/h2&gt;

&lt;p&gt;The original detector had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tracking spaghetti 🍝&lt;/li&gt;
&lt;li&gt;Custom GPU/CPU optimizations nobody could maintain&lt;/li&gt;
&lt;li&gt;Complicated caching and cleanup logic&lt;/li&gt;
&lt;li&gt;Hard-to-debug annotation code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Result? More &lt;strong&gt;time fixing&lt;/strong&gt; than &lt;strong&gt;time shipping&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ The Fix: Trust YOLO
&lt;/h2&gt;

&lt;p&gt;Instead of reinventing everything, we simplified using &lt;strong&gt;Ultralytics’ own best practices&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Tracking
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;enable_tracking&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&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;track&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;conf&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;confidence_threshold&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;persist&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;tracker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tracker_type&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.yaml&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;model&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;conf&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;confidence_threshold&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ Results Extraction
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;boxes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;boxes&lt;/span&gt;
&lt;span class="n"&gt;masks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;masks&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;track_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;boxes&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;boxes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;track_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boxes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;astype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ Annotation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;annotated_frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line_width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;enable_tracking&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;track_ids&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;track_id&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;track_ids&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;putText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;annotated_frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ID:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;track_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ OCR Caching
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;track_id&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;track_id&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tracked_objects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;detection&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ocr&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tracked_objects&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;track_id&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ocr_result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;detection&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ocr&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ocr_pipeline&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extract_text_from_region&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;bbox&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ Track Management
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_simple_track_cleanup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;max_tracks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tracked_objects&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;max_tracks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;oldest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tracked_objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;first_seen_frame&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tracked_objects&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oldest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;max_tracks&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎯 The Results
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;40% fewer lines of code&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Cleaner, linear flow&lt;/li&gt;
&lt;li&gt;Predictable performance (let YOLO optimize)&lt;/li&gt;
&lt;li&gt;Fully functional: detection, tracking, OCR, annotations&lt;/li&gt;
&lt;li&gt;Much easier to debug + extend&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 Takeaway
&lt;/h2&gt;

&lt;p&gt;If you’re building on YOLO:&lt;br&gt;
👉 Don’t fight it.&lt;br&gt;
👉 Don’t over-engineer it.&lt;br&gt;
👉 &lt;strong&gt;Trust the framework&lt;/strong&gt;—Ultralytics already optimized it for you.&lt;/p&gt;

&lt;p&gt;Your code will be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shorter&lt;/li&gt;
&lt;li&gt;Faster&lt;/li&gt;
&lt;li&gt;Easier to maintain&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;💡 Next time your ML pipeline feels messy, ask yourself:&lt;br&gt;
&lt;strong&gt;“Am I making this harder than it needs to be?”&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🔄 Go-like WaitGroup Pattern in Async OCR</title>
      <dc:creator>Syahrul Al-Rasyid</dc:creator>
      <pubDate>Wed, 10 Sep 2025 06:57:17 +0000</pubDate>
      <link>https://dev.to/cag000/go-like-waitgroup-pattern-in-async-ocr-5a05</link>
      <guid>https://dev.to/cag000/go-like-waitgroup-pattern-in-async-ocr-5a05</guid>
      <description>&lt;h1&gt;
  
  
  🔄 Go-like WaitGroup Pattern in Async OCR
&lt;/h1&gt;

&lt;h2&gt;
  
  
  📍 &lt;strong&gt;Location of WaitGroup Implementation&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The Go-like WaitGroup pattern is implemented in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;File&lt;/strong&gt;: &lt;code&gt;src/core/async_ocr_integration.py&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Class&lt;/strong&gt;: &lt;code&gt;AsyncOCRWaitGroup&lt;/code&gt; (lines 28-84)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Usage&lt;/strong&gt;: &lt;code&gt;_process_concurrent_operations()&lt;/code&gt; method&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔄 &lt;strong&gt;How the WaitGroup Works (Like Go's sync.WaitGroup)&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. WaitGroup Initialization&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Line 189-190: Create WaitGroup for coordinating async operations
&lt;/span&gt;&lt;span class="n"&gt;wait_group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AsyncOCRWaitGroup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;2. Add Operations to WaitGroup&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Line 330: Add N operations to WaitGroup (like Go's wg.Add(n))
&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;wait_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all_operations&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;: &lt;code&gt;🔢 [AsyncOCRWaitGroup] Counter: 3 (delta: 3)&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Start Concurrent Operations&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Lines 332-340: Create async tasks for each detection
&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;operation&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all_operations&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_process_single_operation_safe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wait_group&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;updated_detections&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;4. Each Operation Signals Completion&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Line 472-473: Each operation calls done() when finished (like Go's wg.Done())
&lt;/span&gt;&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;wait_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;done&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Decrements counter by 1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;: &lt;code&gt;✅ [AsyncOCRWaitGroup] Operation completed, counter: 2&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Output&lt;/strong&gt;: &lt;code&gt;✅ [AsyncOCRWaitGroup] Operation completed, counter: 1&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Output&lt;/strong&gt;: &lt;code&gt;✅ [AsyncOCRWaitGroup] Operation completed, counter: 0&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;5. Wait for All Operations&lt;/strong&gt;
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Line 199: Wait for all operations to complete (like Go's wg.Wait())
&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;wait_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;operation_timeout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;: &lt;code&gt;🎉 [AsyncOCRWaitGroup] All 3 operations completed&lt;/code&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  🎯 &lt;strong&gt;Detailed Flow Diagram&lt;/strong&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│                   ASYNC OCR WAITGROUP FLOW                  │
└─────────────────────────────────────────────────────────────┘

1. INITIALIZATION
   ┌──────────────────┐
   │ Multiple         │
   │ food_label       │──┐
   │ detections found │  │
   └──────────────────┘  │     ┌─────────────────────┐
                         ├────▶│ Create WaitGroup    │
   ┌──────────────────┐  │     │ wait_group = new()  │
   │ QR/invoice       │  │     └─────────────────────┘
   │ detections found │──┘              │
   └──────────────────┘                 │
                                        ▼

2. ADD OPERATIONS TO WAITGROUP
   ┌─────────────────────────────────────────────────────┐
   │ await wait_group.add(3)  # 3 detections to process  │
   │ 🔢 Counter: 3 (delta: +3)                          │
   └─────────────────────────────────────────────────────┘
                               │
                               ▼

3. START CONCURRENT TASKS
   ┌─────────────────────────────────────────────────────────┐
   │                  CONCURRENT EXECUTION                   │
   │                                                         │
   │ Task 1: food_label   Task 2: food_label   Task 3: QR    │
   │ ┌─────────────────┐  ┌─────────────────┐  ┌─────────┐  │
   │ │ OCR Processing  │  │ OCR Processing  │  │ QR Proc │  │
   │ │ ┌─────────────┐ │  │ ┌─────────────┐ │  │ ┌─────┐ │  │
   │ │ │   gRPC      │ │  │ │   gRPC      │ │  │ │gRPC │ │  │
   │ │ │ OCR Service │ │  │ │ OCR Service │ │  │ │ QR  │ │  │
   │ │ └─────────────┘ │  │ └─────────────┘ │  │ └─────┘ │  │
   │ └─────────────────┘  └─────────────────┘  └─────────┘  │
   │         │                    │                 │        │
   │         ▼                    ▼                 ▼        │
   │ ┌─────────────────┐  ┌─────────────────┐  ┌─────────┐  │
   │ │ await wg.done() │  │ await wg.done() │  │ await    │  │
   │ │ Counter: 2      │  │ Counter: 1      │  │ wg.done()│  │
   │ └─────────────────┘  └─────────────────┘  │Counter:0│  │
   │                                           └─────────┘  │
   └─────────────────────────────────────────────────────────┘
                               │
                               ▼

4. WAITGROUP COORDINATION
   ┌─────────────────────────────────────────────────────────┐
   │                WAITGROUP COORDINATION                   │
   │                                                         │
   │ ✅ Operation 1 complete → Counter: 2                    │
   │ ✅ Operation 2 complete → Counter: 1                    │
   │ ✅ Operation 3 complete → Counter: 0                    │
   │                                                         │
   │ When Counter = 0:                                       │
   │ 🎉 All 3 operations completed!                          │
   │ 📤 Release await wait_group.wait()                      │
   └─────────────────────────────────────────────────────────┘
                               │
                               ▼

5. COMPLETION
   ┌─────────────────────────────────────────────────────────┐
   │ ✨ Successfully processed 3 operations concurrently     │
   │ 📊 Return updated detections with OCR results           │
   │ ⏱️ Total time: ~200ms (instead of 600ms sequential)     │
   └─────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔍 &lt;strong&gt;Key Components Explained&lt;/strong&gt;
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;AsyncOCRWaitGroup Class&lt;/strong&gt; (&lt;code&gt;lines 28-84&lt;/code&gt;)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AsyncOCRWaitGroup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;           &lt;span class="c1"&gt;# Number of pending operations
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Event to signal completion
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_lock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Lock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;    &lt;span class="c1"&gt;# Thread-safe counter updates
&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&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="c1"&gt;# Like Go's wg.Add(n) - adds n operations to wait for
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🔢 Counter: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_counter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (delta: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;done&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Like Go's wg.Done() - signals one operation completed
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_counter&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✅ Operation completed, counter: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_counter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_counter&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Wake up wait()
&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Like Go's wg.Wait() - blocks until counter = 0
&lt;/span&gt;        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🎉 All &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_initial_counter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; operations completed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Where Operations Start&lt;/strong&gt; (&lt;code&gt;line 330&lt;/code&gt;)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Add all operations to WaitGroup
&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;wait_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all_operations&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# e.g., add(3)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Where Each Operation Finishes&lt;/strong&gt; (&lt;code&gt;line 472-473&lt;/code&gt;)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# In _process_single_operation_async
&lt;/span&gt;&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Always mark operation as done in WaitGroup
&lt;/span&gt;    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;wait_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;done&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Decrements counter
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Where We Wait for All&lt;/strong&gt; (&lt;code&gt;line 199&lt;/code&gt;)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Wait for all operations to complete with timeout
&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;wait_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;operation_timeout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📊 &lt;strong&gt;Real Log Example&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When you have 3 food_label detections:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🚀 [AsyncOCR] Processing 3 detections concurrently
🚀 [AsyncOCR] Starting 3 concurrent operations
🔢 [AsyncOCRWaitGroup] Counter: 3 (delta: 3)           ← WaitGroup.Add(3)

[Concurrent gRPC OCR calls happen]

✅ [AsyncOCR] Completed food_label operation for detection 0
✅ [AsyncOCRWaitGroup] Operation completed, counter: 2  ← WaitGroup.Done()

✅ [AsyncOCR] Completed food_label operation for detection 1  
✅ [AsyncOCRWaitGroup] Operation completed, counter: 1  ← WaitGroup.Done()

✅ [AsyncOCR] Completed food_label operation for detection 2
✅ [AsyncOCRWaitGroup] Operation completed, counter: 0  ← WaitGroup.Done()

🎉 [AsyncOCRWaitGroup] All 3 operations completed      ← WaitGroup.Wait() unblocks
✅ [AsyncOCR] Completed 3 operations in 221.9ms
✨ [AsyncOCR] Successfully processed 2 operations concurrently
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎯 &lt;strong&gt;Go vs Python Comparison&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Go Version&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;wg&lt;/span&gt; &lt;span class="n"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WaitGroup&lt;/span&gt;
&lt;span class="n"&gt;wg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;// 3 operations&lt;/span&gt;

&lt;span class="c"&gt;// Start goroutines&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;detection&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;detections&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="n"&gt;Detection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;wg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Done&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c"&gt;// Signal completion&lt;/span&gt;
        &lt;span class="n"&gt;processOCR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}(&lt;/span&gt;&lt;span class="n"&gt;detection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;wg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Wait&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c"&gt;// Wait for all to complete&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Python Version (Our Implementation)&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;wait_group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AsyncOCRWaitGroup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;wait_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 3 operations
&lt;/span&gt;
&lt;span class="c1"&gt;# Start async tasks
&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;detection&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;detections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;process_ocr_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;detection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wait_group&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;wait_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Wait for all to complete
&lt;/span&gt;
&lt;span class="c1"&gt;# In each process_ocr_async:
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Do OCR processing
&lt;/span&gt;    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ocr_service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;detection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;wait_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;done&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Signal completion
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pattern is &lt;strong&gt;identical&lt;/strong&gt; - we wait for a counter to reach zero as each concurrent operation signals completion! 🎉&lt;/p&gt;

</description>
    </item>
    <item>
      <title>FastRTC Logging Implementation</title>
      <dc:creator>Syahrul Al-Rasyid</dc:creator>
      <pubDate>Wed, 10 Sep 2025 06:52:06 +0000</pubDate>
      <link>https://dev.to/cag000/-fastrtc-logging-implementation-3f2m</link>
      <guid>https://dev.to/cag000/-fastrtc-logging-implementation-3f2m</guid>
      <description>&lt;p&gt;This document describes the comprehensive logging system implemented for FastRTC services, including detailed request/response tracking for both the gRPC OCR service and CaloreportService.&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;The logging implementation provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Request tracking&lt;/strong&gt; with unique IDs for correlation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detailed error logging&lt;/strong&gt; with context and retry information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance metrics&lt;/strong&gt; for request/response timing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configurable log levels&lt;/strong&gt; and output formats&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service-specific loggers&lt;/strong&gt; for fine-grained control&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Services Covered
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. gRPC OCR Service Client (&lt;code&gt;src/ocr/grpc_client.py&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Connection establishment and health checks&lt;/li&gt;
&lt;li&gt;Request encoding and transmission&lt;/li&gt;
&lt;li&gt;Response parsing and validation&lt;/li&gt;
&lt;li&gt;Retry logic and error handling&lt;/li&gt;
&lt;li&gt;Performance timing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. CaloreportService Client (&lt;code&gt;src/report_svc/client.py&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;HTTP request/response cycles&lt;/li&gt;
&lt;li&gt;JSON parsing and validation&lt;/li&gt;
&lt;li&gt;Connection errors and timeouts&lt;/li&gt;
&lt;li&gt;Retry attempts and backoff&lt;/li&gt;
&lt;li&gt;Response data analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Log Message Format
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Request Tracking
&lt;/h3&gt;

&lt;p&gt;All requests are assigned a unique 8-character ID for correlation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[a1b2c3d4] 🔍 Starting OCR request to localhost:50051
[a1b2c3d4] 📤 Attempt 1/3 - Encoding image data
[a1b2c3d4] ✅ OCR completed in 0.234s: engine=easyocr, confidence=0.87
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Log Levels Used
&lt;/h3&gt;

&lt;h4&gt;
  
  
  INFO Level
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Service initialization&lt;/li&gt;
&lt;li&gt;Request start/completion&lt;/li&gt;
&lt;li&gt;Successful operations&lt;/li&gt;
&lt;li&gt;Retry attempts&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  DEBUG Level
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Request parameters and configuration&lt;/li&gt;
&lt;li&gt;Encoding/decoding steps&lt;/li&gt;
&lt;li&gt;Response parsing details&lt;/li&gt;
&lt;li&gt;Performance metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  ERROR Level
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Connection failures&lt;/li&gt;
&lt;li&gt;Request timeouts&lt;/li&gt;
&lt;li&gt;Parsing errors&lt;/li&gt;
&lt;li&gt;Retry exhaustion&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  WARNING Level
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Service degradation&lt;/li&gt;
&lt;li&gt;Retry-able errors&lt;/li&gt;
&lt;li&gt;Configuration issues&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example Log Output
&lt;/h2&gt;

&lt;h3&gt;
  
  
  gRPC OCR Service
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2025-08-28 02:38:56 | src.ocr.grpc_client | INFO | extract_text_from_region:123 | [d6b4c25b] 🔍 Starting OCR request to localhost:50051
2025-08-28 02:38:56 | src.ocr.grpc_client | DEBUG | extract_text_from_region:124 | [d6b4c25b] Request params: bbox=[0, 0, 50, 50], class_name=None, engine=easyocr, languages=['en'], gpu=True
2025-08-28 02:38:56 | src.ocr.grpc_client | DEBUG | extract_text_from_region:131 | [d6b4c25b] 📤 Attempt 1/3 - Encoding image data
2025-08-28 02:38:56 | src.ocr.grpc_client | DEBUG | extract_text_from_region:137 | [d6b4c25b] ✅ Image encoded successfully: 2048 bytes
2025-08-28 02:38:56 | src.ocr.grpc_client | DEBUG | extract_text_from_region:148 | [d6b4c25b] 📡 Sending gRPC request (timeout=30s)
2025-08-28 02:38:56 | src.ocr.grpc_client | ERROR | extract_text_from_region:170 | [d6b4c25b] 🔴 gRPC error on attempt 1/3: code=UNAVAILABLE, details=failed to connect
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  CaloreportService
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2025-08-28 02:38:56 | src.report_svc.client | INFO | get_delivery_skus:89 | [24f8f831] 📦 Starting CaloreportService request for delivery_id: test-delivery-id
2025-08-28 02:38:56 | src.report_svc.client | DEBUG | get_delivery_skus:103 | [24f8f831] 🌐 Request details: URL=http://localhost:5270/api/Delivery/test-delivery-id/skus, timeout=30s, max_retries=2
2025-08-28 02:38:56 | src.report_svc.client | DEBUG | get_delivery_skus:111 | [24f8f831] 📡 Attempt 1/3 - Sending HTTP GET request
2025-08-28 02:38:56 | src.report_svc.client | DEBUG | get_delivery_skus:119 | [24f8f831] 📥 Response received in 0.145s: status=200
2025-08-28 02:38:56 | src.report_svc.client | INFO | get_delivery_skus:137 | [24f8f831] ✅ CaloreportService request successful in 0.145s: invoice=INV-001, skus=5, delivery_id=test-delivery-id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configuration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Environment Variables
&lt;/h3&gt;

&lt;p&gt;Configure logging behavior using environment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_LOG_LEVEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;DEBUG

&lt;span class="c"&gt;# Optional log file path&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_LOG_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var/log/fastrtc/app.log

&lt;span class="c"&gt;# Enable/disable console logging (true/false)&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_LOG_CONSOLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;

&lt;span class="c"&gt;# Log format style (detailed/simple)&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_LOG_FORMAT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;detailed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Programmatic Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;src.utils.logger&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;setup_fastrtc_logging&lt;/span&gt;

&lt;span class="c1"&gt;# Setup with custom configuration
&lt;/span&gt;&lt;span class="nf"&gt;setup_fastrtc_logging&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DEBUG&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;log_file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/fastrtc.log&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;enable_console&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;format_style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;detailed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Or use environment variables
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;src.utils.logger&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;setup_logging_from_env&lt;/span&gt;
&lt;span class="nf"&gt;setup_logging_from_env&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Logger Hierarchy
&lt;/h2&gt;

&lt;p&gt;The logging system uses a hierarchical structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root
├── src.ocr.grpc_client          (DEBUG level)
├── src.report_svc.client        (DEBUG level)
├── src.core.detector            (INFO level)
└── src.ui                       (INFO level)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Emoji Guide
&lt;/h2&gt;

&lt;p&gt;The logging uses emoji for quick visual identification:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Emoji&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🔍&lt;/td&gt;
&lt;td&gt;Request started&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📤&lt;/td&gt;
&lt;td&gt;Data encoding/preparation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📡&lt;/td&gt;
&lt;td&gt;Network transmission&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📥&lt;/td&gt;
&lt;td&gt;Response received&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Successful operation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔄&lt;/td&gt;
&lt;td&gt;Retry attempt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;Error occurred&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Critical failure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;Warning condition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📦&lt;/td&gt;
&lt;td&gt;Service request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌐&lt;/td&gt;
&lt;td&gt;Network operation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📋&lt;/td&gt;
&lt;td&gt;Configuration/metadata&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📊&lt;/td&gt;
&lt;td&gt;Statistics/metrics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🚫&lt;/td&gt;
&lt;td&gt;Resource not found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📍&lt;/td&gt;
&lt;td&gt;Location/tracking info&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance Monitoring
&lt;/h2&gt;

&lt;p&gt;Logs include timing information for performance analysis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Request duration&lt;/strong&gt;: Time from start to completion&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network latency&lt;/strong&gt;: Time spent in network communication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Processing time&lt;/strong&gt;: Time spent in data processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retry delays&lt;/strong&gt;: Time spent waiting between retries&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Error Analysis
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Common Error Patterns
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Connection Refused&lt;/strong&gt; - Service not running&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timeout&lt;/strong&gt; - Service overloaded or network issues&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;404 Not Found&lt;/strong&gt; - Resource doesn't exist&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON Parse Error&lt;/strong&gt; - Invalid response format&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gRPC UNAVAILABLE&lt;/strong&gt; - OCR service down&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Debugging Tips
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Search for request ID to trace entire request lifecycle&lt;/li&gt;
&lt;li&gt;Check INFO level for high-level operation status
&lt;/li&gt;
&lt;li&gt;Use DEBUG level for detailed parameter analysis&lt;/li&gt;
&lt;li&gt;Monitor retry patterns for service health&lt;/li&gt;
&lt;li&gt;Analyze timing data for performance optimization&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Integration with FastRTC
&lt;/h2&gt;

&lt;p&gt;The logging system is automatically initialized when using the FastRTC application. To enable detailed logging:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enable debug logging&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_LOG_LEVEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;DEBUG

&lt;span class="c"&gt;# Run application&lt;/span&gt;
make run &lt;span class="nv"&gt;ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Log Rotation and Management
&lt;/h2&gt;

&lt;p&gt;For production deployment:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configure log file rotation using &lt;code&gt;logrotate&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Monitor disk space usage&lt;/li&gt;
&lt;li&gt;Set up log aggregation if running multiple instances&lt;/li&gt;
&lt;li&gt;Consider structured logging formats for automated analysis&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use appropriate log levels&lt;/strong&gt; - DEBUG for development, INFO for production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Include context&lt;/strong&gt; - Request IDs help correlate related log entries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log performance metrics&lt;/strong&gt; - Help identify bottlenecks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sanitize sensitive data&lt;/strong&gt; - Don't log API keys or personal information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor log volume&lt;/strong&gt; - High DEBUG logging can impact performance&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  High Log Volume
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Reduce log level from DEBUG to INFO&lt;/li&gt;
&lt;li&gt;Filter specific loggers if needed&lt;/li&gt;
&lt;li&gt;Use log sampling for high-frequency operations&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Missing Logs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Check logger configuration&lt;/li&gt;
&lt;li&gt;Verify log level settings&lt;/li&gt;
&lt;li&gt;Ensure handlers are properly configured&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Performance Impact
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Monitor logging overhead in production&lt;/li&gt;
&lt;li&gt;Consider asynchronous logging for high-throughput scenarios&lt;/li&gt;
&lt;li&gt;Balance between detail and performance&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Enhanced Detection System Configuration Guide</title>
      <dc:creator>Syahrul Al-Rasyid</dc:creator>
      <pubDate>Tue, 02 Sep 2025 08:55:40 +0000</pubDate>
      <link>https://dev.to/cag000/enhanced-detection-system-configuration-guide-376e</link>
      <guid>https://dev.to/cag000/enhanced-detection-system-configuration-guide-376e</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;This guide covers the configuration options for the enhanced detection system, including background adaptation, YOLO11 compliance improvements, RTSP processing enhancements, and QR code integration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Environment Variables
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Background Adaptation Settings
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;FASTRTC_BACKGROUND_ADAPTATION&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Values&lt;/strong&gt;: &lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Enable or disable adaptive background modeling for false positive reduction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;FASTRTC_BACKGROUND_ADAPTATION=true&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;FASTRTC_BACKGROUND_LEARNING_RATE&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;0.001&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Range&lt;/strong&gt;: &lt;code&gt;0.0001&lt;/code&gt; - &lt;code&gt;0.1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Learning rate for background model adaptation. Lower values = slower adaptation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;FASTRTC_BACKGROUND_LEARNING_RATE=0.005&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;FASTRTC_STABILITY_THRESHOLD&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;0.85&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Range&lt;/strong&gt;: &lt;code&gt;0.1&lt;/code&gt; - &lt;code&gt;0.99&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Minimum stability score for valid detections. Higher = more strict filtering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;FASTRTC_STABILITY_THRESHOLD=0.8&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;FASTRTC_MOTION_THRESHOLD&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;10.0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Range&lt;/strong&gt;: &lt;code&gt;1.0&lt;/code&gt; - &lt;code&gt;100.0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Motion magnitude threshold for dynamic regions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;FASTRTC_MOTION_THRESHOLD=15.0&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;FASTRTC_MIN_PERSISTENCE&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;3&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Range&lt;/strong&gt;: &lt;code&gt;1&lt;/code&gt; - &lt;code&gt;10&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Minimum frames a detection must persist to be considered valid&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;FASTRTC_MIN_PERSISTENCE=2&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;FASTRTC_BACKGROUND_DEBUG&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;false&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Values&lt;/strong&gt;: &lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Enable debug logging for background adaptation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;FASTRTC_BACKGROUND_DEBUG=true&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  RTSP Processing Settings
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;FASTRTC_RTSP_TRANSPORT&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;udp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Values&lt;/strong&gt;: &lt;code&gt;udp&lt;/code&gt;, &lt;code&gt;tcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Transport protocol for RTSP connections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;FASTRTC_RTSP_TRANSPORT=tcp&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;FASTRTC_RTSP_TIMEOUT&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;20&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Range&lt;/strong&gt;: &lt;code&gt;5&lt;/code&gt; - &lt;code&gt;60&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Connection timeout in seconds for RTSP streams&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;FASTRTC_RTSP_TIMEOUT=30&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;FASTRTC_RTSP_RECONNECT_DELAY&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;10&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Range&lt;/strong&gt;: &lt;code&gt;5&lt;/code&gt; - &lt;code&gt;300&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Delay between reconnection attempts in seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;FASTRTC_RTSP_RECONNECT_DELAY=15&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  QR Code Processing Settings
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;FASTRTC_QR_PROCESSING&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Values&lt;/strong&gt;: &lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Enable QR code detection and report service integration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;FASTRTC_QR_PROCESSING=true&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;REPORT_SERVICE_URL&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;http://localhost:5270&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Base URL for the report service&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;REPORT_SERVICE_URL=http://report-service:5270&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;REPORT_SERVICE_TIMEOUT&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;30&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Range&lt;/strong&gt;: &lt;code&gt;5&lt;/code&gt; - &lt;code&gt;120&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Timeout for report service requests in seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;REPORT_SERVICE_TIMEOUT=45&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;REPORT_SERVICE_MAX_RETRIES&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;2&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Range&lt;/strong&gt;: &lt;code&gt;0&lt;/code&gt; - &lt;code&gt;5&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Maximum retry attempts for report service requests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;REPORT_SERVICE_MAX_RETRIES=3&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;REPORT_SERVICE_RETRY_DELAY&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Range&lt;/strong&gt;: &lt;code&gt;1&lt;/code&gt; - &lt;code&gt;10&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Delay between retry attempts in seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;REPORT_SERVICE_RETRY_DELAY=2&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  YOLO11 and Detection Settings
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;FASTRTC_TEMPORAL_SMOOTHING&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Values&lt;/strong&gt;: &lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Enable temporal smoothing for stable annotations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;FASTRTC_TEMPORAL_SMOOTHING=true&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;FASTRTC_SMOOTHING_FACTOR&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;0.7&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Range&lt;/strong&gt;: &lt;code&gt;0.1&lt;/code&gt; - &lt;code&gt;0.9&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Temporal smoothing factor. Higher = more smoothing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;FASTRTC_SMOOTHING_FACTOR=0.6&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;FASTRTC_MIN_CONFIDENCE&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;0.3&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Range&lt;/strong&gt;: &lt;code&gt;0.1&lt;/code&gt; - &lt;code&gt;0.9&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Minimum confidence threshold for temporal smoothing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;FASTRTC_MIN_CONFIDENCE=0.4&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;FASTRTC_CLASS_CONFIG_PATH&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;config/data.yml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Path to class configuration file for TensorRT models&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;FASTRTC_CLASS_CONFIG_PATH=/custom/path/classes.yml&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Performance and Memory Settings
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;FASTRTC_MEMORY_LIMIT_MB&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;512&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Range&lt;/strong&gt;: &lt;code&gt;256&lt;/code&gt; - &lt;code&gt;4096&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Memory limit for detection processing in MB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;FASTRTC_MEMORY_LIMIT_MB=1024&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;FASTRTC_MAX_VIDEO_SIZE_MB&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;0&lt;/code&gt; (unlimited)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Range&lt;/strong&gt;: &lt;code&gt;0&lt;/code&gt; - &lt;code&gt;10000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Maximum video file size for processing in MB (0 = unlimited)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;FASTRTC_MAX_VIDEO_SIZE_MB=500&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  OCR Settings (Existing)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;FASTRTC_OCR_ENABLED&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Values&lt;/strong&gt;: &lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Enable OCR text extraction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;FASTRTC_OCR_ENABLED=true&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;FASTRTC_OCR_GPU&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Values&lt;/strong&gt;: &lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Use GPU acceleration for OCR&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;FASTRTC_OCR_GPU=false&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;FASTRTC_LANG&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;en&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Values&lt;/strong&gt;: &lt;code&gt;en&lt;/code&gt;, &lt;code&gt;ar&lt;/code&gt;, &lt;code&gt;ar+en&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: OCR language(s) to use&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;FASTRTC_LANG=ar+en&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Configuration Files
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Class Configuration (&lt;code&gt;config/data.yml&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Example class configuration for TensorRT models:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Class names mapping for TensorRT engine models&lt;/span&gt;
&lt;span class="na"&gt;names&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;0&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;person'&lt;/span&gt;
  &lt;span class="na"&gt;1&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;bicycle'&lt;/span&gt;
  &lt;span class="c1"&gt;# ... other classes&lt;/span&gt;
  &lt;span class="na"&gt;44&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;food_label'&lt;/span&gt;
  &lt;span class="na"&gt;55&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;invoice'&lt;/span&gt; 
  &lt;span class="na"&gt;80&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;qr_code'&lt;/span&gt;

&lt;span class="c1"&gt;# Additional metadata&lt;/span&gt;
&lt;span class="na"&gt;model_info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;input_size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;3840&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2160&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# 4K resolution&lt;/span&gt;
  &lt;span class="na"&gt;classes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;81&lt;/span&gt;
  &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tensorrt'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Camera Configuration (&lt;code&gt;config/ip_camera.yml&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Enhanced camera configuration with RTSP settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;cameras&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4K&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;RTSP&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Camera"&lt;/span&gt;
    &lt;span class="na"&gt;rtsp_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rtsp://192.168.1.100:554/stream"&lt;/span&gt;
    &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;admin"&lt;/span&gt;
    &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;password"&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Main&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;4K&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;camera"&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;settings&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;
      &lt;span class="na"&gt;transport&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;udp"&lt;/span&gt;
      &lt;span class="na"&gt;reconnect_delay&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;

&lt;span class="na"&gt;camera_settings&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;connection_timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;
  &lt;span class="na"&gt;target_fps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;
  &lt;span class="na"&gt;buffer_size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16777216&lt;/span&gt;  &lt;span class="c1"&gt;# 16MB for 4K streams&lt;/span&gt;

&lt;span class="na"&gt;fallback&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;use_webcam_fallback&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;default_webcam_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  API Configuration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Background Adapter Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;src.core.background_adapter&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BackgroundAdapter&lt;/span&gt;

&lt;span class="c1"&gt;# Create with custom parameters
&lt;/span&gt;&lt;span class="n"&gt;adapter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BackgroundAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;learning_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.005&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;# Faster adaptation
&lt;/span&gt;    &lt;span class="n"&gt;stability_threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;# Less strict filtering
&lt;/span&gt;    &lt;span class="n"&gt;motion_threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;15.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;# Higher motion sensitivity
&lt;/span&gt;    &lt;span class="n"&gt;min_detection_persistence&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;   &lt;span class="c1"&gt;# Shorter persistence requirement
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Update parameters at runtime
&lt;/span&gt;&lt;span class="n"&gt;adapter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update_parameters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;learning_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.001&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;stability_threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.85&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Get statistics
&lt;/span&gt;&lt;span class="n"&gt;stats&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;adapter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_background_stats&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  YOLO Detector Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;src.core.detector&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;YOLOSegmentationDetector&lt;/span&gt;

&lt;span class="c1"&gt;# Create with enhanced settings
&lt;/span&gt;&lt;span class="n"&gt;detector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;YOLOSegmentationDetector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;models/best08032025.engine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;segment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;enable_ocr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;confidence_threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;enable_tracking&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tracker_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;botsort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;class_config_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;config/data.yml&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Update confidence threshold
&lt;/span&gt;&lt;span class="n"&gt;detector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update_confidence_threshold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Get comprehensive stats
&lt;/span&gt;&lt;span class="n"&gt;stats&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;detector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_segmentation_stats&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Background Adaptation Issues
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Problem: Too many false positives filtered
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Lower the stability threshold or reduce motion threshold&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_STABILITY_THRESHOLD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.7
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_MOTION_THRESHOLD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Problem: Background adapter consuming too much memory
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Increase learning rate for faster adaptation&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_BACKGROUND_LEARNING_RATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.01
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Problem: Background model not adapting to lighting changes
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Increase learning rate and reduce stability requirement&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_BACKGROUND_LEARNING_RATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.005
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_STABILITY_THRESHOLD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.75
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  RTSP Connection Issues
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Problem: Frequent disconnections
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Switch to TCP transport and increase timeout&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_RTSP_TRANSPORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tcp
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_RTSP_TIMEOUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;45
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Problem: High latency/buffering
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Use UDP transport with optimized buffer size&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_RTSP_TRANSPORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;udp
&lt;span class="c"&gt;# Configure buffer size in camera config file&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Problem: Connection fails immediately
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Validate network connectivity and credentials&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Test connection manually&lt;/span&gt;
ffmpeg &lt;span class="nt"&gt;-rtsp_transport&lt;/span&gt; udp &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"rtsp://username:password@ip:554/stream"&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; 5 &lt;span class="nt"&gt;-f&lt;/span&gt; null -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  QR Code Processing Issues
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Problem: QR codes not being processed
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Verify report service connectivity&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_QR_PROCESSING&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true
export &lt;/span&gt;&lt;span class="nv"&gt;REPORT_SERVICE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://correct-service:5270
&lt;span class="c"&gt;# Test service manually&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; GET &lt;span class="nv"&gt;$REPORT_SERVICE_URL&lt;/span&gt;/health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Problem: Duplicate QR code processing
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: The system automatically prevents duplicates, but you can verify:&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="c1"&gt;# Check processed delivery IDs
&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;detector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;processed_delivery_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Clear if needed (testing only)
&lt;/span&gt;&lt;span class="n"&gt;detector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;processed_delivery_ids&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Performance Issues
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Problem: High memory usage during video processing
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Enable memory optimizations and set limits&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_MEMORY_LIMIT_MB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1024
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_MAX_VIDEO_SIZE_MB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;500
&lt;span class="c"&gt;# Install psutil for memory monitoring&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;psutil
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Problem: Slow processing on high-resolution streams
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Optimize performance settings&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_TEMPORAL_SMOOTHING&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;  &lt;span class="c"&gt;# Disable if not needed&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_BACKGROUND_LEARNING_RATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.01  &lt;span class="c"&gt;# Faster adaptation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Monitoring and Logging
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Enable Debug Logging
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_BACKGROUND_DEBUG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;span class="c"&gt;# Check logs for background adaptation details&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Performance Monitoring
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Get comprehensive performance stats
&lt;/span&gt;&lt;span class="n"&gt;stats&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;detector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_segmentation_stats&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;FPS: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fps&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Processing time: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;processing_time&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;ms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Background adapter stats
&lt;/span&gt;&lt;span class="n"&gt;bg_stats&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;detector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;background_adapter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_background_stats&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Background learned: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bg_stats&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;background_learned&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Filtered detections: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bg_stats&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;frames_processed&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Memory Monitoring
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Monitor memory usage (requires psutil)
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;
&lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Process&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;memory_mb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;memory_info&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;rss&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Current memory usage: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;memory_mb&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;MB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Production Deployment
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Background Adaptation&lt;/strong&gt;: Start with conservative settings and tune based on scene&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RTSP Streams&lt;/strong&gt;: Use TCP for reliability, UDP for performance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Management&lt;/strong&gt;: Set appropriate limits based on available hardware&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;QR Processing&lt;/strong&gt;: Ensure report service is highly available&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring&lt;/strong&gt;: Enable performance logging and set up alerts&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Development and Testing
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Debug Mode&lt;/strong&gt;: Enable debug logging for troubleshooting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test Environment&lt;/strong&gt;: Use smaller thresholds for faster iteration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance Testing&lt;/strong&gt;: Use the provided test suites to validate performance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Profiling&lt;/strong&gt;: Monitor memory usage during long-running tests&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Example Production Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Background adaptation - production settings&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_BACKGROUND_ADAPTATION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true
export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_BACKGROUND_LEARNING_RATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.001
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_STABILITY_THRESHOLD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.85
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_MOTION_THRESHOLD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10.0
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_MIN_PERSISTENCE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3

&lt;span class="c"&gt;# RTSP - reliable settings&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_RTSP_TRANSPORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tcp
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_RTSP_TIMEOUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30

&lt;span class="c"&gt;# QR Processing - production service&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_QR_PROCESSING&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true
export &lt;/span&gt;&lt;span class="nv"&gt;REPORT_SERVICE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://report-service:5270
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;REPORT_SERVICE_TIMEOUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;REPORT_SERVICE_MAX_RETRIES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2

&lt;span class="c"&gt;# Performance - production limits  &lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_MEMORY_LIMIT_MB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2048
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_MAX_VIDEO_SIZE_MB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1000

&lt;span class="c"&gt;# Disable debug logging&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_BACKGROUND_DEBUG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This configuration provides a robust, production-ready setup with appropriate fail-safes and performance optimizations.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>TensorRT Engine Model Fixes Implementation</title>
      <dc:creator>Syahrul Al-Rasyid</dc:creator>
      <pubDate>Tue, 02 Sep 2025 08:55:32 +0000</pubDate>
      <link>https://dev.to/cag000/tensorrt-engine-model-fixes-implementation-296e</link>
      <guid>https://dev.to/cag000/tensorrt-engine-model-fixes-implementation-296e</guid>
      <description>&lt;p&gt;This document describes the implementation of fixes for two critical issues with TensorRT (.engine) YOLO models:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Class names showing as indices instead of actual names&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Segmentation masks not returning at original resolution&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Problems Addressed
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Issue 1: Class Names as Indices
&lt;/h3&gt;

&lt;p&gt;When using TensorRT engine models (&lt;code&gt;.engine&lt;/code&gt; files), the &lt;code&gt;model.names&lt;/code&gt; attribute may not be properly populated, causing class predictions to show as indices (e.g., "0", "1", "2") instead of meaningful names like "food_label", "invoice", "qr_code".&lt;/p&gt;

&lt;h3&gt;
  
  
  Issue 2: Mask Resolution Mismatch
&lt;/h3&gt;

&lt;p&gt;Segmentation masks from YOLO models are typically returned at the model's input resolution (e.g., 640x640), not at the original image resolution. This causes mask coordinates to be misaligned with the actual objects in the original frame.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution Overview
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. YAML-Based Class Name Loading (&lt;code&gt;src/utils/config_loader.py&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loads class names from &lt;code&gt;fastrtc-test/config/data.yml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Creates mapping from class indices (0-112) to class names&lt;/li&gt;
&lt;li&gt;Provides fallback mechanisms for missing or invalid configurations&lt;/li&gt;
&lt;li&gt;Validates class mapping completeness&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Functions:&lt;/strong&gt;&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="nf"&gt;load_class_names_from_yaml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;get_class_name_safe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;class_mapping&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;class_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fallback_prefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
&lt;span class="nf"&gt;load_class_names_with_fallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fallback_names&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Mask Resolution Utilities (&lt;code&gt;src/utils/mask_utils.py&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resizes masks from model input resolution to original frame resolution&lt;/li&gt;
&lt;li&gt;Handles various mask formats (binary, float, different dimensions)&lt;/li&gt;
&lt;li&gt;Optimized for performance with proper interpolation methods&lt;/li&gt;
&lt;li&gt;Validates mask dimensions and properties&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Functions:&lt;/strong&gt;&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="nf"&gt;resize_mask_to_original&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndarray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;original_shape&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndarray&lt;/span&gt;
&lt;span class="nf"&gt;calculate_mask_area&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndarray&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;
&lt;span class="nf"&gt;process_yolo_masks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;masks_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Union&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndarray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndarray&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt; &lt;span class="n"&gt;original_shape&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndarray&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Detector Integration (&lt;code&gt;src/core/detector.py&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Enhanced Constructor:&lt;/strong&gt;&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;# ... existing parameters ...
&lt;/span&gt;    &lt;span class="n"&gt;class_config_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fastrtc-test/config/data.yml&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key Changes:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Class Name Resolution:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loads class mapping from YAML during initialization&lt;/li&gt;
&lt;li&gt;Prioritizes config-based names over &lt;code&gt;model.names&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Provides safe fallback for unknown class indices&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mask Processing:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Captures original frame dimensions&lt;/li&gt;
&lt;li&gt;Resizes masks to original resolution during post-processing&lt;/li&gt;
&lt;li&gt;Maintains mask accuracy and alignment&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Configuration File Format
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;fastrtc-test/config/data.yml&lt;/code&gt; file should contain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;nc&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;113&lt;/span&gt;  &lt;span class="c1"&gt;# Number of classes&lt;/span&gt;
&lt;span class="na"&gt;names&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;basil_chicken_alfredo_linguine_l'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;basil_chicken_alfredo_linguine_m'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;# ... more food items ...&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;food_label'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;# Index 44&lt;/span&gt;
  &lt;span class="c1"&gt;# ... more food items ...&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;invoice'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;# Index 55&lt;/span&gt;
  &lt;span class="c1"&gt;# ... more food items ...&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;qr_code'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;# Index 81&lt;/span&gt;
  &lt;span class="c1"&gt;# ... remaining classes ...&lt;/span&gt;
&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Basic Usage with TensorRT Model
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;src.core.detector&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;YOLOSegmentationDetector&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize detector with TensorRT engine
&lt;/span&gt;&lt;span class="n"&gt;detector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;YOLOSegmentationDetector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;models/best.engine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;class_config_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fastrtc-test/config/data.yml&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Process frame - will now show proper class names and original resolution masks
&lt;/span&gt;&lt;span class="n"&gt;annotated_frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;detection_info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;detector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;detect_and_segment&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="c1"&gt;# Check detection results
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;detection&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;detection_info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;detections&lt;/span&gt;&lt;span class="sh"&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Class: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;detection&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;class&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Now shows "food_label" instead of "44"
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Mask shape: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;detection&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;mask_array&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Now matches frame resolution
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Custom Configuration Path
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;detector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;YOLOSegmentationDetector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;models/custom_model.engine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;class_config_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/path/to/custom/data.yml&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Performance Considerations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Class Name Loading
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Impact:&lt;/strong&gt; Minimal - loaded once during initialization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory:&lt;/strong&gt; ~5KB for 113 class names&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallback:&lt;/strong&gt; Automatic fallback to model.names if config fails&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Mask Resizing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Method:&lt;/strong&gt; OpenCV bilinear interpolation (optimized)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance:&lt;/strong&gt; ~1-2ms per mask (depends on resolution difference)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory:&lt;/strong&gt; Temporary allocation during resize operation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimization:&lt;/strong&gt; Only resizes if resolution differs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testing and Validation
&lt;/h2&gt;

&lt;p&gt;Run the comprehensive test suite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;fastrtc-test
python test_tensorrt_fixes.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Test Coverage:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ YAML file structure validation&lt;/li&gt;
&lt;li&gt;✅ Class name loading and mapping&lt;/li&gt;
&lt;li&gt;✅ Mask resizing for multiple resolutions&lt;/li&gt;
&lt;li&gt;✅ Detector integration with config&lt;/li&gt;
&lt;li&gt;✅ Fallback behavior testing&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Error Handling
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Class Name Loading Errors
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Handles missing config file
# Handles malformed YAML
# Handles missing required fields
# Provides meaningful error messages
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mask Processing Errors
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Handles empty or invalid masks
# Handles dimension mismatches
# Provides fallback to model resolution
# Logs warnings for debugging
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Debug Logging
&lt;/h2&gt;

&lt;p&gt;Enable detailed logging to see the fixes in action:&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;logging&lt;/span&gt;
&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Will show messages like:
# "🏷️ Using config class name: 44 -&amp;gt; food_label"
# "📐 Resized mask from (640, 640) to (1080, 1920), area: 150000"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Compatibility
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Model Formats
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ TensorRT Engine (.engine) - &lt;strong&gt;Primary target&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ PyTorch (.pt) - &lt;strong&gt;Backwards compatible&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ ONNX (.onnx) - &lt;strong&gt;Should work&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Resolution Support
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ HD (1280x720)&lt;/li&gt;
&lt;li&gt;✅ Full HD (1920x1080)
&lt;/li&gt;
&lt;li&gt;✅ 4K (3840x2160)&lt;/li&gt;
&lt;li&gt;✅ Custom resolutions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  YOLO Versions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ YOLOv8 Segmentation&lt;/li&gt;
&lt;li&gt;✅ YOLOv11 Segmentation&lt;/li&gt;
&lt;li&gt;✅ Custom YOLO models (with proper config)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Common Issues
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"Config file not found"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Ensure the config file exists:&lt;/span&gt;
   &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; fastrtc-test/config/data.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"Class mapping empty"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Validate YAML structure:&lt;/span&gt;
   python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import yaml; print(yaml.safe_load(open('fastrtc-test/config/data.yml')))"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"Mask resize failed"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Check OpenCV installation:&lt;/span&gt;
   python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import cv2; print(cv2.__version__)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Debug Mode
&lt;/h3&gt;

&lt;p&gt;Set environment variable for verbose logging:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FASTRTC_DEBUG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true
&lt;/span&gt;python your_detection_script.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Future Enhancements
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Planned Improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GPU-accelerated mask resizing using CUDA&lt;/li&gt;
&lt;li&gt;Caching of resized masks for repeated detections&lt;/li&gt;
&lt;li&gt;Support for polygon-based masks&lt;/li&gt;
&lt;li&gt;Automatic config file generation from model metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Configuration Extensions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Multiple config file support&lt;/li&gt;
&lt;li&gt;Dynamic class name updates&lt;/li&gt;
&lt;li&gt;Class hierarchy and grouping&lt;/li&gt;
&lt;li&gt;Custom mask processing pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Performance Benchmarks
&lt;/h2&gt;

&lt;p&gt;Based on testing with various configurations:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resolution&lt;/th&gt;
&lt;th&gt;Mask Count&lt;/th&gt;
&lt;th&gt;Resize Time&lt;/th&gt;
&lt;th&gt;Memory Usage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HD → FullHD&lt;/td&gt;
&lt;td&gt;5 masks&lt;/td&gt;
&lt;td&gt;~2ms&lt;/td&gt;
&lt;td&gt;+5MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FullHD → 4K&lt;/td&gt;
&lt;td&gt;10 masks&lt;/td&gt;
&lt;td&gt;~8ms&lt;/td&gt;
&lt;td&gt;+20MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model → HD&lt;/td&gt;
&lt;td&gt;3 masks&lt;/td&gt;
&lt;td&gt;~1ms&lt;/td&gt;
&lt;td&gt;+2MB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Note: Times measured on Intel i7-10700K with 32GB RAM&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
