====== AI Vision ====== Voir aussi: * [[/informatique/ign_bdortho|IGN BdOrtho]] ===== llama.cpp ===== Il y a YOLO et tout plein d'outils dédiés à la détection dans des images. Là je teste avec des modèles multimodaux, sans entraînement spécifique. Le prompt demande s'il y a des panneaux solaire dans l'image fournie, avec sa bbox, et si "oui" de calculer les coordonnées géographiques de l'objet trouvé. Les 2 instructions permettent d'éliminer des faux positifs. Par exemple le modèle trouve un panneau solaire dans cette image, mais ne trouve pas les coordonnées géo, on peut donc l'évacuer des positifs. {{:informatique:ai_lm:ai_vision:champ-avec-rayures_18-131487-91478.jpeg?direct&140|champ avec rayures}} * [[https://github.com/ggml-org/llama.cpp/tree/master/tools/mtmd|Multimodal Support in llama.cpp]] Nécessite un modèle multimodal et un fichier ''mmproj'' approprié. ===== Yolo ===== * https://docs.ultralytics.com/models/yolo26/ Comparaison de perf avec le modèle ''yolo26x.pt'' sur 1521 tuiles de 640 pixels: ^ ^ real ^ user ^ sys ^ | CUDA RTX 3060 | 0m25,625s | 0m22,140s | 0m3,480s | | 13th i7-1360P | 6m3,403s | 48m3,806s | 0m2,906s | ==== Entraînement ==== Construction du jeu de données d’entraînement avec [[https://labelstud.io/|Label Studio]]. Export au format "Yolo + images". Attention, il faut ensuite répartir les images et labels entre "train" et "val". uv run yolo detect train \ data=dataset_s4-project-1-at-2026-03-07-15-33-9190b7c5.yml \ model=~/Data/AI_ModelsVision/yolo26l.pt \ epochs=130 lr0=0.0005 cos_lr=True augment=True optimizer=AdamW ==== panneaux solaires photovoltaïques ==== Spécialisation à la détection de panneaux solaires photovoltaïques sur les tuiles de [[/informatique/ign_bdortho|IGN BdOrtho]]. Essentiellement les grandes installation comme la bâtis agricoles et toitures d'écoles et bâtiment industriels. Les petits panneaux sur toitures habitation résidentielles sont difficiles à différencier et peuvent être pour chauffer l'eau et pas pour générer de l'électricité. Il y a encore quelques faux positifs, mais à la marge. 😉 Le dataset avec 286 images pour "train" et 50 pour "val" : * {{ :informatique:ai_lm:ai_vision:yolo:solar-panels_project-s4_2026-03-07.zip |}} * https://huggingface.co/datasets/Cyrille37/solar-panels-IGN-bdortho Le modèle résultant à partir de **Yolo26L** : * {{ :informatique:ai_lm:ai_vision:yolo:yolo26l_solar_panel-s4.pt.zip |}} * https://huggingface.co/Cyrille37/solar-panels-IGN-bdortho Travaux similaires: * [[https://gabrielkasmi.github.io/deeppvmapper/|Enhancing the Reliability of Deep Learning Models to Improve the Observability of French Rooftop Photovoltaic Installations]] par Gabriel Kasmi pour sa thèse à Université Paris sciences et lettres. * [[https://huggingface.co/agademer/yolo-remote-sensing-photovoltaic|agademer/yolo-remote-sensing-photovoltaic]] - This model detects buildings and rooftop photovoltaic panels from remote sensing imagery using YOLO. IGN's Orthophotos (960x960 pixels aka 192x192 meters) from South-West of France (Castelnaudary to Perpignan), Montpellier surroundings and South of Paris. Rooftop photovoltaic panels and buildings shapes identified with the help of OpenStreetMap. === Détections par départements === Les rectangles ont 2 propriétés: la "confidence" de la détection et "file" pour le nom de la tuile. * 03 Allier {{ :informatique:ai_lm:ai_vision:yolo:bdortho_tuiles-640_03.geojson.zip |}} * [[https://maproulette.org/browse/challenges/54541|Challenge maproulette]] * 05 Hautes-Alpes {{ :informatique:ai_lm:ai_vision:yolo:bdortho_tuiles-640_05.geojson.zip |}} * le modèle hallucine en haute-montagne, mais pas suffisamment de faux-positifs pour justifier un nouvel entraînement * [[https://maproulette.org/browse/challenges/54542|Challenge maproulette]] * 09 Ariège {{ :informatique:ai_lm:ai_vision:yolo:bdortho_tuiles-640_09.geojson.zip |}} * [[https://maproulette.org/browse/challenges/54545|Challenge maproulette]] * 10 Aube {{ :informatique:ai_lm:ai_vision:yolo:bdortho_tuiles-640_10.geojson.zip |}} * [[https://maproulette.org/browse/challenges/54550|Challenge maproulette]] * 22 Côtes-d'Armor {{ :informatique:ai_lm:ai_vision:yolo:bdortho_tuiles-640_22.geojson.zip |}} * [[https://maproulette.org/browse/challenges/54551|Challenge maproulette]] * 32 Gers {{ :informatique:ai_lm:ai_vision:yolo:bdortho_tuiles-640_32.geojson.zip |}} * [[https://maproulette.org/browse/challenges/54538|Challenge maproulette]] * 37 Indre-et-Loire * 42 Loire {{ :informatique:ai_lm:ai_vision:yolo:solar-panels_42.geojson.zip |}} * [[https://maproulette.org/browse/challenges/54565|Challenge maproulette]] * 43 Haute-Loire {{ :informatique:ai_lm:ai_vision:yolo:solar-panels_43.geojson.zip |}} * [[https://maproulette.org/browse/challenges/54585|Challenge maproulette]] * 44 Loire-Atlantique {{ :informatique:ai_lm:ai_vision:yolo:bdortho_tuiles-640_44.geojson.zip |}} * [[https://maproulette.org/browse/challenges/54594|Challenge maproulette]] * 46 Lot {{ :informatique:ai_lm:ai_vision:yolo:bdortho_tuiles-640_46.geojson.zip |}} * [[https://maproulette.org/browse/challenges/54595|Challenge maproulette]] * 48 Lozère {{ :informatique:ai_lm:ai_vision:yolo:bdortho_tuiles-640_48.geojson.zip |}} * [[https://maproulette.org/browse/challenges/54596|Challenge maproulette]] * 49 Maine-et-Loire {{ :informatique:ai_lm:ai_vision:yolo:solar-panels_49.geojson.zip |}} * [[https://maproulette.org/browse/challenges/54624|Challenge maproulette]] * 50 Manche {{ :informatique:ai_lm:ai_vision:yolo:solar-panels_50.geojson.zip |}} * [[https://maproulette.org/browse/challenges/54710|Challenge maproulette]] * 59 Nord {{:informatique:ai_lm:ai_vision:yolo:bdortho_tuiles-640_59.geojson.zip|}} * [[https://maproulette.org/browse/challenges/54555|Challenge maproulette]] * 63 Puy-de-Dôme {{ :informatique:ai_lm:ai_vision:yolo:solar-panels_63.geojson.zip |}} * [[https://maproulette.org/browse/challenges/54626|Challenge maproulette]] * 65 Hautes-Pyrénées {{ :informatique:ai_lm:ai_vision:yolo:solar-panels_65.geojson.zip |}} * [[https://maproulette.org/browse/challenges/54632|Challenge maproulette]] * 82 Tarn-et-Garonne {{ :informatique:ai_lm:ai_vision:yolo:solar-panels_82.geojson.zip |}} * [[https://maproulette.org/browse/challenges/54636|Challenge maproulette]] ===== OCR ===== ==== LiteParse ==== A fast, local PDF parsing with spatial text parsing, OCR, and bounding boxes. Open-source document parser from [[https://developers.llamaindex.ai/liteparse/|LlamaIndex]] https://github.com/run-llama/liteparse ==== GLM-OCR ==== Avec llama.cpp et le modèle [[https://huggingface.co/ggml-org/GLM-OCR-GGUF|GLM-OCR-f16.gguf]] avec son fichier mmproj-GLM-OCR-Q8_0.gguf ~/Code/bronx/AI_Coding/llama.cpp-86/build/bin/llama-server --port 8012 \ -m ~/Data/AI_ModelsOCR/GLM-OCR-f16.gguf \ --mmproj ~/Data/AI_ModelsOCR/mmproj-GLM-OCR-Q8_0.gguf Avec les images de pages scannées du fichier https://www.cotes-darmor.gouv.fr/contenu/telechargement/60849/507248/file/recueil-22-2023-079-recueil-des-actes-administratifs-special.pdf Avec CPU i7-1360P 13thGen real 0m47,583s, 0m32,031s user 0m0,112s, 0m0,110s sys 0m0,025s, 0m0,025s Avec RTX 3060 real 0m5,929s, 0m3,367s user 0m0,099s, 0m0,104s sys 0m0,027s, 0m0,027s La page 8 est un tableau et les données dans les cellules sont très bien extraites, les phrases sur plusieurs lignes dans une cellule sont bien extraites. Avec le prompt : "''Extrais le texte de cette image en préservant la structure (titres, listes, paragraphes). Corrigé les erreurs d'OCR si nécessaire. Réponds avec LE FORMAT MARKDOWN.''" la page 8 donne du Markdown alors que la page 9 donne du HTML ... Alors qu'avec le prompt : "''Extract the text from this image, preserving the structure (headings, lists, paragraphs). Correct any OCR errors where necessary. Please reply in MARKDOWN FORMAT.''" les pages 8 et 9 sont bien en Markdown. Comme quoi **le modèle comprends mieux l'anglais**. Les tables sont bien extraites mais **pas toujours bien rendues** dans la réponse. Après quelques essais le prompt qui fonctionne mieux : "''Extract the text from this image, preserving the structure (headings, lists, paragraphs) and make sure you KEEP THE TABLES in good condition. Correct any OCR errors where necessary. Fine Reply in MARKDOWN FORMAT.''" 😩 voilà qu'après plusieurs usages il n'y a plus de Markdown pour les titres ... 👌 J'ai changé de stratégie: ne plus extraire la mise en forme, mais seulement le texte page par page, avec extraction de quelques entités comme "auteur", "date", "sujet" et un "résumé". Là le model GLM-OCR-f16 est très efficace. ==== Qwen2.5-VL-7B-Instruct ==== https://huggingface.co/unsloth/Qwen2.5-VL-7B-Instruct-GGUF Bien meilleurs résultats pour la structure en Markdown mais beaucoup plus gourmand en mémoire et donc plus lent à cause de l'usage du CPU, même avec du Q4. 😩 ~/Code/bronx/AI_Coding/llama.cpp-86/build/bin/llama-server --port 8012 \ -m ~/Data/AI_ModelsOCR/Qwen2.5-VL-7B-Instruct-UD-Q4_K_XL.gguf \ --mmproj ~/Data/AI_ModelsOCR/mmproj-F16.gguf -ngl 20 real 0m39,938s, 0m45,901s user 0m0,116s, 0m0,105s sys 0m0,024s, 0m0,027s ==== DeepSeek-OCR-GGUF ==== [[https://huggingface.co/ggml-org/DeepSeek-OCR-GGUF|ggml-org/DeepSeek-OCR-GGUF]] Tient dans la VRAM de la RTX3060. Gère bien le Markdown, mais les résultats sont alléatoires ... Et de nombreuses allucinations 😩