sabato 6 aprile 2024

Coral Mini Dev Board

Primi passi con la Coral Dev Board Mini 

Premessa: e' un dispositivo per sola inferenza con Tensorflow Lite, non puo' fare training di modelli


Per prima cosa si connettono due cavi USB-C. Il primo serve solo per la alimentazione, il secondo solo per la USB-OTG a cui e' collegata la seriale (come al solito screen /dev/TTYACMx 115200)

Sulla scheda e' montata una distro Linux derivata Debian. Per fare lo shutdown in modo pulito da shell si lancia il comando, poi si scollega la seriale e dopo la alimentazione

Di default l'utente e'

user : mendel
password : mendel

e' presente di default il sudo

Ci si puo' collegare via SSH in 192.168.100.2 ma attenzione...di default non e' impostato il login via password, deve essere configurato il servizio da shell seriale prima di accedere in SSH.

Si puo' accedere alla shell anche mediante mdt

Per copiare i file si puo' utilizzare scp oppure mdt push

python -m venv .
source bin/activate
python3 -m pip install mendel-development-toolmdt devices
mdt shell

Lo spazio disco (senza SD Card inserita) di 8Gb cosi' distribuito 

mendel@orange-pig:~$ df -H
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       5.4G  2.0G  3.2G  39% /
devtmpfs        1.1G     0  1.1G   0% /dev
tmpfs           1.1G     0  1.1G   0% /dev/shm
tmpfs           1.1G   18M  1.1G   2% /run
tmpfs           5.3M  4.1k  5.3M   1% /run/lock
tmpfs           1.1G     0  1.1G   0% /sys/fs/cgroup
tmpfs           1.1G  283k  1.1G   1% /var/log
/dev/mmcblk0p3  2.1G   41M  1.9G   3% /home
/dev/mmcblk0p2  130M   29M   95M  24% /boot
tmpfs           210M  4.8M  205M   3% /run/user/1000

per una memoria di 2 Gb

Per connettere Wifi si puo' usare

nmcli dev wifi connect <NETWORK_NAME> password <PASSWORD> ifname wlan0

Attenzione ad APT ..come scritto nel precedente post si devono aggiornare le firme GPG dei repository Google Coral


Attenzione anche alla Camera. Mi sono fatto prestare una camera CSI per Raspberry pensando funzionasse senza problema ma il connettore della Coral e' risultato di molto piu' piccolo della flat della camera. Alla fine ho scoperto che la Coral ha un connettore CSI-2 (24 pin) mentre Raspberry una CSI (15 pin)

Link agli esempi

Camera

Audio

Github


 

 

 

Coral Mini dev board e rifiuti su spiaggia

Ho provato ad integrare il modello dei rifiuti su spiaggia visto qui e qui in Tensorflow lite per girare su Coral Mini Dev Board (basato su questo esempio)



Per prima cosa ho scaricato i dati in formato Pascal VOC (quindi con le annotations in formato xml) 

L'albero dei folder e' del tipo

--------------------------------------------------------------------------

dataset
    -train
        --images (solo jpg)
        --annotations (solo xml)
    -test
        --images
        --annotations
    -validation
        --images
        --annotations

-------------------------------------------------------------------------- 


Per questo motivo ho dovuto dividere i file rispetto al file zip scaricato da roboflow sono xml e jpg sono tutti nello stesso folder

Per fare il retrain ho usato il TF Lite Model Maker . Il problema e' che non ne vuole sapere di girare in Colab ed ho tirato su un Docker con il seguente Dockerfile

Inoltre TF Lite Model Maker effettua il retrain di modelli destinati a funzionare on edge e su mobile, in particolare usando EffiecientDet Lite 

-------------------------------------------------------------------------- 

FROM tensorflow/tensorflow:2.13.0-gpu

RUN apt-get update && \
    apt-get install -y libusb-1.0-0 libusb-1.0-0-dev

RUN pip install tflite-model-maker
RUN pip install pycocotools
 

-------------------------------------------------------------------------- 

lanciandolo con il comando

docker build -t litegpu .

