[YOLO Series] Thử nhận diện lửa bằng Yolov4 trên GPU với Keras

Xin chào các mem, trong bài trước chúng ta đã tìm cách train model YOLOv4 bằng COLAB rất nhanh gọn tại đây. Hôm nay chúng ta sẽ tìm cách Thử nhận diện lửa bằng Yolov4 trên GPU với Keras

Nói thêm chút là sau khi train 3000 vòng trên COLAB mình đã có file weights YOLOv4 train với dữ liệu là hình ảnh các ngọn lửa (file weights tại đây cho các bạn ngại train). Bây giờ chúng ta sẽ sử dụng nó để nhận diện lửa trên PC.

yolo sample

Bắt đầu nào!

Phần 1 – Khó khăn khi chạy YOLOv4 trên OpenCV

Trong bài trước mình có guide các bạn chạy YOLOv3 trên OpenCV tại đây. Tuy nhiên sau khi lên YOLOv4 thì nó có thêm một hàm activation mới là hàm “mish” nên khi anh em chạy sẽ bị lỗi Unsupported như hình dưới:

yolo opencv mish error

Hiện có một giải pháp là 1 số bạn sử dụng source opencv, thêm hàm này vào manual và sau đó build lại. Tuy nhiên việc này làm khá mất thời gian và cũng cần hiểu biết về c, c++ nên tạm thời mình chưa đề cập ở đây (bạn nào làm được thì share lên Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup cho anh em với nhé, xin cảm ơn)

Ngoài ra còn có 1 lý do nữa là anh em đang muốn tìm hiểu cách chạy YOLO trên GPU cho nó nhanh nữa nên mình quyết định viết bài về Yolov4 trên Keras luôn nhé anh em.

Let’s go!

Phần 2 – Chuẩn bị nguyên vật liệu để chạy YOLOv4 trên Keras

Đầu tiên anh em cứ clone cái source của mình về cái đã nhé, sau đó minh sẽ phân tích cách làm chi tiết sau. Anh em chạy lệnh git:

git clone https://github.com/thangnch/MiAI_Keras_YoloCode language: PHP (php)

Sau khi chạy xong thì cài đặt các thư viện cần thiết với lệnh:

pip install -r setup.txtCode language: CSS (css)

Đợi khá lâu đó cho các thư viện được cài đặt thành công. Nếu cài đặt có lỗi gì các bạn cứ post lên Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup để thảo luận nhé.

Phần 3 – Convert YOLOv4 model sang Keras Model

File weights bình thường anh em train ra nó lưu ở 1 định dạng riêng và do đó khi muốn chạy trên Keras anh em sẽ phải thực hiện convert. Anh em mở file convert.py và chú ý đoạn source này:

if __name__ == '__main__':
    model_path = 'yolo4_weight.h5'
    anchors_path = 'yolo4_anchors.txt'
    classes_path = 'yolo.names'
    weights_path = 'yolov4-custom_last.weights'

    score = 0.5
    iou = 0.5

    yolo4_model = Yolo4(score, iou, anchors_path, classes_path, model_path, weights_path)
    yolo4_model.close_session()
    print("Model converted..done!")Code language: PHP (php)

Các bạn cần chú ý các dòng sau:

  • Dòng 2: Đây là tên file h5 sau khi convert xong. Các bạn có thể để mặc định cũng được.
  • Dòng 3: File anchors.txt mặc định của YOLOv4.
  • Dòng 4: Ta cần kiểm tra chắc chắn file yolo.names chứa danh sách class đã train ở bài trước. Ví dụ như bài này của mình chứa 1 dòng duy nhất là “Fire” (không có dấu nháy nhé)
  • Dòng 5 : Tiếp theo hãy sửa dòng weights_path = ‘yolov4-custom_last.weights’ thành tên file weights mà bạn đã train ở bài trước. Còn nếu tên file weights của bạn cũng là yolov4-custom_last.weights thì thôi, cứ để nguyên là ngon lành cành đào.

Rồi bây giờ anh em chạy file convert.py 1 phát nào:

python convert.pyCode language: CSS (css)

Anh em đợi một chút cho nó chạy, khi nào màn hình hiện ra dòng chữ Model converted..done! là thành công nhá.

Bây giờ anh em kiểm tra trong thư mực hiện tại đã có thêm file yolov4_weight.h5, đó chính là keras model của chúng ta với đuôi h5 quen thuộc nhé.

Đi tiếp nha!

Phần 4 – Thực hiện nhận diện lửa

Tiếp theo bạn để ý mình đã để sẵn 2 file ảnh để test trong thư mục project là 000341.jpg và 000449.jpg.

Các bạn tìm đến đoạn source sau trong file test.py và thử sửa đoạn này thành các file ảnh của bạn:

img = "000341.jpg"
image = Image.open(img)

