Tìm hiểu một số phương pháp trong computer vision cho bài toán đếm các objects

Vài ngày trước, tôi có đọc 1 bài báo về việc áp dụng Computer Vision trong sản xuất công nghiệp (cụ thể là đếm các sản phẩm trên băng truyền sản xuất) Link bài báo . Cách tiếp cận của họ khá hay, nên hôm nay tôi sẽ chia sẻ lại những gì tôi học được thông qua bài báo đó với các bạn.

Lợi ích của việc áp dụng Computer Vision vào bài toán đếm các objects

  • Thích hợp trong sản xuất công nghiệp, giúp loại bỏ các sản phẩm lỗi
  • Đưa ra kết quả nhanh và chính xác trong thời gian ngắn

Phương pháp tiếp cận

Hướng tiếp cận của phương pháp này dựa trên Otsu thresholding and Hough transformation bởi, phương pháp này rất dễ áp dụng và cũng đem lại kết quả khá cao trong việc detect những objects.

Flow của phương pháp:

  1. Color conversion

Đầu tiên, 1 bức ảnh đầu vào sẽ được convert từ RGB color sang HSV. Trong cách tiếp cận trên, chúng ta có thể bỏ qua màu sắc và ánh sáng và chỉ quan tâm đến độ bão hòa của vật thể. Do đó, chỉ có S chanel được sử dụng. 2. Gaussian Filter

Phương pháp này giúp loại bỏ nhiễu trong bức hình,

blur = cv2.GaussianBlur(img,(5,5),0)
  1. Otsu Thresholding

Convert gray image sang binary image. Thuật toán này sẽ chuyển đổi các pixel thành 2 classes VD: 0 và 1

ret,th = cv.threshold(blur,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)

Một số thuật toán khác bạn cũng có thể áp dụng như: Simple Thresholding, Adaptive Thresholding, .....

  1. Sobel Edge Detection

Sobel Edge Detection là 1 phương pháp gradient dựa trên các đạo hàm bậc nhất, Nó tính toán các đạo hàm của hình ảnh một cách độc lập cho các trục X, Y.

Bài toán sử dụng hai kernel 3X3 được kết hợp với hình ảnh gốc để tính các xấp xỉ của các đạo hàm - một cho các thay đổi theo chiều ngang và một cho chiều dọc.

Ngoài Sobel, bạn cũng có thể áp dụng Laplacian Edge Detection để so sánh kết quả giữa 2 loại này 😄

laplacian = cv2.Laplacian(img,cv2.CV_64F)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)  # x
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)  # y

  1. Hough Circle Transform

Hough Transform là một kỹ thuật phổ biến để phát hiện bất kỳ hình dạng nào, nếu bạn có thể biểu diễn hình dạng đó dưới dạng toán học. Nó có thể phát hiện hình dạng ngay cả khi nó bị hỏng hoặc biến dạng.

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)

lines = cv2.HoughLines(edges,1,np.pi/180,200) # Hough Line Transform

# Hough Circle Transform
img = cv2.medianBlur(img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20,
                            param1=50,param2=30,minRadius=0,maxRadius=0)

Tài liệu tham khảm:

[1] https://arxiv.org/pdf/1802.05911.pdf

[2] https://docs.opencv.org/3.4