By Arnon Puitrakul - 24 สิงหาคม 2021
OpenCV เป็น Library ที่ใช่ในการทำงานกับพวกรูปภาพ และ Computer Vision หลายอย่างมาก ๆ เป็น Library พื้นฐานเลยก็ว่าได้ ทำได้สารพัดอย่างมาก ๆ ตั้งแต่ซื้อ Macbook Air M1 มา พยายามลง OpenCV เพื่อใช้งานกับ Python อยู่นานมาก ๆ กว่าจะลงได้ วันนี้เลยอยากเขียนเก็บไว้อ่านเล่น กับถ้าใครใช้ M1 และต้องการใช้ OpenCV ก็อ่านแล้วทำตามได้เลย
ก่อนที่จะไปลง OpenCV ด้วยขั้นตอนของบทความนี้ เราต้องไปลง Homebrew กับ Conda-Forge ก่อนเด้อ
UPDATE : ตอนนี้เราสามารถ Install OpenCV ผ่าน Conda ได้แล้ว โดยให้เรา Update Conda ให้เป็น Version ล่าสุด ผ่านคำสั่ง conda update conda แล้วเราสามารถติดตั้ง OpenCV ผ่านคำสั่ง conda install opencv
ก่อนที่เราจะลง OpenCV ที่เป็น Highlight ของเราวันนี้มันต้องการพวก Dependencies ที่ต้องใช้ด้วย หนึ่งในนั้นคือ Numpy ถ้าใครที่ใช้ OpenCV จะรู้เลยว่า ถ้าอ่านรูปภาพเข้ามา มันก็คือ Numpy Array ดี ๆ นั่นแหละ มันเลยจำเป็นต้องใช้ แต่เราถ้าเราลงปกติ เราจะได้ Version ที่เป็น x86 แต่เราต้องเอา Version ที่เป็น ARM เข้ามาซึ่ง Apple จัดการเรื่องนี้ให้เราเรียบร้อยแล้ว โดยการรัน Command ด้านล่างได้เลย
conda install -c apple tensorflow-deps
ตัว OpenCV มันไม่เหมือนกับพวก Library บน Python ทั่ว ๆ ไปที่เราสามารถที่จะ ติดตั้งผ่าน Package Manager ได้ตรง ๆ เลยซะทีเดียว ถ้าเป็นบน macOS หรือ Linux เราสามารถทำผ่าน Homebrew ได้เลย แต่ตอนนี้เรามีปัญหาว่า เราใช้ ARM น่ะสิ ซึ่งมันไม่มี Version สำหรับ ARM ในตอนนี้ ทำให้วิธีที่เราจะทำได้คือ เราจะต้องโหลด Source Code ของ OpenCV มา Compile เอง สำหรับใครหลาย ๆ คน ที่ทำงานกับพวก Open Source น่าจะพอคุ้นเคยกับการทำอะไรแบบนี้มาบ้าง แต่ถ้าใครที่ไม่คุ้นเคยไม่เป็นไร เรามาทำไปพร้อม ๆ กัน
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.3.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.3.zip
ขั้นตอนแรกเหนือสิ่งอื่นใด เราต้อง Download Source Code ของ OpenCV มาก่อนโดยใช้ Command ด้านบนทั้ง 2 บรรทัด ให้เช็คเลข Version ก่อน เราอยากให้โหลด Version ล่าสุดเสมอ การจะดูเลข Version ล่าสุด ให้เข้าไปดูใน Release ของ OpenCV ได้เลย แล้วเปลี่ยนเลข Version ให้เป็นล่าสุดด้วย
unzip opencv.zip && unzip opencv_contrib.zip
cd opencv-4.5.3
จากนั้นเราจะต้องแตกทั้ง 2 ไฟล์ออกมา ใช้ Command unzip ได้เลยง่าย ๆ เราจะได้ 2 Folder ออกมาคือ opencv และ opencv_contrib จากนั้นเราก็ Change Directory เข้าไปใน opencv ได้เลย
mkdir build && cd build
ก่อนที่เราจะ Build ได้ เราจะต้องทำการสร้าง Directory สำหรับการเก็บไฟล์ที่ทำการ Build เรียบร้อยแล้วใน Folder ชื่อ Build
cmake \
-DCMAKE_SYSTEM_PROCESSOR=arm64 \
-DCMAKE_OSX_ARCHITECTURES=arm64 \
-DWITH_OPENJPEG=OFF \
-DWITH_IPP=OFF \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=<OpenCV_Contrib_Path>/modules \
-D PYTHON3_EXECUTABLE=<Python_Executable_Path>/bin/python3 \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D OPENCV_ENABLE_NONFREE=ON \
-D BUILD_EXAMPLES=ON ..
ในขั้นตอนนี้เราจะเริ่ม Compile OpenCV กันแล้ว ให้เราแน่ใจว่าเราอยู่ใน Folder build ที่เราพึ่งสร้างเมื่อกี้จริง ๆ นะ ใน Command ด้านบนนี้จะมี 2 ส่วนที่เราจะต้องเปลี่ยนคือ OPENCV_EXTRA_MODULES_PATH ให้เราใส่เป็น Path ของ OpenCV Contrib ที่เรา Download มา
echo $CONDA_PREFIX
และอีกอันที่ต้องแก้คือ PYTHON3_EXECUTABLE ส่วนนี้ให้เราแก้เป็น Path ที่อยู่ของ Python เราว่าอยู่ที่ไหน ถ้าเราใช้ Command ด้านบน เราจะได้ Path ของ Python เรามา ให้เราเอา Path ที่ได้ต่อท้ายด้วย /bin/python3 แค่นี้เราก็พร้อมที่จะรัน cmake ได้แล้ว เมื่อรันเสร็จ เราจะได้ไฟล์หลาย ๆ ไฟล์อยู่บน Folder build ก็คือเรียบร้อยแล้ว
build -j8
จากนั้น เราจะมา Build OpenCV กันผ่าน Command build ส่วนที่เราใส่ j8 คือเป็นการบอกให้มัน Build โดยใช้ 8 Core CPU เต็มที่ M1 มีละ บอกเลยว่าขั้นตอนนี้จะใช้เวลาพอสมควรสัก 8-10 นาทีได้ และบอกเลยว่า มันโหลดเต็มจริง ๆ CPU 100% Utilisation จน CPU ต้องร้องแน่นอน เรากดไป 101 องศาเลย ร้อนอย่างพีค
sudo make install
และสุดท้าย เราจะต้องทำการ Install OpenCV ลงไปในเครื่องของเราผ่าน Command ด้านบนเลย เท่านี้เราก็จะติดตั้ง OpenCV ลงไปในเครื่องของเราเรียบร้อยแล้ว แต่ขั้นตอนยังไม่จบ เพราะเรายังไม่สามารถใช้มันกับ Python ของเราได้
mdfind cv2.cpython
ถ้าเราติดตั้งผ่านแล้วเราจะได้ไฟล์ที่เป็น cpython มาให้เรา Import เข้าไปใน Python Environment ของเราได้ สิ่งที่เราต้องทำคือ Symlink มันเข้าไป แต่ก่อนอื่น เราต้องหาก่อนว่า cpython ของ OpenCV เราอยู่ที่ไหน ผ่าน Command ด้านบน ให้เราเก็บ Path ไว้
cd <ENV_PATH>/lib/python3.9/site-packages
จากนั้นให้เราเอา ENV Path ที่เราได้จาก echo เมื่อขั้นตอนที่แล้วมา ต่อด้วย Path ด้านบน แล้วลอง Change Directory เข้าไปดู
ln -s <CV2 cpython Path> cv2.so
จากนั้นให้เราทำ Symlink จากไฟล์ที่เราหา Path มาได้ เข้าไปใน Path ของ site-packages ที่เรากำลังอยู่จาก Command ด้านบน ก็เป็นอันเรียบร้อยสวยงามแล้ว
>>> import cv2
>>> cv2.__version__
'4.5.3'
จากนั้นเราจะลองเช็คว่า การติดตั้งเราทำสำเร็จมั้ย ให้เราเข้าไปที่ Python Shell แล้วลองพิมพ์ตาม Code ด้านบน เราควรจะได้ เป็นเลข Version ของ OpenCV ที่เราติดตั้งลงไป ก็ถือว่าเรียบร้อยแล้ว เย้ ~
ตอนทำครั้งแรกคือ ผิด ๆ ถูก ๆ เยอะมาก ถึงแม้จะอ่านมาอีกที แต่หลาย ๆ เว็บก็เขียนแล้วบางทีอ่านแล้ว งง ๆ ทำให้เราหลงทางมานานเป็นเดือน ๆ เหมือนกัน งง ไปหมด จนวันนี้ได้สักทีฮ่า ๆ หมุนวนไปมาหลายรอบอยู่ ก็ถ้าใครกำลังหาวิธีอยู่ ก็เราเขียนไว้แล้ว อนาคต เขาอาจจะทำ Version ที่ Compile และ Build มาให้เราแล้วนะ
เราเป็นคนที่อ่านกับซื้อหนังสือเยอะมาก ปัญหานึงที่ประสบมาหลายรอบและน่าหงุดหงิดมาก ๆ คือ ซื้อหนังสือซ้ำเจ้าค่ะ ทำให้เราจะต้องมีระบบง่าย ๆ สักตัวในการจัดการ วันนี้เลยจะมาเล่าวิธีการที่เราใช้ Obsidian ในการจัดการหนังสือที่เรามีกัน...
หากเราเรียนลงลึกไปในภาษาใหม่ ๆ อย่าง Python และ Java โดยเฉพาะในเรื่องของการจัดการ Memory ว่าเขาใช้ Garbage Collection นะ ว่าแต่มันทำงานยังไง วันนี้เราจะมาเล่าให้อ่านกันว่า จริง ๆ แล้วมันทำงานอย่างไร และมันมีเคสใดที่อาจจะหลุดจนเราต้องเข้ามาจัดการเองบ้าง...
ก่อนหน้านี้เราเปลี่ยนมาใช้ Zigbee Dongle กับ Home Assistant พบว่าเสถียรขึ้นเยอะมาก อุปกรณ์แทบไม่หลุดออกจากระบบเลย แต่การติดตั้งมันเข้ากับ Synology DSM นั้นมีรายละเอียดมากกว่าอันอื่นนิดหน่อย วันนี้เราจะมาเล่าวิธีการเพื่อใครเอาไปทำกัน...
เมื่อหลายวันก่อนมีพี่ที่รู้จักกันมาถามว่า เราจะโหลด CSV ยังไงให้เร็วที่สุด เป็นคำถามที่ดูเหมือนง่ายนะ แต่พอมานั่งคิด ๆ ต่อ เห้ย มันมีอะไรสนุก ๆ ในนั้นเยอะเลยนี่หว่า วันนี้เราจะมาเล่าให้อ่านกันว่า มันมีวิธีการอย่างไรบ้าง และวิธีไหนเร็วที่สุด เหมาะกับงานแบบไหน...