Giới thiệu dự án

Nuôi trồng thủy sản, đặc biệt là nuôi cá tra (Pangasius hypophthalmus), giữ vai trò kinh tế mũi nhọn trong cơ cấu nông nghiệp tại Đồng bằng sông Cửu Long. Theo số liệu thống kê ngành thủy sản, toàn vùng hiện có hơn 108 cơ sở sản xuất giống nhân tạo và gần 1.900 hộ ương dưỡng cá giống với diện tích trên 1.500 ha, cung ứng ra thị trường xấp xỉ 16,5 tỷ con cá bột mỗi năm (tập trung chủ yếu tại An Giang và Đồng Tháp). Mặc dù sản lượng và quy mô không ngừng gia tăng, các giao dịch mua bán cá bột, cá hương và cá giống hiện nay vẫn phụ thuộc gần như tuyệt đối vào các phương thức ước lượng thủ công truyền thống:

  • Phương pháp cân mẫu: Sử dụng cân 2 đĩa cân bì chứa nước, múc 2–5g cá đếm thủ công từng con bằng thìa để tính tỷ lệ trung bình (số con/gram), sau đó nhân với tổng trọng lượng xuất bán.
  • Phương pháp dùng dụng cụ đong (cái giăng): Sử dụng thìa đong bán cầu có đục lỗ thoát nước đã được ước định dung tích sẵn theo kinh nghiệm.
  • Phương pháp thể tích (cốc chia độ): Đo độ dâng của cột nước (2–3 cc) khi cho cá ráo nước vào để suy ra mật độ cá trên mỗi đơn vị thể tích.

Các phương pháp kể trên tồn tại nhiều nhược điểm chí mạng: tốn kém thời gian và nhân lực, độ sai số dao động từ 10% đến 20% do thao tác ước lượng chủ quan, gây tranh chấp thương mại giữa người mua và người bán. Nguy hiểm hơn, việc vớt cá ra khỏi môi trường nước khiến cá giống bị xây xát, mất nhớt, sốc nhiệt và tỷ lệ hao hụt sau vận chuyển tăng cao.

Xuất phát từ bài toán thực tế đó, dự án "Thiết kế và thi công hệ thống đếm số lượng cá giống" được nghiên cứu và phát triển nhằm tự động hóa quy trình đếm bằng công nghệ thị giác máy tính (Computer Vision) trên nền tảng phần cứng nhúng biên (Edge Computing).

+-------------------------------------------------------------------------+
|                          HỆ THỐNG ĐẾM CÁ GIỐNG                          |
|                                                                         |
|  +--------------------+      +------------------+      +-------------+  |
|  |  Module Camera CSI | ---> | Raspberry Pi 3 B | ---> |   LCD 1602  |  |
|  |  (OV5647 5MP)      |      | (OpenCV, Python) |      | (Giao tiếp  |  |
|  +--------------------+      +------------------+      |    I2C)     |  |
|           ^                           ^                +-------------+  |
|           |                           |                       ^         |
|  +--------------------+      +------------------+             |         |
|  | Bể đếm thủy tinh   |      | Nguồn DC Kép     |-------------+         |
|  | & LED chiếu sáng   |      | (5V-2.5A / 12V)  |                       |
|  +--------------------+      +------------------+                       |
+-------------------------------------------------------------------------+

Mục tiêu dự án

  1. Thiết kế và chế tạo hoàn chỉnh mô hình phần cứng độc lập (stand-alone) gồm buồng chụp ảnh cá, nguồn chiếu sáng tiêu chuẩn, khối xử lý trung tâm Raspberry Pi 3 Model B, camera CSI và màn hình hiển thị LCD 1602.
  2. Xây dựng thuật toán xử lý ảnh trên nền tảng thư viện mã nguồn mở OpenCV kết hợp Python, tự động nhận dạng, tách biên và đếm chính xác số lượng cá giống trong môi trường nước.
  3. Đạt độ chính xác đếm $\ge 96%$ trong thời gian xử lý dưới 2 giây cho mỗi khung hình tĩnh, tối ưu hóa giao tiếp hiển thị kết quả trực tiếp qua bus I2C.

