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.
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:
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_Yolo
Code 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.txt
Code 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.py
Code 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:
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!
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
Em cài bản Keras thấp hơn bằng lệnh pip install keras==2.3.1 nhé. Nếu vẫn vướng thì post lên Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup nhé!
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`
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
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.
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’
Ồ ko liên quan em ơi., Em thử chụp hình và post lên Group https://www.facebook.com/groups/miaigroup rồi trao đổi thêm nhé! Trên này không có hình khó quá!
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
Bạn post lên Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup nhé! Cho tiện trao đổi!
anh đã chạy được chưa ạ
mình git lone trên colab luôn hả anh
Đúng em. Cho nhanh 😀
Đã làm được cảm ơn anh
Làm sao để thay input từ hình ảnh thành video ạ.
Em tham khảo bài này: https://www.miai.vn/2019/09/23/xay-dung-he-thong-chong-trom-don-gian-bang-yolo-va-opencv/