a) Camera
Phụ thuộc vào từng ứng dụng cụ thể mà chúng ta sẽ có những hệ thống xử lý ảnh khác nhau. Đối với camera trong xử lý ảnh là nơi để cung cấp đầu vào trực tiếp của nguồn ảnh số nên cần có những tiêu chí nhất định. Trong công nghiệp đóng gói, người ta sử dụng hệ thống xử lý ảnh để kiểm tra xem các sản phẩm đã được dán nhãn chưa hoặc kiểm tra nhãn hiệu bao bì có đúng với thành phần chuẩn bị được đóng gói không. Trong công nghiệp dược phẩm, áp dụng hệ thống xử lý ảnh để kiểm tra số lượng viên thuốc có trong vỉ thuốc. Trong lĩnh vực điện, điện tử xử lý ảnh dùng để phát hiện sự thiếu sót các mối hàn sau khi hàn các chân linh kiện vào board mạch. Hiện nay, camera sử dụng trong công nghiệp có nhiều loại như: area scan camera, line scan camera và network camera. Area scan camera, cung cấp chất lượng hình ảnh hàng
36
đầu với tỷ lệ giá/hiệu suất nổi bật. Được áp dụng trong nhiều lĩnh vực, từ tự động hóa nhà máy và giám sát giao thông (ITS) đến hệ thống bán lẻ, dược phẩm.Line scan camera, thích hợp cho các ứng dụng cần cả tốc độ cao và chất lượng hình ảnh cao. Loại camera này không theo dõi toàn bộ ảnh mà đánh giá ảnh chính xác theo từng dòng. Thường được sử dụng trong quá trình kiểm tra chất lượng hàng hóa và quy trình phân loại. Network camera, thường được sử dụng để giám sát với chất lượng hình ảnh vượt trội và hiệu suất mạnh mẽ trong môi trường ánh sáng thấp.
Hình 3.2: Camera trong xử lý ảnh
Có thông số quan trọng trong lựa chọn camera phục vụ xử lý ảnh:
Field of view (FoV): diện tích kiểm tra mà các camera cần quan sát được. Working distance (WD): khoảng cách từ mặt trước của Len đến nền đối tượng
Smallest feature (SF): kích thước của đối tượng nhỏ nhất muốn phát hiện trong ảnh, kích thước này được đại diện bởi khoảng cách giữa 2 điểm ảnh Cần xét tới là Smallest Feature (SF), ví dụ: trong một ứng dụng đo kích thước 1 đối tượng có diện tích 500mmx500mm, khách hàng yêu cầu sai số là < 1mm. Lúc này ta cần tính giá trị Resolution (DxR pixel) của camera để có thể chụp được toàn diện tích đối tượng mà đảm bảo được sai số kích thước là <1mm. Ta lập lên công thức tỷ lệ như sau:
500 mm <---> n pixel 1 mm <----> 2 pixel
D=R= (500x2)/0.5=2000px
37
Cần chú ý: khi chọn Monochorme nếu ảnh đen trắng không làm ảnh hưởng đến kết quả đo, giá trị 90f(frame) là tốc độ thu hình của camera, 90f có nghĩa là 90 hình/giây, nếu ứng dụng không yêu cầu tốc độ cao thì có thể cân nhắc chọn loại camera có tốc độ thu hình thấp hơn để hạ giá thành. Ta chú ý thông số 1”, đây là thông số sẽ giúp ta suy ra được giá trị Sensor Size của cảm biến dựa vào:
Hình 3.3: Một số định dạng cảm biến ảnh phổ biến
Khi có được sensor size (SS) là 13.2 mm. Từ đây là dựa vào quy tắc tam giác đồng dạng tính được giá trị tiêu cự của ống kính Focal Length (FL): FL=WD*SS/FoV. Việc chọn tiêu cự của ống kính sao cho đáp ứng được yêu cầu của dự án sẽ phụ thuộc vào khoảng cách WD, WD có thể là khoảng cách các kỹ sư tự ý thiết lập nếu không bị giới hạn về phần cứng (kỹ sư thích đặt camera cách đối tượng bao nhiêu cũng được), hoặc cũng có thể do yêu cầu của phần cứng là cần cách mặt nền đặt đối tượng cần kiểm tra một khoảng cách bao nhiêu đó. Trong trường hợp này ta ví dụ ta có thể đặt camera cách đối tượng 500mm chẳng hạn, thì suy ra: FL=500*13,2/500=6.6mm.
38
b) Máy tính nhúng Raspberry Pi
Raspberry Pi 4 Model B ra mắt tháng 6/2019 với nhiều nâng cấp rất đáng kể giúp tăng hiệu năng của máy tính mini này lên tới 3x lần.
Thông số kỹ thuật của Raspberry Pi 4 Model B:
Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit SoC 1.5GHz
Có 3 lựa chọn RAM: 2GB, 4GB hoặc 8GB LPDDR4-2400 SDRAM
Wifi chuẩn 2.4 GHz và 5.0 GHz IEEE 802.11ac. Bluetooth 5.0, BLE
Cổng mạng Gigabit Ethernet
Có 1cổng USB tốc độ cao 3.0 và 2 cổng thường USB 2.0
Chuẩn 40 chân GPIO, tương thích với các phiên bản trước
Hỗ trợ 2 cổng ra màn hình chuẩn Micro HDMI với độ phân giải lên tới 4K
Cổng MIPI DSI
Cổng MIPI CSI
Cổng AV 4 chân
H.265 (4kp60 decode), H264 (1080p60 decode, 1080p30 encode)
OpenGL ES 3.0 graphics
Khe cắm Micro-SD cho hệ điều hành và lưu trữ
Nguồn điện DC 5V – 3A DC chuẩn USB-C
5V DC via GPIO header (minimum 3A*)
Hỗ trợ Power over Ethernet (PoE) (yêu cầu có PoE HAT)
39 c) Màn hình hiển thị
Học viên sử dụng màn hình độ phân giải 1024 × 600, kết nối HDMI, tấm nền IPS siêu sáng, tiêu thụ điện năng thấp. Màn hình hỗ trợ các chuẩn sau:
Hỗ trợ Raspbian, cảm ứng 5 điểm, không cần cài driver
Hỗ trợ Ubuntu / Kali / WIN10 IoT, cảm ứng đơn điểm, không cần cài driver Hỗ trợ Retropie, không cần cài driver
Tương thích mọi phiên bản Raspberry Pi
Hình 3.6: Kết nối giữa màn hình HDMI 7 inch và Raspberry Pi
Để màn hình có thể chạy ổn định thì sau khi kết nối cần tiến hành thực hiện Config cho màn hình: max_usb_current=1 hdmi_group=2 hdmi_mode=1 hdmi_mode=87 hdmi_cvt 1024 600 60 6 0 0 0 3.2Thiết lập phần mềm hệ thống 3.2.1 Thiết lập Python
Học viên đã sử dụng python từ thời sinh viên và vẫn đang áp dụng ngôn ngữ này trong lập trình các dự án hằng ngày, có thể nói đây là ngôn ngữ lập trình quen thuộc của học viên. Python trở nên phổ biến do có khả năng chạy đa nền tảng, đồng thời khai báo biến linh động, lập trình rất dễ dàng với hệ thống thư viện và cộng đồng hỗ trợ lớn mạnh. Sử dụng python cho các ứng dụng học máy trở nên rất phổ biến, hiện nay đa số các thư viện đều hỗ trợ lập trình trên nền tảng Python. Phần mềm này khả cấp phát bộ nhớ linh động, cấu hình nhanh chóng, phù hợp với chương trình sử dụng bộ nhớ cấp phát biến động như các chương trình học máy.
40
Thông thường, sau khi đã có tổng hợp nghiên cứu mạng tích chập và mô hình hệ thống, cần tiến hành tối ưu hóa tốc độ đáp ứng, lúc này lựa chọn tốt nhấp là sử dụng các ngôn ngữ máy, đồng thời tính toán phần cứng tương thích, tốt nhất là sử dụng các hệ thống chạy dựa trên FPGA sẽ nhận được hiệu năng tốt nhất. Các hệ thống này thường có chi phí cao, thiết kế khó khăn, thường phù hợp với các hệ thống lớn, bài toán phức tạp thật sự. Trong phạm vi luận văn này, học viên lựa chọn python vừa để mô phỏng, tính toán và chạy thử các mô hình huấn luyện, và các mô hình mạng. Sử dụng python sẽ rất linh hoạt trong thay đổi kiến trúc mạng, dễ dàng thử nghiệm và đánh giá hệ thống hơn.
$sudo apt-get install build-essential checkinstall
$sudo apt-get install libreadline-gplv2-dev
libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev
Hình 3.7: Cài đặt thành công Python
3.2.2 Thiết lập TensorFlow
Thư viện Tensorflow là thư viện của Google được tạo ra với mục đích chính là hỗ trợ người dùng nghiên cứu và thiết kế các chương trình về Machine Learning. Như đã trình bày ở trên, số lượng người dùng thư viện này càng nhiều và số lượng nghiên cứu, sản phẩm được tạo ra từ Tensorflow cũng đang phát triển với tốc độ rất nhanh. Với bài toán về học máy, số lượng các phép tính ma trận, vector là rất lớn. Việc cải thiện tốc độ các tính toán về ma trận làm tăng tốc độ xử lý chương trình lên rất nhiều. Thư viện Tensorflow hỗ trợ tính toán các phép toán về ma trận rất tốt trên cơ sở các phương pháp tính toán ma trận đã được tối ưu từ các nhà toán học. Ngoài các phép tính toán ma trận, vector Tensorflow đã tích hợp nhiều các phép huấn luyện phổ biến đã được nghiên cứu và công bố trong thời gian gần đây. Với các thuật toán tối ưu phức tạp để có thể hiểu và thực hiện lập trình để tạo ra hàm huấn luyện lấy đi nhiều thời gian của các nhà nghiên cứu và lập trình viên, chính vì thế tính năng này của Tensorflow giúp cho người sử dụng tiết kiệm được rất nhiều thời gian.
41
Để thiết lập TensorFlow cần cập nhật trên Raspberry Pi để tránh bị xung đột các bản cài khi tiến hành phân giải gói cài đặt TensorFlow
Để cài đặt các gói này, hãy chạy các lệnh sau trong terminal:
sudo apt update
sudo apt install python3-dev python3-pip python3-venv
Điều hướng đến thư mục muốn lưu trữ môi trường ảo Python 3.0 và tiến hành thiết lập:
mkdir tensorflow_files cd tensorflow_files
Khi đang ở bên trong thư mục. Để tạo một môi trường ảo, chạy lệnh sau:
python3 -m venv virtualenv
Lệnh này sẽ tạo một thư mục có tên là virtualenv. Nó chứa một bản sao của tệp nhị phân Python, trình quản lý gói PIP, thư viện Python tiêu chuẩn và các tệp hỗ trợ khác.
Tiến hành kích hoạt môi trường ảo:
source virtualenv/bin/activate
Sau khi kích hoạt môi trường, thư mục bin của môi trường ảo sẽ được thêm vào đầu biến $PATH, nó sẽ hiển thị tên của môi trường ảo hiện đang sử dụng, tức là virtualenv.
Cập nhật gói PIP trước khi cài đặt:
pip install –upgrade pip
Tiến hành cài đặt TensorFlow:
pip install — upgrade TensorFlow
3.2.3 Thư viện Numpy
Numpy là một thư viện nền tảng sử dụng cho tính toán số học được sử dụng cho ngôn ngữ lập trình Python. Nó bao gồm:
Mảng N-chiều mạnh mẽ Các hàm được tối ưu tinh vi
Thư viện tích hợp cho ngôn ngữ C/C++ và Fortan
Hữu ích đối với tính toán đại số tuyến tính, biến đổi Fourier, và tạo các chuỗi số ngẫu nhiên
42
Không chỉ là công cụ phục vụ hữu ích cho các tín toán khoa học, Numpy còn cung cấp khả năng chứa các dữ liệu nhiều chiều hiệu quả để chứa các loại dữ liệu tổng quát và hỗ trợ định nghĩa nhiều kiểu dữ liệu. Numpy cho phép tích hợp nhanh chóng và tính toán trên nhiều loại cơ sở dữ liệu khác nhau. Trong luận văn này, học viên sử dụng thư viện Numpy để làm công cụ chuyển các dữ liệu từ tập dữ liệu huấn luyện và tập dữ liệu thử nghiệm về kiểu dữ liều chuẩn phù hợp với thư viện Tesorflow nhằm phục vụ tính toán được dễ dàng hơn.
Khi pip đã được cài đặt, tiến hành cài đặt thư viện numpy với các lệnh tương tự để cài đặt Numpy.
sudo apt install python-numpy
3.2.4 Thư viện OpenCV
Thư viện mã nguồn mở về thị giác máy tính OpenCV, hệ thư viện này tuân thủ theo giấy phép của BSD tương tự như của GNU hay apache nên hoàn toàn miễn phí kể cả áp dụng vào thương mại. Hệ thư viện OpenCV hỗ trợ các nền tảng như C++, C, hay Python, Java và hỗ trợ đa hệ điều hành như Windows, Linux, Mac OS, chạy tốt với cả iOS và Android. Nếu cần tính toán tốt và và mục đích tập trung vào ứng dụng thời gian thực thì lựa chọn OpenCV là hiệu quả nhất. Thư viện này được viết và tối ưu hóa trên nền C/C++ nên có lợi thế xử lý đa lõi rất tốt.
Một số thành phần chính của OpenCV phải kể đến như sau: Core: Các hàm xử lý cơ bản
Imgproc: Xử lý ảnh
Videoio: Đọc vào ghi video
HighUI: Giao diện người dùng bậc cao ML: Học máy
Cudaarithm: Các toán tử trên ma trận CudaFilter: Lọc ảnh
43
Hình 3.8: Phát hiện đối tượng trên đường ứng dụng OpenCV
Trong phạm vi luận văn này, số lượng ảnh ở các nhãn là không cân bằng, do đó trong quá trình sử dụng tập mẫu cần sử dụng thư viện OpenCV để làm công cụ thực hiện các thuật toán đơn giản. OpenCV sẽ giúp cân chỉnh từ đó cân bằng số lượng hình ảnh về mức tương đối cân bằng, giúp thuận tiện cho việc đào tạo của mô hình và thực hiện các huấn luyện. Trong đó, khi tiến hành xử lý mô hình trên tập dữ liệu thực tế, học viên dự kiến sẽ sử dụng OpenCV vào các bộ lọc tiền xử lý thực hiện chuẩn đầu vào dữ liệu phù hợp với mô hình huấn luyện.
3.3 Lập trình và đánh giá hệ thống
3.3.1 Lập trình hệ thống
Sau khi nghiên cứu sử dụng các công cụ học viên đã xây dựng được chương trình thử nghiệm và tiến hành huấn luyện vớp tập mẫu đã xây dựng được ở trên (Chương trình chi tiết đính kèm ở phụ lục).
Xây dựng hàm để đưa model vào huấn luyện: viết function để đưa models mà ta đã train khi nãy vào Tflite.loadModel() để lưu model.
// Data được load vào model của TF. loadModel() async{
await Tflite.loadModel(
model: "assets/model_unquant.tflite", labels: "assets/labels.txt");}
Thêm một funtion để lấy ảnh:
// Lấy image từ máy. chooseImage() async{
var image = await ImagePicker.pickImage(source: ImageSource.gallery);
44 return null; } setState(() { _isLodaing = true; _image = image; }); runModelonImage(image); }
//Đưa ảnh vào trong TFlite phân tích với model đã train.
runModelonImage(File image) async {
var output = await Tflite.runModelOnImage( path: image.path, numResults: 2, imageMean: 127.5, imageStd: 127.5, threshold: 0.5); setState(() { _isLodaing = false; _outputs = output; }); } Hiển thị ảnh:
class _HomePageState extends State<HomePage> { bool _isLodaing = false;
File _image; List _outputs; @override
void initState() {
// TODO: implement initState super.initState();
_isLodaing = true;
45 setState(() { _isLodaing = false; }); }); }
Widget build(BuildContext context) { return Scaffold(
appBar: AppBar(
title: Text("Detech Animals"), ), body: _isLodaing ? Container ( alignment: Alignment.center, child: CircularProgressIndicator(), ) : Container( width: MediaQuery.of(context).size.width, child: Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
_image == null ? Container() :
Image.file(_image),
SizedBox(height: 20,), _outputs != null ? Text(
"${_outputs[0]["label"]}", style: TextStyle( color: Colors.black, fontSize: 20.0, background: Paint()..color = Colors.white,), ) : Container()
46 ],),), floatingActionButton: FloatingActionButton( onPressed: () { chooseImage();}, child: Icon(Icons.image),), );}
Hình 3.9: Phát hiện đặc trưng của đối tượng
3.3.2 Đánh giá hệ thống
Sau khi tiến hành huấn luyện kết quả cho thấy thời gian huấn luyện cho mạng chiếm khoảng 67 phút, với một lần huấn luyện tập. Toàn bộ dữ liệu 39.029 ảnh được duyệt lại 50 lần liên tiếp (1.952.650 ảnh huấn luyện). Kết quả độ khớp với tập huấn luyện là 98,64% cho tỉ lệ chính xác huấn luyện. Tiến hành lấy mô hình đã huấn luyện thử nghiệm với tập mẫu thử, độ được kết quả chính xác là 92,62%. Trong chương trình thử nghiệm, sau khi tiến hành huấn luyện, học viên tiến hành xây dựng thêm một hàm tính toán thời gian, nhằm phục vụ xử lý các ảnh đầu vào cho đến khi hệ thống ra được quyết định. Kết quả đạt 0,25s tính thời gian trung bình từ lúc đưa bức ảnh vào đến lúc đạt được dự đoán đầu ra.
47
Hình 3.10: Đồ thị của quá trình huấn luyện
Dựa vào đồ thị của quá trình huấn luyện, có thể quan sát được quá trình các sai số thay đổi, thấy được độ hội tụ của mạng, độ chính xác trong cả quá trình thay đổi. Mạng được huấn luyện trong khoảng 35.000 bước với 50 lần lặp huấn luyện, với độ chính xác là đạt 92,5%. Từ bước thứ 10.000, là giai đoạn có giá trị sai số, độ chính xác của mạng thay đổi rất chậm, từ đó cho thấy sau khoảng 13 lần lặp mạng đã đạt sự hội tụ. Ở giai đoạn sau, tốc độ các thông số mạng thay đổi rất chậm, đó là phần học củng cố thêm.
Nhìn vào quá trình huấn luyện, có thể nhận thấy rằng trong suốt thời gian huấn luyện mạng có những điểm dị thường trong huấn luyện, biểu hiện là một số thời điểm giá trị sai số tăng, cùng với đó độ chính xác giảm đi một khoảng giá trị, sau đó quay trở lại khoảng giá trị cũ. Để đạt kết quả đúng nhất trong quá trình huấn luyện, trước khi dừng chạy huấn luyện, người lập trình nên kiểm tra sự thay đổi các thông số này,