Ibu tidur dengan tenang di malam hari - kami mengumpulkan OpenCV untuk Raspbian'a

Beberapa minggu terakhir sulit bagi tim kami. OpenCV 4 dirilis , dan dengan itu, mereka bersiap untuk OpenVINO toolkit Intel R4, yang mencakup OpenCV. Anda pikir, saya terganggu untuk sementara waktu, saya akan melihat, seperti biasa, tentang forum OpenCV, dan komentar pengguna, dan di sini menjadi modis bagi Anda untuk mengatakan bahwa OpenCV bukan IoT, bahwa di bawah Raspberry Pi itu cukup untuk berkumpul - tidak ada cukup solder untuk make -j2 - di pagi hari itu akan siap jika Anda beruntung.


Oleh karena itu, saya mengusulkan untuk bergandengan tangan dan melihat bagaimana Anda dapat merakit perpustakaan OpenCV untuk sistem operasi 32-bit yang berjalan pada prosesor ARM menggunakan sumber daya mesin dengan OS 64-bit, didorong oleh arsitektur CPU yang sangat baik. Sihir Kompilasi silang, bukan sebaliknya!


Pernyataan masalah


Mengompilasi langsung di papan, yang biasa disebut asli, benar-benar melelahkan, jadi di sini kami akan mempertimbangkan cara untuk membangun proyek yang memungkinkan perangkat komputasi yang lebih kuat (sebut saja mereka host) untuk menyiapkan binari untuk kerabat kecil mereka. Selain itu, kedua mesin dapat memiliki arsitektur CPU yang berbeda. Ini adalah kompilasi silang.


Jadi, untuk menyiapkan pai raspberry yang diisi dengan OpenCV, kita perlu:


  • Ubuntu 16,04 bangkai buruh pelabuhan gambar
  • Mesin host lebih kuat daripada Raspberry Pi (jika tidak, apa gunanya, bukan?)
  • Kompilator silang untuk ARMhf, serta pustaka arsitektur yang sesuai

Seluruh proses pembangunan OpenCV akan berlangsung di mesin host. Saya menggunakan Ubuntu di rumah. Dengan versi Linux yang lain, masalah pemutaran seharusnya tidak terjadi. Untuk pengguna Windows - keinginan tulus saya untuk tidak menyerah dan mencoba mencari tahu sendiri.


Instal Docker


Saya mulai berkenalan dengan buruh pelabuhan sekitar seminggu yang lalu, jadi tambahkan garam gourmet dan gula sintaksis secukupnya. Tiga bahan sudah cukup untuk Anda dan saya - Dockerfile, konsep gambar dan wadah.


Docker sendiri adalah alat untuk membuat dan mereproduksi konfigurasi sistem operasi dengan set komponen yang diperlukan. Dockerfile adalah seperangkat perintah shell yang biasanya Anda gunakan pada mesin host, tetapi dalam kasus ini, semuanya berlaku untuk apa yang disebut gambar docker .


Untuk memasang buruh pelabuhan, pertimbangkan cara paling sederhana: pesan paket melalui layanan pengiriman apt-get :


 sudo apt-get install -y docker.io 

Kami akan memberikan daemon docker segala yang diminta dan kami akan keluar dari sistem (perhatikan login yang sesuai).


 sudo usermod -a -G docker $USER 

Mempersiapkan ruang kerja


Raspberry Pi (dalam kasus saya RPI 2 Model B) dalam persiapan yang paling umum adalah CPU ARMv7 dengan sistem operasi Raspbian (berbasis Debian). Kami akan membuat gambar docker berdasarkan Ubuntu 16.04, di mana kami akan melaporkan cross-compiler, pustaka tentara dan mengumpulkan OpenCV di tempat yang sama.


Buat ayah di mana Dockerfile kami akan berbohong:


 mkdir ubuntu16_armhf_opencv && cd ubuntu16_armhf_opencv touch Dockerfile 

Tambahkan informasi tentang OS dasar dan arsitektur armhf untuk installer paket apt-get :


 FROM ubuntu:16.04 USER root RUN dpkg --add-architecture armhf RUN apt-get update 

Harap perhatikan bahwa perintah seperti FROM ... , RUN ... adalah sintaks docker dan ditulis dalam file uji Dockerfile dibuat.


Mari kita kembali ke direktori induk ubuntu16_armhf_opencv dan mencoba membuat gambar buruh pelabuhan kami:


 docker image build ubuntu16_armhf_opencv 

Selama pelaksanaan perintah apt-get update , Anda harus diarahkan untuk melihat kesalahan dari jenis berikut: Kesalahan 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 

