طراحی سایت و برنامه نویسی

آموزش طراحی سایت و برنامه نویسی

طراحی سایت و برنامه نویسی

آموزش طراحی سایت و برنامه نویسی

آموزش پایتون: ساخت نمودارهای مالی با Bokeh — از صفر تا صد

دنیا به سرعت در حال رشد است. از زمانی که اینترنت و گوشی‌های هوشمند تکامل یافته‌اند، فناوری‌های مالی به طور انفجاری رشد کرده‌اند. بر اساس گزارش‌ها، از هر 781 نفر روی کره زمین یک نفر به صورت آنلاین تجارت می‌کند. این عدد وقتی با دیگر کارهایی که انسان‌ها انجام می‌دهند مقایسه شود، عدد بزرگی به نظر خواهد رسید. در این مطلب در مورد داده‌های بازار سهام، روش دانلود کردن آن‌ها از ترمینال و پرکاربردترین نمودار در حوزه‌های تجاری که به نام نمودار «شعدانی» یا «کندل‌استیک» (Candlestick) شناخته می‌شود بیشتر خواهیم آموخت. همچنین، روش رسم نمودارهای کندل‌استیک را با استفاده از پایتون و Bokeh از صفر فرا خواهیم گرفت. در ادامه این مطلب راجع به ساخت نمودارهای مالی با Bokeh با مجله فرادرس همراه باشید.

برای مطالعه قسمت قبلی این مجموعه مطلب آموزشی می‌توانید روی لینک زیر کلیک کنید:

دانلود کردن داده‌های بازار سهام

در این مرحله به صورت گام به گام کارهایی که باید انجام یابند را توضیح می‌دهیم. ابتدا باید با نوشتن دستور زیر پکیج pandas_datareader را نصب کنیم:

pip3 install pandas_datareader --user

این بسته به ما کمک می‌کند که داده‌های بازار سهام را دانلود کنیم. نکته جالب این است که این کار از ترمینال نیز امکان‌پذیر است. کار دوم این است که کتابخانه datetime را نصب می‌کنیم تا قاب زمانی را برای بازه‌ای که داده‌هایش را لازم داریم ثبت شود.

در این مرحله داده‌ها را از نهم اکتبر 2018 دریافت می‌کنیم. اینک برای واکشی داده‌ها باید در پارامتر نخست نام شرکت یا سهام را وارد کنیم. برای مثال عبارت TSLA برای اشاره به شرکت Tesla استفاده می‌شود. هر شرکت یک نام اختصاری یا ticker برای خود دارد. شرکت Yahoo نیز منبع خوبی برای بررسی داده‌های مالی محسوب می‌شود. از این رو از Yahoo به عنوان منبع داده‌ها استفاده می‌کنیم. موارد دیگر که می‌توانید استفاده کنید، Google ،FRED ،Robinhood و موارد بسیار دیگر است. دو پارامتر آخر نیز قاب زمانی هستند که قبلاً اشاره کردیم.

Bokeh

درک داده‌های بازار سهام

اگر قبلاً با بازار سهام آشنایی داشته باشید، می‌توانید این مرحله را کلاً رد کنید و به مرحله بعد بروید. اگر چنین نیست مطمئن باشید که بالاخره یک روز سر و کارتان به آنجا خواهد افتاد. اما در حال حاضر، اجازه دهید توضیح دهیم که معنی این داده‌ها چیست. ما در تصویر فوق پنج ستون داریم که تقریباً شامل همه‌چیز می‌شود. شما می‌توانید ستون Adj close را فعلاً نادیده بگیرید.

  1. High: بالاترین قیمتی است که سهام معامله شده است.
  2. Low: پایین‌ترین قیمتی است که سهام معامله شده است.
  3. Open: قیمت سهام در نخستین لحظه باز شدن بازار است.
  4. Close: قیمت سهام در زمان بسته شدن بازار سهام است.
  5. Volume: تعداد سهم‌های معامله شده در روز مفروض است.

تنها به کمک این پنج ستون می‌توانیم گراف مالی خود را بسازیم تا داده‌ها به حالت بصری درآیند و بتوانیم از آن نتیجه‌گیری‌هایی بکنیم. بنابراین منتظر چه هستیم؟ در ادامه این کار را انجام می‌دهیم. همواره نهایت تلاش خود را بکنید که پول دربیاورید، اما هیچ گاه این سخن بنجامین فرانکلین را فراموش نکنید که: «سرمایه‌گذاری روی دانش، بالاترین بهره را می‌دهد.»

درک نمودار کندل‌استیک

نمودار کندل‌استیک روشی بسیار کارآمد برای نگاه کردن همزمان به همه ستون‌هایی است که در بخش قبل اشاره کردیم. همان طور که در تصویر فوق می‌بینید، کندل سبز نشان می‌دهد که قیمت امروز افزایش یافته است، در حالی که کندل قرمز نشانگر کاهش است. قیمت‌های high و low نیز روی آن کندل نمایش می‌یابند.

ساخت بدنه کندل‌استیک

اینک ما می‌دانیم که نمودارهای کندل‌استیک چیست و همچنین با روش دانلود داده‌های بازار سهام آشنا شدیم. بنابراین اکنون نوبت آن رسیده است که بدنه نمودارهای کندل‌استیک خود را با استفاده از متد rect در کتابخانه Bokeh بسازیم. اما قبل از این کار باید یک تصویر (figure) بسازیم که نمودار درون آن نمایش پیدا می‌کند. در واقع این یک زمینه بیرونی است. به این منظور از متد figure کتابخانه Bokeh استفاده می‌کنیم.

کد فوق یک کادر خالی ایجاد می‌کند که نمودار ما در ادامه روی آن نمایش پیدا خواهد کرد. اگر از متد rect استفاده کنیم باید چهار پارامتر اجباری به آن ارسال کنیم که باعث ساخت یک مستطیل کامل می‌شوید. دو پارامتر نخست یعنی X-coordinate and و Y-coordinate نقاط مرکزی مستطیل هستند (این وضعیت پیش‌فرض، گرچه روش عجیبی است؛ اما به هر حال مهم است). دو پارامتر دیگر Width و Height یعنی عرض و ارتفاع تصویر هستند. ابتدا نگاهی به کد می‌اندازیم:

پارامترهای نمودار

اینک نوبت آن رسیده است که همه پارامترهای مورد استفاده در متد rect را توضیح دهیم، به طوری که بدانیم نخستین نمودار کندل‌استیک چگونه آماده‌سازی می‌شود.

  • X-axis: همان طور که اشاره کردیم، به یک نقطه مرکزی برای رسم مستطیل خود نیاز داریم و به این منظور باید مختصات افقی یا x نقطه مرکزی را ارسال کنیم. برای محور x از مقدار df.index استفاده می‌کنیم، چون شامل مقادیر زمانی است.
  • Y-axis: در مورد محور y یا عمودی از مقدار 2/(open+close) برای همان تاریخ استفاده می‌کنیم و بدین ترتیب نقطه مرکزی مستطیل خود را در اختیار داریم.
  • Width: ما برای عرض کندل‌استیک از پارامتر hours استفاده می‌کنیم. هر روز 24 ساعت است. در هر طرف 6 ساعت داریم و از این رو بدنه مستطیل 12 ساعت خواهد بود و سپس یک فاصله 12 ساعتی و کندل بعدی قرار دارند. اساساً ما بر اساس زمان فاصله‌بندی می‌کنیم و نه بر حسب فضا؛ گرچه روش چندان مناسبی به نظر نمی‌رسد.
  • Height: تفاضل مطلق بین مقادیر قیمت باز و بسته شدن بازار، ارتفاع بدنه کندل را تشکیل می‌دهد.

اینک موفق شده‌ایم بخش اصلی کار را به پایان ببریم. حال می‌دانیم که همه‌ چیزهای لازم برای ساخت نمودار کندل‌استیک بر اساس داده‌های شرکت مورد نظر در اختیارمان قرار دارند. نمودار ما برای TESLA چیزی مانند تصویر زیر است:

Bokeh
برای مشاهده تصویر در ابعاد اصلی روی آن کلیک کنید.

زیباتر ساختن ظاهر نمودار

هیچ کس دوست ندارد همیشه میله‌های آبی را تماشا کند که هیچ معنایی ندارند. به همین دلیل باید تغییراتی در آن‌ها ایجاد کنیم. ما از میله‌های سبز و قرمز به ترتیب برای بالا رفتن و پایین آمدن قیمت استفاده می‌کنیم. ضمناً تابع‌های مستقلی برای همه پارامترها در متد rect ایجاد می‌کنیم. در ادامه یک ستون جدید برای هر کدام ایجاد کرده‌ایم و داده‌ها را در آن ذخیره می‌کنیم تا درک طرز کار همه موارد آسان‌تر باشد. می‌توانید قاب داده به‌روزرسانی شده را زیر قطعه کدی که در ادامه آمده است ببینید و پس از آن نمودار به‌روزرسانی شده ارائه شده است:

