# Train model nhận diện box + phân loại khu dân cư / ngoài khu dân cư

## Dataset
- **traffic_residence_2class/** đã có 2 class:
  - **0: khu_dan_cu** (Bắt đầu khu dân cư - R420)
  - **1: ngoai_dan_cu** (Hết khu dân cư - R421)
- Mỗi file label `.txt`: `class_id x_center y_center width height` (chuẩn hóa 0–1).
- Một model YOLO vừa **tìm tọa độ box** vừa **phân loại** 0 hay 1.

## Train
Từ thư mục `archive/`:

```bash
# Cách 1: script
python3 train_residence_2class.py

# Cách 2: lệnh yolo
yolo detect train data=traffic_residence_2class/data.yaml model=yolov8n.pt epochs=80 batch=16 imgsz=640
```

Sau khi train xong, weights nằm ở: **runs/detect/residence_2class/weights/best.pt** (hoặc runs/detect/train/ nếu dùng lệnh yolo trực tiếp).

## Dùng model (inference)
Ảnh mới → model trả về **tọa độ từng box** và **class (0 hoặc 1)**:

```bash
yolo detect predict model=runs/detect/residence_2class/weights/best.pt source=path/to/anh.jpg save
```

Hoặc Python:

```python
from ultralytics import YOLO
model = YOLO("runs/detect/residence_2class/weights/best.pt")
results = model.predict("anh.jpg", conf=0.25)
for r in results:
    boxes = r.boxes.xyxy.cpu().numpy()   # [x1,y1,x2,y2] từng box
    classes = r.boxes.cls.cpu().numpy()  # 0 hoặc 1
    for box, cls in zip(boxes, classes):
        x1, y1, x2, y2 = box
        label = "khu_dan_cu" if cls == 0 else "ngoai_dan_cu"
        # dùng (x1,y1,x2,y2) và label
```

Kết quả: mỗi detection có **vị trí box** (x1,y1,x2,y2) và **nhãn** 0 (khu dân cư) hay 1 (ngoài khu dân cư).