4.2.1. Python19
Hình 4.5: Ngôn ngữ Python.
Python là một ngôn ngữ lập trình bậc cao cho các mục đích lập trình đa năng, do Guido van Rossum tạo ra và lần đầu ra mắt vào năm 1991. Python được thiết kế với ưu điểm mạnh là dễ đọc, dễ học và dễ nhớ. Python là ngôn ngữ có hình thức rất sáng sủa, cấu trúc rõ ràng, thuận tiện cho người mới học lập trình.
4.2.2. Anaconda20
Hình 4.6: Nền tảng mã nguồn mở Anaconda trên ngôn ngữ python.
Anaconda là nền tảng (platform) mã nguồn mở về Khoa học dữ liệu (Data Science) trên Python thông dụng nhất hiện nay.
19 Tham khảo từ: Python (programming language)
Trang | 71
4.2.3. Jupyter21
Hình 4.7: Công cụ trực quan hóa mã nguồn Jupyter.
Jupyter Notebook là một ứng dụng web mã nguồn mở cho phép bạn tạo hoặc chia sẻ những văn bản chứa live code, công thức toán học, hình ảnh trực quan, mô phỏng và văn bản. Đây là một công cụ tuyệt với để bạn có thể tạo ra những thực nghiệm, ví dụ một cách nhanh và trực quan nhất.
4.2.4. Visual Studio Code22
Hình 4.8: Trình soạn thảo mã nguồn đa nền tảng (IDE) Visual Studio Code.
VSCode là một công cụ soạn thảo mã nguồn đa nền tảng (IDE) được phát triển bởi Microsoft và giới thiệu lần đầu vào năm 2015, ra mắt chính thức vào năm 2016. VSCode có thể cài đặt và sử dụng trên cả 3 nần tảng Windows, MacOS, Linux. Nó hỗ trợ nhiều ngôn ngữ và chức năng khác nhau tùy vào ngôn ngữ sử dụng cùng với những tính năng mạnh mẽ như : IntelliSense, tích hợp Git, Debugger, Terminal và khả năng tùy chỉnh mở rộng. VSCode là mã nguồn mở và hoàn toàn miễn phí.
21 Tham khảo từ: Project Jupyter
Trang | 72
4.2.5. Google Kaggle23
Hình 4.9: Nền tảng Kaggle cung cấp môi trường làm việc với học máy.
Là một cộng đồng trực tuyến gồm các nhà khoa học dữ liệu và những người thực hành máy học. Kaggle cung cấp những dịch vụ, công cụ mà ở đó, mọi đối tượng có thể thực hành, nghiên cứu về học máy. Từ khi được thành lập vào năm 2010 đến nay, Kaggle đã tạo ra một nên tảng dữ liệu công vô cùng lớn và cung cấp một môi trường làm việc đám mây vô cùng hiệu quả dành cho các lĩnh vực khoa học dữ liệu và trí tuệ nhân tạo.
Trang web hiện hành cung cấp chức năng gần giống notebook như jupyter và các tài nguyên như: CPU, GPU, TPU.
4.2.6. NodeJS24
Hình 4.10: Nền tảng NodeJS.
NodeJS là một nền tảng (Platform) phát triển độc lập được xây dựng trên JavaScript Runtime của Chrome được xây dựng và phát triển từ năm 2009 của công ty Joyent tại Hoa Kỳ. NodeJS có thể thể xây dựng được các ứng dụng mạng một cách nhanh chóng và dễ dàng mở rộng với tốc độ xử lý nhanh, realtime thời gian thực có thể áp dụng cho các sản phẩm có lượng truy cập lớn, cần mở rộng nhanh.
23 Tham khảo từ: Kaggle
Trang | 73
4.2.7. RESTFul API25
Hình 4.11: Mô tả RESTful API.
RESTful API (REpresentational State Transfer Application Programming Interface) là một tiêu chuẩn dùng trong việc thiết kế API cho các ứng dụng web (thiết kế Web Services) để tiện cho việc quản lý resource. Nó chú trọng vào tài nguyên hệ thống, bao gồm các trạng thái tài nguyên được định dạng và được truyển qua HTTP với một số yêu cầu GET, POST, DELETE… đến một URL để xử lý dữ liệu.
4.2.8. Angular
Hình 4.12: Framework hỗ trợ xây dựng giao diện web theo từng mô-đun.
Angular là một JavaScript framework dùng để viết giao diện Web (Front-End) phổ biến sử dụng rộng rãi. Đây là một sản phẩm được viết bởi Misko Hevery và cộng sự, chính thức ra mắt vào năm 2010 được Google duy trì ở hiện tại. Angular là từ ngữ gọi chung cho Angular 2 trở lên (xuất bản 2016) được viết bằng ngôn ngữ TypeScrip là một phiên bản nâng cao của JavaScript. Đến nay đã có phiên bản Angular 11.
Trang | 74
4.2.9. ExpressJS26
Hình 4.13: Framework hỗ trợ xây dựng backend Express.js.
ExpressJS là một framework được xây dựng trên nền tảng của NodeJS cung cấp các tính năng mạnh mẽ để phát triển website hoặc mobile. ExpressJS hỗ trợ các method HTTP và Midleware tạo ra API mạnh mẽ dễ sử dụng. Hiện tại, việc sử dụng ExpressJS là miễn phí.
4.2.10. Heroku27.
Hình 4.14: Nền tảng đám mây hỗ trợ triển khai ứng dụng Heroku.
Heroku la một nền tảng đám mây cho phép các lập trình viên xây dựng, triển khai, quản lý và mở rộng ứng dụng (Platform as a service). Heroku linh hoạt và dễ sử dụng, cung cấp con đường đơn giản để đưa sản phẩm tiếp cận người sử dụng. Nó hỗ trợ nhiều ngôn ngữ lập trình như : NodeJS, Ruby, Python, PHP….. Ngoài ra còn cung cấp Database, SSL miễn phí và liên với Github một cách đơn giản. Những tính năng được hỗ trợ như : Heroku Runtime, Heroku Teams, Scale, Add-ons…giúp các nhà phát triển kiểm soát và quản lý một cách nhanh chóng và dễ dàng.
26 Tham khảo từ: Express.js
Trang | 75
4.2.1. Google Cloud Platform (GCP)28
Hình 4.15: Nền tảng điện toán đám mây Google Cloud Platform.
Google Cloud Platform, được cung cấp bởi Google, là một bộ dịch vụ điện toán đám mây chạy trên cùng một cơ sở hạ tầng mà Google sử dụng nội bộ cho các sản phẩm của người dùng cuối, như Google Search và YouTube. Bên cạnh một bộ công cụ quản lý, nó cung cấp một loạt các dịch vụ đám mây mô-đun bao gồm điện toán, lưu trữ dữ liệu, phân tích dữ liệu và học máy.
Google Cloud Platform cung cấp Cơ sở hạ tầng dưới dạng dịch vụ, Nền tảng là dịch vụ và môi trường máy tính Serverless.
4.2.2. Firebase29
Hình 4.16: Nền tảng phát triển ứng dụng và lưu trữ điện toán Firebase.
Firebase là một platform do Google cung cấp hỗ trợ việc tạo ra các Web Application, Mobile Application ra mắt vào năm 2014 với chất lượng cao, bao gồm các API đơn giản và mạnh mẽ mà không cần backend hay server. Firebase còn giúp các lập trình viên rút ngắn thời gian triển khai và mở rộng quy mô của ứng dụng mà họ đang phát triển. Ngoài ra còn dùng để làm nơi lưu trữ dữ liệu. Nó cung cấp một số dịch vụ nỗi bật như : Real- Time Database, Authentication, Firebase Cloud Messaging, Firebase Database Query, Remote Config…dễ dàng trong việc áp dụng vào những dự án.
28 Tham khảo từ: Google Cloud Platform
Trang | 76
4.2.3. Flask30
Hình 4.17: Framework xây dựng web server mini theo dạng mô-đun Flask.
Flask là một khuôn khổ web vi mô được viết bằng Python. Nó được phân loại là một microframework vì nó không yêu cầu các công cụ hoặc thư viện cụ thể. Nó không có lớp trừu tượng cơ sở dữ liệu, xác thực biểu mẫu hoặc bất kỳ thành phần nào khác mà các thư viện bên thứ ba đã có từ trước cung cấp các chức năng phổ biến.
Trang | 77
4.3.Quy trình thực nghiệm lần 1. 4.3.1. Thu thập dữ liệu. 4.3.1. Thu thập dữ liệu.
4.3.1.1. Tại sao thu thập dữ liệu quan trọng?
Thu thập dữ liệu cho phép chúng ta biết được các tính chất đặc trưng của một thông tin nào đó mà chúng ta có thể sử dụng các mẫu lặp đi lặp lại để phân tích dữ liệu. Từ những mẫu đó, ta có thể xây dựng các mô hình dự đoán bằng cách sử dụng các thuật toán học máy để tìm kiếm xu hướng và dự đoán những thay đổi trong tương lai.
Các mô hình dự đoán chỉ tốt khi dữ liệu mà chúng được xây dựng, vì vậy phương pháp sử dụng để thu thập dữ liệu tốt là rất quan trọng để phát triển các mô hình hiệu tốt. Dữ liệu phải có lỗi, hạn chế các trường hợp bất thường và chứa thông tin liên quan đến mục đích cần dự đoán. Ví dụ, giá nhà đất thì thông tin về vị trí, hướng nhà, mật độ dân số ở đó sẽ có ích rất nhiều, còn yếu tố thời tiết không ảnh hưởng đến giá nhà đất lắm nên chúng ta sẽ không cần bỏ vào bộ dữ liệu thu thập.
4.3.1.2. Các thao tác thu thập dữ liệu.
Nhóm đã dựa trên 1 tập dữ liệu có sẵn cung cấp bởi TS. Nguyễn Thiên Bảo và nhóm mở rộng bộ dữ liệu lên bởi số lượng mẫu của 1 nhãn có số lượng chênh lệnh và quá ít, sau đây là một số phương pháp mà nhóm đã áp dụng để tìm thêm dữ liệu:
• Ứng dụng chức năng tìm kiếm của công cụ hỗ trợ tìm kiếm hình ảnh (Google Image) để tìm ra những hình có tag và nội dung hình ảnh tương tự.
• Dựa các bộ sưu tập được các chuyên gia trong lĩnh vực được công khai.
• Phân loại thủ công có chọn lọc.
4.3.2. Chuẩn bị, khám phá, làm sạch và nhất quán dữ liệu. 4.3.2.1. Định dạng HDF5 là gì? 4.3.2.1. Định dạng HDF5 là gì?
Bởi nhóm không có nhiều tài nguyên nên nhóm sẽ quyết định sử dụng các nền tảng cho phép sử dụng tài nguyên miễn phí như: Google Colab, và cụ thể là dự án này sẽ áp dụng trên Kaggle, vấn đề nhóm gặp phải là việc di chuyển 1 lượng lớn ảnh lên internet là khá vất vả, để giảm thời gian cho vấn đề này, nhóm đã nén dữ liệu dưới định dạng HDF5 (*.h5). Vậy HDF5 là gì?
Trang | 78 HDF5 là một định dạng được thiết kế để lưu trữ các mảng số lớn thuộc loại đồng nhất. Nó đặc biệt tiện dụng khi bạn cần sắp xếp các mô hình dữ liệu của mình theo kiểu phân cấp và bạn cũng cần một cách nhanh chóng để truy xuất dữ liệu.
Các đặc điểm của file HDF5:
• Truy vấn tốc độ cao và tiết kiệm dung lượng lưu trữ.
• Đa nền tảng, thư viện thao tác HDF5 có nhiều ngôn ngữ như C/C++, Java, Python, Golang....
• Không giới hạn kích thước (Lưu ý rằng vẫn phụ thuộc vào dung lượng RAM hiện có).
• Dễ dàng chia sẻ, vì nó giống như dạng nén và thành duy nhất 1 file.
4.3.2.2. Các bước thực hiện.
Các bước thực hiện theo trình tự:
• Khám phá dữ liệu, thông kê số lượng cũng như xem xét chất lượng của dữ liệu.
• Chia tập dữ liệu thành 2 phần là: tập huấn luyện và tập kiểm thử/thẩm định. Tập sẽ được chia ở tỉ lệ 8 : 2. Bởi lẻ chia như vậy vì khi tập huấn luyện có quá ít thì mô hình sẽ không tốt. Ví dụ, thi ngoài đời thực ta có 10 đề thi thì với một người chưa có năng lực làm bài thi trước đó làm 8 đề thi thử (huấn luyện với điều kiện có học tập), thì năng lực người ấy sẽ tăng lên, tăng khả năng làm bài trong 2 đề thi kiểm tra còn lại (tăng khả năng dự đoán). Còn nếu thay bằng tỉ lệ khác mà tỉ lệ tập thử nghiệm nhiều hơn thì khả năng học tập của mô hình sẽ giảm xuống.
• Đọc dữ liệu ảnh và đồng nhất dữ liệu.
- Thực hiện đọc dữ liệu hình ở chế độ màu RGB bằng thư viện OpenCV- Python sang dữ liệu mảng.
- Thay đổi kích thước ảnh về một kích thước chung 224x224. - Đồng thời chuyển đổi label thành vị trí thứ tự của chúng.
• Chuẩn hóa dữ liệu và nén thành file HDF5.
- Chia mảng dữ liệu cho 255 (Giá trị max trong hệ màu RGB để đưa mảng giá trị nằm trong khoảng [0, 1]).
Trang | 79 - Khi chuẩn hóa sẽ có 2 vấn đề là dữ liệu của chúng ta sẽ từ định dạng
unit8 trở thành float64, và ta có thể chọn 1 trong những lựa chọn sau là float32 và float16 thì độ chính xác sẽ bị giảm 1 một nửa.
- Xuất ra file định dạng *.h5.
Việc đọc tập dữ liệu huấn luyện và tập dữ liệu thử nghiệm lặp lại tương tự các bước trên, kết quả sau cùng chúng ta sẽ thu được 2 file HDF5: 1 file chứa dữ liệu cho tập huấn luyện và 1 file chứa dữ liệu cho thử nghiệm/thẩm định.
Trang | 80
4.3.3. Chọn mô hình sẽ huấn luyện.
Mục đích của dự án là ứng dụng học sâu để rút trích các đặc trưng của ảnh để phân loại ảnh và một trong những mô hình Deep Learning tiên tiến đó là Convolutional Neural Network (CNNs – Mạng nơ-ron tích chập) cho phép chúng ta thực hiện được điều này. Keras là một thư viện phần mềm mã nguồn mở cung cấp giao diện Python cho các mạng nơron nhân tạo. Trong đó Keras còn cung cấp các mô hình dựng sẵn phục vụ như cầu học tập, nghiên cứu và mở rộng.
Trong nghiên cứu này, nhóm sẽ tập trung đào tạo tại các mô hình CNN phổ biến được Keras cung cấp (tham khảo ở Bảng 4.2) và kiểm tra mức độ phù hợp của các mô hình.
Một số mô hình học sâu CNN nhóm sẽ thực hiện huấn luyện đào tạo lại:
• VGG16. • VGG19. • ResNet50. • ResNet152. • InceptionV3. • DenseNet121. • DenseNet201. • Xception.
Trang | 81
Bảng 4.2: Bảng thông kê các mô hình SOTAs thư viện Keras cung cấp31.
Model Size(Mb) Top-1
Accuracy32
Top-5
Accuracy Parameters Depth
33 Xception 88 MB 0.790 0.945 22,910,480 126 VGG16 528 MB 0.713 0.901 138,357,544 23 VGG19 549 MB 0.713 0.900 143,667,240 26 ResNet50 98 MB 0.749 0.921 25,636,712 - ResNet101 171 MB 0.764 0.928 44,707,176 - ResNet152 232 MB 0.766 0.931 60,419,944 - ResNet50V2 98 MB 0.760 0.930 25,613,800 - InceptionV3 92 MB 0.779 0.937 23,851,784 159 InceptionResNetV2 215 MB 0.803 0.953 55,873,736 572 MobileNet 16 MB 0.704 0.895 4,253,864 88 MobileNetV2 14 MB 0.713 0.901 3,538,984 88 DenseNet121 33 MB 0.750 0.923 8,062,504 121 DenseNet169 57 MB 0.762 0.932 14,307,880 169 DenseNet201 80 MB 0.773 0.936 20,242,984 201 NASNetMobile 23 MB 0.744 0.919 5,326,716 - NASNetLarge 343 MB 0.825 0.960 88,949,818 - EfficientNetB0 29 MB - - 5,330,571 - EfficientNetB1 31 MB - - 7,856,239 - EfficientNetB2 36 MB - - 9,177,569 - EfficientNetB3 48 MB - - 12,320,535 - EfficientNetB4 75 MB - - 19,466,823 - EfficientNetB5 118 MB - - 30,562,527 - EfficientNetB6 166 MB - - 43,265,143 - EfficientNetB7 256 MB - - 66,658,687 -
31 Bảng thống kê các mô hình đã dựng sẵn được tham khảo trên Keras. Keras Applications.
32 Đề cập đến hiệu xuất của mô hình được tính trên tập dữ liệu ImageNet.
Trang | 82
4.3.4. Huấn luyện mô hình đã chọn trên tập dữ liệu. 4.3.4.1. Mô hình SOTAs cung cấp bởi Keras. 4.3.4.1. Mô hình SOTAs cung cấp bởi Keras.
Khi muốn gọi mô hình để sử dụng ta sử dụng thư viện của Keras trên python. Và gọi bằng cú pháp: tf.keras.applications.<tên mô hình>(<các tham số tùy chọn>).
Trong đó <các tham số tùy chọn> có các tham số chung như:
• include_top: kiểu dữ liệu boolean dùng để chấp nhận đính kèm thêm lớp
fully-connected hay không, mặc định sẽ là True, mình sẽ pre-train đưa ra số lớp khác nên trong lúc huấn luyện ta sẽ tự tạo lại lớp này cho mô hình cần huấn luyện nên ta cho giá trị tham số này là False.
• weights: sẽ có 2 lựa chọn cho chúng ta đó là None và “imagenet”, khi chọn
None thì các trọng số của model bạn sẽ cho những giá trị ngẫu nhiên, còn với tùy chọn “imagenet” thì model chúng ta sẽ lấy trọng số của model được huấn luyện trước đó sẵn có. Trong dự án này nhóm sẽ lấy giá trị trọng số trước đó của “imagenet” để đào tạo lại tiếp cho mô hình.
• input_shape: một tham quan trọng khác là kích thước đầu vào của ảnh, chúng
ta có thể tùy chỉnh kích thước này tùy thuộc vào mục tiêu và bước chuẩn bị dữ liệu của chúng ta như thế nào. Giá trị thường thấy ở giá trị đầu vào ở các mô hình là 224 × 224, một số khác có thể là 331 × 331, 299 × 299, …Trong dự án này nhóm sẽ sử dụng các kích thước khác nhau để đánh giá mô hình theo kích thước của chúng. Các kích thước sẽ là: 128 × 128, 160 × 160, 192 × 192, 224 × 224 𝑣à 256 × 256.
• classes: Là số lớp được chỉ định để mô hình có thể phân loại với điều kiện là