الرؤية الحاسوبية في الصناعة: عيون الآلة
الرؤية الحاسوبية: عندما تتعلم الآلة أن "ترى"
تخيّل أنك تقف على خط إنتاج زجاجات، وعليك فحص 600 زجاجة في الدقيقة بحثاً عن شقوق أو فقاعات هواء. عيناك ستتعب بعد 20 دقيقة، لكن كاميرا صناعية متصلة بنظام ذكاء اصطناعي يمكنها فحص كل زجاجة بدقة 99.5% على مدار 24 ساعة بلا كلل.
الرؤية الحاسوبية الصناعية (Machine Vision) هي تقنية تمنح الآلات القدرة على تحليل الصور واتخاذ قرارات — من كشف العيوب إلى قراءة الباركود إلى توجيه الروبوتات.
مكونات نظام الرؤية الصناعية
أي نظام رؤية صناعي يتكون من خمسة عناصر أساسية:
┌──────────┐ ┌──────────┐ ┌──────────────┐ ┌──────────┐ ┌──────────┐
│ إضاءة │──▶│ كاميرا │──▶│ معالجة صور │──▶│ خوارزمية │──▶│ قرار │
│ Lighting │ │ Camera │ │ Preprocessing│ │ Algorithm│ │ Decision │
└──────────┘ └──────────┘ └──────────────┘ └──────────┘ └──────────┘
الإضاءة: العنصر الأهم الذي يُهمله الجميع
تصوّر أنك تحاول تصوير خدش ضحل على سطح معدني لامع — بإضاءة عادية لن يظهر شيء. لكن بإضاءة جانبية بزاوية منخفضة، سيبرز الخدش كظل واضح.
| نوع الإضاءة | الاستخدام | المبدأ |
|---|---|---|
| إضاءة خلفية (Backlighting) | فحص حواف، كشف ثقوب | الجسم يحجب الضوء = صورة ظلية |
| إضاءة أمامية منتشرة (Diffuse) | فحص ألوان، طباعة | ضوء متساوٍ بلا انعكاسات |
| إضاءة جانبية (Dark field) | كشف خدوش وشقوق | الضوء ينعكس عن العيوب فقط |
| إضاءة حلقية (Ring light) | فحص عام، OCR | ضوء متساوٍ حول العدسة |
| إضاءة منظّمة (Structured) | قياس ثلاثي الأبعاد | خطوط ليزر تُسقط على السطح |
الكاميرات الصناعية
ليست كاميرات عادية — مصممة للعمل في بيئات صعبة:
| الميزة | كاميرا عادية | كاميرا صناعية |
|---|---|---|
| الدقة | 12-48 MP | 0.3-150 MP حسب التطبيق |
| السرعة | 30-60 fps | حتى 10,000 fps |
| واجهة التوصيل | USB/HDMI | GigE Vision / CoaXPress |
| التشغيل | حر (Free-running) | مُزامن بخط الإنتاج (Trigger) |
| العمر الافتراضي | 2-3 سنوات | 10+ سنوات |
| درجة الحماية | لا يوجد | IP65/IP67 |
أنواع الحساسات:
- Area scan: تلتقط صورة كاملة دفعة واحدة — للأجسام المنفصلة (زجاجات، علب)
- Line scan: تلتقط خطاً واحداً — للأسطح المستمرة (قماش، ورق، فولاذ)
المعالجة الأولية للصور (Image Preprocessing)
قبل أن تصل الصورة إلى خوارزمية الذكاء الاصطناعي، نحتاج لتحسينها:
import cv2
import numpy as np
def preprocess_industrial_image(image_path):
# 1. قراءة الصورة
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# 2. تعديل التباين (CLAHE - أفضل من تعديل الهيستوغرام العادي)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
enhanced = clahe.apply(img)
# 3. تقليل الضوضاء مع الحفاظ على الحواف
denoised = cv2.bilateralFilter(enhanced, d=9, sigmaColor=75, sigmaSpace=75)
# 4. كشف الحواف
edges = cv2.Canny(denoised, threshold1=50, threshold2=150)
# 5. تحويل إلى حجم موحد (224x224 لشبكات CNN)
resized = cv2.resize(denoised, (224, 224))
# 6. تطبيع القيم بين 0 و 1
normalized = resized.astype(np.float32) / 255.0
return normalized
# خطوات المعالجة الأولية النموذجية
pipeline_steps = [
"تصحيح التشوه الهندسي (Lens distortion correction)",
"تعديل السطوع والتباين",
"تقليل الضوضاء (Bilateral / Gaussian filter)",
"تحويل إلى تدرج رمادي (إن لم يكن اللون مهماً)",
"تطبيع القيم (Normalization)",
"تغيير الحجم (Resize)",
"تعزيز البيانات (Augmentation) — للتدريب فقط",
]
الشبكات العصبية الالتفافية (CNN)
تخيّل أنك تعلّم طفلاً التمييز بين القطع السليمة والمعيبة. لن تشرح له قواعد رياضية — ستريه مئات الأمثلة حتى يتعلم بنفسه. هذا بالضبط ما تفعله CNN.
كيف تعمل CNN:
صورة المدخل (224×224×3)
│
▼
┌───────────────────────┐
│ طبقة التفافية Conv2D │ ← تكتشف حواف وخطوط بسيطة
│ مرشحات: 32, حجم 3×3 │
├───────────────────────┤
│ طبقة تجميع MaxPool │ ← تُصغّر الصورة وتحتفظ بالأهم
│ حجم 2×2 │
├───────────────────────┤
│ طبقة التفافية Conv2D │ ← تكتشف أنماط أكثر تعقيداً
│ مرشحات: 64 │
├───────────────────────┤
│ طبقة التفافية Conv2D │ ← تكتشف أشكال وبنى كاملة
│ مرشحات: 128 │
├───────────────────────┤
│ طبقة مسطّحة Flatten │ ← تحول الخريطة إلى متجه
├───────────────────────┤
│ طبقة كثيفة Dense │ ← تتخذ القرار النهائي
│ مخرجات: 2 (سليم/معيب) │
└───────────────────────┘
نماذج CNN شائعة في الصناعة:
| النموذج | الحجم | الدقة على ImageNet | الاستخدام الصناعي |
|---|---|---|---|
| MobileNetV2 | 14 MB | 72% | أجهزة حافة (Edge) محدودة الموارد |
| ResNet-50 | 98 MB | 76% | فحص جودة عام |
| EfficientNet-B3 | 48 MB | 82% | توازن بين الدقة والسرعة |
| VGG-16 | 528 MB | 71% | استخراج ميزات (Feature extraction) |
YOLO: الكشف في الوقت الحقيقي
تصوّر خط إنتاج يمر عليه عشرات المنتجات في الثانية — تحتاج نظاماً يحدد ماذا يوجد في الصورة وأين بالضبط، وبسرعة فائقة.
YOLO (You Only Look Once) تنظر إلى الصورة مرة واحدة وتحدد كل الأجسام فيها دفعة واحدة:
from ultralytics import YOLO
# تحميل نموذج YOLO المدرّب مسبقاً
model = YOLO("yolov8n.pt") # n=nano, s=small, m=medium, l=large
# تدريب على بيانات صناعية مخصصة
model.train(
data="factory_defects.yaml", # ملف تعريف البيانات
epochs=100,
imgsz=640,
batch=16,
device="cuda", # تدريب على GPU
)
# الكشف على صورة جديدة
results = model("production_line_frame.jpg")
for box in results[0].boxes:
cls = results[0].names[int(box.cls)] # اسم الفئة
conf = float(box.conf) # درجة الثقة
x1, y1, x2, y2 = box.xyxy[0].tolist() # إحداثيات الصندوق
print(f"كُشف: {cls} (ثقة {conf:.1%}) عند [{x1:.0f},{y1:.0f},{x2:.0f},{y2:.0f}]")
| إصدار YOLO | السرعة (FPS على GPU) | دقة mAP | الاستخدام |
|---|---|---|---|
| YOLOv8-nano | 450+ | 37% | أجهزة حافة، Raspberry Pi |
| YOLOv8-small | 350+ | 45% | فحص سريع |
| YOLOv8-medium | 200+ | 50% | توازن |
| YOLOv8-large | 120+ | 53% | دقة عالية |
تطبيقات صناعية حقيقية
فحص العيوب (Defect Inspection)
كشف الشقوق والخدوش والتشوهات على الأسطح:
# مثال: كشف عيوب على سطح معدني
def classify_surface_defect(image):
"""تصنيف عيوب السطح المعدني"""
predictions = model.predict(image)
defect_classes = {
0: "سليم (OK)",
1: "خدش (Scratch)",
2: "صدأ (Rust)",
3: "شق (Crack)",
4: "تقشّر (Peeling)",
5: "حفرة (Pit)"
}
return defect_classes.get(predictions.argmax(), "غير معروف")
قراءة OCR والباركود
# قراءة الباركود وQR codes
from pyzbar import pyzbar
def read_barcodes(image):
barcodes = pyzbar.decode(image)
results = []
for barcode in barcodes:
data = barcode.data.decode("utf-8")
barcode_type = barcode.type # EAN13, QR, Code128
results.append({"data": data, "type": barcode_type})
return results
# قراءة نص مطبوع (OCR) — تاريخ انتهاء الصلاحية مثلاً
import pytesseract
def read_expiry_date(image):
# معالجة أولية: تحويل إلى أبيض وأسود
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
text = pytesseract.image_to_string(binary, config="--psm 7")
return text.strip()
البصريات والعدسات
اختيار العدسة الصحيحة حاسم — يجب أن تعرف:
# حساب البُعد البؤري المطلوب
sensor_width_mm = 6.4 # عرض حساس الكاميرا (1/1.8")
object_width_mm = 200 # عرض المنطقة المراد تصويرها
working_distance_mm = 500 # المسافة بين الكاميرا والجسم
focal_length = (sensor_width_mm * working_distance_mm) / object_width_mm
print(f"البُعد البؤري المطلوب: {focal_length:.1f} mm")
# حساب الدقة (أصغر عيب يمكن كشفه)
camera_pixels_h = 2048
pixel_size_mm = object_width_mm / camera_pixels_h
print(f"دقة البكسل: {pixel_size_mm:.3f} mm/pixel")
print(f"أصغر عيب قابل للكشف: ~{pixel_size_mm * 3:.2f} mm (3 بكسلات)")
قواعد اختيار العدسة:
- عيب بحجم 0.1 mm يحتاج دقة 0.03 mm/pixel على الأقل
- العدسة التلسنترية (Telecentric) تمنع تشوه المنظور — ضرورية للقياس الدقيق
- فتحة العدسة (f-stop) تتحكم بعمق المجال — f/8 إلى f/11 للتطبيقات الصناعية
نصائح عملية لبناء نظام رؤية صناعي
- ابدأ بالإضاءة: 80% من نجاح مشروع الرؤية يعتمد على الإضاءة الصحيحة
- اجمع بيانات حقيقية: لا تعتمد على صور الإنترنت — صوّر من خط الإنتاج الفعلي
- التوازن في البيانات: إذا كان 99% من المنتجات سليمة، اجمع عيّنات عيوب إضافية
- اختبر في ظروف واقعية: اهتزاز الخط، تغير الإضاءة المحيطة، أتربة على العدسة
- ابدأ بنموذج صغير: MobileNet أو YOLOv8-nano ثم تدرّج حسب الحاجة
- لا تنسَ وقت الاستجابة: في خط سريع، 100 ms تعني أن المنتج تحرك 10 cm