Chào ngày mới các member thân thương của Mì Ai, như vậy trong bài trước mình đã guide các bạn cách triển khai một hệ thống client-server kết nối giữa C# với Flask Python server để xây dựng các hệt thống AI. Hôm nay chúng ta đi tiếp Chương 2, chúng ta sẽ thêm vào các đoạn code khởi tạo model YOLO, thực hiện detection các object trong ảnh từ request của client và trả về kết quả cho client thông qua REST API nhé.
Bài toán của chúng ta là: client sẽ upload một file ảnh chụp và server sẽ trả về các vật thể trong đó kèm theo tọa độ trong ảnh và client sẽ hiển thị kết quả trả về lên màn hình.
Rồi, bắt đầu nhé.
Phần 1. Chuẩn bị nguyên vật liệu
Bài này có kiến trúc client/server nên các bạn phải chuẩn bị cho mình 2 phần là client và server. Tất nhiên rồi!
Đầu tiên các bạn tạo thư mục MiAI_Flask để lưu các thứ của bài này. Tiếp theo các bạn gõ lệnh:
git clone https://github.com/thangnch/MiAI_Flask_2 .
Đợi một chút để source bay về, các bạn sẽ thấy có folder là client là chứa mã nguồn c# còn các file bên ngoài là python dùng trên server.
Bây giờ các bạn tải weights của YOLO về. Link tải tại đây : https://pjreddie.com/media/files/yolov3.weights và lưu vào thư mục MiAI_Flask_2 nhé!
Tiếp theo để làm bài này, các bạn chạy lệnh cài đặt các thư viện như sau:
pip install -r setup.txt
Đợit một chút là done nhé! Sau đó các bạn chuyển sang bước 2.
Phần 2. Tư tưởng bài toán
Với Chương 2 này, chúng ta sẽ làm như sau:
- Client sẽ upload một file ảnh lên server với trình tự như sau:
- Tiếp nhận file ảnh từ người dùng
- Chuyển file ảnh thành Base64 để tiện gửi qua HTTP
- Gửi file ảnh lên server và nhận về một chuỗi dữ liệu trả về gồm: Class ID và tọa độ X,Y, chiều rộng, chiều cao của hình chữ nhật bao quanh đối tượng được nhận dạng. Vi dụ: 5,10,20,300,400 chẳng hạn.
- Client vẽ khung chữ nhật và hiển thị tên đối tượng lên màn hình
- Server thì sẽ thực hiện:
- Khởi tạo model YOLO và chờ sẵn
- Khi có request từ client gửi lên thì nhận ảnh ở dạng Base64
- Chuyển ảnh từ Base64 về ảnh thường và nhận diện
- Trả về client classID và các tọa độ cần thiết.
Đại khái như vậy, bây giờ chúng ta sang phần code nhé.
Phần 3. Viết code chương trình kết nôi client c# với flask server python
Mã nguồn server các bạn xem file httpsvr.py trong thư mục server nhé. Mình đã comment đầy đủ từng dòng lệnh rồi.
Còn mã nguồn client thì ở file Form1.cs cũng đã được comment đầy đủ, các bạn đọc và xem chi tiết trong file.
Nếu có gì cần hỏi thêm hoặc bị lỗi các bạn cứ post lên group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup để cùng trao đổi, thảo luận nhé.
Phần 4. Tiến hành bật server Python Flask
Phần bật này các bạn làm theo Phần 3 trong bài số 1 tại đây nhé. Mình không viết lại chi tiết nữa.
Phần 5. Tiến hành chạy Client bằng C#
Rồi, bây giờ đến phần client. Phần này mình lập trình WinForm bằng Visual Studio 2017 nhé. Bạn nào chưa cài Visual Studio thì cài để code client (đoạn này với các bạn chưa code C# bao giờ chú ý nhé và không nhầm với Visual Studio Code để code python từ trước đến giờ.).
Các bạn đã mở file solution, tìm đến Form1.cs và tìm tiếp hàm button1_Click. Các bạn sửa biến server_ip thành IP chính xác của server là okie. Nếu các bạn chạy trên cùng 1 máy thì cứ sửa thành 0.0.0.0 là xong nhé.
Rồi thì giờ tiến hành run Solution, một màn hình như sau sẽ hiện ra khi các bạn chạy thành công.
Để đơn giản mình fix sẵn 1 cái ảnh trong PictureBox, các bạn có thể sửa lại chương trình để cho phép người dùng chọn 1 ảnh bất kì nhé.
Bây giờ các bạn bấm nút Send to server và đợi chút, các bạn sẽ thấy kết quả thật amazing như sau:
Như vậy , trong Chương 2 này, chúng ta đã biết cách dựng một server python có chạy model YOLO bằng Flask và gọi từ c# lên để detect object thành công.
Mình xin nhắc lại, đây là bài ví dụ để các bạn biết cách triển khai theo mô hình client c# với python flask server thôi. Sau khi thành thạo, các bạn có thể làm các hệ thống khác ví dụ như hệ thống trông xe tại tầng hầm, máy của bảo vệ sẽ chụp ảnh biển số gửi về server để xem xét và cho phép ra vào chứ không ai cài model lên máy bảo vệ cả.
Hẹn gặp lại các bạn. Nếu có gì vướng mắc trong quá trình triển khai các bạn cứ post lên group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup để cùng trao đổi, thảo luận nhé.
Hãy gia nhập 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
Chào bạn.
Bài viết rất hữu ích. Tôi có câu hỏi. Đề bài tương tự nhưng muốn nhận dạng từ file video hoặc từ webcam thì phải làm thế nào. Tôi đã load được từng khung hình của video lên picturebox.
Cảm ơn bạn đã ủng hộ. Việc xử lý video cũng tương tự như hình ảnh. Nhưng bạn có thể đọc 3-4 hoặc 10 frames rồi mới up lên server xử lý để giảm tải chẳng hạn.
Bạn có thể post câu hỏi lên group để tiện trao đổi hơn nhé: Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup