3.1. Xử lý ảnh số bằng thư viện OpenCV
3.1.3. Cách sử dụng OpenCV để đếm vật thể
Phương pháp này được tham khảo và tổng hợp từ nhiều bài viết khác nhau, trong đó tham khảo nhiều nhất từ document chính thức của OpenCV và 2 bài Image Segmentation with Watershed Algorithm (OpenCV Official Document, 2021) và Color Detection using OpenCV Python (Praveen, 2020)
Chương 3: PHƯƠNG PHÁP ĐẾM VẬT THỂ TRONG HÌNH ẢNH
Cụ thể:
- Bước 2, 3 (chuyển sang không gian màu HSV và lấy vùng màu đỏ) tham khảo ở Color Detection using OpenCV Python
- Bước 5 (Thresh OTSU), 7 (findCountour) , 8 (Distance Transform) tham khảo ở Image Segmentation with Watershed Algorithm Input:
Hình 3.1 Ảnh đầu vào phương pháp OpenCV
- Bước 1: Đọc hình ảnh: o Function: cv2.imread o Output:
Hình 3.2 Kết quả bước 1 phương pháp OpenCV
- Bước 2: Chuyển đổi sang không gian màu HSV
o Function: cv2.cvtColor(image, cv2.COLOR_BGR2HSV) o Output:
Chương 3: PHƯƠNG PHÁP ĐẾM VẬT THỂ TRONG HÌNH ẢNH
- Bước 3: Lấy vùng màu đỏ trong hình o Có 2 vùng màu đỏ trong HSV:
lower_red: (H=0, S=70, V=0), upper_red: (H=40, S=255, V=255) lower_red: (H=170, S=70, V=0), upper_red: (H=180, S=70, V=0) o Function: cv2.inRange(hsv_img, lower_red, upper_red)
o Output:
Hình 3.4 Kết quả bước 3 phương pháp OpenCV
- Bước 4: Chuyển đổi ảnh sang Gray, Gaussion blur
o Function: cv2.cvtColor(<image>, cv2.COLOR_BGR2GRAY) và cv2.GaussianBlur(<gray_image>,(5,5),0)
Hình 3.5 Kết quả bước 4 phương pháp OpenCV
- Bước 5: Sử dụng Thresh OTSU để chuyển sang ảnh nhị phân: o Function:
cv2.threshold(<blured_image>,0,255,cv2.THRESH_BINARY_INV+cv2. THRESH_OTSU)
Chương 3: PHƯƠNG PHÁP ĐẾM VẬT THỂ TRONG HÌNH ẢNH
Hình 3.6 Kết quả bước 5 phương pháp OpenCV
- Bước 6: Dùng Morphological Transformatiosn kiểu closing để xoá những object nhỏ:
o Function: cv2.morphologyEx(<image>, cv2.MORPH_CLOSE, np.ones((5,5), np.uint8))
Hình 3.7 Kết quả bước 6 phương pháp OpenCV
- Bước 7: Tìm contour, tính contourArea trung bình để loại bỏ những object quá nhỏ:
o Function: cv2.findContours(<image>, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
Chương 3: PHƯƠNG PHÁP ĐẾM VẬT THỂ TRONG HÌNH ẢNH
Hình 3.8 Kết quả bước 7 phương pháp OpenCV
Tới đây, ta có 2 cách để tìm quả trứng trong hình.
Cách 1: Sử dụng HoughCircle để tìm hình trịn trong từng contour
- Bước 8: Sử dụng HoughCircle để tìm hình trịn và vẽ hình trịn đó lên ảnh gốc o Function: cv2.HoughCircles() và cv2.circle()
Hình 3.9 Kết quả cách 1 phương pháp OpenCV
Cách 2: Sử dụng Distance Transform để tìm trọng tâm và vẽ lên contour
- Bước 8: Sử dụng Distance Transform và Watershed để lấy hình ảnh chứa object chắc chắn
o Function: cv2.distanceTransform(mask,cv2.DIST_L2,5) và cv2.threshold(dist_transform,0.2*dist_transform.max(),255,0)
o Lưu ý: Giá trị 0.2 là cực kì quan trọng ở bước này, nó càng lớn thì hình ảnh output càng nhỏ (gần về tâm). Cịn nếu nhỏ quá thì khơng thể tách object ra được
Chương 3: PHƯƠNG PHÁP ĐẾM VẬT THỂ TRONG HÌNH ẢNH
Hình 3.10 Kết quả bước 8, cách 2 phương pháp OpenCV
- Bước 9: Tìm contour và vẽ hình trịn bao quanh contour lên hình ảnh gốc o Function: cv2.findContour()
o Output:
Hình 3.12 Kết quả cách 2 phương pháp OpenCV 3.1.4. Kết quả 3.1.4. Kết quả
Phương pháp này đã đem lại kết quả tương đối tốt, thời gian xử lý rất nhanh. - Một số hình ảnh đã đếm đúng:
Chương 3: PHƯƠNG PHÁP ĐẾM VẬT THỂ TRONG HÌNH ẢNH
Hình 3.14 Ví dụ kết quả đúng thứ 2
Chương 3: PHƯƠNG PHÁP ĐẾM VẬT THỂ TRONG HÌNH ẢNH
Hình 3.16 Ví dụ kết quả đúng thứ 4
- Một số hình ảnh đếm sai:
Hình 3.18 Ví dụ kết quả sai thứ 2 3.1.5. Đánh giá chi tiết
- Ưu điểm:
o Kết quả tương đối tốt, độ chính xác tương đối o Thời gian xử lý thấp
o Không cần yêu cầu nhiều về phần cứng
o Thuật toán không quá phức tạp, thư viện OpenCV hỗ trợ rất đầy đủ o Chỉ cần xác định trước vùng màu của loại vật thể cần đếm là có thể phát
hiện và đếm được vật thể đó - Nhược điểm:
o Kết quả chưa thật sự chính xác ở những hình khó, bị khuất nhiều o Khoanh vùng sai vị trí, khơng khớp với kích thước quả trứng
o Kết quả thiếu chính xác ở những hình có mật độ vật thể hoặc số lượng vật thể quá cao
Chương 3: PHƯƠNG PHÁP ĐẾM VẬT THỂ TRONG HÌNH ẢNH
Vì những bất cập và khuyết điểm còn tồn đọng, ảnh hưởng trực tiếp và nghiêm trọng đối với mục đích của đề tài, nên nhóm đã đổi phương pháp xử lý bằng Học máy
3.2. Phương pháp sử dụng Học máy và Neural Networks
GitHub source code: https://github.com/hosituan/kounter-server
3.2.1. Keras RetinaNet
GitHub Source code: https://github.com/fizyr/keras-retinanet 3.2.1.1. Giới thiệu về Keras RetinaNet
“Keras implementation of RetinaNet object detection as described in Focal
Loss for Dense Object Detection by Tsung-Yi Lin, Priya Goyal, Ross
Girshick, Kaiming He and Piotr Dollár.” (Keras RetinaNet, 2021)
Keras RetinaNet là một phương pháp cài đặt một mơ hình phát hiện vật thể dựa theo mạng RetinaNet.
Sử dụng Keras RetinaNet:
Paper SKU-110K CVPR train based model dựa theo Keras Retinanet. Paper SKU-110K CVPR thêm 1 layer mới là Soft-IoU layer để train thêm một lần nữa tăng độ chính xác.
Việc train, predict và convert interface model hoàn toàn dựa vào Keras RetinaNet
3.2.1.2. Giới thiệu mạng Resnet
ResNet (Residual Network) được giới thiệu đến công chúng vào năm 2015 giành được vị trí thứ 1 trong cuộc thi ILSVRC 2015 với tỉ lệ lỗi top 5 chỉ 3.57%. Khơng những thế nó cịn đứng vị trí đầu tiên trong cuộc thi ILSVRC and COCO 2015 với ImageNet Detection, ImageNet localization, Coco detection và Coco segmentation.Hiện tại thì có rất nhiều biến thể của kiến trúc ResNet với số lớp khác nhau như ResNet-18, ResNet-34, ResNet-50, ResNet-101, ResNet-152,...Với tên là ResNet theo sau là một số chỉ kiến trúc ResNet với số lớp nhất định. (Viblo Asia, 2020)
3.2.1.3. Mục đích của mạng Resnet
Mạng Resnet là một mạng CNN được thiết kế để làm việc với hàng trăm hàng nghìn lớp chập, khi ta xây dựng mạng CNN với nhiều lớp chập sẽ xảy ra hiện tượng Vanishing Gradient. Thông thường, thuật toán sẽ đi từ output layer đến input layer, tính toán gradient của cost function tương ứng cho từng trọng số(weight) của mạng. Gradient Descent sẽ được sau đó sử dụng để cập nhật các parameter. Quá trình này sẽ được lặp lại cho đến khi các tham số của mạng được hội tụ. Cụ thể trong quá trình training, chúng ta sẽ
có 1 tham số epoch (số lần mà training set được duyệt qua một lần và trọng số được cập nhật). Nếu số lượng vịng lặp quá nhỏ thì đơi khi mạng sẽ khơng đưa ra được kết quả tốt, số vịng lặp quá lớn thì thời gian training sẽ lâu. Tuy nhiên trong thực tế, Gradients sẽ có giá trị nhỏ dần khi đi xuống các layer thấp hơn dẫn đến kết quả được cập nhật không làm thay đổi nhiều trọng số của các lớp đó, làm cho chúng khơng hội tụ và mạng sẽ không thu được kết quả tốt. Mạng Resnet ra đời để giải quyết vấn đề này. (Viblo Asia, 2020) 3.2.1.4. Cấu trúc mạng Resnet 50
Hình 3.19 Cấu trúc mạng Resnet
Một mạng Resnet 50 bao gồm:
- Một tích chập với một kernel kích thước 7x7 và 64 kernel khác với một stride có kích thước 2 là 1 layer
- Max Pooling với kích thướng stride là 2 là 1 layer
- Trong phép chập tiếp theo, có một kernel 1x1, 64 theo sau là kernel 3x3, 64 và cuối cùng là một kernel 1x1, 256. Ba lớp này được lặp lại tổng cộng 3 lần, do đó trong bước này có 9 layer
- Tiếp theo là một kernel 1x1, 128 và sau đó là 3x3, 128 cuối cùng là 1x1, 512. Bước này lặp lại 4 lần nên ta có 12 layer
- Sau đó, một kernel 1x1, 256 và hai kernel nữa là 3x3, 256 và 1x1, 1024. Điều này lặp lại 6 lần nên ở bước này có tổng cộng 18 layer
- Sau đó, một kernel 1x1, 512 và hai kernel 3x3, 512 và 1x1, 2048. Điều này lặp lại 3 lần nên ta có 9 layer
- Cuối cùng, thực hiện average pool và kết thúc bằng một layer fully connected chứa 1000 nút. Và cuối cùng là một hàm softmax để có 1 layer
Vậy tổng cộng có: 1 + 9 + 12 + 18 + 9 + 1 = 50 layers Deep Convolution Network
Chương 3: PHƯƠNG PHÁP ĐẾM VẬT THỂ TRONG HÌNH ẢNH
3.2.2. Precise Detection in Densely Packed Scenes – CVPR 2019 paper
“Man-made scenes can be densely packed, containing numerous objects, often identical, positioned in close proximity. We show that precise object detection in such scenes remains a challenging frontier even for state-of-the-art object detectors. We propose a novel, deep-learning based method for precise object detection, designed for such challenging settings. Our contributions include: (1) A layer for estimating the Jaccard index as a detection quality score; (2) a novel EM merging unit, which uses our quality scores to resolve detection overlap ambiguities; finally, (3) an extensive, annotated data set, SKU-110K, representing packed retail environments, released for training and testing under such extreme settings. Detection tests on SKU-110K and counting tests on the CARPK and PUCPR+ show our method to outperform existing state-of-the-art with substantial margins” (PapeWithCode, 2019)
Trích dẫn lời tựa từ bài báo:
“Các hình ảnh chứa các vật thể được đóng gói dày đặc, chừa nhiều đối tượng, thường giống hệt nhau, có vị trí gần nhau. Chúng tơi thấy rằng việc phát hiện đối tượng chính xác trong những cảnh như vậy vẫn là một biên giới đầy thách thức ngay cả đối với các máy dò đối tượng hiện tại. Chúng tôi đề xuất một phương pháp dựa trên học sâu để phát hiện đối tượng chính xác, được đặt ở vị trí dày đặc đầy thách thức như vậy. Những đóng góp của chúng tơi bao gồm:
- (1) Một lớp để ước tính số Jaccard là điểm chất lượng phát hiện
- (2) Đơn vị hợp nhất EM mới, sử dụng điểm chất lượng để giải quyết sự mơ hồ chồng chéo
- (3) Cuối cùng là một tập hợp dữ liệu rộng rãi – SKU110K gồm những hình ảnh hàng hoá bán lẻ đóng gói, được phát hành để đào tạo và thử nghiệm theo các cài đặt trên.
- Các thử nghiệm trên bộ dữ liệu SKU110K và kiểm tra đếm trên Carpk và PUCPR+ cho thấy phương pháp của chúng tôi vượt trội hơn với biên độ đáng kể”
Tác giả: Eran Goldman, Roei Herzig, Aviv Eiesenschtat, Jacob Goldberger, Tal Hassner, Bar-Ilan University, Tel Aviv University, Trax Retail, The Open University of Israel
Liên kết PDF chính thức:
https://openaccess.thecvf.com/content_CVPR_2019/papers/Goldman_Precise_D etection_in_Densely_Packed_Scenes_CVPR_2019_paper.pdf
Source code chính thức: https://github.com/eg4000/SKU110K_CVPR19 3.2.2.1. Mục đích của bài báo
Ở thời điểm hiện tại, những mơ hình học sâu phát hiện vật thể có thể nhanh chóng và đáng tin cậy để phát hiện vật thể trong rất nhiều khung hình thực tế. Bất chấp sự tiến bộ đáng chú ý này, trường hợp phát hiện vật thể trong khung hình dày đặc các vật thể vẫn còn là một thách thức lớn. Nhóm tác giả đã tập trung vào phát hiện vật thể trong các khung hình dày đặc như vậy. Những hình ảnh này thường là kệ hàng hoá, giao thơng, hình ảnh cảnh quang đơ thị,...
Chương 3: PHƯƠNG PHÁP ĐẾM VẬT THỂ TRONG HÌNH ẢNH
Hình 3.20 Minh hoạ SKU110K CVPR
Hình a) Phát hiện vật thể trong khung hình bằng RetinaNet cho thấy sự thiếu chính xác ở những khu vực có các vật thể quá dày
Hình b) Phát hiện vật thể trong khung hình bằng phương pháp của bài báo cho thấy được những sai sót này đã được giảm đáng kể và thực sự chính xác
Hình c) Phóng to khu vực bị phát hiện sai của RetinaNet
Hình d) Phóng to khu vực bị phát hiện sai của RetinaNet bằng phương pháp của bài
Thách thức lớn nhất để thực hiện được mục đích của bài là tìm ra được đâu là điểm kết thúc cuả một đối tượng và đâu là điểm bắt đầu một đối tượng kế nó, giảm thiểu sự chạm viền của các đối tượng gần nhau.
3.2.2.2. Tóm tắt phương pháp
- Sử dụng một loại điểm chất lượng gọi là Jaccard index được chỉ ra từ một layer mới tên là soft Intersection over Union (Soft-IoU) network layer. Thang điểm này chính là giá trị về chất lượng của mỗi bounding box được phát hiện
- Sử dụng phương pháp tên là EM-Merger unit để chuyển đổi từ những bounding box cùng Soft-IoU score sang MoG, loại bỏ sự đèn lên nhau giữa các bounding box
- Sử dụng một phương pháp tên là Mixture of Gaussians (MoG) để chỉnh sửa lại vị trí các bounding box cho phù hợp
3.2.2.3. Trực quan phương pháp
Hình 3.21 Trực quan phương pháp sử dụng học máy
Hình a) Hình ảnh đầu vào
Hình b) Base network, sử dụng mạng lưới đầu tiên để phát hiện vật thể có trong hình gồm Bounding Box (BB), objectness (Obj) và Soft-IoU layer Hình c) Sử dụng EM-Merger để chuyển đổi từ Soft-IoU sang bản đồ mật độ Gaussian
Hình d) Mơ tả những vật thể vị đè chồng chéo lên nhau
Hình e) Sau khi phân tích bản đồ mật độ Gaussion, xác định lại vị trí chính xác của các vật thể riêng biệt
Chương 3: PHƯƠNG PHÁP ĐẾM VẬT THỂ TRONG HÌNH ẢNH
Bảng so sánh giữa các bộ dataset:
Hình 3.22 So sánh các Dataset
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