martedì 21 novembre 2023

MilkV camera




per mandare in auto esecuzione lo script di streaming si edita il file /mnt/system/auto.sh aggiungendo

/mnt/data/install/CviIspTool.sh 64M

Non riesco a vedere lo stream con VLC su Linux ma usando mpv non ci sono problemi

mpv --no-cache --untimed --no-demuxer-thread --video-sync=audio --vd-lavc-threads=1 rtsp://192.168.42.1:8554/stream0

mercoledì 8 novembre 2023

R 3.6 docker personalizzato

 Un esempio di Dockerfile complesso per R 3.6



FROM rstudio/r-base:3.6-bookworm

ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get -y update
RUN apt-get -y install gdal-bin libgdal-dev libpng-dev libudunits2-dev libfontconfig1-dev libmagick++-dev openjdk-17-jdk apache2 mc nano locales && apt-get clean




RUN service apache2 restart


#ENTRYPOINT ["/usr/sbin/apache2", "-k", "start"]
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
EXPOSE 80
CMD ["apachectl", "-D", "FOREGROUND"]

CMD apachectl -D FOREGROUND

# installa client Oracle
RUN wget https://download.oracle.com/otn_software/java/sqldeveloper/sqlcl-23.2.0.178.1027.zip && unzip sqlcl*.zip
ENV PATH=sqlcl/bin:$PATH


#imposta la localizzazione italiana
RUN sed -i -e 's/# it_IT.UTF-8 UTF-8/it_IT.UTF-8 UTF-8/' /etc/locale.gen && locale-gen
ENV LANG it_IT.UTF-8
ENV LANGUAGE it_IT:it
ENV LC_ALL it_IT.UTF-8

# imposta la timezone a Europe/Rome
ENV TZ="Europe/Rome"

# scarica il sorgente della libreria non presente su CRAN
RUN curl -O "https://cran.r-project.org/src/contrib/Archive/randomForest/randomForest_4.6-10.tar.gz"
#setup R configs
RUN echo "r <- getOption('repos'); r['CRAN'] <- 'http://cran.us.r-project.org'; options(repos = r);" > ~/.Rprofile
RUN Rscript -e "install.packages('zoo')"
RUN Rscript -e "install.packages('leaflet')"
RUN Rscript -e "install.packages('sf')"
RUN Rscript -e "install.packages('leafpop')"
RUN Rscript -e "install.packages('forecast')"
RUN Rscript -e "install.packages('stringr')"
RUN Rscript -e "install.packages('lubridate')"
RUN Rscript -e "install.packages('randomForest_4.6-10.tar.gz', repos = NULL, type='source')"
RUN Rscript -e "install.packages('rpart')"
RUN Rscript -e "install.packages('e1071')"
RUN Rscript -e "install.packages('kknn')"
RUN Rscript -e "install.packages('jpeg')"
RUN Rscript -e "install.packages('data.table')"
RUN Rscript -e "install.packages('tidyr')"
RUN Rscript -e "install.packages('magick')"
RUN Rscript -e "install.packages('leaflet.extras')"
RUN Rscript -e "install.packages('leafem')"
RUN Rscript -e "install.packages('raster')"

# copia i file
ADD go.sh /root/go.sh
ADD omnia_apuane_spool.sql /root/omnia_apuane_spool.sql
ADD omnia_apuane.R /root/omnia_apuane.R
ADD omnia_arno.R /root/omnia_arno.R
ADD omnia_laguna.R /root/omnia_laguna.R

#crea folders in html
RUN mkdir /var/www/html/mappe
RUN mkdir /var/www/html/mappe/omnia_apuane
RUN mkdir /var/www/html/Acque
RUN mkdir /var/www/html/Acque/LAGUNA
RUN mkdir /var/www/html/Acque/ARNO
RUN mkdir /var/www/html/Acque/ARNO/bollettini


# per il ROracle
ADD instantclient-basic-linux.x64-21.11.0.0.0dbru.zip instantclient-basic-linux.x64-21.11.0.0.0dbru.zip
ADD instantclient-sdk-linux.x64-21.11.0.0.0dbru.zip instantclient-sdk-linux.x64-21.11.0.0.0dbru.zip
# ATTENZIONE il comando ADD decompatta in automatico
# i file tar.gz. Per questo motivo la riga successiva usa COPY
COPY ROracle_1.3-2_R_x86_64-linux-gnu.tar.gz /root/ROracle_1.3-2_R_x86_64-linux-gnu.tar.gz

RUN unzip instantclient-basic-linux.x64-21.11.0.0.0dbru.zip -d /opt/oracle/
RUN unzip instantclient-sdk-linux.x64-21.11.0.0.0dbru.zip -d /opt/oracle/

RUN apt-get install -y libaio1
ENV PATH="${PATH}:/opt/oracle/instantclient_21_11"
ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/oracle/instantclient_21_11"

RUN ldconfig

# compila ROracle
RUN Rscript -e 'install.packages("/root/ROracle_1.3-2_R_x86_64-linux-gnu.tar.gz",repos=NULL,type="source")'
RUN Rscript -e "install.packages('RCurl')"
RUN Rscript -e "install.packages('stringr')"


