NEW COURSE: SKETCH RECOGNITION Analysis, implementation, and comparison of sketch recognition algorithms, including feature-based, vision-based, geometry-based, and timing-based recognition algorithms; examination of methods to combine results from various algorithms to improve recognition using AI techniques, such as graphical models. Learn how to make your drawings come alive… Sezgin • Finds corners in a polygon or in a complex shape. • First: Polygon Direction Direction of each stroke segment = arctan2(dy,dx) Add check to make sure graph continuous (e.g., add 2pi) Curvature Change in direction for each segment Speed Speed of each segment (already computed in Rubine) Threshold Curvature • Threshold = mean curvature Threshold Speed • Threshold = 90% of mean Select Vertices for Each • Max of all sections above threshold • Fd = curvature points Select Vertices for Each • Max of all sections above threshold • Fs = speed points Initial Fit • Intersection of Fd and Fs (and of course the endpoints) Local neighborhood: i-k, i+k • Si is a stroke point • k is number of stroke point on either side to search • Le = Euclidian distance from Si-k to Si+k • K not defined – Lets try k = 3 … AND – Variable k where min(Le > 6 pixels) Curvature Certainty Metric for Fd • di = curvature at point i • l = stroke segment curve length from Si-k to Sj+k • Lets call it CCM(vi) Speed Certainty Metric for Fs • Lets call it SCM(vi) Vertex Possibilities: • • • • Fd: Possibilities based on curvature Fs: Possibilities based on speed CCM(Fd) : Curvature Certainty Metric SCM(Fd) : Speed Certainty Metric • H0 = Initial Hybrid Fit = intersection of Fd and Fs (and endpoints) Selecting new points to add • Hi’ = H0 + max(SCM(Fs – H0) ) • Hi’’ = H0 + max(CCM(Fd – H0)) • Pick highest scoring from each list • Try to add it to the H0 Make Line Segments for Hi’ and Hi’’ • For each vertex vi in Hi – create a list of line segments between vi and vi+1 • If there are n points in the vertex selection, there will be n-1 line segments Calculate Error for Both Hi’ and Hi’’ • S = total stroke length (not Euclidean distance) • ODSQ = orthogonal distance squared • ODSQ(s,Hi) = distance of stroke point s to appropriate line segment (previous slide) Distance from point to line segment • if isPointOnLine(point, line) • theDistance = 0; • else • array1 = getLineAxByC(line); • array2 = getAxByCPerpendicularLine(line, point); • • A = [array1(1), array1(2); array2(1), array2(2)]; • b = [array1(3); array2(3)]; • intersectsPoint = linsolve(A, b)'; • if isPointOnLine(intersectsPoint, line) • theDistance = getLineLength([intersectsPoint; point]); • else • dist(1) = getLineLength([line(1,:); point]); • dist(2) = getLineLength([line(2,:); point]); • theDistance = min(dist); • end • end Select either Hi’ or Hi’’ • Pick the one with the lower error • (in the paper this is also the one with the `higher score’ – score in this sense is just an internal ranking metric) • H1 = Hi’ or Hi’’ (the one with the lower error) • We have added one vertex point. Repeat • • • • Create new Hi’ and Hi’’ Hi’ = H1 + max(SCM(Fs – H1) ) Hi’’ = H1 + max(CCM(Fd – H1)) (Note one of them will be the same as the previous time.) • Recompute error and continue When to Stop • • • • Stop when error is below the threshold. … what is threshold? Not in paper Lets – – – – – Compute the error for H0 = e0 Compute the error for Hall (all the chosen v) = eall We want something in the middle: close to eall .1*(e0-eall) + eall You will try other thresholds in your implementation Implications • Anything that you can describe geometrically you can build sketch system for Curves • Stroke between corners can be curve or line • Is line if l2/l1 is close to 1. – Lets use .9 < l2/l1 *1.1 < 1 • Else is curve Sezgin Bezier Curve Fitting • • Want to replace with a Bezier curve http://www.math.ubc.ca/people/faculty/cass/gfx/bezier.html – Bezier Demo • 2 endpoints and 2 control points Bezier curve equation • http://www.cl.cam.ac.uk/Teaching/2000/AGraphHCI/SMEG/node3.ht ml • http://www.moshplant.com/direct-or/bezier/math.html • P0 (x0,y0) = p1, P1 = c1, P2 = c2, P3 = p2 • x(t) = axt3 + bxt2 + cxt + x0 • y(t) = ayt3 + byt2 + cyt + y0 • cx = 3 (x1 - x0) bx = 3 (x2 - x1) - cx ax = x3 - x0 - cx - bx • cy = 3 (y1 - y0) by = 3 (y2 - y1) - cy ay = y3 - y0 - cy - by Sezgin Bezier Curve Fitting • Control points • Endpoints: u = p1, v = p2 • T1= tangent vector – initial direction of stroke at point p1 • T2 = tangent vector of p2 – initial direction of stroke at point p2 • K = stroke length / 3 – 3 is common approximation • c1=k*t1 + v • c2 = k*t2 + u Want to Test our Approximation • Perhaps this is really a very complex curve which can’t be fit with a simple Bezier curve – E.g., the treble clef of a musical staff • Discretize the curve. (It doesn’t say into how many parts – I leave that up to you.) – Linear approximation for each part If error too high • Break our curve down the middle into two curves, and try again. Matlab Curve Fitting • • • • • • • • • • • • • • • • • function [estimates, model] = fitcurvedemo(xdata, ydata) % Call fminsearch with a random starting point. start_point = rand(1, 2); model = @expfun; estimates = fminsearch(model, start_point); % expfun accepts curve parameters as inputs, and outputs sse, % the sum of squares error for A * exp(-lambda * xdata) - ydata, % and the FittedCurve. FMINSEARCH only needs sse, but we want to % plot the FittedCurve at the end. function [sse, FittedCurve] = expfun(params) A = params(1); lambda = params(2); FittedCurve = A .* exp(-lambda * xdata); ErrorVector = FittedCurve - ydata; sse = sum(ErrorVector .^ 2); end end Circles and Ellipses • • • • Least squares fit Make a bounding box of stroke and form Oval is formed from that bounding box. Circle is easy: – Find out how far the circle is from the center = d, return (d-r)^2 – Ellipse more complicated Project Suggestions • Build a finite state machine recognizer for the computability class to easily draw and hand in their diagrams. • Build a physics drawing program that attaches to a design simulator (we have interactive physics 2005) • Build a fashion drawing program. You draw clothes on a person, and it puts them one the person. Project Ideas • Build a robot drawing and simulation program. You draw the robot and have a number of gestures to have it do different things • Gesture Tetris Project Suggestions • Use both rubine and geometrical methods in recognition • Develop new ways for editing. • Build new low level recognizers Projects! • Proposal due: Sept 22 • Visualization Contest – Ivc.tamu.edu/competition • Smart Boards coming • IAP (Industrial Affiliates Program) Demo Projects! • 2 types: – Cool application • Sketch front end to your own research system • Fun application to go on smart board/vis contest – Gesture Tetris – TAMU gesture-based map/directory info – Computability/Physics/EE/MechEng simulator – New recognition algorithm • Significant change to old techniques to make a new application Final Project Handin • • • Implementation… Build it… In class Demonstration (5-10 minutes) Previous work – Find at least 3 relevant papers (not read inc class) – Assign one for class to read, you lead short discussion • Test – – – – • Run your recognition system on data. Find out what data you need (e.g., UML class diagrams) Each student in class will supply others data + Find 6 more people outside (to give 15 different people) Paper – – – – – Introduction (why important) Previous Work Implementation Results Conclusion Syllabus • http://www.cs.tamu.edu/faculty/hammond/ courses/SR/2006
© Copyright 2026 Paperzz