Thoughts & Insights

Blog

Writing on AI, machine learning, software engineering, and the engineering behind real-world ML systems.

67 posts

20267 posts

20242 posts

20233 posts

20222 posts

  • Airflow, MLflow or Kubeflow for MLOps?

    Machine learning is now focusing more on the data (data-centric AI), and MLOps is obviously the way to bring ML projects into production. Today, I will review three popular MLOps frameworks, which are Airflow, MLflow and Kubeflow. The target is to answer two questions: what are the differences between them, and which f...

  • With Daisykit – Everyone can build AI projects!

    Imagine you are a software engineer or a DIY hobbyist with great ideas to build AI-powered projects. However, it will be such difficulty when you know very little or nothing about AI. The complexity of deep learning models is a barrier for everyone wishing to integrate AI services into their projects. Understanding thi...

20217 posts

202012 posts

  • Cài đặt và sử dụng VS Code trên Google Colab

    GPU miễn phí từ Google Colab là môi trường rất tốt để phát triển, thử nghiệm các mô hình học máy một cách miễn phí. Tuy vậy, cá nhân tôi thấy việc dùng Notebook của Colab có phần bất tiện hơn việc code bằng trình sửa code quen thuộc là VS Code. Bài viết này sẽ hướng dẫn các bạn cài đặt và sử dụng VS Code ngay trên môi ...

  • Tìm hiểu mô hình YOLO cho phát hiện vật - Từ YOLOv1 đến YOLOv3

    YOLO - You Only Look Once là một trong những mô hình phát hiện vật tốt nhất ở thời điểm hiện tại. Dù đều được gọi là YOLO, các phiên bản của mô hình này đều có những cải tiến rất đáng kể sau mỗi phiên bản. Sau 3 phiên bản của tác giả chính Joseph Redmon là YOLOv1 đến v3. Lưu ý: Bài viết này chỉ mang tính chất tổng hợp ...

  • Advanced driver-assistance system on Jetson Nano Part 3 - Deep neural networks

    | | 23 | 46 | 79 | 288 | 166 | 270 | 209 | 209 | 207 | 64 | 138 | 31 | 123 | 87 | 2000 | Experiments I trained traffic sign classification network with image size 64x64, Adam optimizer with learning rate 0.0001, batch size 32, loss function categorical cross entropy. In order to deal with class imbalance problem, I set...

  • Advanced driver-assistance system on Jetson Nano Part 2 - Software design

    Recently, I have built a prototype of an advanced driver-assistance system (ADAS) using a Jetson Nano computer. In this project, I have successfully deployed 3 deep neural networks and some computer vision algorithms on a super cheap hardware of Jetson Nano. I decided to write this post series to share about how this s...

  • Advanced driver-assistance system on Jetson Nano Part 1 - Intro & Hardware design

    Recently, I have built a prototype of an advanced driver-assistance system (ADAS) using a Jetson Nano computer. In this project, I have successfully deployed 3 deep neural networks and some computer vision algorithms on a super cheap hardware of Jetson Nano. I decided to write this post series to share about how this s...

  • Hackathon: Xây dựng giải pháp biến đổi, stream giấy viết cho giáo dục từ xa

    Vừa rồi, chúng tôi đã tham gia Cuộc thi IBM Hackathon tổ chức tại Đại học Bách khoa Hà Nội và may mắn dành giải Nhì cho hạng mục Call For Code với giải pháp biến đổi, stream giấy viết cho giáo dục từ xa. Trong bài viết này, tôi muốn chia sẻ với mọi người về giải pháp nhóm tôi đã thiết kế và triển khai trong 48h của cuộ...

  • Chúng tôi đã xây dựng xe tự hành trên giả lập thế nào?

    Trong năm 2020, tôi và một số anh em cùng lớp đại học đã tham dự Cuộc Đua Số, một cuộc thi lập trình xe tự hành cho sinh viên. Ở vòng trường đại học, các đội chơi phải thực hiện thử thách lập trình điều khiển xe tự hành di chuyển trên đường theo biển báo và tránh các chướng ngại vật trong môi trường giả lập. Trong bài ...

  • Tìm hiểu mô hình CenterNet - Objects as Points

    CenterNet là một mạng object detection có thiết kế cực kỳ đơn giản, nhưng lại đạt được cân bằng giữa tốc độ và độ chính xác tốt vừa được ra mắt năm 2019. Ở bài viết này mình muốn giới thiệu đến các bạn những ý tưởng cơ bản của mạng này, cách thức hoạt động và cách huấn luyện CenterNet. Mình sẽ tập trung vào mục đích ph...

  • Thiết lập ban đầu cho Jetson Nano

    | | CPU | Quad-core ARM® A57 CPU | Quad-core ARM Cortex-A53, 1.2GHz. | Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit SoC @ 1.5GHz | | GPU | 128-core NVIDIA Maxwell GPU | Broadcom VideoCore IV. | Broadcom VideoCore VI. | | RAM | 4 GB 64-bit LPDDR4 | RAM: 1GB LPDDR2 (900 MHz) | RAM – 1GB, 2GB hoặc 4GB LPDDR4-240...

  • Gọi hàm Python trên C++ với OpenCV

    Có nhiều khi chúng ta cần gọi một hàm xử lý ảnh hoặc chạy mô hình học máy trên code Python từ C++. Lý do rất đơn giản, có thể là vì bạn muốn dùng luôn code Python, hoặc bạn chưa có thời gian chuyển sang code C++. Bài viết này sẽ hướng dẫn các bạn cách khởi tạo object và gọi đến phương thức Python từ code C++ và truyền ...

  • Linear Regression - Hồi quy tuyến tính cơ bản

    Linear Regression (hồi quy tuyến tính) là một trong những thuật toán cơ bản nhất của Machine Learning. Ở bài viết này, tôi sẽ giới thiệu đến các bạn khái niệm về thuật toán này, lý thuyết toán học và cách triển khai thuật toán trên Python. Bài viết này được viết bằng Jupyter Lab. Trước hết hãy import và setup các thư v...

  • Configure integrated GPU for rendering and NVIDIA GPU for CUDA works in Ubuntu 18.04

    In fact, besides CUDA tasks (which could be deep neural network training), our operating system also consumes a decent amount of memory for graphic rendering. This article will guide you to use onboard graphic card for display, thereby saving a considerable amount of GPU VRAM for model training. It's especially useful ...

20198 posts

  • Phát hiện đường thẳng với Hough Transform - OpenCV

    Hough Transform là thuật toán phát hiện đường thẳng khá hiệu quả trong xử lý ảnh. Ở bài viết này, chúng ta sẽ cùng tìm hiểu về cách thức hoạt động cũng như cách sử dụng Hough Transform để phát hiện đường thẳng trong ảnh bằng thư viện OpenCV. I. Lý thuyết Ý tưởng chung của việc phát hiện đường thẳng trong thuật toán này...

  • Thiết kế thùng rác thông minh tự phân loại rác với Raspberry Pi 3

    Nóng lên toàn cầu, bảo vệ môi trường, rác thải nhựa là những từ khoá nóng trong thời gian gần đây. Mỗi ngày, con người thải ra rất nhiều chai lọ, mà một lượng lớn trong số chúng không được xử lý đúng cách, trở thành nguyên nhân đe doạ sự sống của rất nhiều loài sinh vật và tàn phá môi trường. Tôi có nghĩ đến một giải p...

  • Xây dựng bộ phân loại VGG16 với Tensorflow Keras và áp dụng phân loại chó mèo

    Dù Tensorflow Keras đã hỗ trợ VGG16, ở bài viết này, chúng ta vẫn sẽ cùng nhau viết lại VGG16 trong Tensorflow với Keras để hiểu cấu trúc mạng và cùng thử nghiệm với dataset Kaggle Dogs and Cats để phân loại chó mèo nhé. Mình sẽ trình bày bài viết này giống như một Jupyter Notebook kèm theo kết quả đã thực hiện để mọi ...

  • Thị giác máy tính và những gì cần học để bắt đầu

    Ở bài viết này, chúng ta sẽ cùng tìm hiểu chung về ngành thị giác máy tính (computer vision) và phương pháp học để có một công việc trong ngành này. I. Sơ lược về thị giác máy tính Ta thường nhắc đến tác nhân khai sinh ra vũ trụ là vụ nổ lớn big bang. Ngày nay, người ta cũng tin rằng trong sinh học cũng có một "big ban...

  • Các hàm kích hoạt (activation function) trong neural network

    Hàm kích hoạt (activation function) mô phỏng tỷ lệ truyền xung qua axon của một neuron thần kinh. Trong một mạng nơ-ron nhân tạo, hàm kích hoạt đóng vai trò là thành phần phi tuyến tại output của các nơ-ron. Trong bài viết này, chúng ta sẽ cùng tìm hiểu các hàm kích hoạt phổ biến nhất và các ưu, nhược điểm của chúng. T...

  • Xây dựng bộ phân loại chó, mèo hay gấu trúc với k-NN

    images ... ``` Xây dựng bộ tiền xử lý và nạp dữ liệu Mở file `datasetloader.py` và chèn đoạn code sau: ```py Import necessary packages import numpy as np import cv2 as cv import os class DatasetLoader def load(self, imagepaths, verbose=-1): Initialize the list of images and labels data = [] labels = [] Loop over input ...

  • Locked myself out of SSH port Ubuntu AWS server using ufw

    Currently, I locked myself out of my VPS (Amazon EC2) after configuring ufw firewall. Here are what I've done to disable ufw and take back the control of my VPS. 1. Stop your problem instance 2. Paste this script in `Instance Settings > View/Change User Data` ``` Content-Type: multipart/mixed; boundary="//" MIME-Versio...

  • ReactJS lifecycle method inside a functional Component

    - Understand more about React component types: React Functional or Class Components: Everything you need to know . - In the case you want to combine a functional component with some lifecycle functions like `componentDidMount`, `componentWillUnmount`..., you can use `react-pure-lifecycle` package. - Detail code: ```jsx...

20184 posts

  • Những package cần có cho Ubuntu

    Dưới đây tôi xin giới thiệu một số package tôi thường dùng trên Ubuntu và cách cài đặt. Những package này là các gói phần mềm mà tôi hay dùng, chủ yếu là phục vụ các nhu cầu cơ bản của việc lập trình. Cần có ở đây chỉ mang ý nghĩa cá nhân theo ý kiến của tôi. Tôi viết bài này để lưu lại như một bản note có thể bỏ ra xe...

  • Lọc ảnh (Image Filtering)

    Lọc ảnh (làm mịn ảnh, làm mượt ảnh) là một bước rất quan trọng trong xử lý ảnh. Lọc ảnh thực tế có rất nhiều tác dụng như loại bỏ nhiễu, tìm biên đối tượng. Bài viết này sẽ giới thiệu nguyên tắc chung của lọc ảnh và một số phép lọc ảnh cơ bản. A. Nguyên tắc chung của lọc ảnh Nguyên tắc chung của các phương pháp lọc là ...

  • Các thao tác cơ bản với ảnh trên OpenCV

    | | CV8U | uchar | | CV8S | schar | | CV16U | ushort | | CV16S | short | | CV32S | int | | CV32F | float | | CV64F | double | OpenCV cũng đưa ra dạng rút gọn tên các kiểu dữ liệu Vec: ```cpp typedef Vec< uchar, 2 > cv::Vec2b typedef Vec< uchar, 3 > cv::Vec3b typedef Vec< uchar, 4 > cv::Vec4b typedef Vec< short, 2 > cv:...

  • Ảnh số và các không gian màu trong xử lý ảnh

    Ảnh số (digital image) là một thành phần biểu diễn hình ảnh trong hầu hết các thiết bị điện tử hiện nay như máy ảnh, điện thoại, máy tính, các công cụ hỗ trợ có sử dụng ảnh. Để bắt đầu với xử lý ảnh, chúng ta phải nắm được các kiến thức cơ bản về ảnh số và cách biểu diễn ảnh số trong máy tính. Bài viết này sẽ khái quát...