#cancella i file temporanei
RUN rm randomForest_4.6-10.tar.gz
RUN rm sqlcl*.zip
RUN rm /root/*.tar.gz
RUN rm /root/*.zip

ROracle in R 4

 Per usare ROracle in R v.4 si deve compilare il codice scaricando il pacchetto ROracle_1.3-1.1.tgz e istantclient base ed sdk da Oracle https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html

export PATH="$PATH:/opt/oracle/instantclient_21_12"

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/oracle/instantclient_21_12"

R CMD INSTALL --configure-args='--with-oci-lib=/opt/oracle/instantclient_21_12/ --with-oci-inc=/opt/oracle/instantclient_21_12/sdk/include' ROracle_1.3-1.1.tar.gz

sudo sh -c "echo /opt/oracle/instantclient_21_12 > /etc/ld.so.conf.d/oracle-instantclient.conf"

sudo ldconfig

Per effettuare la connesione da R

library('ROracle')
library(DBI)
host <- "dbaaaa.aaaa.it"
port <- 1521
svc <- "dbaaaa.aaaaaa.it"
connect.string <- paste(
  "(DESCRIPTION=",
  "(ADDRESS=(PROTOCOL=tcp)(HOST=", host, ")(PORT=", port, "))",
  "(CONNECT_DATA=(SERVICE_NAME=", svc, ")))", sep = "")
drv = dbDriver("Oracle")
con  = dbConnect(drv, "username", "password", dbname=connect.string)

Gnome Tracker

 All'avvio del portatile mi sono accorto che il comando top riportava un processo chiamato tracker che occupava praticamente gran parte dei cicli di CPU


Non lo sapevo ma cercando ho scoperto che questo e' un servizio di indicizzazione file di Gnome

Per disabilitarlo non e' banalissimo

systemctl --user mask tracker-extract-3.service tracker-miner-fs-3.service tracker-miner-rss-3.service tracker-writeback-3.service tracker-xdg-portal-3.service tracker-miner-fs-control-3.service

e successivamente

tracker3 reset -s -r

Foraminiferi e Yolo 8

Qualche anno fa avevo provato ad addestrare una rete neurale per il riconoscimento di foraminiferi con risultati diciamo mediocri



Ho visto che i migliori risultati non si ottengono partendo da una rete ex-novo ma riaddestrando reti gia' elaborate. In questo caso ho provato ad addestrare Yolo 8 con il dataset dei foraminiferi

La prima prova la ho fatto, anche con ottimi risultati, utilizzando il cloud di Roboflow ma volevo una soluzione da fare girare on the edge


Per prima cosa ho creato un virtualenv in Python 

I dati sono inclusi in un folder in cui ci sono le sottodir test,train e valid in cui sono in ciascuna ci sono inclusi i folder images e labels


Per creare le labels ho utilizzato labelImg. Avendo problemi con l'installazione ho utilizzato il docker a questo link


Si deve selezionare il folder dove sono contenute le immagini, il folder dove saranno salvati i file txt in cui sono salvate le annotations, il tipo di annotation (di default viene indicato PascalVOC ma deve andare a Yolo) ed in View conviene indicare autosave 

Nel folder alla radice deve essere create un file data.yaml in cui sono indicati i percorsi dei folder delle immagini, il numero di classi (4) ed i nomi delle classi

train: ../train/images
val: ../valid/images
test: ../test/images
nc: 4
names: ['Candeina_Nitida', 'Globigerina_Bulloides', 'Globigerina_Falconensis', 'Globigerina_digitata']

a questo punto si procede con l'installazione di Yolo 8 

pip install ultralytics

si procede quindi con l'addestramento. Per una prima prova ho usato il pretrain piu' semplice yoolov8n ma vi sono reti addestrati molto piu' profonde in yolov8s.pt, yolov8m.pt, yolov8l.pt, yolov8x.pt
Il parametro batch dipende dalla potenza della propria CPU/GPU...io ho solo lavorato in CPU


yolo task=detect mode=train model=yolov8n.pt imgsz=640 data=data.yaml epochs=10 batch=8 name=yolov8n_foraminiferi



Nel folder run/detect/yolo8n_foraminiferi si trovano i grafici dei parametri del modello


Si puo' validare il modello con 

yolo task=detect mode=val model=runs/detect/yolov8n_foraminiferi/weights/best.pt name=yolov8n_eval data=data.yaml imgsz=640



I risultati sono peggiori di quelli visti con Roboflow ma in ogni caso si ricorda che in questo caso e' stato usata la rete di addestramento piu' semplificata

Una volta finito l'addestramento si puo' usare la rete per riconoscere oggetti

yolo task=detect mode=predict model=runs/detect/yolov8n_foraminiferi/weights/best.pt source=test/immagine.jpg show=True imgsz=640 name=yolov8n_c1 hide_labels=True











Docker pull via http_proxy

 la configurazione del proxy per effettuare un pull di un container docker si trova in

/etc/systemd/system/docker.service.d/http-proxy.conf

ed ha una sintassi del tipo

[Service]
Environment="HTTP_PROXY=http://proxy.aaaaaaaaaa.it:8080"
Environment="HTTPS_PROXY=http://proxy.aaaaaaaaaa.it:8080"

per rendere effettive le modifiche 

systemctl stop docker

systemctl stop docker.socket

systemctl daemon-reload

systemctl start docker

Debugger integrato ESP32S3

Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede  nell'ID USB della porta Jtag. Nel modulo...