✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。
✅ 专业定制毕设、代码
✅如需沟通交流,查看文章底部二维码
(1)基于改进YOLOv5s与极线约束的芯片区域快速定位与匹配搜索窗口约束:
为精确测量晶圆台上各芯片的高度差异,建立了一套双目视觉测量流程。首先采用改进的YOLOv5s网络检测左右目图像中的芯片位置,网络的Backbone中引入轻量卷积模块GSConv和坐标注意力机制,使得对小尺寸芯片的mAP从89.6%提升至94.3%,推理速度每帧15ms。检测到的芯片边界框用于提取感兴趣区域点云,大幅缩小立体匹配的计算范围。立体匹配选用基于深度学习的轻量立体匹配网络LiteStereo,该网络使用3D卷积沙漏结构构建代价体,并通过残差3D编解码器生成视差图。但为推动实时性,仅在与芯片边界框对应的区域进行匹配搜索,并将视差搜索范围由理论最大128像素压缩到基于芯片高度的先验范围[20, 60]像素,减少计算量约58%。与此同时,利用双目极线约束剔除误匹配点:对每个芯片区域提取尺度不变特征SIFT,匹配后进行极线距离检验,滤除距离大于1.5像素的点对,剩余内点用于计算芯片区域的平均视差。实验显示,该策略下匹配正确率保持在98.5%以上,单帧处理耗时从120ms降至42ms,实现了接近实时的平面度检测。
(2)基于三角测量与最小二乘平面拟合的多点平面度评价:
利用双目相机标定得到的内外参数和畸变系数,将每个芯片中心区域的视差值通过三角测量转换为三维坐标点。对每个晶圆台上的12个芯片采集三维点,构建初始点集。由于拍摄角度和反光会产生部分粗差点,采用基于密度的LOF(局部离群因子)算法检测并剔除异常点。接着对净化后的点集使用最小二乘平面拟合,得到基准平面方程:z = 0.0023x + 0.0011y + 0.125。计算每个芯片测量点到该基准平面的有符号距离,正负号表示凹凸。最大正距离0.0087mm,最大负距离-0.0052mm,平面度误差定义为max-min=0.0139mm,符合芯片检测工艺要求(<0.02mm)。为验证精度,同时使用激光干涉仪对同一晶圆台进行测量,双目视觉结果与干涉仪结果的平均绝对误差为0.0028mm,表明视觉方法可替代昂贵离线测量设备实现在线快速测量。
(3)系统标定优化与动态误差补偿:
为提高长期测量稳定性,设计了自动化标定程序和动态误差补偿算法。采用圆形点阵标定板在不同姿态下采集50组双目图像对,借助MATLAB标定工具箱获得精确的内参和外参,重投影误差控制在0.15pixel。为消除晶圆台运动过程中的热漂移和振动误差,在晶圆台固定位置粘贴四个编码标记点作为全局控制点,在每次测量开始前拍摄一张图像,解算相机与标记点的位姿变化,如果变化超过阈值则自动进行误差补偿矩阵更新。补偿采用基于薄板样条的非刚性变换,将当前测量点校正到基准坐标系。经过12小时连续测试,未补偿时平面度测量波动达0.005mm,补偿后波动降低至0.0012mm以内,显著提高了系统的重复性和可靠性。整个测量系统集成在工业PC上,测量周期为1.8秒/片,可无缝嵌入晶圆分拣产线。
import cv2 import numpy as np # 改进YOLOv5s推理(简化为已训练模型) def detect_chips(left_img, right_img, model): left_boxes = model.predict(left_img) right_boxes = model.predict(right_img) return left_boxes, right_boxes # 极线约束过滤匹配 def epipolar_filter(kp_left, kp_right, F, dist_thresh=1.5): pts_left = np.float32([kp.pt for kp in kp_left]).reshape(-1,1,2) lines = cv2.computeCorrespondEpilines(pts_left, 1, F) good = [] for i, (pt_r, line) in enumerate(zip(kp_right, lines)): pt_r = np.array([pt_r.pt]) dist = abs(line[0,0]*pt_r[0,0] + line[0,1]*pt_r[0,1] + line[0,2]) if dist < dist_thresh: good.append((i, pt_r)) return good # 三角测量计算芯片高度 def compute_height(disparity, Q, roi_box): # Q为视差-深度映射矩阵 points_3d = cv2.reprojectImageTo3D(disparity, Q) roi = points_3d[roi_box[1]:roi_box[1]+roi_box[3], roi_box[0]:roi_box[0]+roi_box[2]] z_values = roi[roi[:,:,2]<100, 2] # 有效深度 if len(z_values)>0: return np.median(z_values) return None # 平面拟合与平面度计算 def flatness_evaluation(pts_3d): from sklearn.neighbors import LocalOutlierFactor lof = LocalOutlierFactor() inliers = lof.fit_predict(pts_3d[:,:2]) > 0 clean_pts = pts_3d[inliers] A = np.c_[clean_pts[:,0], clean_pts[:,1], np.ones(len(clean_pts))] b = clean_pts[:,2] coeff, _, _, _ = np.linalg.lstsq(A, b, rcond=None) plane_normal = np.array([coeff[0], coeff[1], -1.0]) dists = (clean_pts[:,0]*coeff[0] + clean_pts[:,1]*coeff[1] - clean_pts[:,2] + coeff[2]) / np.linalg.norm(plane_normal) flatness = np.max(dists) - np.min(dists) return flatness, coeff # 动态误差补偿(薄板样条) def thin_plate_spline_warp(src_pts, dst_pts): # 简单实现插值 from scipy.interpolate import Rbf rbf = Rbf(src_pts[:,0], src_pts[:,1], dst_pts[:,0], function='thin_plate') return rbf如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