• HOME
  • DỰ ÁN & MẠCH ĐIỆN
    • Lập trình
      • ARDUINO PROJECT
      • ESP8266 PROJECT
      • ESP32 PROJECT
      • RASPBERRY PI PROJECT
      • Vi điều khiển
    • Điện tử ứng dụng
      • Audio / Amplifiers
      • Nguồn điện
      • Pin sạc/Acquy và mạch sạc
      • Biến đổi AC và DC
      • Robotic
      • Cảm biến
      • LED
      • LCD
      • Động cơ bước
      • Mạch linh tinh
      • Test & Measurement
      • RF – FM
    • Nixie Clock
    • HOME AUTOMATION
    • Dân dụng
    • Công nghiệp
  • KIẾN THỨC CĂN BẢN
    • Điện tử cơ bản
    • Điện tử số
    • PCB
    • Nixie Tube
    • Raspberry Pi
    • Vi điều khiển
    • Arduino
    • IN 3D
  • DOWNLOAD
    • Phần mềm điện tử
    • Giáo trình
      • Giáo trình Điện – Điện tử
      • Giáo trình Tự Động Hóa
      • Giáo trình Viễn thông
    • Đề tài
      • Đề tài – Điện – Điện Tử
      • Đề tài – Tự Động Hóa
      • Đề tài – Viễn thông
    • Điện tử ứng dụng
    • Tài liệu nước ngoài
    • Hướng dẫn, sửa chữa
    • Sơ đồ, nguyên lý thiết bị
    • Tiêu chuẩn – Đo lường – Thử nghiệm
    • Datasheet
  • LIÊN HỆ
  • SẢN PHẨM

Mạch Điện Lý Thú

Sơ đồ nguyên lý, PCB, đồ án, tài liệu, DIY

Trang chủ » DỰ ÁN & MẠCH ĐIỆN » Lập trình » RASPBERRY PI PROJECT » YOLO bản fork ngon hơn bản chính chủ, hỗ trợ OpenCV 4.x

YOLO bản fork ngon hơn bản chính chủ, hỗ trợ OpenCV 4.x

28/04/2025 by admin Để lại bình luận

Đã được đăng vào 03/10/2019 @ 15:05

YOLO bản fork ngon hơn bản chính chủ, hỗ trợ OpenCV 4.x

Mục lục hiện
YOLO bản fork ngon hơn bản chính chủ, hỗ trợ OpenCV 4.x
Bước 1: Tải mã nguồn về biên dịch
Bước 2: Hiểu cơ chế biên dịch mã nguồn mở, giúp bạn xử lý hầu hết các lỗi
Bước 3: Sửa Makefile của AlexeyAB/darknet
Bước 4: Tích hợp với OpenCV
Bước 5: Bật CUDNN
Bước 6: CUDNN_HALF=1 và AVX=1
Bước 7: Sửa biến môi trường trong bash shell
Bước 8: Biên dịch bằng lệnh make
Bước 9: Chạy thử
Đánh giá hiệu năng AlexeyAB/darknet

Xem bài hướng dẫn YOLO trước đó

Xem thêm:

  • Cài đặt OpenCV nhanh nhất trên MacOSX để lập trình AI

Phải công nhận tác giả đầu tiên của YOLO, Joseph Redmond là một thiên tài vì đã nghĩ ra một thuật quá đỉnh.

YOLO 1 lên 3 có quá nhiều cải tiến hay. Tuy nhiên tác giả có vẻ như bận rộn nghiên cứu những ý tưởng mới hơn nên YOLO3 còn rất nhiều điểm bất cập:

  • Không hỗ trợ Windows
  • Tốc độ chưa phải tối ưu
  • Không hỗ trợ OpenCV bản 4.x yêu cầu C++ 11
  • Không hỗ trợ nhận dạng live camera và trả về kết quả trực tuyến….

Alexey AB, một thanh niên người Nga quyết định ra tay giải cứu thế giới lập trình viên (có đến 95% những kẻ chỉ ngồi chờ thư viện ngon để xài lại, trong đó có tôi, bảo vệ trông xe, đón khách, chạy xe ôm có chút thời gian mọn học lập trình là quá mừng nói gì đến việc giải cứu thế giới).

Alexey AB phân nhanh (fork) mã nguồn của Joseph Redmon và tạo ra một phiên bản YOLO Darknet https://github.com/AlexeyAB/darknet chạy tốt trên Windows, Linux, Mac và thêm rất nhiều thứ hay ho.

Cộng đồng góp sức cũng đông thế nên đây có lẽ là YOLO bản fork tốt nhất hiện nay.

Bài viết này chia sẻ lại kinh nghiệm biên dịch AlexeyAB/darknet trên MacOSX, làm sao để Nvidia CUDA, CUDA Neural Network và cả OpenCV bản 4.1 mới nhất.

Bước 1: Tải mã nguồn về biên dịch

git clone --depth=1 https://github.com/AlexeyAB/darknet
cd darknet
nano Makefile

Trước khi gõ lệnh make hãy chỉnh lại Makefile đã.

Bước 2: Hiểu cơ chế biên dịch mã nguồn mở, giúp bạn xử lý hầu hết các lỗi


Bài viết này thực ra chả liên quan gì đến thuật toán hay kiến thức xử lý ảnh, học máy cả.

Nó chỉ xoay quanh vấn đề làm sao biên dịch thành công một dự án viết bằng ngôn ngữ C/C++ liên kết với các thư viện ngoài như OpenCV.

Để biên dịch dự án C/C++ ta cần trình make và Makefile. Makefile là file cấu hình chỉ ra file chạy sẽ phải import header file nào và link đến thư viện nào thế thôi.

Bạn hiểu rõ cách thức biên dịch C/C++ trên Linux, Mac, thì sau này dự án mã nguồn mở nào cũng chơi được hết. Ý tôi, tay bảo vệ ngày trông xe, tối học code là vậy.

Một vài YouTube về makefile để các bạn tham khảo

  • Makefile and GNU make
  • Ví dụ Makefile trong một ứng dụng C
  • Sách “The GNU Make Book” của tác giả  John Graham-Cumming

Bước 3: Sửa Makefile của AlexeyAB/darknet


Phần đầu của Makefile bạn có thể bật những lựa chọn sau đây

GPU=1
CUDNN=1
CUDNN_HALF=1
OPENCV=1
AVX=1
OPENMP=0
LIBSO=0
ZED_CAMERA=0

Giải thích từng lựa chọn một nhé

  1. GPU: tận dụng card đồ hoạ Nvidia để tính toán thay vì phụ thuộc vào CPU. Nên bật. Yêu cầu máy có card đồ hoạ Nvidia, đời càng mới càng tốt
  2. CUDNN: thư viện do chính Nvidia để tận dụng GPU cho mạng deep neural network. Tham khảo link này https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html
  3. CUDNN_HALF: Theo như tác giả nói sẽ tăng tốc gấp 2 đến 3 lần trên GPU kiến trúc Volta improved neural network performance Detection 3x times, Training 2 x times on GPU Volta (Tesla V100, Titan V, …) using Tensor Cores if CUDNN_HALF defined. Vâng con card đồ hoạ TitanV chỉ có 119 triệu đồng thôi các bạn ạ. Lương bảo vệ trông xe, 5 triệu bao ăn uống bữa trưa. Cứ tầm 2 năm chịu khó chạy xe ôm buổi tối là mình mua được TitanV rồi.
  4. OPENCV: tích hợp với thư viện OpenCV. Điểm dễ nhận thấy nhất khi bật chức năng này, nhận dạng sang, là tự bật luôn ảnh kết quả lên thay vì chỉ lưu ra file predicion.
  5. AVX: tập lệnh xử lý tính toán ma trận Intel Avanced Vector Extension. Nếu không dùng GPU, mà bật AVX thì tốc độ xử lý cũng tăng lên Yolo3 85%, Yolo2 20%. Quá tốt còn gì !
  6. OPENMP: thư viện xử lý song song trên nhiều Core. Cái này mình đã thử bật lên nó toàn báo lỗi clang: error: unsupported option ‘-fopenmp’. Nếu trên Linux lỗi này chữa ngon. Còn trên Mac, các bạn tham khảo bài viết này nhé https://daijiang.name/en/2017/06/21/fopenmp-option-of-clang-error/ . Tạm thời mình tắt nó.
  7. LIBSO: nếu bạn muốn viết một ứng dụng C/C++ hoàn chỉnh tận dụng lại Darknet Yolo thì bật lựa chọn này lên, nó xuất ra thư viện Dynamic Link Library, khi biên dịch thì nhúng vào. Ví dụ mẫu một app console dùng Yolo đây. Lập trình C++ nhìn chung là nhàn nhưng giờ mình có Python rồi nên buổi sau mình viết hướng dẫn lập trình Python gọi vào YOLO nhé.
  8. ZED_CAMERA: chỉ bật nếu bạn dùng ZED camera nhìn được chiều sâu 3D. Loại này chỉ có 499 $ thôi, đặt mua họ gửi đến tận nhà.

