كان الأسبوعان الماضيان صعبًا بالنسبة لفريقنا. تم إصدار OpenCV 4 ، ومعه ، أعدوا لمجموعة أدوات OpenVINO R4 من Intel ، والتي تتضمن OpenCV. تعتقد ، أنا مشتت لفترة من الوقت ، وسأنظر ، كالمعتاد ، في منتديات OpenCV وتعليقات المستخدمين ، وهنا أصبح من المألوف بالنسبة لك أن تقول أن OpenCV ليس IoT ، وأنه في Raspberry Pi يكفي التجميع - لا يوجد لحام كاف لوضع make -j2
- في الصباح سيكون جاهزًا إذا كنت محظوظًا.
لذلك ، أقترح أن نتكاتف معًا ونرى كيف يمكنك تجميع مكتبة OpenCV لنظام تشغيل 32 بت يعمل على معالج ARM باستخدام موارد جهاز بنظام تشغيل 64 بت ، مدفوعًا ببنية وحدة معالجة مركزية ممتازة. السحر تجميع عبر ، وليس خلاف ذلك!
بيان المشكلة
يعد التجميع المباشر على السبورة ، والذي يُطلق عليه عادةً اللغة الأصلية ، أمرًا شاقًا حقًا ، لذلك سننظر هنا في طريقة لبناء مشروع يتيح لأجهزة حوسبة أقوى (دعنا نطلق عليها المضيفين) لإعداد الثنائيات لأقاربهم الصغار. علاوة على ذلك ، يمكن أن يكون لكل من الجهازين بنية CPU مختلفة. هذا تجميع متقاطع.
لذا ، لإعداد فطيرة التوت محشوة بـ OpenCV ، نحتاج إلى:
- الذبيحة أوبونتو 16.04 صورة عامل الميناء
- الجهاز المضيف أقوى من Raspberry Pi (وإلا ما هو المغزى ، أليس كذلك؟)
- مترجم عبر ARMhf ، وكذلك مكتبات العمارة المقابلة
ستتم عملية بناء OpenCV بالكامل على الجهاز المضيف. أنا استخدم أوبونتو في المنزل. مع إصدار آخر من Linux ، لا يجب أن تحدث مشاكل في التشغيل. لمستخدمي Windows - أتمنى خالص عدم الاستسلام ومحاولة اكتشاف ذلك لأنفسنا.
تثبيت Docker
لقد بدأت التعارف مع عامل الرصيف منذ حوالي أسبوع ، لذا أضف الملح الذواقة والسكر النحوي حسب الذوق. ثلاثة مكونات كافية بالنسبة لك ولي - Dockerfile ، مفهوم الصورة والحاوية.
Docker نفسها هي أداة لإنشاء وإعادة إنتاج تكوين أي نظام تشغيل بالمجموعة اللازمة من المكونات. ملف Dockerfile عبارة عن مجموعة من أوامر shell التي تستخدمها عادةً على الجهاز المضيف ، ولكن في هذه الحالة ، تنطبق جميعها على ما يسمى صورة docker
.
لتثبيت عامل الميناء ، فكر في أبسط طريقة: اطلب حزمة من خلال خدمة توصيل apt-get
:
sudo apt-get install -y docker.io
سنعطي خفية عامل الميناء كل ما يطلبه وسنقوم بتسجيل الخروج من النظام (لاحظ تسجيل الدخول وفقًا لذلك).
sudo usermod -a -G docker $USER
تحضير مساحة العمل
Raspberry Pi (في حالتي RPI 2 Model B) في الإعداد الأكثر شيوعًا هو وحدة المعالجة المركزية ARMv7 مع نظام التشغيل Raspbian (القائم على دبيان). سنقوم بإنشاء صورة docker
إرساء استنادًا إلى Ubuntu 16.04 ، حيث سنبلغ عن المترجم المشترك ومكتبات الجيش ونجمع OpenCV في نفس المكان.
أنشئ بابا حيث Dockerfile
بنا:
mkdir ubuntu16_armhf_opencv && cd ubuntu16_armhf_opencv touch Dockerfile
أضف معلومات حول نظام التشغيل الأساسي armhf
حزمة apt-get
:
FROM ubuntu:16.04 USER root RUN dpkg --add-architecture armhf RUN apt-get update
يرجى ملاحظة أن أوامر مثل FROM ...
، RUN ...
هي بناء docker
Dockerfile
ويتم كتابتها في ملف اختبار Dockerfile
تم إنشاؤه.
دعنا نعود إلى الدليل الرئيسي ubuntu16_armhf_opencv
ونحاول إنشاء صورة عامل الميناء لدينا:
docker image build ubuntu16_armhf_opencv
أثناء تنفيذ الأمر apt-get update
، يجب أن تظهر لك أخطاء من النوع التالي: Err:[] [url] xenial[-] armhf Packages
Ign:30 http://archive.ubuntu.com/ubuntu xenial-backports/main armhf Packages Ign:32 http://archive.ubuntu.com/ubuntu xenial-backports/universe armhf Packages Err:7 http://archive.ubuntu.com/ubuntu xenial/main armhf Packages 404 Not Found Ign:9 http://archive.ubuntu.com/ubuntu xenial/restricted armhf Packages Ign:18 http://archive.ubuntu.com/ubuntu xenial/universe armhf Packages Ign:20 http://archive.ubuntu.com/ubuntu xenial/multiverse armhf Packages Err:22 http://archive.ubuntu.com/ubuntu xenial-updates/main armhf Packages 404 Not Found Ign:24 http://archive.ubuntu.com/ubuntu xenial-updates/restricted armhf Packages Ign:26 http://archive.ubuntu.com/ubuntu xenial-updates/universe armhf Packages Ign:28 http://archive.ubuntu.com/ubuntu xenial-updates/multiverse armhf Packages Err:30 http://archive.ubuntu.com/ubuntu xenial-backports/main armhf Packages 404 Not Found Ign:32 http://archive.ubuntu.com/ubuntu xenial-backports/universe armhf Packages
إذا نظرت إلى الملف /etc/apt/sources.list
فإن كل خطأ من هذا القبيل يتوافق مع سطر ما ، على سبيل المثال:
خطأ
Err:22 http://archive.ubuntu.com/ubuntu xenial-updates/main armhf Packages 404 Not Found
سطر في /etc/apt/sources.list :
deb http://archive.ubuntu.com/ubuntu/ xenial-updates main restricted
الحل :
ينقسم إلى قسمين:
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ xenial-updates main restricted deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted
وبالتالي ، يجب عليك استبدال عدة مصادر للحزم. في رصيفنا ، سنستبدلهم جميعًا بأمر واحد:
RUN sed -i -E 's|^deb ([^ ]+) (.*)$|deb [arch=amd64] \1 \2\ndeb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports/ \2|' /etc/apt/sources.list
الآن يجب أن يعمل apt-get update
بدون أخطاء.
نضع الحزم اللازمة
نحتاج إلى توفير حزم مضيف مثل git
و python-pip
و cmake
و pkg-config
، بالإضافة إلى crossbuild-essential-armhf
، وهو عبارة عن مجموعة من المترجمات المتقاطعة gcc / g ++ ( arm-linux-gnueabihf-gcc
و arm-linux-gnueabihf-g++
) ومكتبات النظام للهندسة المعمارية المقابلة:
RUN apt-get install -y git python-pip cmake pkg-config crossbuild-essential-armhf
من غير المعتاد - نقوم أيضًا بتنزيل GTK (المستخدم لرسم النوافذ في وحدة highgui) و GStreamer و Python ، ولكن مع إشارة صريحة إلى بنية أجنبية:
RUN apt-get install -y --no-install-recommends \ libgtk2.0-dev:armhf \ libpython-dev:armhf \ libgstreamer1.0-dev:armhf \ libgstreamer-plugins-base1.0-dev:armhf \ libgstreamer-plugins-good1.0-dev:armhf \ libgstreamer-plugins-bad1.0-dev:armhf
ثم نستنسخ ونجمع ، مشيرًا إلى الأعلام الضرورية:
RUN git clone https://github.com/opencv/opencv --depth 1 RUN mkdir opencv/build && cd opencv/build && \ export PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig && \ cmake -DCMAKE_BUILD_TYPE=Release \ -DOPENCV_CONFIG_INSTALL_PATH="cmake" \ -DCMAKE_TOOLCHAIN_FILE="../opencv/platforms/linux/arm-gnueabi.toolchain.cmake" \ -DWITH_IPP=OFF \ -DBUILD_TESTS=OFF \ -DBUILD_PERF_TESTS=OFF \ -DOPENCV_ENABLE_PKG_CONFIG=ON \ -DPYTHON2_INCLUDE_PATH="/usr/include/python2.7" \ -DPYTHON2_NUMPY_INCLUDE_DIRS="/usr/local/lib/python2.7/dist-packages/numpy/core/include" \ -DENABLE_NEON=ON \ -DCPU_BASELINE="NEON" ..
اين
CMAKE_TOOLCHAIN_FILE
- المسار إلى ملف cmake الذي يحدد عملية الترجمة المتقاطعة (يعين المترجم المطلوب ، يقيد استخدام مكتبات المضيف.
WITH_IPP=OFF
، - تعطيل التبعيات الثقيلة.
BUILD_TESTS=OFF
، BUILD_PERF_TESTS=OFF
، قم بتعطيل BUILD_PERF_TESTS=OFF
الاختبار.
OPENCV_ENABLE_PKG_CONFIG=ON
- حتى يتمكن pkg-config من العثور على تبعيات مثل GTK. PKG_CONFIG_PATH
هو المسار الصحيح حيث سيبحث pkg-config
عن المكتبات.
PYTHON2_INCLUDE_PATH
، PYTHON2_NUMPY_INCLUDE_DIRS
- المسارات المطلوبة للأغلفة المتقاطعة للصياغة لـ python2.
ENABLE_NEON=ON
، CPU_BASELINE="NEON"
- تمكين تحسين NEON.
OPENCV_CONFIG_INSTALL_PATH
- يضبط مكان الملفات في دليل install
.
الشيء الرئيسي الذي يجب الانتباه إليه بعد تنفيذ cmake
هو أن يتم تجميع جميع الوحدات اللازمة (python2 ، على سبيل المثال):
-- OpenCV modules: -- To be built: calib3d core dnn features2d flann gapi highgui imgcodecs imgproc java_bindings_generator ml objdetect photo python2 python_bindings_generator stitching ts video videoio -- Disabled: world -- Disabled by dependency: - -- Unavailable: java js python3 -- Applications: tests perf_tests apps -- Documentation: NO -- Non-free algorithms: NO
وتم العثور على التبعيات اللازمة ، مثل GTK:
-- GUI: -- GTK+: YES (ver 2.24.30) -- GThread : YES (ver 2.48.2) -- GtkGlExt: NO -- -- Video I/O: -- GStreamer: -- base: YES (ver 1.8.3) -- video: YES (ver 1.8.3) -- app: YES (ver 1.8.3) -- riff: YES (ver 1.8.3) -- pbutils: YES (ver 1.8.3) -- v4l/v4l2: linux/videodev2.h
كل ما عليك فعله هو الاتصال make
make install
والانتظار حتى يكتمل البناء:
Successfully built 4dae6b1a7d32
استخدم id
الصورة هذا لوضع علامة وإنشاء حاوية:
docker tag 4dae6b1a7d32 ubuntu16_armhf_opencv:latest docker run ubuntu16_armhf_opencv
وعلينا فقط ضخ OpenCV المجمعة خارج الحاوية. أولاً ، دعنا نلقي نظرة على معرف الحاوية التي تم إنشاؤها:
$ docker container ls --all CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e94667fe60d2 ubuntu16_armhf_opencv "/bin/bash" 6 seconds ago Exited (0) 5 seconds ago clever_yalow
وانسخ دليل التثبيت مع تثبيت OpenCV:
docker cp e94667fe60d2:/opencv/build/install/ ./ mv install ocv_install
اضبط الطاولة
انسخ ocv_install
إلى Raspberry Pi ، ocv_install
المسارات وحاول تشغيل OpenCV من python.
export LD_LIBRARY_PATH=/path/to/ocv_install/lib/:$LD_LIBRARY_PATH export PYTHONPATH=/path/to/ocv_install/python/:$PYTHONPATH
قم بتشغيل مثال الكشف باستخدام الشبكة العصبية MobileNet-SSD من https://github.com/chuanqi305/MobileNet-SSD :
import cv2 as cv print cv.__file__ classes = ['backgroud', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor'] cap = cv.VideoCapture(0) net = cv.dnn.readNet('MobileNetSSD_deploy.caffemodel', 'MobileNetSSD_deploy.prototxt') cv.namedWindow('Object detection', cv.WINDOW_NORMAL) while cv.waitKey(1) != 27: hasFrame, frame = cap.read() if not hasFrame: break frame_height, frame_width = frame.shape[0], frame.shape[1] blob = cv.dnn.blobFromImage(frame, scalefactor=0.007843, size=(300, 300), mean=(127.5, 127.5, 127.5)) net.setInput(blob) out = net.forward() for detection in out.reshape(-1, 7): classId = int(detection[1]) confidence = float(detection[2]) xmin = int(detection[3] * frame_width) ymin = int(detection[4] * frame_height) xmax = int(detection[5] * frame_width) ymax = int(detection[6] * frame_height) if confidence > 0.5: cv.rectangle(frame, (xmin, ymin), (xmax, ymax), color=(255, 0, 255), thickness=3) label = '%s: %.2f' % (classes[classId], confidence) labelSize, baseLine = cv.getTextSize(label, cv.FONT_HERSHEY_SIMPLEX, 0.5, 1) ymin = max(ymin, labelSize[1]) cv.rectangle(frame, (xmin, ymin - labelSize[1]), (xmin + labelSize[0], ymin + baseLine), (255, 0, 255), cv.FILLED) cv.putText(frame, label, (xmin, ymin), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0)) cv.imshow('Object detection', frame)

هذا كل شيء ، لا يستغرق التجميع الكامل أكثر من 20 دقيقة. لقد وضعت النسخة النهائية من Dockerfile
أدناه Dockerfile
هذه الفرصة ، أقترح إجراء استطلاع قصير من فريق OpenCV لأولئك الذين لديهم خبرة مع المكتبة: https://opencv.org/survey-2018.html .
ونعم ، تهانينا على OpenCV 4! هذا ليس مجرد عمل فريق منفصل ، بل هو عمل المجتمع بأكمله - OpenCV 4 أنت.
FROM ubuntu:16.04 USER root RUN dpkg --add-architecture armhf RUN sed -i -E 's|^deb ([^ ]+) (.*)$|deb [arch=amd64] \1 \2\ndeb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports/ \2|' /etc/apt/sources.list RUN apt-get update && \ apt-get install -y --no-install-recommends \ cmake \ pkg-config \ crossbuild-essential-armhf \ git \ python-pip \ libgtk2.0-dev:armhf \ libpython-dev:armhf \ libgstreamer1.0-dev:armhf \ libgstreamer-plugins-base1.0-dev:armhf \ libgstreamer-plugins-good1.0-dev:armhf \ libgstreamer-plugins-bad1.0-dev:armhf RUN pip install numpy==1.12.1 RUN git clone https://github.com/opencv/opencv --depth 1 RUN mkdir opencv/build && cd opencv/build && \ export PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig && \ cmake -DCMAKE_BUILD_TYPE=Release \ -DOPENCV_CONFIG_INSTALL_PATH="cmake" \ -DCMAKE_TOOLCHAIN_FILE="../opencv/platforms/linux/arm-gnueabi.toolchain.cmake" \ -DWITH_IPP=OFF \ -DBUILD_TESTS=OFF \ -DBUILD_PERF_TESTS=OFF \ -DOPENCV_ENABLE_PKG_CONFIG=ON \ -DPYTHON2_INCLUDE_PATH="/usr/include/python2.7" \ -DPYTHON2_NUMPY_INCLUDE_DIRS="/usr/local/lib/python2.7/dist-packages/numpy/core/include" \ -DENABLE_NEON=ON \ -DCPU_BASELINE="NEON" .. && make -j4 && make install