
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI HANOI UNIVERSITY OF INDUSTRY Tập san SINH VIÊN NGHIÊN CỨU KHOA HỌC Số 14 ● 2024 89
NGUYÊN CỨU VÀ XÂY DỰNG HỆ THỐNG CẢNH BÁO NẤM ĐỘC
RESEARCH AND BUILDING A POISONOUS MUSHROOMS WARNING SYSTEM
Vũ Văn Út1,*, Đào Xuân Trường1, Lương Đắc Chí2,
Phạm Văn Đại2, Nguyễn Tuấn Anh3
1Lớp KTPM 02 - K16, Khoa Công nghệ thông tin, Trường Đại học Công nghiệp Hà Nội
2Lớp KTPM 04 - K16, Khoa Công nghệ thông tin, Trường Đại học Công nghiệp Hà Nội
3Khoa Công nghệ thông tin, Trường Đại học Công nghiệp Hà Nội
*Email: utvu312223@gmail.com
TÓM TẮT
Trong bài báo này, chúng tôi đã tìm cách để có thể xây dựng một hệ thống cảnh báo nấm độc. Sau quá trình sàng lọc
tất cả các mô hình truyền thống và mô hình học sâu, cuối cùng chúng tôi xác định chọn mô hình CNN. CNN cho thấy hiệu
suất tốt trong việc phân loại hình ảnh. Cụ thể ở đây là phân loại ảnh các loại nấm, từ đó xác định xem nấm nào là có độc
và không độc. Mặc dù trình mô hình của chúng tôi chưa đạt chính xác quá cao, nhưng chúng tôi vẫn có thể nhận được kết
quả chính xác ở mức độ chấp nhận được và đã xác định thành công đối tượng có bị bệnh không dựa vào mô hình đã đào
tạo.
Từ khóa: cảnh báo nấm độc; học sâu; CNN
ABSTRACT
In this paper, we sought to build a toxic mushroom warning system. After screening all traditional and deep learning
models, we finally decided to choose the CNN model. CNN shows good performance in image classification. Specifically,
here is to classify photos of mushrooms, thereby determining which mushrooms are poisonous and which are not. Although
our model is not very accurate, we can still get acceptable results and have successfully determined whether a subject is
sick or not based on the model. train.
Keywords: warning of poisonous mushrooms; deep learning; CNN
CHỮ VIẾT TẮT
AI Artificial intelligence Trí tuệ nhân tạo
CNN Convolutional Neural Networks Mạng nơ-ron tích chập
ANN Artificial Neural Network Mạng nơ-ron nhân tạo
1. GIỚI THIỆU
Bài báo này trình bày về việc sử dụng mô hình mạng
neural học sâu (CNN) để phát hiện và cảnh báo các loại nấm
độc. Mô hình này đã cho thấy hiệu suất tốt trong việc phân
loại hình ảnh nấm và xác định được đối tượng là nấm độc
hay không độc. Việc phát triển một hệ thống nhận dạng nấm
độc và không độc có thể đóng góp một cách quan trọng vào
việc đảm bảo an toàn và chất lượng của thực phẩm, giúp
người tiêu dùng có thêm kiến thức để lựa chọn thực phẩm
một cách thông minh và an toàn. Cùng với sự phát triển của
phần cứng mạnh mẽ cho phép tính toán hàng tỷ phép tính
trong một giây, mạng CNN trở nên phổ biến hơn và được
áp dụng vào nhiều lĩnh vực khác nhau của đời sống như lĩnh
vực thị giác máy tính, lĩnh vực tự động nhận dạng giọng
nói, xử lý ngôn ngữ tự nhiên, lĩnh vực y khoa,...
2. PHƯƠNG PHÁP VÀ TƯ LIỆU
Trong phần này, bài báo sẽ trình bày chi tiết việc xây
dựng mạng tích chập CNN. CNN là thuật toán xử lý ảnh
nên mục tiêu của mô hình là phát hiện và phân loại nấm.
CNN có thể xử lý ảnh với kích thước lớn và chất lượng hình
ảnh cao rất phù hợp với dữ liệu của chúng ta là ảnh chụp 1
loài nấm. Ngoài ra, CNN còn có thể được huấn luyện bằng
GPU giúp tăng tốc độ huấn luyện lên rất nhiều lần, với
lượng dữ liệu đầu vào lớn thì điều này rất hữu ích.

TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI HANOI UNIVERSITY OF INDUSTRY Tập san SINH VIÊN NGHIÊN CỨU KHOA HỌC Số 14 ● 2024 902.1. Kiến trúc mạng CNN
Kiến trúc mạng CNN là một tập hợp các lớp
Convolution chồng lên nhau và sử dụng các hàm nonlinear
activation như ReLU và tanh để kích hoạt các trọng số trong
các node. Mỗi một lớp sau khi thông qua các hàm kích hoạt
sẽ tạo ra các thông tin trừu tượng hơn cho các lớp tiếp theo.
Mỗi một lớp sau khi thông qua các hàm kích hoạt sẽ tạo
ra các thông tin trừu tượng hơn cho các lớp tiếp theo. Trong
mô hình mạng truyền ngược (feedforward neural network)
thì mỗi nơ-ron đầu vào (input node) cho mỗi nơ-ron đầu ra
trong các lớp tiếp theo.
Mô hình này gọi là mạng kết nối đầy đủ (fully connected
layer) hay mạng toàn vẹn (affine layer). Còn trong mô hình
CNN thì ngược lại. Các layer liên kết được với nhau thông
qua cơ chế convolution.
Layer tiếp theo là kết quả convolution từ layer trước đó,
nhờ vậy mà ta có được các kết nối cục bộ. Như vậy mỗi nơ-
ron ở lớp kế tiếp sinh ra từ kết quả của filter áp đặt lên một
vùng ảnh cục bộ của nơ-ron trước đó.
Mỗi một lớp được sử dụng các filter khác nhau thông
thường có hàng trăm hàng nghìn filter như vậy và kết hợp
kết quả của chúng lại. Ngoài ra có một số layer khác như
pooling/subsampling layer dùng để chắt lọc lại các thông
tin hữu ích hơn (loại bỏ các thông tin nhiễu).
Trong quá trình huấn luyện mạng (training) CNN tự
động học các giá trị qua các lớp filter dựa vào cách thức mà
bạn thực hiện. Ví dụ trong tác vụ phân lớp ảnh, CNN sẽ cố
gắng tìm ra thông số tối ưu cho các filter tương ứng theo
thứ tự raw pixel > edges > shapes > facial > high-level
features. Layer cuối cùng được dùng để phân lớp ảnh.
Trong mô hình CNN có 2 khía cạnh cần quan tâm là tính
bất biến (Location Invariance) và tính kết hợp
(Compositionality). Với cùng một đối tượng, nếu đối tượng
này được chiếu theo các góc độ khác nhau (translation,
rotation, scaling) thì độ chính xác của thuật toán sẽ bị ảnh
hưởng đáng kể.
Pooling layer sẽ cho bạn tính bất biến đối với phép dịch
chuyển (translation), phép quay (rotation) và phép co giãn
(scaling). Tính kết hợp cục bộ cho ta các cấp độ biểu diễn
thông tin từ mức độ thấp đến mức độ cao và trừu tượng hơn
thông qua convolution từ các filter.
Đó là lý do tại sao CNN cho ra mô hình với độ chính
xác rất cao. Cũng giống như cách con người nhận biết các
vật thể trong tự nhiên.
Mạng CNN sử dụng 3 ý tưởng cơ bản:
●
các trường tiếp nhận cục bộ (local receptive field)
●
trọng số chia sẻ (shared weights)
●
tổng hợp (pooling).
- Trường tiếp nhận cục bộ (local receptive field)
Đầu vào của mạng CNN là một ảnh. Ví dụ như ảnh có
kích thước 28×28 thì tương ứng đầu vào là một ma trận có
28×28 và giá trị mỗi điểm ảnh là một ô trong ma trận. Trong
mô hình mạng ANN truyền thống thì chúng ta sẽ kết nối
các nơron đầu vào vào tầng ảnh.
Tuy nhiên trong CNN chúng ta không làm như vậy mà
chúng ta chỉ kết nối trong một vùng nhỏ của các nơ-ron đầu
vào như một filter có kích thước 5×5 tương ứng (28- 5 + 1)
24 điểm ảnh đầu vào. Mỗi một kết nối sẽ học một trọng số
và mỗi nơ-ron ẩn sẽ học một bias. Mỗi một vùng 5×5 đấy
gọi là một trường tiếp nhận cục bộ.
Hình 1. Mô tả một filter
Một cách tổng quan, ta có thể tóm tắt các bước tạo ra 1
hidden layer bằng các cách sau:
Bước 1: Tạo ra nơ-ron ẩn đầu tiên trong lớp ẩn 1.
Hình 2. Tạo nơ-ron ẩn đầu tiên
Bước 2: Dịch filter qua bên phải một cột sẽ tạo được
nơ-ron ẩn thứ 2.
Với bài toán nhận dạng ảnh người ta thường gọi ma trận
lớp đầu vào là feature map, trọng số xác định các đặc trưng
là shared weight và độ lệch xác định một feature map là
shared bias. Như vậy đơn giản nhất là qua các bước trên
chúng ta chỉ có 1 feature map. Tuy nhiên trong nhận dạng
ảnh chúng ta cần nhiều hơn một feature map.

TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI HANOI UNIVERSITY OF INDUSTRY Tập san SINH VIÊN NGHIÊN CỨU KHOA HỌC Số 14 ● 2024 91
Hình 3. Dịch trái tạo nơ-ron ẩn thứ hai
Hình 4. Feature map
Như vậy, local receptive field thích hợp cho việc phân
tách dữ liệu ảnh, giúp chọn ra những vùng ảnh có giá trị
nhất cho việc đánh giá phân lớp.
- Chia sẻ trọng số (shared weight and bias)
Đầu tiên, các trọng số cho mỗi filter (kernel) phải giống
nhau. Tất cả các nơ-ron trong lớp ẩn đầu sẽ phát hiện chính
xác feature tương tự chỉ ở các vị trí khác nhau trong hình
ảnh đầu vào. Một convolutional layer bao gồm các feature
map khác nhau. Mỗi một feature map giúp detect một vài
feature trong bức ảnh. Lợi ích lớn nhất của trọng số chia sẻ
là giảm tối đa số lượng tham số trong mạng CNN.
- Lớp tổng hợp (pooling layer)
Lớp pooling thường được sử dụng ngay sau lớp
convolutional để đơn giản hóa thông tin đầu ra để giảm bớt
số lượng nơ-ron.
Hình 5. Mô tả pooling layer
Thủ tục pooling phổ biến là Max pooling, thủ tục này
chọn giá trị lớn nhất trong vùng đầu vào 2×2
Hình 6. Quá trình pooling
Như vậy qua lớp Max Pooling thì số lượng nơ-ron giảm
đi phân nửa. Trong một mạng CNN có nhiều Feature Map
nên mỗi Feature Map chúng ta sẽ cho mỗi Max
Pooling khác nhau. Chúng ta có thể thấy rằng Max
Pooling là cách hỏi xem trong các đặc trưng này thì đặc
trưng nào là đặc trưng nhất. Ngoài Max Pooling còn có L2
Pooling.
Cuối cùng ta đặt tất cả các lớp lại với nhau thành một
CNN với đầu ra gồm các nơ-ron với số lượng tùy bài toán.
Hình 7. Mô tả 1 mạng tích chập CNN
2 lớp cuối cùng của các kết nối trong mạng là một lớp
đầy đủ kết nối (fully connected layer). Lớp này nối mọi nơ-
ron từ lớp max-pooled tới mọi nơ-ron của tầng ra.
- Cách chọn tham số cho CNN
Số các convolution layer: càng nhiều các convolution
layer thì performance càng được cải thiện. Sau khoảng 3
hoặc 4 layer, các tác động được giảm một cách đáng kể.
Filter size: thường filter theo size 5×5 hoặc 3×3.
Pooling size: thường là 2×2 hoặc 4×4 cho ảnh đầu vào
lớn.
Cách cuối cùng là thực hiện nhiều lần việc train test để
chọn ra được param tốt nhất.
2.2. Tăng cường dữ liệu trong CNN
Để tăng cường dữ liệu chuẩn bị cho việc học sâu của mô
hình CNN, chúng tôi sử dụng lớp ImageDataGenerator của

TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI HANOI UNIVERSITY OF INDUSTRY Tập san SINH VIÊN NGHIÊN CỨU KHOA HỌC Số 14 ● 2024 92thư viện Keras để tạo ra các phiên bản tăng cường của dữ
liệu hình ảnh trong quá trình huấn luyện. Việc tăng cường
dữ liệu như xoay, dịch chuyển, thu phóng, lật ngang, giúp
tăng khả năng tổng quát hóa của mô hình, giảm thiểu hiện
tượng overfitting và cải thiện độ chính xác của mô hình khi
áp dụng vào dữ liệu mới. Đồng thời, chúng tôi cũng khai
báo và khởi tạo các generators cho tập huấn luyện và tập
kiểm tra, cho phép đọc dữ liệu ảnh từ thư mục và chia thành
các batch để huấn luyện và đánh giá mô hình.
2.3. Phương pháp triển khai
Để triển khai mô hình CNN để phân loại bệnh phổi từ
ảnh X-quang. Đầu tiên chúng là sẽ cài đặt các thư viện như
Tensorflow, OpenCV, NumPy, Pandas,… Sau đó, sử dụng
ImageDataGenerator để tăng cường dữ liệu ảnh. Cụ thể,
đoạn code tạo một ImageDataGenerator với các tham số
như rotation_range, width_shift_range, height_shift_range,
shear_range, zoom_range, horizontal_flip để tạo ra những
biến thể mới từ các ảnh gốc. Tạo generator cho tập train và
test với train_generator và test_generator. Các generator
này sử dụng ImageDataGenerator đã tạo ở bước trước đó để
tạo ra các ảnh mới và đưa chúng vào mô hình. Xây dựng
mô hình CNN bằng cách sử dụng Sequential. Mô hình này
bao gồm 4 lớp Conv2D với các kích thước khác nhau, 4 lớp
MaxPooling2D và 2 lớp Dense với hàm kích hoạt relu và
softmax. Model được xây dựng cụ thể như sau:
● Lớp đầu tiên là một Conv2D layer với 32 filter, kích
thước kernel là (3, 3) và hàm kích hoạt là 'relu'. Input shape
của layer này là (200, 200, 3), tương ứng với kích thước của
ảnh đầu vào (200x200) và số lượng kênh màu RGB (3).
● Lớp thứ hai là một MaxPooling2D layer với kích
thước pool là (2, 2). Layer này giúp giảm kích thước của
feature map được tạo ra từ Conv2D layer trước đó, đồng
thời giữ lại thông tin quan trọng của feature map.
● Lớp thứ ba là một Conv2D layer với 64 filter, kích
thước kernel là (3, 3) và hàm kích hoạt là 'relu'.
● Lớp thứ tư là một MaxPooling2D layer với kích thước
pool là (2, 2).
Lớp thứ năm và lớp thứ sáu tương tự như lớp thứ ba
và lớp thứ tư, với Conv2D layers có số filter là 128, và
MaxPooling2D layers có kích thước pool là (2, 2).
● Sau đó, ta áp dụng một Flatten layer để chuyển đổi
feature map từ 3D sang 1D, để chuẩn bị cho việc kết nối với
các fully connected layers.
● Sau đó, ta thêm hai fully connected layers với số lượng
unit tương ứng là 512 và num_class (số lượng lớp) với hàm
kích hoạt softmax.
● Model này được tối ưu hóa bằng tối ưu hóa Adam, với
hàm loss được sử dụng là Sparse Categorical Crossentropy.
Sau đó, khởi chạy mô hình bằng cách sử dụng optimizer
Adam, loss function SparseCategoricalCrossentropy và
metrics accuracy, bắt đầu huấn luyện mô hình bằng cách sử
dụng fit_generator và truyền vào train_generator với số lần
lặp epochos = 50 và số bước mỗi trong mỗi lần lặp epocho
= 5.
Cuối cùng, ta lưu model bằng evaluate_generator.
3. THỰC NGHIỆM
3.1. Cơ sở dữ liệu
Hiện nay có rất nhiều hình ảnh về các loài nấm trên
Internet. Chúng tôi đã thu thập các hình ảnh tạo thành 1 bộ
cơ sở dữ liệu:
170 images : chia làm 2 tập train , validation.
Training Dataset : 150 images belonging to 2 classes.
Validation Dataset : 20 images belonging to 2 classes.
3.2. Huấn luyện
Mô hình đều được huấn luyện trên Google Colab. Mô
hình huấn luyện trên một tập dữ liệu chuẩn bị sẵn các file
train, test, validation riêng. Thay đổi chu kỳ sau mỗi lần
train để kiểm tra độ fit của mô hình.
3.3. Đánh giá trên tập thực nghiệm
Sau nhiều lần huấn luyện thì hệ thống đã được nâng cao
độ chính xác lên đến: 85% trên tập validation
Hình 8. Độ chính xác
3.4. Triển khai hệ thống
Các thư viện thường được sử dụng
Hình 9. Nhập các thư viện cần thiết
Kết nối tới GoogleDrive
Hình 10. Kết nối tới GoogleDrive

TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI HANOI UNIVERSITY OF INDUSTRY Tập san SINH VIÊN NGHIÊN CỨU KHOA HỌC Số 14 ● 2024 93 Lấy đường dẫn tới các mục chứa dữ liệu
Hình 11. Lấy đường dẫn tới các mục chứa dữ liệu
Tiền xử lí ảnh
Hình 12. Tiền xử lý ảnh
Đọc dữ liệu ảnh và đưa ảnh về cùng một kích thước
(200, 200) để tiện cho việc huấn luyện mô hình
Hình 13. Đọc dữ liệu và đưa ảnh về cùng kích thước
Xây dựng một mô hình CNN cơ bản
Hình 14. Xây dựng model
Tiếp tục, chúng ta thiết lập tham số để huấn luyện mô
hình và tiến hành train model với 50 epoch và đánh giá lại
model.
Hình 15. Thiết lập tham số và huấn luyện model
Hình 16. Save và load model
Kiểm tra lại model, thu được kết quả test chính xác với
nguồn dữ liệu đã nhập vào.
Hình 17. Dữ liệu chẩn đoán
Chẩn đoán cho thấy nấm này có độc.
Hình 18. Kết quả chẩn đoán

