Chú thích:
- #Img.: Số lượng hình ảnh
- #Obj./img.: Trung bình số lượng dối tượng trên một hình - #Cls.: Số loại đối tượng
- #Cls./img.: Trung bình số loại đối tượng trên từng hình - Dense.: Các đối tượng có nằm sát nhau, dày đặc khơng?
- Idnt.: Các hình ảnh có chứa nhiều đối tượng giống nhau hoặc khoá để phân biệt được vùng ngăn cách giữa hai đối tượng khơng?
- BB: Bouding box có bao gồm độ chính xác khơng?
Qua bảng so sánh, nhận thấy được bộ dữ liệu SKU-110K thật quý giá và rất phù hợp cho bài toán cần giải quyết là các vật thể nằm dày đặt nhau.
3.2.3. Sử dụng phương pháp trong luận văn
Để sử dụng được những phương pháp từ hai bài báo SKU-110K CVPR và Keras RetinaNet đòi hỏi nhóm cần có khả năng đọc hiểu được những mắt xích và tham số quan trọng trong soucre code của tác giả, nắm được những kiến thức cơ bản về Python và một số thư viện cốt lõi để có thể thực hiện train, test và predict. 3.2.3.1. Chuẩn bị bộ dataset
Nhóm đã tự đánh nhãn thủ cơng hơn 10 bộ dataset với hơn 100 hình và 2000 bounding box mỗi bộ.
Việc chuẩn bị dataset tốn rất nhiều thời gian, nhóm đã tìm hiểu và xác định những vật thể dễ tiếp cận trước để thu thập dữ liệu và đánh nhãn.
Việc đánh nhãn được sử dụng bằng công cụ LabelImg và format của annotation là .XML, nhóm đã tìm hiểu và viết function để convert từ dạng
.XML sang CSV cho đúng chuẩn annotation format của bài báo để thuận tiện trong quá trình train.
3.2.3.2. Cách train
Vì thời điểm ra đời của bài 2019, nên nhóm đã gặp rất nhiều khó khăn trong việc sử dụng ở hiện tại, địi hỏi nhóm phải đọc kĩ và sửa đổi source code của tác giả cho phù hợp với môi trường Google Colab và các package hiện tại. Cụ thể các phiên bản quan trọng:
- tensorflow 1.13.1 - tensorflow-gpu 1.13.1 - keras 2.2.4
- h5py 2.10.0 - keras_resnet 0.2.0
Việc train cho model diễn ra hai lần.
Lần thứ nhất là cho model base bằng pretrained model và phương pháp của Keras RetinaNet.
Lần thứ hai là sử dụng weight file (.h5) vừa có được để train cho IoU layer của bài SKU-110K CVPR, sẽ train cho một layer mới để tính được điểm số của từng bounding box.
3.2.3.3. Cách kiểm tra và sử dụng kết quả
Việc sử dụng kết quả dựa trên sự kết hợp Keras RetinaNet và SKU-110K CVPR. Sử dụng phương pháp Keras RetinaNet để chuyển đổi từ training model được sang interface model để giảm dung lượng và tăng tốc độ load model vào RAM và predict.
Sau đó dùng phương pháp cảu SKU-110K CVPR để biến đổi và lọc lại kết quả đã được predict (MoG và EM-Merger). Cụ thể:
Chương 3: PHƯƠNG PHÁP ĐẾM VẬT THỂ TRONG HÌNH ẢNH
Hình 3.23 Code minh hoạ predict bằng phương pháp học máy
Model sẽ predict và đưa ra 4 giá trị và boxes (bounding box), hard_scores (điểm số hard của Jaccard) , labels (tên của box, cụ thể trong luận văn chỉ có 1 loại mỗi model), soft_scores (điểm số soft của Jaccard).
Sử dụng threshhold là 0.5 và EM-Merger để lọc lại những bounding box bị đè lên nhau và có kết quả ở filtered_data là danh sách các bounding box đúng vị trí.
Sử dụng kết quả:
Kết quả số lượng vật thể trong hình ảnh bằng số lượng filtered_boxes, các giá trị x, y, height, width là lần lượt là toạ độ điểm gốc và chiều cao/chiều ngang của hình chữ nhật, score là độ tin cậy của box đó.
Chương 4: MƠ HÌNH HỌC MÁY VÀ BỘ DỮ LIỆU
Chương 4
4. MƠ HÌNH HỌC MÁY VÀ BỘ DỮ LIỆU
4.1. Bộ dữ liệu đã thu thập, đánh nhãn trong đề tài
Drive folder:
https://drive.google.com/drive/folders/18oIQsmRKV5mvKcdYS4cDxNiU5yM mwMgK?usp=sharing
4.1.1. Dataset trứng
Hình 4.1 Dataset trứng
Định dạng dataset: RetinaNet Keras CSV Số lượng hình ảnh: 67 hình
Train set: 50 hình Validation set: 17 hình Số lượng vật thể: 580 vật thể
Số lượng vật thể trung bình trên ảnh: 11 vật thể/hình
Hình 4.2 Dataset gỗ
Định dạng dataset: RetinaNet Keras CSV Số lượng hình ảnh: 18
Train set: 13 hình Validation set: 5 hình
Số lượng vật thể: 1084 vật thể
Số lượng vật thể trung bình trên ảnh: 60 vật thể/hình
Chương 4: MƠ HÌNH HỌC MÁY VÀ BỘ DỮ LIỆU
Hình 4.3 Dataset ống thép hình trịn
Định dạng dataset: RetinaNet Keras CSV Số lượng hình ảnh: 16
Train set: 12 hình Validation set: 4 hình
Số lượng vật thể: 1000 vật thể
Số lượng vật thể trung bình trên ảnh: 63 vật thể/hình
Hình 4.4 Dataset đồng xu
Định dạng dataset: RetinaNet Keras CSV Số lượng hình ảnh: 33
Train set: 27 hình Validation set: 8 hình
Số lượng vật thể: 1146 vật thể
Số lượng vật thể trung bình trên ảnh: 35 vật thể/hình
Chương 4: MƠ HÌNH HỌC MÁY VÀ BỘ DỮ LIỆU
Hình 4.5 Dataset nắp chai
Định dạng dataset: RetinaNet Keras CSV Số lượng hình ảnh: 46
Train set: 35 hình Validation set: 11 hình
Số lượng vật thể: 1334 vật thể
Số lượng vật thể trung bình trên ảnh: 29 vật thể/hình
4.1.6. Dataset thùng giấy
Hình 4.6 Dataset thùng giấy
Định dạng dataset: RetinaNet Keras CSV Số lượng hình ảnh: 41
Train set: 35 hình Validation set: 11 hình Số lượng vật thể: 882 vật thể
Số lượng vật thể trung bình trên ảnh: 29 vật thể/hình
Hình 4.7 Dataset ống thép hình chữ nhật
Định dạng dataset: RetinaNet Keras CSV Số lượng hình ảnh: 28 hình
Train set: 21 hình Validation set: 7 hình
Số lượng vật thể: 1548 vật thể
Số lượng vật thể trung bình trên ảnh: 55 vật thể/hình
Chương 4: MƠ HÌNH HỌC MÁY VÀ BỘ DỮ LIỆU
Hình 4.8 Dataset viên bi
Định dạng dataset: RetinaNet Keras CSV Số lượng hình ảnh: 46 hình
Train set: 38 hình Validation set: 8 hình
Số lượng vật thể: 1835 vật thể
Số lượng vật thể trung bình trên ảnh: 40 vật thể/hình
Hình 4.9 Dataset hộp iPhone
Định dạng dataset: RetinaNet Keras CSV Số lượng hình ảnh: 37 hình
Train set: 33 hình Validation set: 4 hình
Số lượng vật thể: 1271 vật thể
Số lượng vật thể trung bình trên ảnh: 34 vật thể/hình
Chương 4: MƠ HÌNH HỌC MÁY VÀ BỘ DỮ LIỆU
Hình 4.10 Dataset bàn phím
Định dạng dataset: RetinaNet Keras CSV Số lượng hình ảnh: 15 hình
Train set: 12 hình Validation set: 3 hình
Số lượng vật thể: 1328 vật thể
Số lượng vật thể trung bình trên ảnh: 89 vật thể/hình
4.2. Model học máy đã huấn luyện được trong đề tài
Drive folder:
https://drive.google.com/drive/folders/1nb7oK5SY0g6DCNkactUporMnb4IFQj Fu?usp=sharing
4.2.1. Trứng
Quá trình train gồm 100 epoch và 250 step per epoch, tại Google Colab. Ghi chú biểu đồ:
- Trục hoành: Số step - Trục tung: Giá trị
4.2.1.1. Train model base detector - Classification_loss:
- Loss:
Hình 4.12 Biểu đồ loss model trứng
- Regression_loss:
Hình 4.13 Biểu đồ regression_loss model trứng
Chương 4: MƠ HÌNH HỌC MÁY VÀ BỘ DỮ LIỆU
Hình 4.14 Biểu đồ val_classification_loss model trứng
- Val_regression_loss:
Hình 4.15 Biểu đồ val_regression_loss model trứng
4.2.1.2. Train cho IoU Layer - Loss:
Hình 4.16 Biểu đồ loss train IoU layer model trứng
- Val_regression_loss:
Hình 4.17 Biểu đồ val_regression_loss train IoU layer model trứng 4.2.2. Bi 4.2.2. Bi
Quá trình train gồm 100 epoch và 250 step per epoch, tại Google Colab. Cụ thể kết quả:
4.2.2.1. Train model base detector - Classification_loss:
Chương 4: MƠ HÌNH HỌC MÁY VÀ BỘ DỮ LIỆU
Hình 4.18 Biểu đồ classification_loss model viên bi
- Loss:
Hình 4.19 Biểu đồ loss model viên bi
Hình 4.20 Biểu đồ regression_loss model viên bi
- Val_classification_loss
Hình 4.21 Biểu đồ val_classification_loss model viên bi
Chương 4: MƠ HÌNH HỌC MÁY VÀ BỘ DỮ LIỆU
Hình 4.22 Biểu đồ val_regression_loss model viên bi
4.2.2.2. Train IoU Layer: - Loss:
Hình 4.23 Biểu đồ loss train IoU layer model viên bi 4.2.3. Ống thép hình chữ nhật 4.2.3. Ống thép hình chữ nhật
Quá trình train gồm 100 epoch và 250 step per epoch, train tại Google Colab. Cụ thể kết quả:
4.2.3.1. Training model base detector - Classification_loss:
Hình 4.24 Biểu đồ classification_loss model ống thép hình chữ nhật
- Loss:
Hình 4.25 Biểu đồ loss model ống thép hình chữ nhật
Chương 4: MƠ HÌNH HỌC MÁY VÀ BỘ DỮ LIỆU
Hình 4.26 Biểu đồ regression_loss model ống thép hình chữ nhật
- Val_resgression_loss
Hình 4.27 Biểu đồ val_regression_loss model ống thép hình chữ nhật
4.2.3.2. Training cho IoU layer - Loss:
Hình 4.28 Biểu đồ loss train IoU layer model ống thép hình chữ nhật 4.2.4. Ống thép hình trịn 4.2.4. Ống thép hình trịn
Quá trình train gồm 100 epoch và 250 step per epoch, train tại Google Colab. Cụ thể kết quả:
4.2.4.1. Train model base detector: - Classification_loss:
Hình 4.29 Biểu đồ classification_loss model ống thép hình trịn
Chương 4: MƠ HÌNH HỌC MÁY VÀ BỘ DỮ LIỆU
Hình 4.30 Biểu đồ classification_loss model ống thép hình trịn
- Regression_loss:
Hình 4.31 Biểu đồ regression_loss model ống thép hình trịn
Hình 4.32 Biểu đồ val_regression_loss model ống thép hình trịn
4.2.4.2. Train IoU layer:
Hình 4.33 Biểu đồ loss train IoU layer model ống thép hình trịn 4.2.5. Thùng giấy 4.2.5. Thùng giấy
Quá trình train gồm 100 epoch và 250 step per epoch, train tại Google Colab. Cụ thể kết quả:
4.2.5.1. Train model base detector - Classification_loss:
Chương 4: MƠ HÌNH HỌC MÁY VÀ BỘ DỮ LIỆU
Hình 4.34 Biểu đồ classification loss model thùng giấy
- Loss:
Hình 4.35 Biểu đồ loss model thùng giấy
Hình 4.36 Biểu đồ Regression loss model thùng giấy
- Val_regression_loss:
Hình 4.37 Biểu đồ Val_regression_loss model thùng giấy
4.2.5.2. Train IoU layer: - Loss:
Chương 4: MƠ HÌNH HỌC MÁY VÀ BỘ DỮ LIỆU
Hình 4.38 Biểu đồ loss train IoU layer model thùng giấy 4.2.6. Hộp điện thoại iPhone 4.2.6. Hộp điện thoại iPhone
Quá trình train gồm 100 epoch và 250 step per epoch, train tại Google Colab. Cụ thể kết quả:
4.2.6.1. Training model base detector - Classification_loss:
Hình 4.39 Biểu đồ classification_loss model hộp điện thoại iPhone
Hình 4.40 Biểu đồ loss model hộp điện thoại iPhone
- Regression_loss:
Hình 4.41 Biểu đồ regression_loss model hộp điện thoại iPhone
Chương 4: MƠ HÌNH HỌC MÁY VÀ BỘ DỮ LIỆU
Hình 4.42 Biểu đồ val_regression_loss model hộp điện thoại iPhone
4.2.6.2. Training cho IoU layer: - Loss:
Hình 4.43 Biểu đồ loss train IoU layer model hộp điện thoại iPhone 4.2.7. Bàn phím 4.2.7. Bàn phím
Q trình train gồm 100 epoch và 250 step per epoch, train tại Google Colab. Cụ thể kết quả:
4.2.7.1. Training model base detector - Classification_loss:
Hình 4.44 Biểu đồ classification_loss model bàn phím
- Loss:
Hình 4.45 Biểu đồ loss model bàn phím
- Regression_loss:
Hình 4.46 Biểu đồ regression_loss model bàn phím
Chương 4: MƠ HÌNH HỌC MÁY VÀ BỘ DỮ LIỆU
Hình 4.47 Biểu đồ val_regression_loss model bàn phím
4.2.7.2. Training cho IoU layer: - Loss:
Hình 4.48 Biểu đồ loss train IoU layer model bàn phím 4.2.8. Khúc gỗ hình trịn 4.2.8. Khúc gỗ hình trịn
Q trình train gồm 100 epoch và 250 step per epoch, train tại Google Colab. Cụ thể kết quả:
4.2.8.1. Training model base detector - Classification_loss:
Hình 4.49 Biểu đồ classification_loss model khúc gỗ hình trịn
- Loss:
Hình 4.50 Biểu đồ loss model khúc gỗ hình trịn
Chương 4: MƠ HÌNH HỌC MÁY VÀ BỘ DỮ LIỆU
Hình 4.51 Biểu đồ regression_loss model khúc gỗ hình trịn
- Val_resgression_loss:
Hình 4.52 Biểu đồ val_regression_loss model khúc gỗ hình trịn
4.2.8.2. Training cho IoU layer: - Loss:
Hình 4.53 Biểu đồ loss train IoU layer model khúc gỗ hình trịn 4.2.9. Đồng xu
4.2.9.1. Train cho model base detector - Classification_loss:
Hình 4.54 Biểu đồ classification_loss model đồng xu
Chương 4: MƠ HÌNH HỌC MÁY VÀ BỘ DỮ LIỆU
Hình 4.55 Biểu đồ regression_loss model đồng xu
- Val_classification_loss:
Hình 4.56 Biểu đồ val_classification_loss model đồng xu
Hình 4.57 Biểu đồ val_regression_loss model đồng xu
- Val_loss:
Hình 4.58 Biểu đồ val_loss model đồng xu
4.2.9.2. Train cho IoU layer - Loss:
Chương 4: MƠ HÌNH HỌC MÁY VÀ BỘ DỮ LIỆU
Hình 4.59 Biểu đồ loss train IoU layer model đồng xu
- Val_loss:
Hình 4.60 Biểu đồ val_loss train IoU layer model đồng xu 4.2.10. Nắp chai 4.2.10. Nắp chai
Quá trình train gồm 100 epoch và 250 step per epoch, train tại Google Colab. Cụ thể kết quả:
4.2.10.1. Training model base detector - Classification_loss:
Hình 4.61 Biểu đồ classification_loss model nắp chai
- Loss:
Hình 4.62 Biểu đồ loss model nắp chai
- Regression_loss:
Chương 4: MƠ HÌNH HỌC MÁY VÀ BỘ DỮ LIỆU
- Val_resgression_loss:
Hình 4.64 Biểu đồ val_regression_loss model nắp chai
4.2.10.2. Training cho IoU layer: - Loss:
Chương 5
5. PYTHON SERVER
GitHub source code: https://github.com/hosituan/kounter-server
5.1. Flask, Gunicorn, Flask-SocketIO và SocketIO 5.1.1. Giới thiệu 5.1.1. Giới thiệu
5.1.1.1. Flask
- Là một micro web framework để phát triển Web bằng ngôn ngữ Python ra mắt vào năm 2010 bởi nhà phát triển Amin Ronacher
- Kích thước rất nhỏ nhẹ, khơng u cầu bất kì thư viện hoặc cơng cụ nào khi cài đặt. Khơng có database abstraction layer, form validation hay bất kì component nào khơng thực sự cần thiết
- Dễ dàng để một người mới về Python phát triển được một Web Server hoặc website nhỏ
- Dễ dàng nâng cấp, mở rộng trong ứng dụng phức tạp - Sử dụng trong luận văn: Dùng để phát triển web server
- Theo khảo sát của Stack Overflow về độ phổ biến của các web framework cho thấy mức độ phổ biến của Flask tương đối cao:
Hình 5.1 Biểu đồ sử dụng web framework
Chương 5: PYTHON SERVER
o Tốc độ
o Hỗ trợ NoQuery
o Tốt giản tuyệt đối, độ phức tạp tối thiểu o Dễ dàng kết nối tiện ích mở rộng
o Cung cấp xử lý HTTP request o API độc đáo và mạch lạc o Hỗ trợ bảo mật cookie
o Trình gỡ lỗi được nhúng trong trình duyệt o Document rõ ràng và dễ sử dụng
- Nhược điểm: Vì sự đơn giản và nhỏ nhẹ của Flask nên khi sử dụng đơi khi chúng ta phải tự cài đặt những gói phần mềm khác, những gói tiện ích mở rộng hoặc là phải tự làm rất nhiều việc khác.
5.1.1.2. Gunicorn
- Gunicorn là một trong những python web server theo chuẩn WSGI (Web Server Gatewate Interface), ổn định và được triển khai nhiều trong các môi trường sản phẩm thực tế. (Vimentor, 2018)
- Gunicorn dễ sử dụng và hỗ trợ nhiều web framework khác nhau như Django, Flask,... (Vimentor, 2018)
- Hỗ trợ SSL Certificate
- Sử dụng trong luận văn: Dùng để triển khai server 5.1.1.3. Flask-SocketIo và SocketIO
- Flask-SocketIO và SocketIO là công cụ cho phép ứng dụng Flask giao tiếp 2 chiều có độ trễ thấp giữa client và server.
- Ứng dụng phía client có thể sử dụng bất kỳ ngơn ngữ nào trong JavaScript, Python, C++, Java và Swift.
- Sử dụng trong luận văn: Dùng để client theo dõi tiến độ đếm của server
5.1.2. Cài đặt và sử dụng
5.1.2.1. Flask
- Cài đặt: pip install flask - Sử dụng:
Ví dụ cài đặt hai function chính ở file server.py: app = Flask(__name__)
if __name__ == "__main__":
socketio.run(app,host='0.0.0.0',port=80,debug=False, use_reloader=False)
@app.route('/', methods=['GET', 'POST']) def welcome():
return "Hello from My Kounter"
Việc cài đặt và sử dụng Flask rất dễ dàng, chỉ với 2 function trên đã tạo được một web server có đường dẫn chính trả về 1 dòng chữ đơn giản. 5.1.2.2. Gunicorn
- Cài đặt: pip install gunicorn - Sử dụng:
Cấu hình file wsgi.py để import và sử dụng file server.py from server import app
if __name__ == "__main__": app.run()
Sau đó chạy lệnh: gunicorn --bind 0.0.0.0:8080 wsgi:app Server sẽ được khởi động với WSGI Entry Point
5.1.2.3. Flask-SocketIO và SocketIO - Cài đặt: pip install flask-socketio - Sử dụng:
Import packet vào project from flask_socketio import SocketIO, emit
Ở vị trí muốn phát kết quả về client, sử dụng hàm emit(), ở phía client sẽ