Tác giả cũng đã chú thích ở đây rất kỹ rồi
# set GPU=1 and CUDNN=1 to speedup on GPU
# set CUDNN_HALF=1 to further speedup 3 x times (Mixed-precision on Tensor Cores) GPU: Volta, Xavier, Turing and higher
# set AVX=1 and OPENMP=1 to speedup on CPU (if error occurs then set AVX=0)

Nếu bạn dùng những GPU cao cấp của Nvidia thì lệnh ARCH= -gencode arch=compute_XX,code=[sm_XX,compute_XX] .

Lệnh này sẽ giúp tận dụng triệt để các tập lệnh tính toán trên từng dòng GPU.

Bước 4: Tích hợp với OpenCV


Đầu tiên cài đặt OpenCV bản mới nhất lên Mac đã. Hướng dẫn cài đặt mình viết ở đây.

Darknet/Yolo nguyên gốc của Joseph Redmond chỉ hỗ trợ OpenCV 3.x vì OpenCV 4.x yêu cầu bật lựa chọn hỗ trợ C++11 khi biên dịch.

Bản Darknet của Alexey BB hỗ trợ C++11 nên mình rất là ưng.

Tuy nhiên bạn phải sửa đoạn này trong Makefile nếu bạn cài OpenCV 4.x

ifeq ($(OPENCV), 1)
COMMON+= -DOPENCV
CFLAGS+= -DOPENCV
LDFLAGS+= `pkg-config --libs opencv`
COMMON+= `pkg-config --cflags opencv`
endif

thành (thêm số 4 vào opencv).

Bản chất là lúc biên dịch giai đoạn link, make sẽ tìm đến thư mục /usr/local/lib, OpenCV thấp hơn 4 thì là opencv, còn từ bản 4.x sẽ có file /usr/local/lib/opencv4

ifeq ($(OPENCV), 1)
COMMON+= -DOPENCV
CFLAGS+= -DOPENCV
LDFLAGS+= `pkg-config --libs opencv4`
COMMON+= `pkg-config --cflags opencv4`
endif

Bước 5: Bật CUDNN


Vào đây https://developer.nvidia.com/cudnn tải thư viện cudnn về, bung file nén ra và copy vào thư mục /usr/local/cudnn/

Sửa đoạn này Makefile

ifeq ($(CUDNN), 1)
COMMON+= -DCUDNN
ifeq ($(OS),Darwin) #MAC
CFLAGS+= -DCUDNN -I/usr/local/cuda/include
LDFLAGS+= -L/usr/local/cuda/lib -lcudnn

thành

ifeq ($(CUDNN), 1)
COMMON+= -DCUDNN
ifeq ($(OS),Darwin) #MAC
CFLAGS+= -DCUDNN -I/usr/local/cudnn/include
LDFLAGS+= -L/usr/local/cudnn/lib -lcudnn

Cách 2 là bạn copy header cudnn.h vào /usr/local/cuda/include và toàn bộ file trong thư mục lib của cudnn vào /usr/local/cuda/lib

Bước 6: CUDNN_HALF=1 và AVX=1


Bước này chỉ cần bật lên, mà không phải làm gì cả

Bước 7: Sửa biến môi trường trong bash shell


Mình dùng zsh và OhMyZSH nên gõ

nano ~/.zshrc

Thêm những đoạn lệnh sau.

Tất nhiên bạn cần có chút kiến thức Linux, Bash Shell để chỉnh phù hợp với đường dẫn thực tế trên máy của bạn

export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib:/usr/local/cudnn/lib
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

Bước 8: Biên dịch bằng lệnh make


Lỗi đâu ta lại Google, StackOverflow sửa đến đó. Ví dụ tôi gặp lỗi này

dyld: Library not loaded: /usr/local/opt/ceres-solver/lib/libceres.1.dylib