Phạm vi và giới hạn kỹ thuật

  • Đối tượng đếm: Cá giống kích thước chiều dài từ 1.0 cm đến 2.0 cm.
  • Số lượng cá thể trên mỗi lần đếm: Tối đa 50 cá thể trong một khung chụp.
  • Môi trường thử nghiệm: Bể chứa thủy tinh kích thước đáy $20 \times 20\text{ cm}$, mực nước tĩnh chuẩn 2.0 cm, nền trắng tương phản cao.

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Tiêu chí đánh giá Phương pháp cân mẫu Phương pháp đong giăng / Cốc chia độ Giải pháp thị giác máy tính đề xuất
Độ chính xác Thấp (sai số 10% - 18%) Rất thấp (sai số 15% - 25%) Cao ($\ge 96%$, sai số $\le 4%$)
Tác động sinh học Cá bị stress, dễ ngạt, tỷ lệ chết tăng 5-8% Làm trầy xước biểu bì cá bột Không tiếp xúc (Non-invasive), cá bơi tự nhiên
Thời gian xử lý 5 - 10 phút/mẫu 2 - 3 phút/mẫu $\le 2$ giây/mẫu
Tính minh bạch Dễ nảy sinh tranh cãi thương mại Hoàn toàn theo cảm quan Hiển thị số liệu trực quan, lưu ảnh đối chứng
Chi phí vận hành Tốn công lao động thủ công liên tục Tốn công lao động thủ công Tự động hóa hoàn toàn

Phân tích yêu cầu kỹ thuật theo mô hình MoSCoW

  • Must Have (Bắt buộc): Khối xử lý trung tâm Raspberry Pi 3 Model B; Module Camera CSI 5MP; thuật toán phân ngưỡng tự động Otsu; tách dính Watershed; hiển thị kết quả lên LCD 1602 qua giao tiếp I2C.
  • Should Have (Nên có): Hệ thống đèn LED chiếu sáng 4 cạnh giảm thiểu bóng đổ; bể đếm phủ nền màu trắng tăng tương phản quang học; lưu trữ ảnh xử lý phục vụ kiểm định.
  • Could Have (Có thể mở rộng): Kết nối mạng không dây (Wi-Fi 802.11n) gửi dữ liệu báo cáo lên máy chủ nội bộ hoặc Dashboard quản lý.
  • Won't Have (Chưa thực hiện trong phiên bản này): Nhận diện phân loại nhiều loài cá khác nhau cùng lúc; đếm liên tục dòng chảy tốc độ cao trên 100 con/giây.

Thiết kế hệ thống

Hệ thống được module hóa thành các khối chức năng độc lập đảm bảo độ ổn định cao và dễ dàng bảo trì:

+--------------------------------------------------------------------------+
|                          KIẾN TRÚC PHẦN CỨNG                            |
|                                                                          |
|   +-----------------------+           +-----------------------------+    |
|   | Adapter 12V-3A        | --------> | Dây LED Trắng (Viền Bể Cá)  |    |
|   +-----------------------+           +-----------------------------+    |
|                                                                          |
|   +-----------------------+           +-----------------------------+    |
|   | Adapter 5V-2.5A       | --------> | Raspberry Pi 3 Model B      |    |
|   +-----------------------+           | - CPU: BCM2837 4x 1.2GHz    |    |
|                                       | - RAM: 1GB LPDDR2           |    |
|                                       +-----------------------------+    |
|                                            |                 |           |
|                                     MIPI-CSI Bus        I2C Bus (2 Dây)  |
|                                            |                 |           |
|                                            v                 v           |
|                               +-------------------+   +---------------+  |
|                               | Camera Pi V1.3    |   | Mạch PCF8574  |  |
|                               | (Sensor OV5647)   |   | -> LCD 1602   |  |
|                               +-------------------+   +---------------+  |
+--------------------------------------------------------------------------+

Bảng thông số kỹ thuật phần cứng và phần mềm

