משתמש:האדם-החושב/טיוטה
קונבולוציה (עיבוד תמונה)
עריכהקונבולוציה (באנגלית: convolution, בעברית: כינוס) הינה דרך לזיקוק תמונות לצורך חידודן, זיהוי קצוות או צורות פרימיטיביות כלשהן בתוכן ועוד בתחום הבינה המלאכותית והראיה הממוחשבת. שמות נוספים המתאימים לשיטה זאת הינם Convolutional neural networks (בעברית: רשתות עצביות מתפתחות) או ConvNet או פשוט CNN.
היסטוריה
עריכההשיטה הומצאה על ידיי יאן לקון חוקר ממעבדות נוקיה בל בשנת 1988. השיטה התבססה על מודל הניוקוגניטרון רשת עצבית מלאכותית דיי בסיסית שהומצאה בשנת 1980 על ידיי המדען קוניהיקו פוקושימה. השיטה בזמנו ידעה לזהות ספרות בכתב יד ונעשה בה שימוש בבנקים ומערכות דואר אך לא יותר מכך מכיוון שבזמן זה היה מחסור במאגריי מידע גדולים ומפותחים דבר הכרחי על מנת לאמן בינה מלאכותית מסוג זה, בעיה נוספת הייתה החומרה שאז בזמנו לא הייתה מספיק חזקה על מנת לאמן בינה מלאכותית מסוג זה.
בשנת 2012 חלה תפנית כאשר AlexNet הראתה שאולי הגיע הזמן לחזור לרשתות עצביות מתפתחות עם הטכנולוגיה ודאטה של ימיינו שהתפתחו הרבה מאוד.
אופן הפעולה
עריכהעוברים על התמונה ומכפילים עם הליבה (באנגלית: kernel) שהיא מטריצה בגודל עם קפיצות בגודל כאשר מייצג את גודל הקפיצה בציר ה- ו מייצג את גודל הקפיצה בציר ה- (בדרך כלל ו יהיו באותו גודל ולכן פשוט יקראו כנ"ל לגביי ), כאשר כל ליבה יכולה לשמש לצורך מטרה שונה
או פשוט .
כאשר מייצג את התמונה החדשה, מייצג את התמונה המקורית ו מייצג את הליבה.
פעולה | ליבה ω | התמונה הסופית g(x,y) |
---|---|---|
הזהות | ||
זיהוי קצוות | ||
חידוד | ||
טשטוש קופסה | ||
טשטוש גאוס 3 × 3 | ||
טשטוש גאוס 5 × 5 | ||
ביטול חידוד 5 × 5
מבוסס על טשטוש גאוס עם כמות 1 וסף 0 |
קוד
עריכהfor each image row in input image: for each pixel in image row: set accumulator to zero for each kernel row in kernel: for each element in kernel row: if element position corresponding* to pixel position then multiply element value corresponding* to pixel value add result to accumulator endif set output image pixel to accumulator
מודל TensorFlow העושה שימוש בשכבות קונבולוציה (Conv2D) :
def build_classifier():
model = Sequential(name="classifier")
model.add(Conv2D(64, kernel_size=5, strides=2, input_shape=img_shape, padding='same'))
model.add(LeakyReLU(alpha=0.2))
model.add(Dropout(0.3))
model.add(Conv2D(128, kernel_size=5, strides=2, padding='same'))
model.add(LeakyReLU(alpha=0.2))
model.add(Dropout(0.3))
model.add(Conv2D(256, kernel_size=5, strides=2, padding='same'))
model.add(LeakyReLU(alpha=0.2))
model.add(Dropout(0.3))
model.add(Conv2D(512, kernel_size=5, strides=2, padding='same'))
model.add(LeakyReLU(alpha=0.2))
model.add(Dropout(0.3))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
model.summary()
image = Input(shape=img_shape)
validity = model(image)
return Model(image, validity)
ריפוד
עריכהריפוד (באנגלית: padding) נועד על מנת לפתור שתי בעיות:
- במהלך ביצוע קונבולוציה נוצרת בעיה אנחנו בעצם עוברים פחות פעמים על קצוות התמונה וכתוצאה מכך לעבד מידע יקר ערך אומנם זה יכול להראות שולי אבל לאחר שימוש בהרבה שכבות קונבולוציה במודל זה מצטבר להרבה מה גם זה פרקטיקה רעה לא לנצל את כל הדאטה.
- לאחר כל שימוש בקונבולוציה התמונה תקטן ובעצם אם נשתמש בכמה שכבות קונבולוציה נוכל באיזשהו שלב להגיע למצב שבו אנחנו צמצמנו את התמונה עד כדיי מחיקתה.
תהליך הריפוד בעצם "מרפד" את התמונה באפסים מצדדיה ובכך פותר את שתי הבעיות כי עכשיו אנו עוברים גם על הקצוות כמו שצריך וגם לאחר קונבולוציה התמונה תישאר באותו הגודל (כמובן בהנחה שהוספנו את הריפוד בגודל המתאים).
למשל לתמונה בגודל של עם ליבה בגודל וקפיצות בגודל של אחד אם נוסיף שכבת ריפוד אחת מכל כיוון לאחר קונבולוציה נשאר עם תמונה בגודל כלומר לא הקטנו אותה.
כמובן שבגלל שריפדנו באפסים אין לחשוש להטיית/עיוות התוצאות כתוצאה מהריפוד.
ראו גם
עריכה- Ludwig, Jamie (n.d.). Image Convolution (PDF). Portland State University.
- Lecarme, Olivier; Delvare, Karine (בינואר 2013). The Book of GIMP: A Complete Guide to Nearly Everything. No Starch Press. p. 429. ISBN 978-1593273835.
{{cite book}}
: (עזרה) - Gumster, Jason van; Shimonski, Robert (במרץ 2012). GIMP Bible. Wiley. pp. 438–442. ISBN 978-0470523971.
{{cite book}}
: (עזרה) - Shapiro, Linda G.; Stockman, George C. (בפברואר 2001). Computer Vision. Prentice Hall. pp. 53–54. ISBN 978-0130307965.
{{cite book}}
: (עזרה)
קישורים חיצוניים
עריכה- How convolutional neural networks work, in depth
- CNN | Introduction to Padding
- vImage Programming Guide: Performing Convolution Operations
- Image Processing using 2D-Convolution
- GNU Image Manipulation Program - User Manual - 8.2. Convolution Matrix
- GLSL Demonstration of 3x3 Convolution Kernels
- Complete C++ open source project
קטגוריה:למידה חישובית קטגוריה:אלגוריתמים קטגוריה:בינה מלאכותית