
Billigast vet jag inte. Men enklast är det. Fast det beror på vilka metoder man vill använda. Open CV så är raspberry bättre än stm32.
Rick81 skrev: ↑28 juli 2020, 22:55:04 Kan tillägga att jag själv implementerat kamera och display i en STM32F1 på 72 MHz. Visserligen var det bara 320x240 pixlar. Men visst det var en del jobb få till det....
Tror nog ESP32 är mer pålitligt än Raspberry pi om man ska använda i kommersiella produkter med livslängd mer än 1 år...
Kod: Markera allt
FIFO_GPIO_Configuration();
FIFO_CS_L();
FIFO_WE_H();
while( 1 != OV7725_Init() );
OV7725_EXTI_Configuration();
OV7725_NVIC_Configuration();
Vsync = 0;
LCD_Initializtion(true);
LCD_ADC_Init();
bool releasedJoy = false;
while (1)
{
CommonLoop();
if( Vsync == 2 )
{
LCD_SetCursor(0, 0);
LCD_WriteRAM_Prepare();
FIFO_RRST_L();
FIFO_RCLK_L();
FIFO_RCLK_H();
FIFO_RRST_H();
FIFO_RCLK_L();
FIFO_RCLK_H();
for( count = 0; count < 76800; count++ )
{
FIFO_RCLK_L();
CMOS_Data = (GPIOC->IDR<<8) & 0xff00;
FIFO_RCLK_H();
FIFO_RCLK_L();
CMOS_Data |= (GPIOC->IDR) & 0x00ff;
FIFO_RCLK_H();
LCD_WriteRAM(CMOS_Data);
}
Vsync = 0;
}
}
}
Kod: Markera allt
void EXTI0_IRQHandler(void)
{
if ( EXTI_GetITStatus(EXTI_LINE_VSYNC_CMOS) != RESET )
{
if( Vsync == 0 )
{
FIFO_WRST_L();
FIFO_WE_H();
Vsync = 1;
FIFO_WE_H();
FIFO_WRST_H();
}
else if( Vsync == 1 )
{
FIFO_WE_L();
Vsync = 2;
}
EXTI_ClearITPendingBit(EXTI_LINE_VSYNC_CMOS);
}
}
Ok, så din applikation är "seende robotar". Det låter spännande. (Din definition av reinforcement learning är lite udda, faktiskt.) Vad skall roboten se? Hur fort skall det gå? Färg/svartvitt? Upplösning?Jag är intresserad utav AI på inbyggda system. Detta har med robotik att göra, inget annat. Kan man få en radiostyrd bil eller robotar se med en kamera och identifiera vad den ser så kan man koppla ihop med Reinforcement Learning, vilket är i praktiken en hög med olika if-sataer uttryckt i linjär algebra.
Hastigheten du behöver beror på vilken upplösning och framerate du har. Vad LCD har med detta att göra får du nog utveckla lite.Men för att tillämpa AI på enbyggda system så måste man ha en kamera + LCD. Men inte vilken kamera och LCD som helst. Det måste vara en kamera och LCD som har en DMA fästning(interfaces). Då går det otroligt snabbt.
Djupa neurala nätverk är en sak. PCA, Fisher faces osv är helt andra saker. Hänger detta ihop med det du tänker göra? Kanske skall börja med att fokusera på en sak i taget.Dessutom så kan jag tillägga att djupa neurala CNN nätverk kräver tusentals bilder. Jag har programvara för LDA + PCA där man kan få till bildigenkänning med ca 100 bilder totalt AC 4 personer(25 bilder per person). En teknik som kallas för Fisher Faces. Används inom OpenCV.
Storleksordningen 320x240 är väl tänligen normalt för klassiska neuralnät för bildapplikationer. Har du funderat på beräkningstiden för ett lämpligt CNN på din målplatform? Det vore ju trist om du inte kunde processa mer än någon frame per sekund om det är "realtid" du vill ha. (Vill du det?) För hög prestanda är det nog enklare (och troligen dyrare) att använda exempelvis Nvidia Jetson, om du kan få tag på ett sådant. Men du kommer att behöva stort batteri.320x240 pixlar är enormt ska du veta. Normalt brukar CNN nätverk vara på 28x28.
Så denna OV kamera kopplas in på I2C endast och "bittlangar" med något protokoll?Rick81 skrev: ↑29 juli 2020, 08:45:43 Jag körde mostvarande denna kameran:
https://www.electrodragon.com/product/o ... ra-module/
Kameran intieras via I2C och sedan "bitbangar" jag ut parallellbussen.
LCD koppplas via FMSC bussen (externa minnesbussen) på STM32F1. Huvudloopen blir inte värre än så här:Sen hanterar jag vsync via EXTI interupt:Kod: Markera allt
FIFO_GPIO_Configuration(); FIFO_CS_L(); FIFO_WE_H(); while( 1 != OV7725_Init() ); OV7725_EXTI_Configuration(); OV7725_NVIC_Configuration(); Vsync = 0; LCD_Initializtion(true); LCD_ADC_Init(); bool releasedJoy = false; while (1) { CommonLoop(); if( Vsync == 2 ) { LCD_SetCursor(0, 0); LCD_WriteRAM_Prepare(); FIFO_RRST_L(); FIFO_RCLK_L(); FIFO_RCLK_H(); FIFO_RRST_H(); FIFO_RCLK_L(); FIFO_RCLK_H(); for( count = 0; count < 76800; count++ ) { FIFO_RCLK_L(); CMOS_Data = (GPIOC->IDR<<8) & 0xff00; FIFO_RCLK_H(); FIFO_RCLK_L(); CMOS_Data |= (GPIOC->IDR) & 0x00ff; FIFO_RCLK_H(); LCD_WriteRAM(CMOS_Data); } Vsync = 0; } } }
Kod: Markera allt
void EXTI0_IRQHandler(void) { if ( EXTI_GetITStatus(EXTI_LINE_VSYNC_CMOS) != RESET ) { if( Vsync == 0 ) { FIFO_WRST_L(); FIFO_WE_H(); Vsync = 1; FIFO_WE_H(); FIFO_WRST_H(); } else if( Vsync == 1 ) { FIFO_WE_L(); Vsync = 2; } EXTI_ClearITPendingBit(EXTI_LINE_VSYNC_CMOS); } }
Jag tänker inte masstillverka. Utan jag vill ha en proper lösning på ett problem.davidi skrev: ↑29 juli 2020, 10:53:12 Du ställer en till synes ganska generell fråga om något som beror på en massa faktorer. Vilka är kraven? Bygger du något som ska användas i ett enda exemplar, eller tänker du serietillverka tusentals enheter? Varför är det viktigt med en sekundsnabb boot-tid? Vad ska hända med output från kameran? Etc etc
Jag har ingen specifikation än. Jag sitter bara och rabblar upp massa idéer för mig själv
Kan man få 20 FPS per sekund? Det kanske låter lite mycket?Hastigheten du behöver beror på vilken upplösning och framerate du har. Vad LCD har med detta att göra får du nog utveckla lite.
Jag försöker avgöra vad är egentligen bäst. STM32-vägen eller Raspberry-vägen?Djupa neurala nätverk är en sak. PCA, Fisher faces osv är helt andra saker. Hänger detta ihop med det du tänker göra? Kanske skall börja med att fokusera på en sak i taget.
Jag har inte kommit så långt. Just nu funderar jag på vilken plattform jag ska använda mig utav.Storleksordningen 320x240 är väl tänligen normalt för klassiska neuralnät för bildapplikationer. Har du funderat på beräkningstiden för ett lämpligt CNN på din målplatform? Det vore ju trist om du inte kunde processa mer än någon frame per sekund om det är "realtid" du vill ha. (Vill du det?) För hög prestanda är det nog enklare (och troligen dyrare) att använda exempelvis Nvidia Jetson, om du kan få tag på ett sådant. Men du kommer att behöva stort batteri.
Ett förslag är att börja modellera på en vanlig PC (med GPU för NN-accellerering, vid behov). Utveckla din algoritm där och mät prestanda och kostnad "kontinuerligt". Då får du ett bra hum om vad som kostar vad, och i slutändan vilken målplatform som kommer att fungera för din lösning.Jag har inte kommit så långt. Just nu funderar jag på vilken plattform jag ska använda mig utav.
Jag bitbangar en parallell 8 bit databus från kameran. Protokollet är sköts via FIFO_XXX signalerna i koden.Så denna OV kamera kopplas in på I2C endast och "bittlangar" med något protokoll?
FMSC/parallellt är alltid snabbare än SPI. Förenklat kan man säga att en 16 bit FMSC buss är 16 ggr snabbare än SPI på samma klockfrekvens. Lite sanning med modifikation, men inte långt ifrån.Vad är bäst FMSC eller SPI när det kommer till LCD? Jag har en LCD med SPI. ILI9341.