Thành phần Thông số kỹ thuật / Phiên bản Chức năng trong hệ thống
Vi xử lý trung tâm Raspberry Pi 3 Model B (Broadcom BCM2837 64-bit ARMv8 Cortex-A53 quad-core @ 1.2GHz, 1GB LPDDR2 RAM) Tiếp nhận ảnh thô từ Camera, thực thi pipeline xử lý ảnh số, điều khiển xuất dữ liệu.
Cảm biến hình ảnh Raspberry Pi Camera Module V1.3 (OmniVision OV5647 5MP, Native Resolution $2592 \times 1944$, cáp ribbon CSI 15-pin) Thu nhận ảnh tĩnh độ phân giải cao của bể cá từ khoảng cách cố định 27 cm.
Màn hình hiển thị LCD 1602 (16 ký tự $\times$ 2 dòng, HD44780 controller) tích hợp Module I2C PCF8574 (Địa chỉ 0x27) Hiển thị số lượng cá đếm được, trạng thái vận hành của hệ thống.
Chiếu sáng Dây LED SMD ánh sáng trắng ($6500\text{K}$), nguồn cấp 12VDC, gắn bao quanh 4 mặt ngoài thành kính ở độ cao 10 cm Cung cấp quang thông đồng đều, triệt tiêu hiện tượng bóng đổ (shadow artifact) và lóa sáng (specular reflection).
Hệ điều hành & Nền tảng Raspbian OS (Debian Wheezy/Jessie kernel), Python 3.x, OpenCV 3.x, NumPy, Matplotlib, smbus, i2c-tools Nền tảng thực thi giải thuật thị giác máy tính và điều khiển ngoại vi I/O.

Methodology

Dự án áp dụng phương pháp nghiên cứu phát triển kết hợp giữa mô hình lặp thực nghiệm (Iterative Prototyping) và quy trình kiểm thử từng khối:

  1. Giai đoạn 1 (Hardware Integration & Environment Setup): Thiết kế kết cấu cơ khí buồng đếm ($20 \times 20 \times 25\text{ cm}$), phủ sơn trắng bề mặt đáy và 8 cm chân thành hồ; cân chỉnh nguồn sáng LED và tiêu cự Camera.
  2. Giai đoạn 2 (Algorithm Design & Optimization): Phát triển chuỗi thuật toán xử lý ảnh trên Python/OpenCV; tối ưu hóa thời gian tính toán ma trận trên kiến trúc ARM.
  3. Giai đoạn 3 (Hardware-in-the-loop Testing & Calibration): Tích hợp giao tiếp I2C hiển thị LCD; đánh giá sai số thực tế qua các dải mật độ cá thể từ 5 đến 50 con.

Implementation và kết quả

Development process

Pipeline xử lý ảnh của hệ thống đếm tự động được triển khai theo quy trình khép kín gồm 6 giai đoạn logic:

[Ảnh màu BGR (Camera OV5647)] 
       │
       ▼
[Chuyển đổi ảnh Grayscale 8-bit] ──> Công thức chuyển đổi mức xám tối ưu
       │
       ▼
[Lọc nhiễu Gaussian Blur 5x5] ──> Khử nhiễu gợn nước và hạt muối tiêu
       │
       ▼
[Phân ngưỡng tự động Otsu] ──> Tạo mặt nạ nhị phân tách Foreground/Background
       │
       ▼
[Hình thái học (Morphology Opening)] ──> Loại bỏ cặn bẩn, rong rêu nhỏ
       │
       ▼
[Biến đổi khoảng cách & Watershed] ──> Tách các cá thể bị dính chồng mép
       │
       ▼
[Trích xuất Contour & Đếm] ──> Lọc diện tích min/max, gửi kết quả qua bus I2C -> LCD

Cơ sở toán học của các thuật toán lõi

1. Chuyển đổi không gian màu RGB sang Grayscale 8-bit: Cường độ sáng của từng pixel được xác định theo mô hình độ chói tiêu chuẩn: $$I(x, y) = 0.299 \cdot R(x, y) + 0.587 \cdot G(x, y) + 0.114 \cdot B(x, y)$$ Để tối ưu hóa tốc độ thực thi trên CPU ARM nhúng không yêu cầu tính toán dấu phẩy động phức tạp (floating-point operations), thuật toán có thể được xấp xỉ hóa bằng phép toán số nguyên: $$I(x, y) = \frac{2 \cdot R(x, y) + 5 \cdot G(x, y) + 1 \cdot B(x, y)}{8}$$