Jika Anda melihat file /etc/apt/sources.list maka setiap kesalahan tersebut terkait dengan beberapa baris, misalnya:


Kesalahan


 Err:22 http://archive.ubuntu.com/ubuntu xenial-updates/main armhf Packages 404 Not Found 

Baris dalam /etc/apt/sources.list :


 deb http://archive.ubuntu.com/ubuntu/ xenial-updates main restricted 

Solusi :
Dibagi menjadi dua:


 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 

Dengan demikian, Anda harus mengganti beberapa sumber paket. Di buruh pelabuhan kami, kami akan mengganti semuanya dengan satu perintah:


 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 

Sekarang apt-get update harus bekerja tanpa kesalahan.


Kami menempatkan paket yang diperlukan


Kita perlu menyediakan paket host seperti git , python-pip , cmake dan pkg-config , serta crossbuild-essential-armhf , yang merupakan seperangkat kompiler silang gcc / g ++ ( arm-linux-gnueabihf-gcc dan arm-linux-gnueabihf-g++ ) dan pustaka sistem dari arsitektur yang sesuai:


 RUN apt-get install -y git python-pip cmake pkg-config crossbuild-essential-armhf 

Dari yang tidak biasa - kami juga mengunduh GTK (digunakan untuk menggambar windows di modul highgui), GStreamer dan Python, tetapi dengan indikasi eksplisit dari arsitektur asing:


 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 

Dan kemudian kita mengkloning dan mengumpulkan, menunjukkan bendera yang diperlukan:


 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" .. 

dimana


  • CMAKE_TOOLCHAIN_FILE - path ke file cmake yang mendefinisikan proses kompilasi silang (set kompiler yang diinginkan, membatasi penggunaan perpustakaan host.


  • WITH_IPP=OFF , - nonaktifkan dependensi berat.


  • BUILD_TESTS=OFF , BUILD_PERF_TESTS=OFF , nonaktifkan build uji.


  • OPENCV_ENABLE_PKG_CONFIG=ON - sehingga pkg-config dapat menemukan dependensi seperti GTK. PKG_CONFIG_PATH adalah jalur yang benar di mana pkg-config akan mencari perpustakaan.


  • PYTHON2_INCLUDE_PATH , PYTHON2_NUMPY_INCLUDE_DIRS - jalur yang diperlukan untuk pembungkus kompilasi silang untuk python2.


  • ENABLE_NEON=ON , CPU_BASELINE="NEON" - aktifkan NEON optimisasi.


  • OPENCV_CONFIG_INSTALL_PATH - menyesuaikan lokasi file di direktori install .



Hal utama yang harus Anda perhatikan setelah eksekusi cmake adalah bahwa semua modul yang diperlukan dirakit (python2, misalnya):


 -- 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 

dan dependensi yang diperlukan, seperti GTK, ditemukan:


 -- 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 

Yang tersisa hanyalah memanggil make , make install dan tunggu build selesai:


 Successfully built 4dae6b1a7d32 

Gunakan id gambar ini untuk memberi tag dan membuat wadah:


 docker tag 4dae6b1a7d32 ubuntu16_armhf_opencv:latest docker run ubuntu16_armhf_opencv 

Dan kita hanya perlu memompa OpenCV rakitan keluar dari wadah. Pertama, mari kita lihat pengidentifikasi wadah yang dibuat:


 $ 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 

Dan salin direktori instal dengan OpenCV yang diinstal:


 docker cp e94667fe60d2:/opencv/build/install/ ./ mv install ocv_install 

Atur meja


Salin ocv_install ke Raspberry Pi, set path dan coba jalankan OpenCV dari python.


 export LD_LIBRARY_PATH=/path/to/ocv_install/lib/:$LD_LIBRARY_PATH export PYTHONPATH=/path/to/ocv_install/python/:$PYTHONPATH 

Jalankan contoh deteksi menggunakan jaringan saraf MobileNet-SSD dari 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) 


Itu saja, perakitan lengkap membutuhkan waktu tidak lebih dari 20 menit. Saya melampirkan versi final Dockerfile bawah ini dan mengambil kesempatan ini, saya mengusulkan untuk mengambil survei singkat dari tim OpenCV bagi mereka yang pernah memiliki pengalaman dengan perpustakaan: https://opencv.org/survey-2018.html .


Dan ya, selamat di OpenCV 4! Ini bukan hanya pekerjaan tim yang terpisah, ini adalah pekerjaan seluruh komunitas - OpenCV 4 Anda.


 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/id430906/


All Articles