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 ของเราได้

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 มาให้เราแล้วนะ