Build และ ติดตั้ง OpenCV บน Apple M1 Mac
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
Step 1 : Install Dependencies
ก่อนที่เราจะลง OpenCV ที่เป็น Highlight ของเราวันนี้มันต้องการพวก Dependencies ที่ต้องใช้ด้วย หนึ่งในนั้นคือ Numpy ถ้าใครที่ใช้ OpenCV จะรู้เลยว่า ถ้าอ่านรูปภาพเข้ามา มันก็คือ Numpy Array ดี ๆ นั่นแหละ มันเลยจำเป็นต้องใช้ แต่เราถ้าเราลงปกติ เราจะได้ Version ที่เป็น x86 แต่เราต้องเอา Version ที่เป็น ARM เข้ามาซึ่ง Apple จัดการเรื่องนี้ให้เราเรียบร้อยแล้ว โดยการรัน Command ด้านล่างได้เลย
conda install -c apple tensorflow-deps
Step 2: Compile OpenCV
ตัว 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 องศาเลย ร้อนอย่างพีค
Step 3: Install OpenCV
sudo make install
และสุดท้าย เราจะต้องทำการ Install OpenCV ลงไปในเครื่องของเราผ่าน Command ด้านบนเลย เท่านี้เราก็จะติดตั้ง OpenCV ลงไปในเครื่องของเราเรียบร้อยแล้ว แต่ขั้นตอนยังไม่จบ เพราะเรายังไม่สามารถใช้มันกับ Python ของเราได้
Step 4: Symlink OpenCV to site-package
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 มาให้เราแล้วนะ