2. Phân ngưỡng nhị phân tự động Otsu (Otsu Thresholding): Thuật toán tự động tìm giá trị ngưỡng tối ưu $T^*$ bằng cách cực đại hóa phương sai giữa hai lớp (Foreground - cá giống $C_1$ và Background - nền bể $C_0$): $$\sigma_B^2(T) = \omega_0(T) \cdot \omega_1(T) \cdot \left[\mu_0(T) - \mu_1(T)\right]^2$$ Trong đó:

  • $\omega_0, \omega_1$: Xác suất xuất hiện của lớp nền và đối tượng cá.
  • $\mu_0, \mu_1$: Giá trị mức xám trung bình của hai lớp tương ứng.

3. Tách đối tượng chồng lấn bằng thuật toán Watershed: Đối với các cá thể bơi sát hoặc đè mép lên nhau, hệ thống áp dụng phép biến đổi khoảng cách (Exact Euclidean Distance Transform): $$D(p) = \min_{q \in \text{Background}} \sqrt{(x_p - x_q)^2 + (y_p - y_q)^2}$$ Sau khi tìm các điểm cực đại cục bộ làm "hạt giống" (markers), thuật toán Watershed sẽ mô phỏng quá trình dâng nước địa hình mức xám để thiết lập đường phân chia chính xác từng cá thể độc lập.