docker run --gpus all -it -p  -v $PWD:/tmp -w /tmp litegpu bash

A questo punto si passa alla creazione vera e propria del modello con lo script python. Rispetto all'esempio di Colab, ho dovuto abbassare la batch size a 2 e rimuovere la validazione del modello altrimenti lo script satura tutta la memoria GPU

--------------------------------------------------------------------------

import numpy as np
import os

from tflite_model_maker.config import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import object_detector

import tensorflow as tf
assert tf.__version__.startswith('2')

tf.get_logger().setLevel('ERROR')
from absl import logging
logging.set_verbosity(logging.ERROR)


label_map = {1: 'Glass', 2: 'Metal',3: 'Net',4: 'null',5: 'PET_Bottle',6: 'Plastic_Buoy',7: 'Plastic_Buoy_China',8: 'Plastic_ETC',9: 'Rope',10: 'Styrofoam_Box',11: 'Styrofoam_Buoy',12: 'Styrofoam_Piece'}

train_images_dir = 'dataset/train/images'
train_annotations_dir = 'dataset/train/annotations'
val_images_dir = 'dataset/validation/images'
val_annotations_dir = 'dataset/validation/annotations'
test_images_dir = 'dataset/test/images'
test_annotations_dir = 'dataset/test/annotations'

train_data = object_detector.DataLoader.from_pascal_voc(train_images_dir, train_annotations_dir, label_map=label_map)
validation_data = object_detector.DataLoader.from_pascal_voc(val_images_dir, val_annotations_dir, label_map=label_map)
test_data = object_detector.DataLoader.from_pascal_voc(test_images_dir, test_annotations_dir, label_map=label_map)
print(f'train count: {len(train_data)}')
print(f'validation count: {len(validation_data)}')
print(f'test count: {len(test_data)}')


spec = object_detector.EfficientDetLite0Spec()
model = object_detector.create(train_data=train_data,
                               model_spec=spec,
                               validation_data=validation_data,
                               epochs=10,
                               batch_size=2,
                               train_whole_model=True)
#model.evaluate(test_data)
TFLITE_FILENAME = 'efficientdet-lite-litter.tflite'
LABELS_FILENAME = 'litter-labels.txt'
model.export(export_dir='.', tflite_filename=TFLITE_FILENAME, label_filename=LABELS_FILENAME,
             export_format=[ExportFormat.TFLITE, ExportFormat.LABEL])
model.evaluate_tflite(TFLITE_FILENAME, test_data)
-------------------------------------------------------------------------- 

con risultato finale

659 - loss: 0.8730 - learning_rate: 2.5257e-05 - gradient_norm: 5.0130 - val_det_loss: 0.6480 - val_cls_loss: 0.3706 - val_box_loss: 0.0055 - val_reg_l2_loss: 0.0659 - val_loss: 0.7139


Si potrebbe anche usare il modello 1 cambiando la linea

spec = object_detector.EfficientDetLite1Spec()

ma la mia scheda grafica non ha abbastanza memoria

Per verificare se il modello funziona si puo' all'interno del docker installare tramite pip

python3 -m pip install --extra-index-url https://google-coral.github.io/py-repo/ pycoral

e poi lanciare il comando lo script

-------------------------------------------------------------------------- 

from PIL import ImageDraw
from PIL import ImageFont
import PIL

import tflite_runtime.interpreter as tflite
from pycoral.adapters import common
from pycoral.adapters import detect
from pycoral.utils.dataset import read_label_file

def draw_objects(draw, objs, scale_factor, labels):
  """Draws the bounding box and label for each object."""
  COLORS = np.random.randint(0, 255, size=(len(labels), 3), dtype=np.uint8)
  for obj in objs:
    bbox = obj.bbox
    color = tuple(int(c) for c in COLORS[obj.id])
    draw.rectangle([(bbox.xmin * scale_factor, bbox.ymin * scale_factor),
                    (bbox.xmax * scale_factor, bbox.ymax * scale_factor)],
                   outline=color, width=3)
    font = ImageFont.truetype("LiberationSans-Regular.ttf", size=15)
    draw.text((bbox.xmin * scale_factor + 4, bbox.ymin * scale_factor + 4),
              '%s\n%.2f' % (labels.get(obj.id, obj.id), obj.score),
              fill=color, font=font)

