Hệ thống nhận diện biển số xe máy/ô tô Việt Nam từ ảnh hoặc video, được xây dựng với pipeline xử lý tiên tiến:
- Tăng cường ảnh (Enhancement): Sử dụng PReNet để khử mưa và tăng chất lượng ảnh
- Phát hiện biển số (Detection): Sử dụng YOLOv11 fine-tuned cho biển số Việt Nam
- Nhận diện ký tự (OCR): Sử dụng PaddleOCR để đọc ký tự trên biển số
- Lưu trữ dữ liệu: Kết quả được lưu vào SQL Server với khả năng tránh trùng lặp
- Giao diện web: Upload ảnh/video và xem kết quả trực tiếp
- Xử lý cả ảnh và video
- Tăng cường chất lượng ảnh trong điều kiện mưa
- Phát hiện chính xác biển số Việt Nam
- OCR với độ chính xác cao
- Giao diện web thân thiện
- Tìm kiếm biển số đã nhận diện
- Tránh lưu trùng lặp dữ liệu
ViTraLP/
├── Backend Servers (FastAPI)
│ ├── main_test.py # Server chính với ROI processing
│ ├── main_full_image.py # Server xử lý toàn bộ ảnh
│ ├── main_half_bottom.py # Server xử lý nửa dưới ảnh
│ └── requirements.txt # Thư viện Python cần thiết
│
├── Core Modules
│ ├── enhancement_prenet_crop.py # Module tăng cường ảnh PReNet
│ ├── yolo_detect.py # Module phát hiện biển số YOLO
│ ├── ocr_infer.py # Module OCR PaddleOCR
│ ├── license_plate_validator.py # Validator biển số Việt Nam
│ ├── networks.py # Kiến trúc mạng PReNet
│ └── utils.py # Tiện ích hỗ trợ
│
├── Frontend (React)
│ └── UI/my-app/
│ ├── src/App.js # Giao diện chính
│ ├── package.json # Dependencies React
│ └── README.md # Hướng dẫn frontend
│
├── Outputs
│ ├── outputs/enhanced/ # Ảnh đã tăng cường
│ ├── outputs/crops/ # Ảnh crop biển số
│ ├── output_yolo_crop_test/ # Ảnh crop test
│ └── uploaded_images/ # Ảnh upload tạm thời
│
├── Models & Weights
│ ├── yolo_finetuned_weights/ # YOLO weights fine-tuned
│ ├── original_weights_paddle/ # PaddleOCR weights
│ └── original_weights_paddle.zip # PaddleOCR weights (zipped)
│
├── Notebooks & Testing
│ ├── test_pipeline.ipynb # Test pipeline
│ └── Inference_prenet.ipynb # Test PReNet
│
└── Documentation & Config
├── Readme.md # File này
├── environment.yml # Conda environment
├── .gitignore # Git ignore rules
├── structure # Cấu trúc dự án gốc
└── config/ # Thư mục cấu hình
- Python: 3.10.16
- Node.js: 16+ (cho frontend)
- SQL Server: Để lưu trữ dữ liệu
- RAM: Tối thiểu 16GB
- GPU: Khuyến nghị có GPU để tăng tốc độ xử lý
# Tạo conda environment (khuyến nghị)
conda env create -f environment.yml
# Hoặc tạo môi trường mới
conda create -n vitralp python=3.10.16
conda activate vitralppip install -r requirements.txtTải các file weights từ Google Drive:
yolo11_medium_rainy_200_best.pth→ Đặt trongyolo_finetuned_weights/original_weights_paddle.pth→ Đặt trongoriginal_weights_paddle/finetuning.zip→ Giải nén cho PReNet
Chỉnh sửa thông tin kết nối trong các file server:
def get_db_connection():
conn = pyodbc.connect(
"DRIVER={ODBC Driver 17 for SQL Server};"
"SERVER=YOUR_SERVER_NAME;" # Thay đổi
"DATABASE=YOUR_DATABASE_NAME;" # Thay đổi
"UID=YOUR_USERNAME;" # Thay đổi
"PWD=YOUR_PASSWORD;" # Thay đổi
)
return connCREATE TABLE DETECTED_NUMBER (
ID INT IDENTITY(1,1) PRIMARY KEY,
Recognized_Text NVARCHAR(50) NOT NULL,
Enhanced_File_Path NVARCHAR(500) NOT NULL,
Created_At DATETIME DEFAULT GETDATE()
);Có 3 lựa chọn server tùy theo nhu cầu:
Server chính (ROI processing):
python main_test.pyServer xử lý toàn ảnh:
python main_full_image.pyServer xử lý nửa dưới:
python main_half_bottom.py- Server chạy tại:
http://localhost:8001 - API docs:
http://localhost:8001/docs
cd UI/my-app
npm installnpm start- Giao diện web:
http://localhost:3000
Xử lý upload ảnh/video
Request:
- Method:
POST - Content-Type:
multipart/form-data - Body: File ảnh (.jpg, .jpeg, .png, .bmp) hoặc video (.mp4, .avi, .mov, .mkv)
Response:
{
"processing_time_seconds": 2.45,
"enhanced_files": [
"enhanced/51A-9763_0.png",
"enhanced/30A-12345_1.png"
],
"ocr_results": [
{
"enhanced_file": "enhanced/51A-9763_0.png",
"text": "51A-9763",
"frame": 0
}
],
"existed_results": [
{
"text": "30A-12345",
"enhanced_file": "enhanced/30A-12345_1.png"
}
],
"invalid_results": [
{
"text": "INVALID-123",
"message": "Biển số xe không hợp lệ"
}
]
}Tìm kiếm biển số đã nhận diện
Response:
[
{
"recognized_text": "51A-9763",
"enhanced_file_path": "outputs/enhanced/51A-9763_0.png"
}
]Tải ảnh đã tăng cường
Tải ảnh từ thư mục outputs
- Upload: Hỗ trợ drag & drop ảnh/video
- Preview: Xem trước ảnh trước khi xử lý
- Results: Hiển thị kết quả OCR và ảnh enhanced
- Download: Tải từng ảnh kết quả
- Search: Tìm kiếm biển số đã nhận diện
- History: Xem lịch sử xử lý
- Truy cập
http://localhost:3000 - Upload ảnh hoặc video
- Chờ xử lý (có progress bar)
- Xem kết quả OCR và ảnh enhanced
- Tải ảnh hoặc tìm kiếm biển số
- Xử lý ROI với tỷ lệ cố định
- Tối ưu cho biển số ở vị trí cụ thể
- Nhanh nhất trong 3 server
- Xử lý toàn bộ ảnh/video
- Phù hợp khi biển số có thể ở bất kỳ đâu
- Chậm hơn nhưng chính xác hơn
- Xử lý nửa dưới của ảnh/video
- Phù hợp cho camera an ninh
- Cân bằng giữa tốc độ và độ chính xác
Trong các file server:
model_path = "path/to/your/yolo/weights.pt"ROI_RATIO = (0.32, 0.63, 0.432, 0.336) # (x1, y1, x2, y2)if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8001)pip install -r requirements.txt- Giảm batch size trong code
- Sử dụng CPU thay vì GPU
- Đóng các ứng dụng khác
- Kiểm tra thông tin kết nối
- Đảm bảo SQL Server đang chạy
- Cài đặt ODBC Driver 17
- Tải weights từ Google Drive
- Kiểm tra đường dẫn trong code
# Chạy với debug mode
python main_test.py --debug
# Xem logs chi tiết
tail -f logs/app.log- Fork repository
- Tạo feature branch
- Commit changes
- Push to branch
- Tạo Pull Request
- Tuân thủ PEP 8 cho Python
- Comment code rõ ràng
- Test trước khi commit
- Update documentation
Dự án này được phát hành dưới MIT License.
- Email: tonybdg2061@gmail.com
- GitHub: tomruise162
- LinkedIn: https://www.linkedin.com/in/giabao16/
- PReNet authors cho mô hình tăng cường ảnh
- YOLOv11 team cho mô hình detection
- PaddleOCR team cho OCR engine
- FastAPI team cho web framework
Cập nhật lần cuối: Tháng 7, 2025