20177 posts

  • Xây dựng một cấu hình Emacs từ đầu

    Emacs là một trình soạn thảo văn bản đa chức năng và có thể mở rộng các chức năng một cách mạnh mẽ. Khi chưa cấu hình (tất cả thiết lập để ở mặc định), Emacs có thể coi là trình soạn thảo hơi khó dùng, giao diện khá đơn giản, nếu không nói là xấu. Tuy nhiên khi tuỳ biến bằng các tệp cấu hình, bạn có thể biến Emacs thàn...

  • Install mysql2 gem on macOS using MAMP as mySQL server

    When installing `mysql2` gem on a system using MAMP as mySQL server, you may end up with a compilation error because of incorrect mysql path. To deal with this problem, instead of `gem install mysql2`, try to specify mysql configuration directory: ```bash gem install mysql2 -- --with-mysql-config=/Applications/MAMP/Lib...

  • Minify multiple Javascript files in a folder with UglifyJS

    To minify multiple Javascript files, you can use Grunt. However, there is a much easier way to archive it using UglifyJS and Bashscript. Step 1: Install UglifyJS ``` npm install -g uglify-js ``` Step 2: Write some Bash script code to find and minify all js files in a folder ```bash for file in path/to/js/folder/.js; do...

  • Một cách nhập xâu kí tự trong C - giải quyết vấn đề của fflush cho Linux, Mac OS

    Khi lập trình C trên Windows, bạn có thể sử dụng `fflush()` để làm sạch bộ đệm trước khi nhập một xâu, tránh tình trạng "lạc trôi" của lệnh nhập xâu. Tuy nhiên khi làm việc với các hệ thống khác như Linux, hay Mac OS, mọi chuyện không đơn giản nữa: nhiều khi `fflush()` sẽ không làm việc. Bài viết này sẽ cho bạn một các...

  • Lấy địa chỉ IP thật của client trên Heroku với Nodejs

    Khi sử dụng Express js của Nodejs, bạn đơn giản chỉ cần sử dụng `req.ip` để lấy IP người dùng. Tuy thế, khi bạn ứng dụng của chúng ta được host trên Heroku thì việc lấy IP thế này sẽ cho kết quả sai, đơn giản vì Heroku thực hiện một số routing khiến IP bạn nhận được là IP của router Heroku hoặc proxy. Vậy chúng ta nên ...

  • Tạo contact form đơn giản với Nodejs - nodemailer

    Nếu website của bạn sử dụng một CMS như Wordpress thì việc tạo contact form đã khá dễ dàng với các plug-in. Tuy nhiên nếu bạn đang có một website tĩnh, bạn sẽ cần một dịch vụ để xử lí các form liên hệ của bạn. Bài viết này sẽ hướng dẫn bạn tự tạo một backend đơn giản để xử lí các form liên hệ. Form liên hệ của chúng ta...

  • Một số kĩ thuật xử lí tiếng Việt trong Javascript

    Các kĩ thuật xử lí sau sẽ giúp chúng ta thao tác với tiếng Việt dễ dàng hơn mà không cần mất công xây dựng lại. Xoá dấu tiếng Việt Hàm xoadau() sau sẽ xoá loại bỏ hoàn toàn dấu câu tiếng Việt, không phân biệt hoa thường. ```javascript function xoadau(str) { str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, 'a') s...

201615 posts

  • Kinh nghiệm ban đầu với Fedora Linux

    Cũng lâu rồi tôi không viết bài trên blog của mình. Hôm nay nhân dịp cài đặt và dùng thử hệ điều hành Fedora Linux (bản Workstation 24), tôi muốn viết một bài chia sẻ cho mọi người những kinh nghiệm đầu tiên về việc sử dụng Fedora. Trước hết, tôi xin phép so sánh Fedora với một bản phân phối linux hết sức nổi tiếng - U...

  • Thuật toán loang ứng dụng trong game dò mìn

    Thuật toán loang (thuật toán vết dầu loang) là một thuật toán dùng khá nhiều trong tin học, ứng dụng trong các bài toán thực tế như các bài toán tìm đường đi, game dò mìn, game line98... Gọi là thuật toán loang vì nguyên lí của thuật toán này rất giống với hiện tượng loang của chất lỏng. Khi ta đổ nước xuống một về mặt...

  • Xây dựng thuật toán sinh mìn trong trò chơi dò mìn Minesweeper viết bằng C

    Gần đây, Việt Anh mới viết lại trò chơi dò mìn cổ điển bằng ngôn ngữ C. Trò chơi này có thể thực hiện với những thuật toán đơn giản. Bài viết này sẽ nói về thuật toán khởi tạo mìn mỗi lúc bắt đầu trò chơi. Trước hết tôi muốn gửi bạn file mã nguồn trò dò mìn tôi viết: https://github.com/vietanhdev/minesweeper-in-c/blob/...

  • Thay đổi độ phân giải màn hình Raspberry Pi

    Khi cài đặt các phiên bản hệ điều hành dựa trên Linux, tôi nhận thấy nhiều hệ điều hành đôi lúc không nhận được độ phân giải thật của màn hình máy tính, dẫn đến việc hiển thị màn hình với độ phân giải thấp hơn mức bình thường, khiến các đối tượng trên màn hình bị mờ, nhìn rất xấu. Trên với các hệ điều hành Fedora, Ubun...

  • A very simple guide to GNU Emacs

    | | M-f | Word Forward | | M-b | Word Backward | | C-a / C-e | Jump to beginning / end of line | | M-\{ / M-\} | Paragraph Forward / Backward | | C-v / M-v | Page Forward / Backward | | M-< / M-> | Jump to beginning / end of file | | M-C-a / M-C-e | C Function Forward / Backward | Above is a very basic guide to GNU Ema...

  • Cấu hình Emacs để lập trình C

    Link hướng dẫn cài đặt và sử dụng các chức năng: http://tuhdo.github.io/c-ide.html Sau đây là vài thứ cơ bản ko cần đọc cái bên trên cài và dùng luôn đã >> Anh em thực hiện cài đặt: Mở Terminal, gõ lệnh: `git clone https://github.com/tuhdo/emacs-c-ide-demo.git ~/.emacs.d` Nếu hiện thông báo đã tồn tại thư mục ` ~/.emac...

  • Lập trình viên nên tạo website cá nhân

    Trong thời đại số mà các công nghệ, mạng xã hội đang ngày càng thể hiện sự ảnh hưởng của chúng, mỗi chúng ta không chỉ tồn tại trong thế giới thực, mà còn trong thế giới online. Sự hiện diện của mỗi người trong thế giới online đang dần trở nên quan trọng, khi mà ở đó, ta không những có thể kết nối với những người quen ...

  • Cấu trúc rẽ nhánh trong C

    Cấu trúc rẽ nhánh trong mỗi ngôn ngữ lập trình luôn luôn là một thành phần quan trọng. Đó là thành phần cơ bản tạo nên hầu hết các thuật toán hiện đại. Nếu bạn muốn mô tả một đoạn chương trình kiểu như: Nếu gặp điều kiện C thì thực hiện hành động A, ngược lại, thực hiện hành động B thì bạn chắc chắn cần sử dụng cấu trú...

  • Biến, hằng và nhập xuất dữ liệu trong C

    | | 42 | %6d | 42 | | 42 | %-6d | 42 | | 'z' | %3c | z | | 2.71828 | %10.2f | 2.71 | | "printf" | %10s | printf | b) Nhập dữ liệu từ bàn phím: Cú pháp: `scanf ("xâu kí tự…", <các con trỏ>);` Ví dụ ta muốn nhập một số nguyên vào biến a: ```c int a; scanf("%d", &a); ``` Lưu ý: Ở đây `&a` là con trỏ trỏ tới biến a. Chú ý ...

  • Toán tử trong C

    | | Postfix | `() [] -> . ++ - -` | Trái sang phải | | Unary | `+ - ! ~ ++ - - (type) & sizeof` | Phải sang trái | | Tính nhân | ` / %` | Trái sang phải | | Tính cộng | `+ -` | Trái sang phải | | Dịch chuyển bit | `<< >>` | Trái sang phải | | So sánh không ngang bằng | `< <= > >=` | Trái sang phải | | So sánh ngang bằn...

  • Cài đặt Geany – gcc làm môi trường soạn thảo và biên dịch ngôn ngữ C trên Ubuntu

    Trong bài viết này Việt Anh sẽ hướng dẫn các bạn cài Geany và gcc để soạn thảo và biên dịch chương trình viết bằng ngôn ngữ C trên Linux (cụ thể ở đây là hệ điều hành Ubuntu). 1.Trước hết bạn phải tải và cài đặt Geany: Mở Terminal (Ctrl + Alt +t) và gõ lần lượt các lệnh sau để cài đặt trình soạn thảo mã nguồn Geany: ``...

  • Cấu trúc chương trình C cơ bản

    Các thành phần của một chương trình C cơ bản bao gồm: - Các lệnh tiền xử lí - Các hàm - Các biến - Các lệnh và biểu thức - Các comment (ghi chú về code giúp ích cho công tác bảo trì và nâng cấp) Chúng ta hãy cùng nghiên cứu chương trình Hello World – Chào thế giới trong ngôn ngữ C. Chương trình này có chức năng in dòng...

  • Giới thiệu serie học lập trình C

    > Ngôn ngữ lập trình C là một ngôn ngữ mệnh lệnh được phát triển từ đầu thập niên 1970 bởi Dennis Ritchie để dùng trong hệ điều hành UNIX. Từ đó, ngôn ngữ này đã lan rộng ra nhiều hệ điều hành khác và trở thành một những ngôn ngữ phổ dụng nhất. C là ngôn ngữ rất có hiệu quả và được ưa chuộng nhất để viết các phần mềm h...

  • Thiết lập Sublime Text 3 để biên dịch và chạy ngôn ngữ C

    Xem hướng dẫn cài đặt Sublime text 3. 2. Tiếp đó cài đặt gcc để biên dịch ngôn ngữ c: Mở Terminal (Ctrl + Alt +t) và gõ lần lượt các lệnh sau để cài đặt gói build-essential: ```sh sudo apt-get update sudo apt-get install build-essential ``` 3. Cấu hình Build system cho Sublime Text để biên dịch và chạy C: Mở Sublime Te...

  • Sống với đam mê hoặc một cuộc đời nhàm chán

    Các bạn ạ, đã có rất nhiều bài viết, hội thảo, cuộc nói chuyện của các chuyên gia nổi tiếng xoay quanh chủ đề “sự đam mê“. Bạn đã đọc? Bạn đã nghe? Bạn đã thấy? Vậy bạn đã hiểu được bao nhiêu phần trăm về cái mà người ta gọi là đam mê, và về cách đam mê ảnh hưởng, xây dựng và khiến cuộc sống của mỗi con người trở nên c...