Bokeh
برای مشاهده تصویر در ابعاد اصلی روی آن کلیک کنید.
Bokeh
برای مشاهده تصویر در ابعاد اصلی روی آن کلیک کنید.

ساخت قطعه‌های کندل‌استیک

اینک ما یک نمودار زیبا داریم و بدنه میله‌ها را نیز ایجاد کرده‌ایم، اما همچنان مقادیر high و low نمایش پیدا نمی‌کنند. این میله‌ها نیز همانند عمر همه ما کوتاه و بلند دارند. اگر به خط 41 کد زیر نگاه کنید، می‌بینید که این وضعیت را چگونه باید مدیریت کنید، فرایند ساده‌ای دارد.

Bokeh
برای مشاهده تصویر در ابعاد اصلی روی آن کلیک کنید.

بدین ترتیب موفق شده‌ایم یک نمودار عالی کندل‌استیک را برای 10 روز بسازیم. همین کار را می‌توان برای بازه 3 ماهه و یا بیشتر نیز ایجاد کرد. نموداری که در ادامه مشاهده می‌کنید، با استفاده از همان 60 خط کد فوق ساخته شده و مربوط به داده‌های سه ماه است.

Bokeh
برای مشاهده تصویر در ابعاد اصلی روی آن کلیک کنید.

سخن پایانی درباره ساخت نمودارهای مالی با Bokeh

همانطور که همه ما می‌دانیم، بصری‌سازی به درک بهتر داده‌های خام کمک زیادی می‌کند. ایجاد نمودارهای بصری از داده‌ها مزیت‌های بسیاری دارد و به کمک کتابخانه‌های خارجی مانند Bokeh و همچنین فرایند بصری‌سازی پایتون این کار قدرتمندتر از هر زمان دیگری انجام می‌پذیرد. در این مطلب مواردی را در خصوص داده‌های بازار سهام، روش دانلود کردن آن‌ها، مفهوم نمودارهای کندل‌استیک، و روش ایجاد آن‌ها به کمک کتابخانه Bokeh آموختید.

منبع: فرادرس


تشخیص چهره در پایتون با OpenCV و Dlib — از صفر تا صد

در این راهنما با روش ایجاد و اجرای یک الگوریتم تشخیص چهره در پایتون با استفاده از OpenCV و Dlib آشنا می‌شویم. همچنین برخی قابلیت‌های آن‌ها را برای شناسایی همزمان چشم‌ها و دهان روی چهره‌های مختلف معرفی خواهیم کرد. در این مقاله روش پیاده‌سازی مقدماتی تشخیص چهره را به طور کامل توضیح می‌دهیم که شامل ابزارهای طبقه‌بندی آبشاری، پنجره‌های HOG، و CNN-های یادگیری عمیق می‌شود.

برای مشاهده مخزن گیت‌هاب این مقاله به این لینک (+) مراجعه کنید.

مقدمه‌‌

ما در این مطلب از OpenCV استفاده خواهیم کرد که یک کتابخانه متن‌باز برای بینایی ماشین است و به زبان ++C/C نوشته شده است. این کتابخانه اینترفیس‌هایی در زبان‌های ++C، پایتون و جاوا دارد. OpenCV از پلتفرم‌های ویندوز، لینوکس، macOS ،iOS و اندروید پشتیبانی می‌کند. برخی از بخش‌های کار نیازمند Dlib هستند که یک کیت ابزار ++C شامل الگوریتم‌های یادگیری ماشین و ابزارهایی برای خلق نرم‌افزارهای پیچیده است.

پیش‌نیازهای تشخیص چهره در پایتون

نخستین مرحله برای شروع کار، نصب OpenCV و Dlib است. به این منظور دستور زیر را وارد کنید:

pip install opencv-python
pip install dlib

بسته به این که از کدام نسخه از پایتون استفاده می‌کنید، فایل در مسیرهای مختلفی نصب می‌شود. در مورد نسخه‌ای که ما استفاده می‌کنیم، وضعیت به صورت زیر بوده است:

/usr/local/lib/python3.7/site-packages/cv2

اگر در نصب Dlib با مشکلاتی مواجه شدید به این مقاله (+) مراجعه کنید.

ایمپورت و مسیر مدل‌ها

ما یک نت‌بوک ژوپیتر/فایل پایتون می‌سازیم و کار خود را با آن آغاز می‌کنیم:

import cv2
import matplotlib.pyplot as plt
import dlib
from imutils import face_utils

font = cv2.FONT_HERSHEY_SIMPLEX

طبقه‌بندی آبشاری

ابتدا به بررسی طبقه‌بندی آبشاری می‌پردازیم.

نظریه

طبقه‌بندی آبشاری یا آبشارهای مشهور طبقه‌بندی ارتقا یافته به همراه ویژگی‌های شِبه Haar (یا Haar-like feature) عمل می‌کنند و یک کاربرد خاص از «یادگیری گروهی» (ensemble learning) محسوب می‌شوند که boosting نام دارند. این ابزارها به طور عمده روی طبقه‌بندی‌های Adaboost و دیگر مدل‌ها مانند Real Adaboost ،Gentle Adaboost یا Logitboost تکیه دارند.

ابزارهای طبقه‌بندی آبشاری روی چند تصویر نمونه از یک موضوع آموزش می‌بینند. این تصاویر شامل سوژه‌ای است که می‌خواهیم شناسایی کنیم. همچنین از تصاویر دیگر که شامل آن موضوع نیستند نیز استفاده می‌شود.

چگونه می‌توان تشخیص داد که در تصویری چهره انسان وجود دارد یا نه؟ یک الگوریتم به نام فریمورک شناسایی شیء Viola–Jones وجود دارد که شامل همه مراحل مورد نیاز برای شناسایی زنده چهره است. این موارد شامل فهرست زیر می‌شوند:

  • گزینش ویژگی Haar: ویژگی‌هایی هستند که از موجک‌های Haar مشتق شده‌اند.
  • ایجاد تصویر یکپارچه
  • آموزش Adaboost
  • ابزارهای طبقه‌بندی آبشاری

اگر می‌خواهید مقاله اصلی Viola-Jones را ببینید، به این لینک (+) مراجعه کنید.

گزینش ویژگی Haar

برخی ویژگی‌های مشترک وجود دارند که در همه چهره‌های انسانی می‌توان مشاهده کرد:

  • یک منطقه شامل ناحیه چشمی که در مقایسه با گونه‌ها تیره‌تر است.
  • رنگ روشن‌تر بینی در مقایسه با چشم‌ها
  • موقعیت خاص چشم‌ها، دهان و بینی و …

این خصوصیات به نام ویژگی‌های Haar نامیده می‌شوند. فرایند استخراج ویژگی مانند زیر است:

تشخیص چهره در پایتون

در این مثال، نخستین ویژگی تفاوت بین شدت روشنایی بین ناحیه چشم‌ها و منطقه گونه‌های فوقانی را اندازه‌گیری می‌کند. مقدار این ویژگی به وسیله جمع زدن پیکسل‌ها در ناحیه سیاه فوقانی و تفریق آن از مقادیر پیکسل‌های ناحیه سفید به دست می‌آید.

تشخیص چهره در پایتون

سپس این مستطیل را به عنوان یک کرنل کانولوشنی روی کل تصویر اعمال می‌کنیم. برای این که رویکرد جامعی داشته باشیم، باید همه ابعاد و موقعیت‌های ممکن برای هر کرنل را اعمال کنیم. یک تصویر ساده 24 در 24 پیکسل، معمولاً منتهی به 160،000 ویژگی می‌شود که هر یک از جمع/تفریق کردن مقادیر پیکسل‌ها به دست آمده‌اند. بدین ترتیب امکان تشخیص چهره زنده از دست می‌رود. بنابراین سؤال این است که این فرایند چگونه عملیاتی می‌شود؟

زمانی که ناحیه مناسبی به وسیله یک مستطیل شناسایی می‌شود، اجرای پنجره روی نواحی مختلف چهره بی‌فایده خواهد بود. این کار به وسیله Adaboost صوت می‌گیرد.

ویژگی‌های مستطیل با استفاده از مفهوم تصویر یکپارچه محاسبه می‌شوند که روشی بسیار سریع‌تر است. در مورد این روش در بخش بعدی بیشتر توضیح خواهیم داد.

تشخیص چهره در پایتون