# Load the TF Lite model
labels = read_label_file('./e0/litter-labels.txt')
interpreter = tflite.Interpreter('./e0/efficientdet-lite-litter.tflite')
interpreter.allocate_tensors()

# Resize the image for input
image = Image.open('./e0/1.jpg')
_, scale = common.set_resized_input(
    interpreter, image.size, lambda size: image.resize(size, PIL.Image.Resampling.LANCZOS))

# Run inference
interpreter.invoke()
objs = detect.get_objects(interpreter, score_threshold=0.4, image_scale=scale)

# Resize again to a reasonable size for display
display_width = 500
scale_factor = display_width / image.width
height_ratio = image.height / image.width
image = image.resize((display_width, int(display_width * height_ratio)))
draw_objects(ImageDraw.Draw(image), objs, scale_factor, labels)
image.save("output.jpg")

-------------------------------------------------------------------------- 

il risultato e' l'immagine di apertura del post

A questo punto si compilano i modelli per poter girare su Coral Dev Mini Board installando il compilatore sul PC

wget -O- https://packages.cloud.google.com/apt/doc/apt-key.gpg | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/coral-edgetpu.gpg

apt-get update
apt-get install edgetpu-compiler

e poi lanciando la compilazione con

edgetpu_compiler efficientdet-lite-litter.tflite -d --num_segments=1

a questo punto si copiano i file del modello sulla Dev Board 

scp efficientdet-lite-litter_edgetpu.tflite mendel@192.168.100.2:/home/mendel

e si lancia

python3 detect_image.py --model efficientdet-lite-litter_edgetpu.tflite --labels litter-labels.txt --input CD_10196_jpg.rf.4a2b1adf824f2a18a7eea764b9012f36.jpg --output output.jpg


----INFERENCE TIME----
Note: The first inference is slow because it includes loading the model into Edge TPU memory.
347.37 ms
182.40 ms
181.49 ms
178.24 ms
182.33 ms
-------RESULTS--------
Styrofoam_Piece
  id:     11
  score:  0.453125
  bbox:   BBox(xmin=248, ymin=132, xmax=279, ymax=171)
PET_Bottle
  id:     4
  score:  0.4375
  bbox:   BBox(xmin=274, ymin=206, xmax=299, ymax=246)

 


Attenzione che la versione del runtime del compilatore deve essere compatibile con le librerie sulla Dev Board. In una prima prova avevo avuto l'errore

RuntimeError: Failed to prepare for TPU. Failed precondition: Package requires runtime version (14), which is newer than this runtime version (13).Node number 7 (EdgeTpuDelegateForCustomOp) failed to prepare.

ed infatti il comando  edgetpu_compiler --version rispondeva
Edge TPU Compiler version 16.0.384591198

mentre la runtime version era

python3 -c "import pycoral.utils.edgetpu; print(pycoral.utils.edgetpu.get_runtime_version())"
BuildLabel(COMPILER=6.3.0 20170516,DATE=redacted,TIME=redacted), RuntimeVersion(13)

Questo era dovuto al fatto che apt non scaricava gli aggiornamenti a causa della firma GPG scaduta dei repository Google Coral 

Il problema si e' risolto con

wget -O- https://packages.cloud.google.com/apt/doc/apt-key.gpg | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/coral-edgetpu.gpg


mercoledì 3 aprile 2024

Tensorflow e firme spettrali

Questa e' sola una prova di fattibilita', non ha interesse di uso pratico

Era un po' di tempo che volevo provare ad usare una rete neurale per classificare le firme spettrali da telerilevamento

Per semplicita' ho preso una immagine Sentinel 2 e selezionato 90 Pin sulla mappa (3 categorie: sedimenti fluviali, suolo nudo, vegetazione) per estrarre le firme tramite Optical/Spectrum View


 