Mã nguồn xử lý ảnh lõi trên Raspberry Pi

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Hệ thống đếm số lượng cá giống tự động trên Raspberry Pi 3
Tác giả: Huỳnh Bảo Sơn - GVHD: Nguyễn Duy Thảo
Trường Đại học Sư phạm Kỹ thuật TP.HCM (2019)
"""

import cv2
import numpy as np
import smbus
import time

# --- CẤU HÌNH GIAO TIẾP I2C CHO LCD 1602 ---
I2C_ADDR = 0x27
LCD_WIDTH = 16
LCD_CHR = 1 # Chế độ gửi dữ liệu
LCD_CMD = 0 # Chế độ gửi lệnh
ENABLE = 0b00000100

bus = smbus.SMBus(1) # Bus 1 trên Raspberry Pi 3

def lcd_byte(bits, mode):
    bits_high = mode | (bits & 0xF0) | 0x08
    bits_low = mode | ((bits << 4) & 0xF0) | 0x08
    bus.write_byte(I2C_ADDR, bits_high)
    lcd_toggle_enable(bits_high)
    bus.write_byte(I2C_ADDR, bits_low)
    lcd_toggle_enable(bits_low)

def lcd_toggle_enable(bits):
    time.sleep(0.0005)
    bus.write_byte(I2C_ADDR, (bits | ENABLE))
    time.sleep(0.0005)
    bus.write_byte(I2C_ADDR, (bits & ~ENABLE))
    time.sleep(0.0005)

def lcd_init():
    for cmd in [0x33, 0x32, 0x06, 0x0C, 0x28, 0x01]:
        lcd_byte(cmd, LCD_CMD)
    time.sleep(0.005)

def lcd_string(message, line):
    message = message.ljust(LCD_WIDTH, " ")
    lcd_byte(line, LCD_CMD)
    for char in message:
        lcd_byte(ord(char), LCD_CHR)

# --- THUẬT TOÁN ĐẾM CÁ BẰNG OPENCV ---
def process_and_count_fish(image_path, min_area=30, max_area=1200):
    # 1. Đọc ảnh đầu vào từ buồng chụp
    img = cv2.imread(image_path)
    if img is None:
        raise ValueError("Không thể tải ảnh từ đường dẫn đã chỉ định.")
    
    # 2. Chuyển sang ảnh xám
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 3. Lọc nhiễu Gauss 5x5
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)
    
    # 4. Phân ngưỡng tự động Otsu nghịch đảo (Cá đen trên nền trắng)
    _, thresh = cv2.threshold(blurred, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
    
    # 5. Phép toán hình thái học loại bỏ nhiễu cặn nhỏ
    kernel = np.ones((3, 3), np.uint8)
    opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
    
    # 6. Xác định vùng chắc chắn là nền (Sure Background)
    sure_bg = cv2.dilate(opening, kernel, iterations=3)
    
    # 7. Biến đổi khoảng cách và xác định vùng đối tượng chắc chắn (Sure Foreground)
    dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
    _, sure_fg = cv2.threshold(dist_transform, 0.4 * dist_transform.max(), 255, 0)
    sure_fg = np.uint8(sure_fg)
    
    # 8. Xác định vùng chưa rõ ranh giới (Unknown Region)
    unknown = cv2.subtract(sure_bg, sure_fg)
    
    # 9. Đánh dấu Markers cho thuật toán Watershed
    _, markers = cv2.connectedComponents(sure_fg)
    markers = markers + 1
    markers[unknown == 255] = 0
    
    # Thực thi phân đoạn Watershed
    markers = cv2.watershed(img, markers)
    
    # 10. Tìm Contour và lọc theo diện tích cá thể
    fish_count = 0
    unique_markers = np.unique(markers)
    
    for marker_id in unique_markers:
        if marker_id <= 1: # Bỏ qua Background và biên
            continue
        mask = np.zeros(gray.shape, dtype="uint8")
        mask[markers == marker_id] = 255
        
        cnts, _ = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        for c in cnts:
            area = cv2.contourArea(c)
            if min_area <= area <= max_area:
                fish_count += 1
                
    return fish_count

# --- CHƯƠNG TRÌNH CHÍNH ---
if __name__ == "__main__":
    lcd_init()
    lcd_string("HE THONG DEM CA", 0x80)
    lcd_string("DANG KHOI DONG...", 0xC0)
    time.sleep(2)
    
    raw_image_path = "/home/pi/fish_capture.jpg"
    
    try:
        start_time = time.time()
        total_fish = process_and_count_fish(raw_image_path)
        latency = time.time() - start_time
        
        # Xuất kết quả ra màn hình LCD 1602
        lcd_byte(0x01, LCD_CMD) # Clear LCD
        lcd_string("KET QUA DEM:", 0x80)
        lcd_string(f"SO LUONG: {total_fish:02d} CON", 0xC0)
        print(f"[SUCCESS] Đếm thành công: {total_fish} cá thể | Thời gian: {latency:.2f}s")
    except Exception as e:
        lcd_string("LOI HE THONG!", 0x80)
        print(f"[ERROR] Chi tiết lỗi: {e}")

Testing và validation

Quá trình kiểm thử hệ thống được thực hiện qua 5 kịch bản mật độ với các mẻ cá giống kích thước $1.0 - 2.0\text{ cm}$ bơi tự do trong bể đếm tiêu chuẩn.

Bảng kết quả thực nghiệm và sai số hệ thống

Kịch bản thử nghiệm Số lượng thực tế (Con) Số lượng hệ thống đếm (Con) Sai số tuyệt đối (Con) Độ chính xác (%) Thời gian xử lý TB (s)
Mẻ 1 (Mật độ rất thấp) 10 10 0 100.0% 1.12
Mẻ 2 (Mật độ thấp) 20 20 0 100.0% 1.18
Mẻ 3 (Mật độ trung bình) 30 29 -1 96.67% 1.25
Mẻ 4 (Mật độ khá cao) 40 39 -1 97.50% 1.34
Mẻ 5 (Mật độ tối đa) 50 48 -2 96.00% 1.48
Giá trị trung bình 30 29.2 0.8 98.03% 1.27
BIỂU ĐỒ SO SÁNH: SỐ CÁ THỰC TẾ VS HỆ THỐNG ĐẾM
Số con
 50 ┼─────────────────────────────────────────────● Thực tế: 50
    │                                             ▲ Đếm: 48 (96.0%)
 40 ┼───────────────────────────────● Thực tế: 40
    │                               ▲ Đếm: 39 (97.5%)
 30 ┼─────────────────● Thực tế: 30
    │                 ▲ Đếm: 29 (96.7%)
 20 ┼─────────● Thực tế: 20
    │         ● Đếm: 20 (100%)
 10 ┼─● Thực tế: 10
    │ ● Đếm: 10 (100%)
  0 ┴─┴─────────┴─────────┴─────────┴─────────┴──
     Mẻ 1      Mẻ 2      Mẻ 3      Mẻ 4      Mẻ 5

Kết quả đạt được

  • Hoàn thiện phần cứng: Thi công thành công khung buồng đo khép kín kích thước $20 \times 20 \times 25\text{ cm}$ bằng kính trong suốt, cách ly ánh sáng tạp từ môi trường xung quanh; hệ thống LED viền 12V phân bổ ánh sáng đẳng hướng loại trừ 99% hiện tượng bóng đáy.
  • Hiệu năng xử lý: Thời gian trích xuất và đếm trung bình chỉ 1.27 giây/ảnh, đáp ứng tiêu chuẩn xử lý tiệm cận thời gian thực (near real-time) trên hệ nhúng Raspberry Pi 3.
  • Chỉ số độ chính xác: Tỷ lệ đếm chính xác trung bình đạt 98.03% đối với dải cá thể dưới 50 con, vượt trội hoàn toàn so với mục tiêu ban đầu đề ra ($\ge 96%$).

Đổi mới và đóng góp

  1. Chuyển đổi phương thức phi tiếp xúc (Non-invasive Vision Counting): Thay thế toàn bộ thao tác vớt, cân, đong cơ học gây sốc sinh học cho cá bằng giải pháp thu nhận quang học tĩnh. Cá hoàn toàn bơi lội tự nhiên trong môi trường nước $2\text{ cm}$, giảm tỷ lệ tổn thương và chết sau đếm về mức xấp xỉ 0%.
  2. Giải quyết triệt để bài toán cá bơi dính chùm bằng Watershed: Ứng dụng thành công chuỗi biến đổi khoảng cách kết hợp phân vùng lưu vực (Marker-controlled Watershed Segmentation), giúp hệ thống tách biệt chính xác các cá thể nằm đè hoặc bơi sát nhau với hiệu suất phân tách thành công đạt trên $94%$.
  3. Hệ thống nhúng độc lập, chi phí thấp (Cost-effective Edge System): Thiết kế hoàn chỉnh thiết bị không cần phụ thuộc vào máy vi tính cấu hình cao (PC), tối ưu hóa toàn bộ thuật toán chạy mượt mà trên phần cứng nhúng tiêu thụ công suất thấp ($< 15\text{W}$).

Ứng dụng thực tế và triển khai

Kịch bản ứng dụng thực tế

  • Trại sản xuất cá giống nhân tạo: Đặt tại khâu đóng túi oxy xuất bán tại các tỉnh An Giang, Đồng Tháp, Cần Thơ; đếm nhanh từng mẻ 50 con làm mẫu chuẩn định lượng trước khi xuất xưởng hàng triệu cá bột.
  • Hộ nông dân thu mua cá giống: Kiểm tra nhanh mật độ cá giống trong các bể ươm định kỳ để hiệu chỉnh lượng thức ăn phù hợp mà không làm cá bị trầy xước.

Hướng dẫn lắp đặt và triển khai

+--------------------------------------------------------------------------+
|                  SƠ ĐỒ BỐ TRÍ HÌNH HỌC BUỒNG ĐẾM                        |
|                                                                          |
|                           [ Camera CSI OV5647 ]                          |
|                                     │                                    |
|                                     │ Khoảng cách H = 27 cm              |
|                                     ▼                                    |
|             ┌───────────────────────────────────────────────┐            |
|             │               Thành bể thủy tinh              │            |
| ════════════│═══════════════════════════════════════════════│════════════ |
| [ Dây LED ] │  - - - - - - - Mực nước h = 2 cm - - - - - -  │ [ Dây LED ]|
| Cao 10 cm   │                                               │ Cao 10 cm  |
| ════════════│═══════════════════════════════════════════════│════════════ |
|             │ ██████████ Sơn trắng đáy và chân hồ █████████ │            |
|             └───────────────────────────────────────────────┘            |
|                              Đáy bể 20x20 cm                             |
+--------------------------------------------------------------------------+
  1. Thiết lập phần cứng:
    • Cố định Camera Raspberry Pi V1.3 chính giữa tâm nóc buồng chụp ở độ cao chuẩn $H = 27\text{ cm}$ tính từ đáy bể để trường nhìn (FOV) bao phủ trọn vẹn diện tích đáy $20 \times 20\text{ cm}$.
    • Dán dải LED 12V trắng quanh 4 mặt ngoài thành kính ở độ cao $10\text{ cm}$. Đổ nước sạch vào bể đạt mực nước $h = 2\text{ cm}$.
  2. Kết nối mạch I/O:
    • Cáp CSI nối từ Camera vào cổng Camera Interface trên Raspberry Pi 3.
    • Module PCF8574 LCD nối vào 4 chân GPIO: Pin 2 (5V), Pin 9 (GND), Pin 3 (SDA/GPIO2), Pin 5 (SCL/GPIO3).
  3. Cấu hình phần mềm:
    sudo raspi-config # Kích hoạt giao tiếp Camera và I2C
    sudo apt-get update && sudo apt-get install -y python3-opencv python3-smbus i2c-tools
    sudo i2cdetect -y 1 # Kiểm tra địa chỉ hiển thị 0x27 của LCD
    python3 fish_counter.py # Chạy chương trình đếm
    

Bảng dự toán chi phí phần cứng (Bill of Materials - BOM)

Hạng mục linh kiện Số lượng Đơn giá ước tính (VNĐ) Thành tiền (VNĐ)
Board Raspberry Pi 3 Model B 01 950.000 950.000
Module Camera Raspberry Pi V1.3 5MP 01 250.000 250.000
Màn hình LCD 1602 + Module I2C PCF8574 01 75.000 75.000
Bể kính $20 \times 20 \times 25\text{ cm}$ + Gia công sơn phủ 01 120.000 120.000
Hệ thống đèn LED 12V + Adapter 12V-3A 01 bộ 130.000 130.000
Nguồn adapter 5V-2.5A chuyên dụng Raspberry Pi 01 90.000 90.000
Khung giá đỡ mica/gỗ + Phụ kiện dây nối 01 bộ 150.000 150.000
TỔNG CỘNG CHI PHÍ PHẦN CỨNG 1.765.000 VNĐ

Hạn chế và hướng phát triển

Hạn chế kỹ thuật

  • Giới hạn số lượng cá thể: Khi mật độ cá vượt quá 50 con trong khung chụp $20 \times 20\text{ cm}$, các cá thể có xu hướng xếp chồng tầng lên nhau theo chiều sâu của cột nước, dẫn đến hiện tượng che khuất quang học (occlusion), làm tăng sai số thiếu từ $4%$ lên $12%$.
  • Độ nhạy quang học môi trường: Thuật toán phân ngưỡng Otsu phụ thuộc vào độ trong suốt của nước. Nếu nước bị đục hoặc có nhiều bọt khí li ti, hệ thống có thể nhận diện nhầm là đối tượng cá thể nhỏ.

Hướng phát triển mở rộng

  1. Nâng cấp giải thuật Deep Learning: Tích hợp các mô hình mạng nơ-ron học sâu tối ưu hóa cho biên như Tiny-YOLOv8 hoặc MobileNet-SSD để phân loại và đếm đa loài cá thể ngay cả trong môi trường nước có độ đục cao.
  2. Đếm liên tục trên dòng chảy (Continuous Flow Channel): Thiết kế máng trượt trong suốt kết hợp camera tốc độ cao (High-speed Global Shutter Camera) và giải thuật theo vết đối tượng đa mục tiêu (Multi-Object Tracking - DeepSORT), nâng công suất đếm lên $5.000 - 10.000\text{ con/phút}$.
  3. Kết nối Internet vạn vật (IoT): Phát triển module truyền thông không dây ESP32/Wi-Fi đồng bộ dữ liệu đếm lên đám mây (Cloud Database), xuất hóa đơn điện tử tự động cho các bên giao dịch.

Đối tượng hưởng lợi

+---------------------------------------------------------------------------+
|                          ĐỐI TƯỢNG HƯỞNG LỢI                              |
|                                                                           |
|   SINH VIÊN & NGHIÊN CỨU SINH      LẬP TRÌNH VIÊN NHÚNG & THỊ GIÁC MÁY    |
|   - Nguồn tài liệu học tập mẫu     - Source code xử lý ảnh thực tế        |
|   - Ứng dụng OpenCV trên ARM       - Kiến trúc tối ưu hóa I2C/CSI         |
|                                                                           |
|   CHỦ CƠ SỞ & NÔNG DÂN THỦY SẢN    CHUYÊN GIA NÔNG NGHIỆP CÔNG NGHỆ CAO  |
|   - Tiết kiệm 85% thời gian đếm    - Cơ sở dữ liệu mẫu cá giống           |
|   - Giảm 100% rủi ro sốc sinh học  - Tiền đề tự động hóa ao nuôi          |
+---------------------------------------------------------------------------+
  • Sinh viên và Nghiên cứu sinh: Cung cấp tài liệu tham khảo hoàn chỉnh về quy trình thiết kế hệ thống nhúng từ khâu tính toán nguồn, giao tiếp bus CSI/I2C đến xây dựng pipeline thị giác máy tính OpenCV trên kiến trúc Linux ARM.
  • Kỹ sư phát triển phần mềm/Phần cứng: Cung cấp mẫu thiết kế (design pattern) tối ưu cho các bài toán xử lý ảnh biên thời gian thực với tài nguyên tính toán giới hạn.
  • Cơ sở sản xuất và Nông dân nuôi trồng thủy sản: Giúp tiết kiệm $85%$ thời gian kiểm đếm, triệt tiêu tổn thất hao hụt do cá chết vì tiếp xúc cơ học, đảm bảo tính khách quan và minh bạch trong các hợp đồng giao thương giống thủy sản.

Câu hỏi thường gặp

1. Hệ thống có yêu cầu máy tính cấu hình cao để vận hành không?

Không. Toàn bộ chương trình xử lý ảnh và điều khiển hiển thị đều được thực thi độc lập trên vi xử lý Broadcom BCM2837 của board mạch nhúng Raspberry Pi 3 Model B. Người dùng chỉ cần cấp nguồn là hệ thống tự động khởi động và hiển thị kết quả trực tiếp ra màn hình LCD 1602.

2. Khi cá bơi đè lên nhau, hệ thống giải quyết như thế nào để tránh đếm thiếu?

Hệ thống sử dụng thuật toán phân đoạn Watershed kết hợp phép biến đổi khoảng cách (Distance Transform). Khi các cá thể tiếp xúc mép, thuật toán sẽ dựa vào cực đại khoảng cách cục bộ để xác định tâm của từng cá thể và thiết lập "đường biên phân cách rãnh nước", giúp tách rời và đếm chính xác từng đối tượng riêng biệt.

3. Có thể mở rộng để đếm các loại thủy sản khác như tôm giống hay cá kích thước lớn hơn không?

Hoàn toàn có thể. Người dùng chỉ cần hiệu chỉnh hai tham số trong mã nguồn: diện tích lọc đường biên (min_area, max_area) và tỷ lệ ngưỡng hạt giống Watershed để phù hợp với kích thước quang học của loài thủy sản mục tiêu.

4. Nguồn sáng LED viền xung quanh bể có vai trò gì đặc biệt?

Đèn LED 12V viền quanh 4 mặt ngoài thành bể giúp tạo ra chùm sáng xuyên ngang đồng đều. Thiết kế này triệt tiêu bóng đổ của cá xuống đáy hồ và ngăn hiện tượng phản xạ lóa sáng mặt nước lọt vào ống kính camera, đảm bảo chất lượng ảnh nhị phân sau bước phân ngưỡng Otsu đạt độ sắc nét cao nhất.

5. Chi phí đầu tư toàn bộ hệ thống khoảng bao nhiêu và thời gian hoàn vốn?

Tổng chi phí linh kiện phần cứng để thi công một máy hoàn chỉnh xấp xỉ 1.765.000 VNĐ. Đối với một cơ sở ương dưỡng cá giống quy mô trung bình (xuất bán 100.000 con/tháng), việc giảm tỷ lệ hao hụt cá giống và tiết kiệm nhân công đếm sẽ giúp cơ sở thu hồi vốn đầu tư chỉ sau 1 đến 2 tháng vận hành.


Kết luận

Đề tài "Thiết kế và thi công hệ thống đếm số lượng cá giống" đã giải quyết thành công bài toán tự động hóa kiểm đếm thủy sản bằng công nghệ thị giác máy tính nhúng. Với việc kết hợp tối ưu giữa phần cứng Raspberry Pi 3 Model B, Camera CSI 5MP và giải thuật phân vùng Watershed trên OpenCV, hệ thống đạt độ chính xác ấn tượng 98.03%, thời gian xử lý chỉ 1.27 giây/lần đếm và chi phí sản xuất cực kỳ tiết kiệm dưới 1.8 triệu đồng.

Dự án không chỉ khẳng định tính khả thi cao trong việc ứng dụng công nghệ 4.0 vào sản xuất nông nghiệp thực tiễn tại Đồng bằng sông Cửu Long, mà còn mở ra tiềm năng thương mại hóa rộng rãi để phát triển các thiết bị đếm phân loại thủy hải sản thông minh trong tương lai.