چند نوع از مستطیل‌ها وجود دارند که می‌توان برای استخراج ویژگی‌های Haar مورد استفاده قرار داد. این موارد شامل فهرست زیر هستند:

  • ویژگی دو مستطیلی به تفاضل بین مجموع مقادیر پیکسل‌ها درون نواحی مستطیلی می‌پردازد و به طور عمده برای تشخیص لبه‌ها (در تصویر زیر a و b) استفاده می‌شود.
  • ویژگی سه مستطیلی مجموع ناحیه درون محدوده مستطیل‌های کناری را محاسبه می‌کند که از مجموع مستطیل میانی کسر می‌شوند و به طور عمده برای شناسایی خطوط (c و d) استفاده می‌شود.
  • ویژگی چهار مستطیلی تفاضل بین جفت‌های قطری مستطیل‌ها (e) را محاسبه می‌کند.

تشخیص چهره در پایتون

اینک که ویژگی‌ها گزینش شده‌اند، آن‌ها را با استفاده از طبقه‌بندی Adaboost روی مجموعه‌ای از تصاویر آموزشی اعمال می‌کنیم. بدین ترتیب مجموعه‌ای از طبقه‌بندی‌های ضعیف با هم ترکیب می‌شود تا یک مدل گروهی دقیق را تشکیل دهند. با استفاده از 200 ویژگی (به جای 160،000 ویژگی اولیه) میزان دقتی برابر با 95% به دست می‌آید. ما در این نوشته از 6000 ویژگی استفاده کرده‌ایم.

تصویر یکپارچه

محاسبه ویژگی‌های مستطیلی به سبک کرنل کانولوشنی، ممکن است مدت زمان بسیار زیادی طول بکشد. به همین دلیل طراحان اولیه این روش Viola و Jones یک بازنمایی میانجی از تصویر را پیشنهاد کرده‌اند که آن را تصویر یکپارچه می‌نامند. نقش تصویر یکپارچه این است که امکان محاسبه مجموع هر مستطیلی را به سادگی با استفاده از تنها چهار ویژگی فراهم می‌کند.

فرض کنید می‌خواهیم ویژگی‌های مستطیلی را در یک پیکسل مفروض با مختصات x و y محاسبه کنیم. سپس تصویر یکپارچه پیکسل را در مجموع پیکسل‌های سمت بالا و سمت چپ پیکسل محاسبه می‌کنیم:

