AgriChat is a domain-specialized multimodal large language model for agricultural image understanding. It is built on top of LLaVA-OneVision / Qwen-2-7B and adapted with LoRA for fine-grained plant species identification, plant disease diagnosis, and crop counting.
General-purpose MLLMs lack verified agricultural expertise across diverse taxonomies, diseases, and counting settings. AgriChat is trained to address that gap using AgriMM, a large multi-source agricultural instruction dataset covering:
1.
2├── README.md
3├── adapter_config.json
4├── adapter_model.safetensors
5└── dataset/
6 ├── README.md
7 ├── train.jsonl
8 └── test.jsonl
1{
2 "images": ["datasets_sorted\\iNatAg_subset\\hymenaea_courbaril\\280829227.jpg"],
3 "messages": [...]
4}
1datasets_sorted/
2├── iNatAg_subset/
3├── classification/
4├── detection/
5└── ...
1import torch
2from PIL import Image
3from peft import PeftModel
4from transformers import AutoProcessor, LlavaOnevisionForConditionalGeneration
5
6BASE_MODEL_ID = "llava-hf/llava-onevision-qwen2-7b-ov-hf"
7AGRICHAT_REPO = "boudiafA/AgriChat"
8
9processor = AutoProcessor.from_pretrained(BASE_MODEL_ID)
10base_model = LlavaOnevisionForConditionalGeneration.from_pretrained(
11 BASE_MODEL_ID,
12 torch_dtype=torch.bfloat16,
13 device_map="auto",
14 low_cpu_mem_usage=True,
15)
16model = PeftModel.from_pretrained(
17 base_model,
18 AGRICHAT_REPO,
19)
20model.eval()
21
22image = Image.open("path/to/image.jpg").convert("RGB")
23prompt = "What is shown in this agricultural image?"
24
25conversation = [
26 {
27 "role": "user",
28 "content": [
29 {"type": "image"},
30 {"type": "text", "text": prompt},
31 ],
32 }
33]
34
35text = processor.apply_chat_template(conversation, add_generation_prompt=True)
36inputs = processor(text=[text], images=[image], return_tensors="pt", padding=True)
37device = next(model.parameters()).device
38inputs = {k: v.to(device) if isinstance(v, torch.Tensor) else v for k, v in inputs.items()}
39
40with torch.inference_mode():
41 output_ids = model.generate(**inputs, max_new_tokens=512, do_sample=False)
42
43input_len = inputs["input_ids"].shape[1]
44response = processor.tokenizer.decode(output_ids[0][input_len:], skip_special_tokens=True)
45print(response.strip())
AgriChat outperforms strong open-source generalist baselines on multiple agriculture benchmarks.
1@article{boudiaf2026agrichat,
2 title = {AgriChat: A Multimodal Large Language Model for Agriculture Image Understanding},
3 author = {Boudiaf, Abderrahmene and Hussain, Irfan and Javed, Sajid},
4 journal = {Submitted to Computers and Electronics in Agriculture},
5 year = {2026}
6}