C'e' da osservare che SNAP  estrae solo le bande Sentinel 2 a risoluzione a 10 m. Il file csv e' del tipo  (ho provato a fare il resampling per estrarre tutta la firma spettrale mostrata in grafico ma senza successo)

490,560,665,842,Classe
0.0737,0.0992,0.1278,0.2956,1
0.064,0.0882,0.1038,0.2976,1
0.0682,0.0964,0.1086,0.2792,1
0.0674,0.0956,0.1142,0.2832,1
0.0772,0.1046,0.1386,0.2642,1 

 

A questo punto ho modificato questo esempio di tensorflow basato sul dataset Iris sostituendo le feature della morfologia dei fiori con la risposta spettrale


import pandas as pd
import numpy as np
import tensorflow as tf
import seaborn as sns
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Dropout
from sklearn.preprocessing import LabelEncoder , StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix

df = pd.read_csv('spettri.csv')
print(df.head())

le = LabelEncoder()
df['classe'] = le.fit_transform(df['classe'])

X = df.drop(columns=['classe'])
y = df['classe']
print(y.head())
print(y.value_counts())

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25,shuffle=True,random_state=7)

sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

print(y_train)
y_train = tf.keras.utils.to_categorical(y_train,num_classes=3)

def get_models():
model = Sequential([
Dense(units=32,input_shape=(4,),activation='relu'),
Dense(units=32,activation='relu'),
Dropout(0.5),
Dense(units=3,activation='softmax')
])
return model

model = get_models()
model.compile(optimizer='Adam',loss='categorical_crossentropy',metrics=['accuracy'])
model.summary()

model.fit(X_train,y_train,epochs=100, verbose=2)

prediction = model.predict(X_test)
prediction = np.argmax(prediction,axis=-1)
acury = accuracy_score(y_test,prediction)
print(acury)
cm = confusion_matrix(y_test,prediction)
print(cm)


In fase di test il perggior riconoscimento e' dell' 86%

Questa e' la matrice di confusione del risultato peggiore
 

[[7 1 0]
 [0 5 2]
 [0 0 8]]



venerdì 29 marzo 2024

Gaussian Splatting con Nerfstudio e Opensplat

Sto interessando a gaussian splatting ed ho iniziato provando OpenSplat

Prima di usare OpenSplat si devono preparare i dati con NerfStudio

Ho creato un virtualenv con Python e quindi ho installato Nerfstudio ed alcune dipendenze

pip install nerfstudio

apt install ffmpeg

apt install colmap

A questo punto ho preso le immagini di esempio del Lego ed ho lanciato il processing (no gpu)

 

ns-process-data images --data ./data/img/lego/train/ --output-dir ./data/img/elabora --no-gpu

E' giunto il momento di passare ad OpenSplat.

Ho creato il docker clonando il git del progetto e lanciando (compilazione abbastanza veloce)

docker build -t opensplat .

a questo punto si lancia il docker puntando a dove sono state salvate le elaborazioni di Nerfstudio

docker run -it -v /home/luca/OpenSplat/NerfStudio/data/img:/data --device=/dev/kfd --device=/dev/dri opensplat:latest bash

e lanciando la elaborazione

root@c52b8089c5f6:/code/build# ./opensplat ../../data/elabora/ -n 2000


il risultato dopo 2000 steps e' il file splat.ply


https://playcanvas.com/viewer



Yolo 8 in Google Colab

Ho provato a vedere di sfruttare le risorse gratuite di Google Colab per fare il retraining di Yolo del precedente post

Per prima cosa si copiano i files su Google Drive e si concede la lettura a Colab

import os, sys
from google.colab import drive
drive.mount('/content/drive')
nb_path = '/content/notebooks'
os.symlink('/content/drive/My Drive/Colab Notebooks', nb_path)
sys.path.insert(0,nb_path)

In seguito si installa Yolo 

%pip install ultralytics
import ultralytics
ultralytics.checks()

Ho usato per semplicita' la modalita'a linea nei comando (basta mettere un punto interrogativo prima del comando) effettuando i puntamenti sui folder GDrive