result = yolo4_model.detect_image(image,model_image_size=model_image_size)
plt.imshow(result)
plt.show()
yolo4_model.close_session()Code language: JavaScript (javascript)

Sau khi sửa xong thì chạy file test.py và nếu okie thì kết quả đây:

yolov4 trên GPU

Như vậy chúng ta đã biết cách chạy được YOLOV4 trên GPU với Keras. Bài này vừa giúp các bạn thử nghiệm được model YOLOv4 đã train vừa có thể tăng tốc nếu máy bạn có GPU.

Mình xin tạm dừng ở đây và hẹn gặp lại các bạn trong các bài tiếp theo của series NLP còn đang dang dở.

Hãy join cùng cộng đồng Mì AI nhé!

Fanpage: http://facebook.com/miaiblog
Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup
Website: https://miai.vn
Youtube: http://bit.ly/miaiyoutube

Cảm ơn bài tham khảo rất hay của Ma-Dan!

Related Post

15 Replies to “[YOLO Series] Thử nhận diện lửa bằng Yolov4 trên GPU với Keras”

  1. Loi: em install theo anh nhu trong setup.txt thi no bat tensor > 2.2 moi dung dc keras, em install tensorflow >= 2.2 thi no bat tensor < 2.0 moi dung duoc @@ cuoi cung khong biet dung ban tensor nao

  2. Dành cho bạn nào bị lỗi như bên dưới thì: vào đây update package lên: https://stackoverflow.com/a/62482183
    Traceback (most recent call last):
    File “convert.py”, line 5, in
    from keras import backend as K
    File “/usr/local/lib/python3.7/site-packages/keras/__init__.py”, line 6, in
    ‘Keras requires TensorFlow 2.2 or higher. ‘
    ImportError: Keras requires TensorFlow 2.2 or higher. Install TensorFlow via `pip install tensorflow`

    1. Một lựa chọn khác để sửa lỗi là thay đổi version bằng cách thay đổi setup.txt:
      numpy
      tensorflow-gpu==1.13.1
      keras==2.3.0
      pillow
      opencv-python
      opencv-python-headless

  3. Cảm ơn anh.
    Anh Thắng cho em hỏi, nếu mình muốn áp dụng Yolo v4 model với input là video (video được đọc bằng openCV) thì như thế nào vậy anh? Em search thử thì chỉ có hướng dẫn dùng OpenCV với Yolo v3.

  4. Hi Anh Thắng, vậy trong trường hợp máy không có GPU thì mình ko thực hiện dc lệnh convert ah anh.
    Em thực hiện trên máy mac thì gặp lỗi như sau:
    Traceback (most recent call last):
    File “convert.py”, line 166, in
    yolo4_model = Yolo4(score, iou, anchors_path, classes_path, model_path, weights_path)
    File “convert.py”, line 152, in __init__
    self.load_yolo()
    File “convert.py”, line 133, in load_yolo
    self.yolo4_model.save(self.model_path)
    File “/Users/diego/.conda/envs/MiAI_Keras_Yolo/lib/python3.7/site-packages/keras/engine/network.py”, line 1152, in save
    save_model(self, filepath, overwrite, include_optimizer)
    File “/Users/diego/.conda/envs/MiAI_Keras_Yolo/lib/python3.7/site-packages/keras/engine/saving.py”, line 449, in save_wrapper
    save_function(obj, filepath, overwrite, *args, **kwargs)
    File “/Users/diego/.conda/envs/MiAI_Keras_Yolo/lib/python3.7/site-packages/keras/engine/saving.py”, line 541, in save_model
    _serialize_model(model, h5dict, include_optimizer)
    File “/Users/diego/.conda/envs/MiAI_Keras_Yolo/lib/python3.7/site-packages/keras/engine/saving.py”, line 161, in _serialize_model
    layer_group[name] = val
    File “/Users/diego/.conda/envs/MiAI_Keras_Yolo/lib/python3.7/site-packages/keras/utils/io_utils.py”, line 233, in __setitem__
    dataset = self.data.create_dataset(attr, val.shape, dtype=val.dtype)
    File “/Users/diego/.conda/envs/MiAI_Keras_Yolo/lib/python3.7/site-packages/h5py/_hl/group.py”, line 143, in create_dataset
    if ‘/’ in name:
    TypeError: a bytes-like object is required, not ‘str’

  5. Em chạy file convert.py thì bị lỗi như này
    Traceback (most recent call last):
    File “convert.py”, line 173, in
    yolo4_model = Yolo4(score, iou, anchors_path, classes_path, model_path, weights_path)
    File “convert.py”, line 157, in __init__
    self.load_yolo()
    File “convert.py”, line 130, in load_yolo
    buffer=weights_file.read(weights_size * 4))
    TypeError: buffer is too small for requested array

Leave a Reply

Your email address will not be published. Required fields are marked *