در فرمول فوق (ii(x،y تصویر یکپارچه و (i(x،y تصویر اصلی است.

زمانی که تصویر یکپارچه به صورت کامل محاسبه شد، یک رابطه بازگشتی وجود دارد که یک بار روی تصویر اصلی اعمال می‌شود. در واقع می‌توانیم جفت روابط بازگشتی زیر را تعریف کنیم:

تشخیص چهره در پایتون

که (s(x،y مجموع ردیف تجمعی و s(x−1)=0، ii(−1،y)=0 است.

این رابطه چه فایده‌ای دارد؟ تصور کنید ناحیه D وجود دارد که در آن می‌خواهیم مجموع پیکسل‌ها را محاسبه کنیم. ما سه ناحیه دیگر را نیز به صورت A ،B و C تعریف کرده‌ایم.

  • مقدار تصویر اصلی در نقطه 1 برابر با مجموعه پیکسل‌ها در مستطیل A است.
  • مقدار مربوطه در نقطه 2 برابر با A + B است.
  • مقدار مربوطه در نقطه 3 برابر با A + C است.
  • مقدار مربوطه در نقطه 4 برابر با A + B + C + D است.

از این رو مجموع پیکسل‌ها در ناحیه D را می‌توان با استفاده از فرمول زیر محاسبه کرد:

4+1−(2+3)

با استفاده از یک گذر می‌توان مقدار درون یک مستطیل را با استفاده از تنها 4 ارجاع آرایه‌ای محاسبه کرد:

تشخیص چهره در پایتون

باید بدانید که مستطیل‌ها عملاً ویژگی‌های کاملاً ساده‌ای هستند، اما اهمیت زیادی در تشخیص چهره دارند. فیلترهای Steerable هنگامی که با مسائل پیچیده سر و کار داریم، انعطاف‌پذیری بیشتری دارند.

تشخیص چهره در پایتون

یادگیری تابع طبقه‌بندی با استفاده از Adaboost

با فرض وجود یک مجموعه برچسب خورده از تصاویر آموزشی (مثبت یا منفی) Adaboost به صورت زیر مورد استفاده قرار می‌گیرد:

  • یک مجموعه کوچک از ویژگی‌ها را انتخاب کنید.
  • الگوریتم طبقه‌بندی را آموزش دهید.

از آنجا که اغلب ویژگی‌ها در میان 160،000 ویژگی نامرتبط تصور شده‌اند؛ الگوریتم یادگیری ضعیف که با استفاده از مدل boosting ساختیم طوری طراحی شده است که ویژگی مستطیلی منفردی را انتخاب کند که مثال‌های مثبت و منفی را به بهترین روش از هم جدا می‌کند.

طبقه‌بندی آبشاری

با این که فرایند توصیف شده فوق کاملاً کارآمد است، اما هنوز یک مشکل عمده بر سر راه آن پابرجا است. در یک تصویر اغلب بخش‌ها را قسمت‌های غیر از چهره تشکیل می‌دهند. دادن اهمیت یکسان به همه بخش‌های چنین تصویری بی‌معنی است، چون باید تمرکز عمده روی ناحیه‌ای باشد که احتمال وجود چهره بیشتر است. Viola و Jones در روش خود به نرخ شناسایی بالایی دست یافتند و در عین حال زمان محاسبه را با استفاده از طبقه‌بندی‌های آبشاری کاهش دادند.

ایده اصلی این بوده است که آن پنجره‌های فرعی را که شامل چهره نیستند رد کنند و در عین حال مناطقی که چنین خصوصیتی را دارند حفظ نمایند. از آنجا که وظیفه ما شناسایی مناسب چهره بوده است، می‌خواهیم نرخ تشخیص منفی نادرست، یعنی موادی که شامل چهره بوده‌اند، اما چنین شناسایی نشده‌اند را کاهش دهیم.

یک سری از طبقه‌بندی‌ها روی هر پنجره فرعی اعمال می‌شوند. این طبقه‌بندی‌ها درخت‌های تصمیم ساده‌ای هستند:

  • اگر طبقه‌بندی نخست مثبت باشد، به طبقه‌بندی دوم می‌رویم.
  • اگر طبقه‌بندی دوم مثبت باشد، به طبقه‌بندی سوم می‌رویم.
  • و همین طور تا آخر.

هر نتیجه منفی در یک نقطه، منتهی به رد پنجره فرعی می‌شود که احتمالاً شامل یک چهره است. طبقه‌بندی اول اغلب مثال‌های منفی را با هزینه محاسباتی پایین کاهش می‌دهد و طبقه‌بندی‌های بعدی مثال‌های منفی بعدی را که هزینه بالاتری دارند با استفاده از توان محاسباتی بالاتر حذف می‌کنند.

تشخیص چهره در پایتون

طبقه‌بندی‌ها با استفاده از Adaboost آموزش داده می‌شوند و حد آستانه طوری تعیین می‌شود که نرخ تشخیص نادرست کمینه شود. زمانی که چنین مدلی را آموزش می‌دهیم، متغیرها به صورت زیر هستند:

  • تعداد مراحل طبقه‌بندی
  • تعداد ویژگی‌ها در هر مرحله
  • حد آستانه در هر مرحله

خوشبختانه در OpenCV، کل مدل از قبل برای تشخیص چهره تعلیم یافته است.

ایمپورت‌ها

مرحله بعدی این است که وزن‌های از قبل آموزش‌یافته را مکان‌یابی کنیم. ما از مدل‌های از پیش آموزش‌دیده برای تشخیص چهره، چشم‌ها و دهان استفاده خواهیم کرد. بسته به این که از چه نسخه‌ای از پایتون استفاده می‌کنید فایل‌های مربوطه باید در چنین مکان‌هایی باشند:

/usr/local/lib/python3.7/site-packages/cv2/data

الگوریتم‌های طبقه‌بندی آبشاری را به روش زیر اعلان می‌کنیم:

cascPath = "/usr/local/lib/python3.7/site-packages/cv2/data/haarcascade_frontalface_default.xml"
eyePath = "/usr/local/lib/python3.7/site-packages/cv2/data/haarcascade_eye.xml"
smilePath = "/usr/local/lib/python3.7/site-packages/cv2/data/haarcascade_smile.xml"

faceCascade = cv2.CascadeClassifier(cascPath)
eyeCascade = cv2.CascadeClassifier(eyePath)
smileCascade = cv2.CascadeClassifier(smilePath)

تشخیص چهره روی یک تصویر

پیش از پیاده‌سازی یک الگوریتم تشخیص چهره واقعی، نسخه ساده‌ای از آن را روی یک تصویر ساده به کار می‌گیریم. کار خود را با بارگذاری یک تصویر تست آغاز می‌کنیم:

تشخیص چهره در پایتون

سپس چهره را تشخیص داده و یک مستطیل پیرامون آن اضافه می‌کنیم:

در ادامه فهرستی از پارامترهای مشترک را برای تابع detectMultiScale مشاهده می‌کنید:

  • scaleFactor: پارامتری است که میزان کاهش اندازه تصویر را در هر مقیاس‌بندی تصویر تعیین می‌کند.
  • minNeighbors: این پارامتر تعداد همسایگی‌های هر مستطیل نامزد که باید حفظ شوند را تعیین می‌کند.
  • minSize: کمینه اندازه ممکن برای شیء است. شیءهای کوچک‌تر از آن نادیده گرفته می‌شوند.
  • maxSize: بیشینه ممکن برای اندازه شیء است. شیءهای بزرگ‌تر از آن نادیده گرفته می‌شوند.

در نهایت نتیجه نمایش پیدا می‌کند:

تشخیص چهره در پایتون

چنان که مشاهده می‌کنید، تشخیص چهره روی تصویر تست ما به خوبی عمل کرده است. در ادامه آن را به صورت عملکرد همزمان (آنی) تست می‌کنیم.

تشخیص چهره آنی

در این بخش پیاده‌سازی تشخیص چهره زنده را در پایتون بررسی خواهیم کرد. نخستین گام باز کردن دوربین و دریافت ویدئو است. سپس تصویر را به یک تصویر خاکستری تبدیل می‌کنیم. این کار برای کاهش ابعاد تصویر ورودی صورت می‌گیرد. در واقع به جای 2 نقطه برای هر پیکسل که با رنگ‌های قرمز، سبز و آبی توصیف می‌شوند، یک تبدیل خطی ساده استفاده می‌شود:

این وضعیت به صورت پیش‌فرض در OpenCV پیاده‌سازی شده است:

اینک از متغیر faceCascade که در بخش قبلی تعریف کردیم استفاده می‌کنیم. این متغیر شامل یک الگوریتم از پیش آموزش‌دیده است و آن را روی یک تصویر خاکستری اعمال می‌کنیم.

برای هر چهره‌ای که تشخیص داده شود، یک مستطیل پیرامون چهره ترسیم می‌شود:

در مورد هر دهان که تشخیص داده می‌شود نیز یک مستطیل پیرامون آن رسم می‌شود:

همچنین برای هر چشم شناسایی شده یک مستطیل در پیرامونش ترسیم می‌شود:

سپس تعداد کل چهره‌ها شمارش شده و تصویر نهایی نمایش پیدا می‌کند:

زمانی که می‌خواهیم از دوربین خارج شویم یک گزینه خروج نیز پیاده‌سازی می‌کنیم تا با ارسال حرف q فعال شود:

در نهایت هنگامی که همه کارها انجام یافت، دریافت ویدئو قطع می‌شود و همه پنجره‌ها بسته می‌شوند. البته بستن پنجره‌ها در سیستم Mac با برخی مشکلات مواجه می‌شود که ممکن است نیازمند توقف پردازش پایتون در Activity Manager باشد:

جمع‌بندی

کد کامل ما اینک به صورت زیر است:

نتایج

در ویدئوی کوتاه زیر عملکرد پیاده‌سازی تشخیص چهره ما را مشاهده می‌کنید:

تشخیص چهره در پایتون

هیستوگرام گرادیان‌های جهت‌دار (HOG) در Dlib

دومین پیاده‌سازی محبوب برای تشخیص چهره از سوی Dlib ارائه شده و از مفهومی به نام هیستوگرام گرادیان‌های جهت‌دار (HOG) بهره می‌گیرد. در این بخش به پیاده‌سازی روش اصلی پیشنهاد شده در مقاله Dalal و Triggs (+) می‌پردازیم.

نظریه

ایده‌ای که در پشت HOG قرار دارد این است که می‌توان ویژگی‌ها را به صورت یک بردار استخراج کرد و آن را به یک الگوریتم طبقه‌بندی، برای مثال ماشین بردار پشتیبانی داد که ارزیابی کند آیا یک چهره (یا هر چیز دیگر که برای شناسایی‌اش تعلیم دیده است) در آن ناحیه وجود دارد یا نه.

ویژگی‌های استخراج شده، توزیع‌ها (هیستوگرام‌ها)-ی جهت‌گیری گرادیان‌ها (یا گرادیان‌های جهت‌دار) از تصویر هستند. گرادیان‌ها عموماً در بخش‌های لبه و گوشه، مقادیر بالایی دارند و بدین ترتیب به ما امکان می‌دهند که آن نواحی را تشخیص دهیم.

در مقاله اصلی، فرایند کار برای تشخیص بدن انسان به صورت زیر پیاده‌سازی شده است و زنجیره تشخیص به شرح زیر است:

تشخیص چهره در پایتون

پیش‌پردازش

قبل از هر چیز، تصاویر ورودی باید هم‌اندازه باشند. از این رو برش و تغییر مقیاس لازم است. وصله‌هایی که ما در این مقاله استفاده می‌کنیم، دارای نسبت 1:2 هستند و از این رو ابعاد تصاویر ورودی باید برای نمونه 64 در 128 یا 100 در 200 باشد.

محاسبه تصاویر گرادیان

نخستین گام، محاسبه گرادیان‌های افقی و عمودی تصویر از طریق به‌کارگیری کرنل‌های زیر است:

تشخیص چهره در پایتون با استفاده از OpenCV و Dlib

گرادیان یک تصویر عموماً اطلاعات غیرضروری را حذف می‌کند. گرادیان تصویری که در بخش فوق در نظر گرفتیم را می‌توان در پایتون به صورت زیر به دست آورد:

شکل را به صورت زیر رسم می‌کنیم:

تشخیص چهره در پایتون با استفاده از OpenCV و Dlib

با این حال ما تصویر را پیش‌پردازش نکرده‌ایم.

محاسبه HOG

در ادامه تصویر به سلول‌های 8 در 8 تقسیم می‌شود تا یک بازنمایی فشرده ایجاد شود و HOG در برابر نویز مقاومت بیشتری بیابد. سپس HOG را برای هریک از این سلول‌ها محاسبه می‌کنیم.

برای تخمین جهت گرادیان درون ناحیه، یک هیستوگرام میان 64 مقدار از جهت‌گیری‌های گرادیان (8 در 8) می‌سازیم و بزرگی آن‌ها (64 مقدار دیگر) درون هر ناحیه را نیز محاسبه می‌کنیم. دسته‌های هیستوگرام با زوایای گرادیان از 0 تا 180 درجه مرتبط هستند. در مجموع 9 دسته به صورت 0، 20، 40،… و 160 درجه وجود دارند.

کد فوق دو نوع اطلاعات را در اختیار ما قرار می‌دهد:

  • جهت گرادیان‌
  • بزرگی گرادیان

زمانی که HOG را می‌سازیم، 3 حالت فرعی وجود دارد:

  • زاویه کمتر از 160 درجه باشد و در نیمه بین 2 طبقه قرار نگرفته باشد. در چنین مواردی، این زاویه در دسته مناسب HOG اضافه می‌شود.
  • زاویه کمتر از 60 درجه باشد و دقیقاً بین دو طبقه قرار بگیرد. در چنین حالتی یک مشارکت برابر بین دو طبقه مجاور تصور کرده و بزرگی را به 2 بخش تقسیم می‌کنیم.

تشخیص چهره در پایتون با استفاده از OpenCV و Dlib

  • زاویه بزرگ‌تر از 160 درجه باشد. در چنین حالت‌هایی تصور می‌کنیم که آن پیکسل به صورت قائم بر 160 و تا 0 درجه مشارکت دارد.

تشخیص چهره در پایتون با استفاده از OpenCV و Dlib

HOG برای هر سلول 8 در 8 به صورت زیر به دست می‌آید:

تشخیص چهره در پایتون با استفاده از OpenCV و Dlib

نرمالسازی بلوک

در نهایت، یک بلوک 16 در 16 را می‌توان برای نرمالسازی تصویر و برای مثال حذف تأثیر نوردهی اعمال کرد. این نتیجه به سادگی با تقسیم کردن هر مقدار HOG با اندازه 8 در 8 بر L2-norm مربوط به بلوک HOG 16 در 16 که شامل آن است صورت می‌گیرد. در واقع این یک بردار ساده با طول 9*4 = 36 است.

در نهایت همه بردارهای 36 در 1 در یک بردار بزرگ تجمیع می‌شوند و کار به پایان می‌رسد. بدین ترتیب بردار ویژگی به دست می‌آید و با استفاده از آن می‌توان یک الگوریتم طبقه‌بندی SVM نرم (C=0.01) را آموزش داد.

تشخیص چهره روی یک تصویر

پیاده‌سازی این روش کاملاً سر راست است:

تشخیص چهره در پایتون با OpenCV و Dlib

تشخیص چهره آنی

همانند روش قبلی، پیاده‌سازی آنی این الگوریتم نیز آسان است. ما یک نسخه سبک‌تر از آن را که تنها چهره را تشخیص می‌دهد را پیاده‌سازی کرده‌ایم. Dlib شناسایی نقاط کلیدی چهره را نیز به صورت کاملاً ساده اجرا می‌کند که البته بررسی آن خارج از حیطه این مقاله است:

شبکه عصبی کانولوشنی در Dlib

آخرین روش که در این مقاله برای تشخیص چهره بررسی می‌کنیم مبتنی بر شبکه‌های عصبی کانولوشنی (CNN) است. برای پیاده‌سازی این روش از نتایج این مقاله (+) در مورد شناسایی شیء (Max-Margin (MMOD بهره جسته‌ایم.

اندکی از نظریه روش

شبکه‌های عصبی کانولوشنی (CNN) شبکه‌های عصبی پیش‌خور (feed-forward) هستند که به طور عمده برای بینایی ماشین استفاده می‌شوند. این شبکه‌ها یک پیش-آموزش خودکار را نیز همراه با بخش شبکه عصبی فشرده ارائه می‌کنند. CNN-ها انواع خاصی از شبکه‌های عصبی برای پردازش داده‌ها با فناوری شبه grid هستند. معماری CNN از کورتکس بینایی جانداران الهام گرفته است.

در رویکردهای قبلی، بخش عمده‌ای از کار مربوط به انتخاب فیلترها برای ایجاد ویژگی‌هایی جهت استخراج بیشینه ممکن اطلاعات از تصاویر بوده است. با ظهور یادگیری عمیق و ظرفیت‌های محاسباتی بالاتر این کار اکنون به صورت خودکار صورت می‌گیرد. نام CNN از این واقعیت ناشی می‌شود که ورودی تصویر اولیه با یک مجموعه از فیلترها پیچش (convolve) می‌یابد. پارامتری که باید انتخاب کرد، تعداد فیلترهایی که باید اعمال شوند و ابعاد فیلترها است. بُعد فیلتر به نام طول stride نامیده می‌شود. مقادیر معمول برای این stride بین 2 و 5 هستند:

تشخیص چهره در پایتون با OpenCV و Dlib

خروجی CNN در این مورد خاص یک طبقه‌بندی باینری است که در صورت وجود چهره مقدار 1 و در غیر این صورت مقدار 0 می‌گیرد.

تشخیص چهره روی یک تصویر

برخی اجزای این رویکرد در پیاده‌سازی تغییر می‌یابند. نخستین گام، دانلود کردن مدل از پیش آموزش‌دیده (+) است. وزن‌ها را به پوشه خود منتقل و dnnDaceDetector را تعریف کنید:

dnnFaceDetector = dlib.cnn_face_detection_model_v1("mmod_human_face_detector.dat")

سپس مشابه روشی که تا به اینجا عمل کردیم پیش می‌رویم:

تشخیص چهره در پایتون با OpenCV و Dlib

تشخیص چهره آنی

در نهایت نسخه آنی تشخیص چهره CNN را پیاده‌سازی خواهیم کرد:

کدام روش را باید انتخاب کرد؟

سؤال دشواری است و برای پاسخ به آن باید دو معیار مهم زیر را در نظر گرفت:

  • زمان محاسبات
  • دقت

اگر سرعت را معیار قرار دهیم، HoG سریع‌ترین الگوریتم به نظر می‌رسد و سپس طبقه‌بندی آبشار Haar و CNN قرار دارند.

با این حال، CNN-ها و Dlib دقیق‌ترین الگوریتم‌ها هستند. HoG نیز عملکرد خوبی دارد، اما مشکلاتی در شناسایی چهره‌های کوچک دارد. طبقه‌بندی HaarCascade نیز به خوبی HoG عمل می‌کند. اگر می‌خواهید تشخیص سریعی در ویدئوهای زنده خود داشته باشید پیشنهاد می‌کنیم از روش HoG استفاده کنید.



    منبع: فرادرس


    تحلیل شبکه های اجتماعی با R — به زبان ساده

    تحلیل  شبکه های اجتماعی یکی از مباحث داغ روز است که در این مطلب به طور کامل به آن پرداخته خواهد شد. از زمان پیداش «شبکه‌های اجتماعی برخط» (Online Social Networks | OSN) تاکنون، جمعیت کاربران این شبکه‌ها روز به روز افزایش می‌یابد. بر اساس آخرین گزارش «دیجیتال ۲۰۱۹» (Digital 2019) که توسط «هوت‌سوئیت» (Hootsuite) ارائه شده است (این گزارش ۲۲۱ صفحه‌ای، چشم‌اندازی دقیق از وضعیت استفاده از وب و به طور خاص شبکه‌های اجتماعی ارائه می‌کند)، در سال ۲۰۱۹، اینترنت از سراسر جهان ۴.۳۸۸ میلیارد کاربر (نفوذ ٪۵۷) دارد و نسبت به سال گذشته، رشد ٪۹.۱ داشته است. شایان توجه است که جمعیت کل جهان، ۷.۶۷۶ میلیارد نفر است.

    همچنین، تعداد کاربران شبکه‌های اجتماعی در سال ۲۰۱۹ برابر با ۳.۴۸۴ میلیارد (نفوذ ٪۴۵) گزارش شده که نسبت به سال گذشته ٪۹ رشد داشته است. تعداد کاربران تلفن همراه در سال ۲۰۱۹، برابر با ۵.۱۱۲ میلیارد است که رشد ٪۲ نسبت به سال گذشته از خود نشان می‌دهد. در این میان، تعداد کاربران شبکه‌های اجتماعی موبایل، ۳.۲۵۶ میلیارد نفر (نفوذ ٪۴۲) است.

    تحلیل شبکه های اجتماعی برخط

    از سوی دیگر، مدت زمانی که افراد برای حضور در شبکه‌های اجتماعی صرف می‌کنند رشد قابل توجهی داشته و به نوعی می‌توان گفت این روزها، شبکه‌های اجتماعی همیشه و همه جا همراه افراد هستند و بخش قابل توجهی از زندگی آن‌ها را شامل می‌شوند. با توجه به همین آمار و ارقام و حجم محتوایی که هر روز افراد در شبکه‌های اجتماعی برخط تولید کرده و به اشتراک می‌گذارند، مبحثی جدید با عنوان تحلیل شبکه های اجتماعی شکل گرفته است.

    در این مطلب، آموزش تحلیل شبکه های اجتماعی با R ارائه شده است. البته به منظور درک هر چه بهتر مطلب، ابتدا مفهوم شبکه اجتماعی و دلایل نیاز به تحلیل شبکه های اجتماعی بیان شده، فرصت‌های شغلی این حوزه مورد بررسی قرار گرفته و سپس، به چگونگی انجام تحلیل شبکه های اجتماعی با R پرداخته شده است. در نهایت، منابع آموزشی مفید برای فراگیری کامل و تسلط بر این مبحث، ارائه شده‌اند.

    شبکه اجتماعی چیست؟

    یک تعریف ساده و کوتاه قابل ارائه از شبکه‌های اجتماعی این است: «شبکه اجتماعی، ساختاری متشکل از افراد (یا سازمان‌ها) است». به بیان جامع‌تر، شبکه اجتماعی ساختاری متشکل از بازیگران شبکه (افراد یا سازمان‌ها) و روابط میان آن‌ها است.

    در واقع، یک شبکه اجتماعی را می‌توان به صورت یک «گراف» (Graph) در نظر گرفت که در آن، بازیگران شبکه همان «گره‌های» (Nodes) گراف و روابط میان آن‌ها «یال‌های» (Edges) گراف است. قدمت شبکه‌های اجتماعی به تشکیل اولین اجتماعات انسانی باز می‌گردد. یک خانواده، فامیل، سازمان و حتی مدرسه، به دید سنتی یک شبکه اجتماعی محسوب می‌شود. در واقع، انواع گوناگونی از روابط می‌تواند میان بازیگران یک شبکه اجتماعی برقرار باشد.

    تحلیل شبکه های اجتماعی

    جنس جدیدی از شبکه‌های اجتماعی با ظهور وب ۲.۰ ایجاد شدند. «شبکه‌های اجتماعی برخط» (Online Social Networks)، نوعی از شبکه‌های اجتماعی مبتنی بر وب هستند. این شبکه‌های اجتماعی انواع گوناگونی دارند که می‌توان به شبکه‌های اجتماعی به اشتراک‌گذاری ویدئو، صوت، متن و شبکه‌های اجتماعی ترکیبی که انواع محتوا را می‌توان در آن به اشتراک گذاشت اشاره کرد.

    هرچند، در حال حاضر اغلب شبکه‌های اجتماعی با وجود آنکه برای هدف خاصی طراحی شده‌اند، معمولا امکان به اشتراک‌گذاری چند نوع محتوا را به طور هم‌زمان به کاربر می‌دهند و هر بار در گذر زمان، از قابلیت‌های جدیدی در این راستا، بهره‌برداری می‌کنند. از جمله معروف‌ترین و محبوب‌ترین شبکه‌های اجتماعی برخط، می‌توان به «فیس‌بوک» (Facebook)، «یوتیوب» (YouTube)، واتس‌اپ (WhatsApp)، «وی‌چت» (WeChat)، «اینستاگرام» (Instagram)، «توییتر» (Twitter) و «لینکدین» (Linkedin) اشاره کرد. نکته شایان توجه این است که در حال حاضر از عبارت شبکه‌های اجتماعی معمولا برای اشاره به شبکه‌های اجتماعی برخط استفاده می‌شود و کمتر پیش می‌آید که با بیان شبکه اجتماعی شکل سنتی آن مد نظر باشد.

    تحلیل شبکه های اجتماعی چیست و چرا به آن نیاز است؟

    همانطور که پیش از این اشاره شد، مفهوم شبکه‌های اجتماعی به اولین اجتماعات انسانی شکل گرفته توسط بشر باز می‌گردد و مفهوم کنونی شبکه اجتماعی که در واقع منظور از آن، شبکه اجتماعی برخط است، با ظهور وب ۲.۰ ایجاد شد. اولین رشته‌های تحلیل اجتماعات انسانی نیز به تلاش‌های جامعه‌شناسان اولیه مانند «گئورگ زیمل» (Georg Simmel) و «امیل دورکیم» (Émile Durkheim) مربوط می‌شود که مطالعات و آثار مکتوبی را پیرامون الگوهای روابطی که بازیگران شبکه‌های اجتماعی را به یکدیگر متصل می‌کند دارند. در سال ۱۹۳۰ بود که «جاکوب مورنو» (Jacob L. Moreno) و «هلن جنگینز» (Helen Jennings) روش‌های تحلیلی پایه‌ای را برای شبکه‌های اجتماعی معرفی کردند.

    در ابتدای قرن بیستم، برخی از جامعه‌شناسان، از عبارت «شبکه اجتماعی» برای اشاره به روابط پیچیده بین اعضای اجتماعات انسانی در ابعاد شخصی و بین فردی گرفته تا بین‌المللی استفاده کردند. در واقع می‌توان گفت، «تحلیل شبکه های اجتماعی» (Online Social Network Analysis | OSNA | SNA)، استراتژی برای بررسی شبکه‌های اجتماعی است. تحلیل شبکه‌های اجتماعی به دو صورت «ساختاری» (Structural) و «رفتاری» (Behavioral) انجام می‌شود. در تحلیل ساختاری، گراف ساختاری یک شبکه اجتماعی (شامل گره‌ها و یال‌ها) مورد بررسی قرار می‌گیرد.

    تحلیل شبکه های اجتماعی

    در تحلیل رفتاری، رفتار کاربر در یک شبکه اجتماعی، شامل محتوایی که به اشتراک می‌گذارد، زمان‌های فعالیت و برخی از دیگر موارد، مورد بررسی قرار می‌گیرد. یکی از وظایف اصلی که در تحلیل رفتاری شبکه‌های اجتماعی معمولا انجام می‌شود، «متن‌کاوی» (Text Mining)است. برای مثال، توییت‌های ارسالی کاربران فارسی زبان در یک شبکه اجتماعی مانند توییتر، در یک بازه زمانی مشخص گردآوری می‌شوند و با استفاده از روش‌های متن‌کاوی، «تحلیل احساسات» (Sentimental Analysis) که به آن عقیده‌کاوی (Opinion Mining) یا تحلیل عواطف نیز گفته می‌شود، تحلیل عواطف کاربران در جهت تشخیص حساب‌های کاربری که به «نفرت پراکنی» (Hate Speech)می‌پردازند انجام می‌شود (البته برخی از دانشمندان، تفاوت‌های ظریفی بین تحلیل احساست و عقیده‌کاوی بر می‌شمارند).

    با توجه به آمارهای ارائه شده در ابتدای این مطلب، به خوبی مشهود است که جهان کنونی، جهانی متشکل از ساختارهای اجتماعی شکل گرفته در وب و در واقع دنیای شبکه‌های اجتماعی برخط است. افراد حاضر در شبکه، احساسات، عقاید، خواسته‌ها، اخبار و مسائل گوناگون را به صورت آنی با یکدیگر به اشتراک می‌گذارند. این یعنی، یک بایگانی عظیم و به وسعت جهان از داده‌های افراد گوناگون که با تحلیل آن‌ها می‌توان به دانشی فوق‌العاده در راستای شناخت بشر و دنیای انسانی دست یافت. چنین شناختی می‌تواند در راستای اهداف گوناگون، از جمله موارد زیر مفید واقع شود.

    • شناسایی فعالیت‌های مجرمانه در شبکه‌های اجتماعی (شامل گروهک‌ها و ترول‌ها)
    • انجام بازاریابی دیجیتال هدفمند و قدرتمند با شناخت دقیق مشتریان
    • بهبود فرایند ارتباط با مشتریان از طریق شبکه‌های اجتماعی
    • ساخت سیستم‌های توصیه‌گر (برای کالا و خدمات و یا دیگر انواع سیستم‌های توصیه‌گر)
    • ساخت موتورهای جستجوی مبتنی بر نظرات کاربران
    • استفاده از دانش حاصل شده از تحلیل شبکه های اجتماعی در راستای اهداف «هوش تجاری» (‌Business Intelligence)
    • کمک به بهبود تصمیم‌سازی در کسب و کارها و یا سازمان‌های گوناگون دولتی و نهادهای نظارتی و امنیتی
    • پیش‌بینی نتایج به ویژه در انتخابات‌ها
    • کشف موضوعات نوظهور و گرایش‌های موضوعی

    نمونه‌ای از قدرت تحلیل شبکه‌های اجتماعی و استفاده از دانش حاصل شده از آن جهت دستیابی به اهداف گوناگون را می‌توان در ماجرای «کمبریج آنالیتیکا» (Cambridge Analytica) و فیس‌ بوک و تاثیر به سزایی که گفته می‌شود در  انتخابات آمریکا داشته است مشاهده کرد.

    فرصت‌های شغلی در زمینه تحلیل شبکه های اجتماعی

    با توجه به نقش مهمی که شبکه‌های اجتماعی در تدوین استراتژی‌های کسب و کارها در حال حاضر دارند، و تاثیر به سزایی که دانش حاصل از تحلیل شبکه های اجتماعی در حوزه‌های گوناگون داشته است، فرصت‌های شغلی متعدد با درآمد خوب برای کارشناسان این حوزه وجود دارد. تحلیل‌گران شبکه‌های اجتماعی می‌توانند تا حتی ۱۱۰,۰۰۰ دلار در سال حقوق دریافت کنند. انتظار می‌رود تعداد فرصت‌های شغلی این حوزه با توجه به رشد روزافزون ضریب نفوذ شبکه‌های اجتماعی، افزایش پیدا کند.

    تحلیل شبکه های اجتماعی

    تحلیل شبکه های اجتماعی چگونه انجام می‌شود؟

    همانطور که پیش تر بیان شد، تحلیل شبکه های اجتماعی به دو شکل ساختاری (بر اساس گراف شبکه) و رفتاری (محتوای به اشتراک گذاشته شده توسط کاربر و رفتار کاربر در شبکه مانند ساعات حضور و به اشتراک‌گذاری محتوا) انجام می‌شود. هر یک از این دو نوع تحلیل، اصول و روش‌های خاص خود را دارند. برای مثال، در تحلیل ساختاری، نیاز به تسلط بر مباحث زیر وجود دارد:

    • مفاهیم نظریه گراف‌ها
    • مفاهیم بنیادین پیرامون ساختار شبکه‌های اجتماعی مانند «شبکه‌های اگو» (Ego Networks) و «شبکه‌های سراسری» (Global Networks)
    • سنجه‌های اختصاصی ساختارهای شبکه‌های اجتماعی ( که سه دسته اصلی آن عبارتند از «ارتباطات» (Connections)، «توزیع‌ها» (Distributions) و «بخش‌بندی» (Segmentation))
    • دیگر مباحث این حوزه مانند انواع ساختارهای ناهنجار در شبکه (ستاره‌ای، گروهک و شبه گروهک)

    در تحلیل‌ رفتاری، یکی از مرسوم‌ترین راهکارها استفاده از محتوای متنی به اشتراک گذاشته شده توسط کاربر است. بدین معنا که برای مثال متن توییت‌ها، پست‌های فیس‌بوک و یا کپشن‌های پست‌های اینستاگرام را گردآوری و تحلیل می‌کنند. بدین منظور، کاربر نیاز به آشنایی با مفاهیم متن‌کاوی و ابزارهای آن دارد.

    تحلیل شبکه های اجتماعی با زبان برنامه نویسی R

    برای پیاده‌سازی تحلیل شبکه های اجتماعی می‌توان از ابزارهای ویژه این حوزه استفاده کرد. از جمله این ابزارها، زبان‌های برنامه‌نویسی R و «پایتون» (Python) هستند. R یک زبان محاسباتی قدرتمند است که در ابتدا به طور ویژه برای محاسبات آماری به کار می‌رفت. اما در گذر زمان و با توسعه «بسته‌های» (Packages) این زبان برای «علم داده» (Data Science)، «یادگیری ماشین» (Machine Learning) و به طور خاص «متن‌کاوی» (Text Mining) استفاده از این زبان برای انجام تحلیل شبکه‌های اجتماعی نیز رواج یافت. نمونه‌ای از پروژه‌های تحلیل شبکه های اجتماعی با R را می‌توان در مطلب «تحلیل احساسات در توییتر با زبان R — راهنمای کاربردی» و «تحلیل ترافیک شهری با استفاده از شبکه‌های اجتماعی و R — راهنمای کاربردی» مشاهده کرد.

    تحلیل شبکه های اجتماعی

    جمع‌بندی

    تحلیل شبکه‌های اجتماعی به اشکال گوناگون و با اهداف متنوعی صورت می‌پذیرد. به منظور انجام تحلیل شبکه های اجتماعی، کاربر نیاز به آشنایی با مفاهیم این حوزه، مباحث داده‌کاوی و متن‌کاوی و همچنین یک ابزار مانند زبان برنامه‌نویسی R دارد. به علاقه‌مندان یادگیری تحلیل شبکه های اجتماعی، مشاهده دوره آموزش ویدئویی آموزش تحلیل شبکه های اجتماعی با زبان R و متن کاوی که به زبان فارسی تهیه شده و مدت زمان آن ۷ ساعت و ۲۵ دقیقه است، توصیه می‌شود.


      منبع: فرادرس


      حلقه while و do…while در ++C — راهنمای کاربردی

      حلقه‌ها در برنامه‌نویسی برای تکرار یک بلوک خاص از کد استفاده می‌شوند. در این مقاله با روش ایجاد حلقه while و do…while در ++C آشنا خواهیم شد. در برنامه‌نویسی رایانه، حلقه برای تکرار یک بلوک کد تا زمانی که شرط خاصی برقرار شود، مورد استفاده قرار می‌گیرد. در زبان برنامه‌نویسی ++C، سه نوع حلقه وجود دارند:

      • حلقه for
      • حلقه while
      • حلقه do…while

      برای مطالعه قسمت قبلی این مجموعه مطلب آموزشی می‌توانید به پست حلقه for در زبان برنامه نویسی ++C — به زبان ساده مراجعه کنید.

      حلقه while در ++C

      ساختار این حلقه به صورت زیر است:

      که در آن testExpression روی هر مدخل حلقه while بررسی می‌شود.

      حلقه while چگونه کار می‌کند؟

      • حلقه while عبارت تست را ارزیابی می‌کند.
      • اگر عبارت تست درست باشد، کد درون بدنه حلقه while مورد ارزیابی قرار می‌گیرد.
      • سپس عبارت تست مجدداً ارزیابی می‌شود. این فرایند تا زمانی که عبارت تست نادرست شود ادامه می‌یابد.
      • هنگامی که عبارت تست نادرست شود، حلقه while خاتمه می‌یابد.

      فلوچارت حلقه while

      مثال 1: حلقه while در ++C

      خروجی

      Enter a positive integer: 4
      Factorial of 4 = 24

      در این برنامه از کاربر تقاضا می‌شود که یک عدد صحیح مثبت وارد کند که در متغیر number ذخیره می‌شود. فرض کنید کاربر مقدار 4 را وارد کند.

      سپس حلقه while شروع به اجرای کد می‌کند. طرز کار حلقه while به صورت زیر است:

      1. در ابتدا i=1 است و عبارت تست یعنی i <= number درست است، از این رو مقدار فاکتوریل برابر با 1 خواهد بود.
      2. عبارت i به مقدار 2 به‌روزرسانی می‌شود، عبارت تست true است، مقدار فاکتوریل برابر با 2 می‌شود.
      3. عبارت i به مقدار 3 به‌روزرسانی می‌شود، عبارت تست true است، مقدار فاکتوریل برابر با 6 می‌شود.
      4. عبارت i به مقدار 4 به‌روزرسانی می‌شود، عبارت تست true است، مقدار فاکتوریل برابر با 24 می‌شود.
      5. عبارت i به مقدار 5 به‌روزرسانی می‌شود، عبارت تست false می‌شود و حلقه خاتمه می‌یابد.

      حلقه do…while در ++C

      حلقه do…while نوع دیگری از حلقه while است که یک تفاوت مهم با آن دارد. بدنه حلقه do…while پیش از بررسی عبارت تست، یک بار اجرا خواهد شد.

      ساختار حلقه do…while به صورت زیر است:

      طرز کار حلقه do…while چگونه است؟

      • کدهای درون بدنه حلقه دست‌کم یک بار اجرا می‌شوند. سپس تنها عبارت تست بررسی می‌شود.
      • اگر عبارت تست درست باشد، بدنه حلقه اجرا می‌شود. این فرایند تا زمانی ادامه می‌یابد که عبارت نادرست شود.
      • هنگامی که عبارت تست نادرست باشد، حلقه do…while خاتمه می‌یابد.

      فلوچارت حلقه do…while

      مثال 2: حلقه do…while در ++C

      خروجی

      Enter a number: 2
      Enter a number: 3
      Enter a number: 4
      Enter a number: -4
      Enter a number: 2
      Enter a number: 4.4
      Enter a number: 2
      Enter a number: 0

      بدین ترتیب به پایان این بخش از آموزش مفاهیم زبان برنامه‌نویسی ++C می‌رسیم.

      برای مطالعه قسمت بعدی این مجموعه مطلب آموزشی می‌توانید روی لینک زیر کلیک کنید:

      هش کردن رمزهای عبور در جاوا — به زبان ساده

      در این مقاله، به بررسی اهمیت هش کردن رمزهای عبور می‌پردازیم. نگاهی سریع به ماهیت آن خواهیم داشت و دلیل اهمیت آن را نیز توضیح می‌دهیم. همچنین برخی روش‌های امن و ناامن برای اجرای هش کردن رمزهای عبور در جاوا را معرفی می‌کنیم.

      هش کردن چیست؟

      هش کردن فرایندی است که در طی آن یک رشته یا Hash از یک پیام مفروض با استفاده از یک تابع ریاضی ساخته می‌شود. این تابع ریاضی به نام «تابع هش رمزشناختی» (Cryptographic Hash Function) نامیده می‌شود. با این که چند تابع هش هم اینک وجود دارند، اما توابعی که برای هش کردن رمزهای عبور طراحی شده‌اند باید چهار مشخصه زیر را داشته باشند تا امن محسوب شوند:

      • باید قطعی باشند، یعنی یک پیام که از سوی یک تابع هش پردازش می‌شود، همواره باید پیام هش شده یکسانی را تولید کند.
      • معکوس‌پذیر نباشند، یعنی امکان تولید یک پیام از روی هش آن وجود نداشته باشد.
      • آنتروپی بالایی داشته باشند، یعنی تغییرات کوچک در یک پیام، باید منجر به تفاوت‌های وسیعی در هش حاصل شود.
      • در برابر تصادم مقاومت داشته باشند؛ منظور از این گفته آن است که دو پیام متفاوت نباید هش یکسانی تولید کنند.

      یک تابع هش که هر چهار مشخصه فوق را داشته باشد، گزینه خوبی برای هش کردن رمزهای عبور است، زیرا مجموعه مشخصه‌های فوق موجب می‌شوند که مهندسی معکوس رمز عبور از روی هش دشوار باشد.

      ضمناً، تابع‌های هش کردن رمزهای عبور باید کُند باشند، چون الگوریتم‌های سریع مستعد حملات brute force هستند که در طی آن مهاجمان تلاش می‌کنند یک رمز عبور را با هش کردن و مقایسه میلیاردها یا تریلیون‌ها رمز عبور بالقوه در طی هر ثانیه حدس بزنند.

      برخی تابع‌های هش عالی که همه معیارهای فوق را دارند شامل PBKDF2 ،BCrypt و SCrypt هستند. اما ابتدا باید برخی الگوریتم‌های قدیمی‌تر را بررسی کنیم تا ببینیم چرا استفاده از آن‌ها دیگر توصیه نمی‌شود.

      MD5: توصیه نمی‌شود

      نخستین تابع هش که بررسی می‌کنیم، الگوریتم «چکیده پیام» (message-digest) به نام MD5 است که در سال 1992 توسعه یافته است. متد MessageDigest جاوا امکان محاسبه آن را ساده کرده است و هنوز در برخی موارد می‌تواند مفید باشد. با این وجود، در طی سال‌های اخیر ثابت شده است که MD5 مشخصه چهارم هش کردن رمزهای عبور را که در بخش قبلی اشاره کردیم ندارد. چون از نظر محاسباتی تولید تصادم بسیار راحت است. علاوه بر آن MD5 یک الگوریتم سریع است و از این رو در برابر حمله‌های brute-force کارایی ندارد.

      SHA-512: توصیه نمی‌شود

      در این بخش نگاهی به SHA-512 خواهیم داشت که بخشی از خانواده الگوریتم هش امن است. این خانواده با معرفی SHA-0 در سال 1993 آغاز شده است.

      از آنجا که توان رایانه‌ها به صورت مداوم افزایش می‌یابد و هر روز آسیب‌پذیری‌های جدید را کشف می‌کنیم، محققان نسخه‌های جدیدی از SHA را طراحی کرده‌اند. نسخه‌های جدیدتر به تدریج طول بیشتری دارند و در برخی موارد محققان نسخه جدید را بر مبنای الگوریتم قبلی منتشر می‌سازند.

      SHA-512 طولانی‌ترین کلید را در نسل سوم از الگوریتم‌های هش دارد. با این که در حال حاضر نسخه‌های امن‌تری از SHA ارائه شده‌اند، اما SHA-512 قوی‌ترین نسخه‌ای است که در جاوا پیاده‌سازی شده است.

      پیاده‌سازی در جاوا

      در این بخش به بررسی پیاده‌سازی الگوریتم هش کردن SHA-512 در جاوا می‌پردازیم. ابتدا باید مفهوم Salt را درک کنیم. Salt به بیان ساده یک دنباله تصادفی است که برای هر هش جدید تولید می‌شود.

      با استفاده از این خصوصیت تصادفی بودن میزان آنتروپی هش بالا می‌رود و پایگاه داده خود را در برابر لیست‌های از قبل تهیه شده از هش‌ها که به نام «جداول رنگین‌کمان» (rainbow tables) شناخته می‌شوند مقاوم‌تر می‌سازیم. تابع هش جدید ما به طور تقریبی به صورت زیر است:

      تولید یک Salt

      برای استفاده از Salt از کلاس SecureRandom از java.security استفاده می‌کنیم:

      سپس از کلاس MessageDigest برای پیکربندی تابع SHA-512 با Salt خود کمک می‌گیریم:

      بدن ترتیب اینک می‌توانیم از متد digest برای تولید رمز عبور هش شده جدید خود بهره بگیریم:

      چرا استفاده از آن توصیه نمی‌شود؟

      حتی زمانی که از Salt استفاده می‌کنیم، SHA-512 همچنان یک گزینه متوسط محسوب می‌شود، اما گزینه‌های قوی‌تر و کُندتری نیز وجود دارند. ضمناً گزینه‌های دیگر که در ادامه بررسی خواهیم کرد، یک ویژگی مهم به نام «قدرت قابل پیکربندی» (Configurable Strength) دارند.

      PBKDF2 ،BCrypt و SCrypt

      PBKDF2 ،BCrypt و SCrypt سه الگوریتم هش کردن هستند که استفاده از آن‌ها توصیه می‌شود.

      چرا باید از این الگوریتم‌ها استفاده کنیم؟

      هر کدام از این الگوریتم‌ها کند هستند و هر کدام یک ویژگی مشترک عالی به نام قدرت قابل پیکربندی دارند. این بدان معنی است که با افزایش توان محاسباتی رایانه‌ها می‌توانیم الگوریتم را از طریق تغییر دادن ورودی‌ها کندتر کنیم.

      پیاده‌سازی PBKDF2 در جاوا

      اکنون Salt-ها مفهومی بنیادی در زمینه هش کردن رمزهای عبور محسوب می‌شوند و از این رو باید یکی از آن‌ها را برای PBKDF2 نیز استفاده کنیم:

      سپس یک PBEKeySpec و یک SecretKeyFactory ایجاد می‌کنیم که با استفاده از الگوریتم PBKDF2WithHmacSHA1 وهله‌سازی می‌شوند:

      پارامتر سوم (65536) به طرز مؤثری پارامتر قدرت است. این پارامتر تعیین می‌کند که این الگوریتم برای چند بار تکرار خواهد شد و بدین ترتیب زمان مورد نیاز برای تولید هش افزایش می‌یابد. در نهایت می‌توانیم از SecretKeyFactory برای تولید هش استفاده کنیم:

      پیاده‌سازی BCrypt و SCrypt در جاوا

      تا به این جا مشخص شد که BCrypt و SCrypt هنوز در جاوا پشتیبانی نمی‌شوند؛ اما برخی کتابخانه‌های جاوا از آن‌ها پشتیبانی می‌کنند. یکی از این کتابخانه‌ها Spring Security نام دارد.

      هش کردن رمزهای عبور با Spring Security

      با این که جاوا به صورت بومی از هر دو الگوریتم هش کردن PBKDF2 و SHA پشتیبانی می‌کند، اما الگوریتم‌های BCrypt و SCrypt همچنان پشتیبانی نمی‌شوند.

      خوشبختانه کتابخانه Spring Security از طریق اینترفیس PasswordEncoder از هر سه این الگوریتم‌های توصیه شده پشتیبانی می‌کند، بنابراین:

      • MessageDigestPasswordEncoder الگوریتم‌های MD5 و SHA-512 را ارائه می‌کند.
      • Pbkdf2PasswordEncoder الگوریتم PBKDF2 را ارائه می‌کند.
      • BCryptPasswordEncoder الگوریتم BCrypt را ارائه می‌کند.
      • SCryptPasswordEncoder الگوریتم SCrypt را ارائه می‌کند.

      انکودرهای رمز عبور برای PBKDF2 ،BCrypt و SCrypt همگی از پیکربندی قدرت مطلوب هش رمز عبور پشتیبانی می‌کنند. حتی بدون وجود یک اپلیکیشن مبتنی بر Spring Security می‌توان از این انکودرها به صورت مستقیم استفاده کرد. همچنین اگر از سایت خود با استفاده از Spring Security حفاظت می‌کنید در این صورت می‌توانید انکودر رمز عبور مطلوب خود را از طریق DSL آن یا از طریق تزریق وابستگی پیکربندی کنید.

      برخلاف مثال‌های قبلی که مطرح شدند، این الگوریتم‌ها Salt را برای ما به صورت داخلی تولید می‌کنند. الگوریتم Salt را درون هش خروجی برای استفاده‌های بعدی در زمان اعتبارسنجی رمز عبور ذخیره می‌کند.

      نتیجه‌گیری

      بدین ترتیب در این مطلب بررسی نسبتاً عمیقی در مورد روش‌های هش کردن رمز عبور داشتیم و به کاوش مفاهیم و کاربردهای آن‌ها پرداختیم. همچنین نگاهی به برخی تابع‌های قدیمی هش کردن داشتیم و برخی انواع که هم اینک پیاده‌سازی شده‌اند را پیش از کدنویسی در جاوا بررسی کردیم. در نهایت دیدیم که کتابخانه Spring Security با کلاس‌های رمزنگاری خاص خود، طیفی از تابع‌های هش کردن مختلف را در جاوا پشتیبانی می‌کند.

      منبع: فرادرس