!yolo task=detect mode=train model=yolov8m.pt imgsz=640 data=/content/drive/MyDrive/ocean_trash/data.yaml epochs=60 batch=32 name=yolov8m_e60_b32_trash

Rispetto alla prova sul portatile ho potuto utilizzare la YOLO M al posto di YOLO N impostando le epoch a 60 e la batch a 32 (con queste impostazioni siamo quasi al limite dei 15 Gb di memoria disponibili sulla GPU T4 disponibile nel profilo gratuito)

Rispetto alla rete addestrata sul portatile con YOLO N, 10 epoch e 4 batch c'e' un significativo miglioramento a parita'di set di immagini di addestramento anche se la classe Rope risulta permanere come mal classificata






giovedì 28 marzo 2024

Retrain Yolo8 con rifiuti su spiaggia

Ho provato a fare il retraining di Yolo 8 con rifiuti spiaggiati usando il dataset al link sottostante

 https://universe.roboflow.com/baeulang/ocean_trash

 


 Il dataset e' composto da 1133 immagini

Il train e' stato eseguito sull' NVidia Geforce 940M su mio portatile Debian. Per questo motivo ho dovuto usare il modello nano e ridurre le batch da 16 a 8 altrimenti saturavo completamente il Gb di ram della scheda video


yolo task=detect mode=train model=yolov8n.pt imgsz=640 data=/home/luca/yolo8/trash/data.yaml epochs=10 batch=4 name=yolov8n_trash


 

yolo detect val model='/home/luca/yolo8/runs/detect/yolov8n_trash4/weights/best.pt'  imgsz=640 data=/home/luca/yolo8/trash/data.yaml


Matrice di confusione




a questo punto ho usato il file addestrato per riconoscere immagini che non sono state inserite nella fase di train

yolo predict model='/home/luca/yolo8/runs/detect/yolov8n_trash4/weights/best.pt' source='/home/luca/yolo8/trash/test/images/CD_9581_jpg.rf.ac853dd458749924fe0891cd4c5f9a21.jpg' imgsz=640

 

Questo e' un esempio di riconoscimento


Il risultato non e' eccezionale ma c'e' considerare che e' stato utilizzato come base il modello nano



venerdì 22 marzo 2024

SV305 raw image

Sto provando a prendere il controllo della SVBony SV305 senza passare da AstroDMX

La camera puo' essere controllata tramite l'SDK che si trova al link https://www.svbony.com/Support/SoftWare-Driver  (il driver e' proprietario e la libreria e' distribuita compilata)

Per prima cosa su Linux si copia il file 90-ckusb.rules in /etc/udev/rules.d e si riavvia udev con udevadm control --reload-rules

La camera puo' essere controllata sia mediante l'esempio in C sia mediante Python con la libreria https://pypi.org/project/pysvb/

Il salvataggio e' in ogni caso in formato raw con spazio colore GRBG, cio' vuol dire che il filtro di Bayes riporta nella prima riga valore RGRGRGRGRG mentre nella seconda GBGBGBGB

