Setup dell’Ambiente — CMake, Eigen e OpenCV
Prima di scrivere una sola riga del nostro framework, dobbiamo costruire il cantiere. In questo laboratorio configuriamo i tre strumenti che useremo per tutto il corso:
.cpp in un eseguibile, in modo automatico e indipendente dal sistema operativo.Al termine del laboratorio avrete un progetto che compila e stampa il risultato di un prodotto matrice-vettore.
Per compilare C++17 vi serve un compilatore moderno. Scegliete il vostro sistema:
Linux — tutto già disponibile:
macOS — usate Homebrew:
Il clang++ di Apple funziona, ma gcc via Homebrew è più coerente con Linux.
Windows — il consiglio è WSL 2 (Windows Subsystem for Linux): un terminale Linux reale dentro Windows, senza macchine virtuali:
Poi seguite le istruzioni Linux. Verificate con g++ --version e cmake --version.
Il consiglio è Visual Studio Code — gratuito, multipiattaforma, estensibile.
Estensioni da installare subito dal pannello Extensions:
Con CMake Tools potete dimenticare i comandi da terminale: il pulsante Build in basso a sinistra compila il progetto. Usate comunque il terminale nelle prime settimane per capire cosa succede sotto.
Eigen è header-only: non occorre compilarla. Scegliete il metodo più comodo:
Via package manager (consigliato):
Manualmente (funziona su tutti i sistemi):
Eigen/ dentro libs/eigen/ nel vostro progettoNel CMakeLists.txt punterete agli header con:
OpenCV è una libreria compilata: va installata e poi collegata al progetto.
Linux:
macOS:
Windows/WSL: stessa procedura Linux dentro il terminale WSL.
Nel CMakeLists.txt aggiungete:
Verificate che OpenCV sia trovata con:
Ecco il file di partenza che useremo e aggiorneremo nel corso delle settimane:
cmake_minimum_required(VERSION 3.15)
project(BasicNeural)
set(CMAKE_CXX_STANDARD 17)
# Eigen
find_package(Eigen3 QUIET)
if(NOT Eigen3_FOUND)
include_directories(libs/eigen) # fallback manuale
endif()
# OpenCV
find_package(OpenCV REQUIRED)
add_executable(mio_prog main.cpp)
target_link_libraries(mio_prog ${OpenCV_LIBS})I tre comandi per compilare e avviare:
Useremo questi tipi per tutto il corso:
| Tipo | Cosa rappresenta | Esempio |
|---|---|---|
Eigen::MatrixXd |
Matrice di double, dimensioni dinamiche |
Pesi di un layer |
Eigen::VectorXd |
Vettore colonna di double |
Bias, output di un layer |
Eigen::ArrayXd |
Array 1D per operazioni elemento per elemento | Funzioni di attivazione |
Xd sta per X-dimensionale double. Ci sono varianti float (Xf) e a dimensioni fisse (Matrix3d, ecc.) che non useremo.
#include <Eigen/Dense>
Eigen::MatrixXd W = Eigen::MatrixXd::Random(3, 4); // 3x4, valori in [-1,1]
Eigen::VectorXd x = Eigen::VectorXd::Random(4); // 4x1
// Prodotto matrice-vettore → risultato 3x1
Eigen::VectorXd z = W * x;
// Trasposta
Eigen::MatrixXd Wt = W.transpose(); // diventa 4x3
// Inizializzazioni utili
Eigen::MatrixXd Z = Eigen::MatrixXd::Zero(3, 4);
Eigen::MatrixXd I = Eigen::MatrixXd::Identity(4, 4);
// Operazioni ELEMENTO PER ELEMENTO con .array()
// (indispensabile per le funzioni di attivazione!)
Eigen::ArrayXd relu = z.array().max(0.0); // ReLU: max(0, zi)
Eigen::ArrayXd sig = 1.0 / (1.0 + (-z.array()).exp()); // SigmoidAttenzione: * tra due MatrixXd è sempre prodotto matriciale. Per il prodotto elemento per elemento usate .array().
Verificate che tutto funzioni scrivendo un main.cpp che:
W (\(3 \times 4\), valori casuali) e un vettore x (\(4 \times 1\)).z_relu = z.array().max(0.0) e lo stampa: è il vostro primo forward pass!Se Eigen stampa e OpenCV apre la finestra, l’ambiente è pronto per tutto il corso.
La soluzione di riferimento verrà discussa all’inizio della prossima lezione.