أمي تنام بهدوء في الليل - نجمع OpenCV لـ Raspbian'a

كان الأسبوعان الماضيان صعبًا بالنسبة لفريقنا. تم إصدار 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 

Source: https://habr.com/ru/post/ar430906/


All Articles