Nella demo viene selezionata una ROI di 800x600 (la massima risoluzione e' 1920x1080x16bit) con un file di uscita di dimensione di 3840000 byte.  Considerando che 800x600 sono 480000 pixels ci sono 8 byte per pixel (il calcolo sarebbe 800x600x4x2) 

oltre al formato RAW16 sono supportati i formati RAW8,RAW10, RAW12,RAW14,RAW16,RGB24,RGB32,Y8, Y10,Y12,Y14,Y16

http://www.suffolksky.com/2022/04/21/indi-allsky-sv305-gain-and-color-setting/


Scan camera number: 1

Friendly name: SVBONY SV305
Port type: USB2.0
SN: 01232E4B8B52E627EE20081200a4
Device ID: 0x1201
Camera ID: 1
sn: 01232E4B8B52E627EE20081200a4
camera maximum width 1920
camera maximum height 1080
camera color space: color
camera bayer pattern: 2
support bin: 1
support bin: 2
support bin: 0
support img type: 0
support img type: 4
support img type: 5
support img type: 10
support img type: -1
Max depth: 16
Is trigger camera: YES
=================================
control type: 1
control name: Exposure
control Description: Exposure
Maximum value: 1999999991
minimum value: 29
default value: 30000
is auto supported: YES
is writable: YES
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
control type 1 value 989
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
=================================
control type: 0
control name: Gain
control Description: Gain
Maximum value: 720
minimum value: 0
default value: 10
is auto supported: NO
is writable: YES
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
control type 0 value 0
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
=================================
control type: 9
control name: Contrast
control Description: Contrast
Maximum value: 100
minimum value: 0
default value: 50
is auto supported: NO
is writable: YES
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
control type 9 value 50
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
=================================
control type: 10
control name: Sharpness
control Description: Sharpness
Maximum value: 100
minimum value: 0
default value: 0
is auto supported: NO
is writable: YES
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
control type 10 value 0
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
=================================
control type: 11
control name: Saturation
control Description: Saturation
Maximum value: 255
minimum value: 0
default value: 128
is auto supported: NO
is writable: YES
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
control type 11 value 128
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
=================================
control type: 4
control name: WB_R
control Description: WB Red
Maximum value: 511
minimum value: 0
default value: 128
is auto supported: YES
is writable: YES
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
control type 4 value 231
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
=================================
control type: 5
control name: WB_G
control Description: WB Green
Maximum value: 511
minimum value: 0
default value: 128
is auto supported: YES
is writable: YES
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
control type 5 value 128
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
=================================
control type: 6
control name: WB_B
control Description: WB Blue
Maximum value: 511
minimum value: 0
default value: 128
is auto supported: YES
is writable: YES
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
control type 6 value 253
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
=================================
control type: 2
control name: Gamma
control Description: Gamma
Maximum value: 1000
minimum value: 0
default value: 100
is auto supported: NO
is writable: YES
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
control type 2 value 100
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
=================================
control type: 8
control name: Frame speed
control Description: Frame speed
Maximum value: 2
minimum value: 0
default value: 1
is auto supported: NO
is writable: YES
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
control type 8 value 2
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
=================================
control type: 13
control name: Offset
control Description: Offset
Maximum value: 255
minimum value: 0
default value: 0
is auto supported: NO
is writable: YES
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
control type 13 value 0
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
=================================
control type: 12
control name: Auto exposure target
control Description: Auto exposure target
Maximum value: 160
minimum value: 60
default value: 100
is auto supported: NO
is writable: YES
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
control type 12 value 100
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
=================================
control type: 7
control name: Flip
control Description: Flip
Maximum value: 3
minimum value: 0
default value: 0
is auto supported: NO
is writable: YES
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
control type 7 value 0
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
=================================
control type: 18
control name: Bad pixel correction
control Description: Bad pixel correction
Maximum value: 1
minimum value: 0
default value: 1
is auto supported: NO
is writable: YES
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
control type 18 value 1
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
=================================
control type: 19
control name: Bad pixel correction threshold
control Description: Bad pixel correction threshold
Maximum value: 200
minimum value: 10
default value: 60
is auto supported: NO
is writable: YES
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
control type 19 value 60
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
camera ROI, startX 0, startY 0, width 1920, height 1080, bin 1
camera ROI, startX 0, startY 0, width 800, height 600, bin 1
cameraMode: 0
pixel size 2.900000
write image file SVB_image_0.raw
drop frames: 0
write image file SVB_image_1.raw
drop frames: 0
write image file SVB_image_2.raw
drop frames: 0
write image file SVB_image_3.raw
drop frames: 0
write image file SVB_image_4.raw
drop frames: 0
write image file SVB_image_5.raw
drop frames: 0
write image file SVB_image_6.raw
drop frames: 0
write image file SVB_image_7.raw
drop frames: 0
write image file SVB_image_8.raw
drop frames: 0
write image file SVB_image_9.raw
drop frames: 0
stop camera capture
close camera

 

Tour de France Firenze Gran Depart

  Poagcar Wout Van Aert Vingegaard       Van Der Poel