Đây là lỗi thường gặp khi file binary gọi đến một dynamic library nhưng nó lại chưa được cài đặt.

Cách xử lý là tim đúng file mà cài

brew install ceres-solver

Bước 9: Chạy thử

Bạn nhớ đổi tên file data/giaothong.jpg thành đường dẫn đúng đến file ảnh có trên máy tính của bạn

./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/giaothong.jpg

Kết quả là:

Nhận dạng bằng AlexeyAB/Darknet – YOLO3

Đánh giá hiệu năng AlexeyAB/darknet

Tốc độ xử lý một ảnh bây giờ 228 miliseconds, so với https://pjreddie.com/darknet/yolo/ 0.43 second.

Như vậy AlexeyAB/darknet nhanh hơn bản gốc 1.88 lần.

Rất đáng kể cho YOLO bản fork phải không nào.

Nguồn: techmaster.vn

  • Share on Facebook
  • Tweet on Twitter

Thuộc chủ đề:Raspberry Pi, RASPBERRY PI PROJECT Tag với:nhận dạng, OpenCV, xử lý ảnh, YOLO

Bài viết trước « Đo và kiểm tra THẠCH ANH còn sống hay chết trên bo mạch bằng đồng hồ vạn năng và máy hiện sóng
Bài viết sau Arduino cơ bản 01: Getting Started »

Reader Interactions

Để lại một bình luận Hủy

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Sidebar chính

Zalo hỏi đáp 24/7

Theo dõi qua mạng xã hội

  • Facebook

Bạn đang tìm gì?

Bài viết mới nhất

Hướng dẫn tạo thư viện Altium

14/05/2025

Đồng hồ dùng bóng đèn điện tử – Nixie clock

14/05/2025

Căn chỉnh tốc độ rút nhựa trong in 3D – Retraction Calibration

14/05/2025

Cài đặt Octoprint lên Raspbian

13/05/2025

P2 - Smart Home - Ổ điện thông minh

P2 – Smart Home – Ổ điện thông minh

13/05/2025

Danh mục

  • DỰ ÁN & MẠCH ĐIỆN (241)
    • Công nghiệp (16)
    • Dân dụng (29)
    • Điện tử ứng dụng (178)
      • Audio / Amplifiers (34)
      • Biến đổi AC và DC (24)
      • Cảm biến (40)
      • Động cơ bước (5)
      • Kiểm thử và đo đạc (23)
      • LCD (15)
      • LED (20)
      • Mạch linh tinh (27)
      • Nguồn điện (42)
      • Pin sạc/Acquy và mạch sạc (24)
      • RF – FM (5)
      • Robotic (2)
    • HOME AUTOMATION (23)
    • Lập trình (82)
      • ARDUINO PROJECT (39)
      • ESP32 PROJECT (6)
      • ESP8266 PROJECT (17)
      • RASPBERRY PI PROJECT (9)
      • Vi điều khiển (24)
    • Nixie Clock (3)
  • Kiến thức căn bản (170)
    • Arduino (36)
    • Điện tử cơ bản (77)
    • Điện tử số (9)
    • IN 3D (9)
    • Nixie Tube (13)
    • PCB (18)
    • Raspberry Pi (10)
    • Vi điều khiển (16)

Footer

Bài viết mới nhất

  • Hướng dẫn tạo thư viện Altium
  • Đồng hồ dùng bóng đèn điện tử – Nixie clock
  • Căn chỉnh tốc độ rút nhựa trong in 3D – Retraction Calibration
  • Cài đặt Octoprint lên Raspbian
  • P2 – Smart Home – Ổ điện thông minh
  • Thiết kế mạch in trên Altium cho người mới

Bình luận mới nhất

  • Tên gì kệ tui trong Mạch Ampli 19W dùng IC LA4440
  • admin trong Đồng hồ số hiển thị trên LED 7 đoạn dùng 89S52 và DS1307
  • Thành trong Đồng hồ số hiển thị trên LED 7 đoạn dùng 89S52 và DS1307
  • admin trong Đồng hồ sử dụng LCD máy Homephone – Gphone Clock

Tìm kiếm

Tất cả nội dung trên website chỉ dùng để tham khảo. Chúng tôi không chịu trách nhiệm về thông tin thành viên đăng tải lên website và xóa bài viết khi có vi phạm bản quyền tác giả.