Skip to content

Commit 8c9b159

Browse files
author
Saumya Saksena
committed
Add migration markdown
1 parent 9737304 commit 8c9b159

File tree

1 file changed

+317
-0
lines changed

1 file changed

+317
-0
lines changed

MIGRATION.md

Lines changed: 317 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,317 @@
1+
# Migration Guide: Legacy → Modern
2+
3+
## Quick Comparison
4+
5+
### Old Code Structure
6+
7+
```
8+
telloCV-masked-rcnn.py # 500+ lines of everything
9+
tracker.py # Color-based tracking
10+
requirements.txt # Ancient dependencies
11+
```
12+
13+
### New Code Structure
14+
15+
```
16+
tello_vision/
17+
├── detectors/ # Modular detection backends
18+
├── tello_controller.py # Drone control
19+
├── visualizer.py # Rendering
20+
└── app.py # Clean main app
21+
```
22+
23+
## Key Changes
24+
25+
### 1. Model Loading
26+
27+
**Old (Matterport Mask R-CNN):**
28+
29+
```python
30+
from mrcnn import model as modellib
31+
from mrcnn.config import Config
32+
33+
class InferenceConfig(Config):
34+
NAME = "coco"
35+
GPU_COUNT = 1
36+
IMAGES_PER_GPU = 1
37+
38+
config = InferenceConfig()
39+
model = modellib.MaskRCNN(mode="inference", config=config, model_dir='./')
40+
model.load_weights('mask_rcnn_coco.h5', by_name=True)
41+
```
42+
43+
**New (YOLOv8):**
44+
45+
```python
46+
from tello_vision.detectors.base_detector import BaseDetector
47+
48+
detector = BaseDetector.create_detector('yolov8', {
49+
'model': 'yolov8n-seg.pt',
50+
'device': 'cuda',
51+
'confidence': 0.5
52+
})
53+
detector.load_model()
54+
```
55+
56+
### 2. Detection
57+
58+
**Old:**
59+
60+
```python
61+
results = model.detect([image], verbose=0)
62+
r = results[0]
63+
boxes = r['rois']
64+
masks = r['masks']
65+
class_ids = r['class_ids']
66+
scores = r['scores']
67+
```
68+
69+
**New:**
70+
71+
```python
72+
result = detector.detect(frame)
73+
74+
for detection in result.detections:
75+
class_name = detection.class_name
76+
confidence = detection.confidence
77+
bbox = detection.bbox
78+
mask = detection.mask # Already in correct format
79+
```
80+
81+
### 3. Drone Control
82+
83+
**Old (TelloPy):**
84+
85+
```python
86+
import tellopy
87+
88+
drone = tellopy.Tello()
89+
drone.connect()
90+
drone.takeoff()
91+
drone.up(50)
92+
```
93+
94+
**New (djitellopy):**
95+
96+
```python
97+
from tello_vision.tello_controller import TelloController
98+
99+
drone = TelloController(config)
100+
drone.connect()
101+
drone.takeoff()
102+
drone.move_up(50)
103+
```
104+
105+
### 4. Video Streaming
106+
107+
**Old:**
108+
109+
```python
110+
import av
111+
112+
container = av.open(drone.get_video_stream())
113+
for packet in container.demux():
114+
for frame in packet.decode():
115+
# Process frame
116+
```
117+
118+
**New:**
119+
120+
```python
121+
frame = drone.get_frame() # Simple!
122+
```
123+
124+
### 5. Visualization
125+
126+
**Old (Manual drawing):**
127+
128+
```python
129+
def display_instances(image, boxes, masks, class_ids, class_names, scores):
130+
# 50+ lines of manual drawing code
131+
for i in range(n_instances):
132+
# Draw mask
133+
# Draw box
134+
# Draw label
135+
return image
136+
```
137+
138+
**New:**
139+
140+
```python
141+
from tello_vision.visualizer import Visualizer
142+
143+
visualizer = Visualizer(config)
144+
frame = visualizer.draw_detections(frame, result)
145+
```
146+
147+
### 6. Configuration
148+
149+
**Old (Hardcoded):**
150+
151+
```python
152+
SPEED = 50
153+
CONFIDENCE = 0.7
154+
MODEL_PATH = 'mask_rcnn_coco.h5'
155+
```
156+
157+
**New (YAML):**
158+
159+
```yaml
160+
# config.yaml
161+
detector:
162+
backend: "yolov8"
163+
yolov8:
164+
model: "yolov8n-seg.pt"
165+
confidence: 0.5
166+
167+
drone:
168+
speed: 50
169+
```
170+
171+
## Converting Your Custom Code
172+
173+
### In case you customized detection:
174+
175+
**Old pattern:**
176+
177+
```python
178+
# Custom class filtering in display_instances
179+
if class_names[class_ids[i]] not in ['person', 'car']:
180+
continue
181+
```
182+
183+
**New pattern:**
184+
185+
```python
186+
# In config.yaml
187+
detector:
188+
target_classes: ["person", "car"]
189+
190+
# Or programmatically:
191+
result = result.filter_by_class(['person', 'car'])
192+
```
193+
194+
### If you added tracking:
195+
196+
**Old pattern:**
197+
198+
```python
199+
# Embedded in main loop
200+
if tracking:
201+
# Complex tracking logic mixed with everything
202+
```
203+
204+
**New pattern:**
205+
206+
```python
207+
# Separate tracker class
208+
from tello_vision.detectors.base_detector import DetectionResult
209+
210+
class MyTracker:
211+
def update(self, result: DetectionResult):
212+
# Clean tracking logic
213+
pass
214+
```
215+
216+
### If you modified controls:
217+
218+
**Old pattern:**
219+
220+
```python
221+
# In TelloCV class
222+
def on_press(self, key):
223+
if key == keyboard.Key.tab:
224+
self.drone.takeoff()
225+
```
226+
227+
**New pattern:**
228+
229+
```python
230+
# In config.yaml
231+
controls:
232+
takeoff: "tab"
233+
custom_action: "x"
234+
235+
# Or extend TelloController
236+
class MyController(TelloController):
237+
def custom_action(self):
238+
# Your logic
239+
```
240+
241+
## Performance Improvements
242+
243+
| Metric | Old | New (YOLOv8n) | Improvement |
244+
| ------------ | ---- | ------------- | --------------- |
245+
| FPS (1050Ti) | 4.6 | 25-30 | **5-6x faster** |
246+
| FPS (CPU) | ~1 | 2-3 | 2-3x faster |
247+
| Memory | ~4GB | ~2GB | 50% less |
248+
| Load time | 30s | 5s | 6x faster |
249+
| Code lines | 500+ | 50 | 10x cleaner |
250+
251+
## Common Pitfalls
252+
253+
### 1. Color Format
254+
255+
- Old: Sometimes RGB, sometimes BGR
256+
- New: Consistently BGR (OpenCV standard)
257+
258+
### 2. Mask Format
259+
260+
- Old: 3D array, needs reshaping
261+
- New: 2D binary mask, ready to use
262+
263+
### 3. Coordinates
264+
265+
- Old: (y1, x1, y2, x2) format
266+
- New: (x1, y1, x2, y2) format
267+
268+
### 4. Threading
269+
270+
- Old: Manual thread management
271+
- New: Built-in async support
272+
273+
## Step-by-Step Migration
274+
275+
1. **Install new version:**
276+
277+
```bash
278+
./install.sh
279+
```
280+
281+
2. **Update dependencies:**
282+
- Remove old `requirements.txt`
283+
- Use `pyproject.toml` instead
284+
285+
3. **Port configuration:**
286+
- Extract hardcoded values
287+
- Add to `config.yaml`
288+
289+
4. **Refactor detection:**
290+
- Replace Mask R-CNN calls with detector API
291+
- Update result parsing
292+
293+
5. **Update drone control:**
294+
- Replace TelloPy with TelloController
295+
- Use new control methods
296+
297+
6. **Test incrementally:**
298+
```bash
299+
python examples/test_detector.py # Test detection only
300+
python -m tello_vision.app # Full system
301+
```
302+
303+
## Need Help?
304+
305+
- Check `examples/` directory for reference implementations
306+
- Run `python examples/benchmark.py` to test your setup
307+
- See README.md for detailed API docs
308+
309+
## Still Using Old Features?
310+
311+
If you need features from the old codebase that aren't in v2.0:
312+
313+
1. **Color-based tracking:** Check `examples/object_follower.py`
314+
2. **Custom keyboard controls:** Extend `TelloController`
315+
3. **Specific model:** Implement custom `BaseDetector`
316+
317+
Open an issue if you need help porting something specific!

0 commit comments

Comments
 (0)