در این مطلب، ویدئو تشخیص واقعی شی با استفاده از OpenCV Python ON CPU | آموزش تشخیص شی OpenCV با زیرنویس فارسی را برای دانلود قرار داده ام. شما میتوانید با پرداخت 15 هزار تومان ، این ویدیو به علاوه تمامی فیلم های سایت را دانلود کنید.اکثر فیلم های سایت به زبان انگلیسی می باشند. این ویدئو دارای زیرنویس فارسی ترجمه شده توسط هوش مصنوعی می باشد که میتوانید نمونه ای از آن را در قسمت پایانی این مطلب مشاهده کنید.
مدت زمان فیلم: 00:17:11
تصاویر این ویدئو:
قسمتی از زیرنویس این فیلم:
00:00:00,240 –> 00:00:01,680
سلام به همه و خوش آمدید به
2
00:00:01,680 –> 00:00:04,160
کانال در یکی از آموزش های ما، ما
3
00:00:04,160 –> 00:00:06,399
با yolo v4 با استفاده از opencv تشخیص اشیا را انجام دادیم،
4
00:00:06,399 –> 00:00:07,759
5
00:00:07,759 –> 00:00:10,160
اما نیاز به داشتن gpu برای
6
00:00:10,160 –> 00:00:12,799
فریم بر ثانیه مناسب دارد و فقط دو تا سه
7
00:00:12,799 –> 00:00:15,440
فریم در ثانیه را در cpu در ویدیوی امروز به
8
00:00:15,440 –> 00:00:17,359
ما می دهد که سعی خواهیم کرد برای پیادهسازی
9
00:00:17,359 –> 00:00:20,240
تشخیص شی بلادرنگ با استفاده از opencv در cpu،
10
00:00:20,240 –> 00:00:22,000
اجازه دهید ابتدا شروع کنیم،
11
00:00:22,000 –> 00:00:23,680
باید آخرین
12
00:00:23,680 –> 00:00:26,560
نسخههای opencv و opencv contrib را
13
00:00:26,560 –> 00:00:28,960
با استفاده از دستور pip نصب کنید، من قبلاً آنها را
14
00:00:28,960 –> 00:00:31,039
نصب کردهام، همانطور که میبینید
15
00:00:31,039 –> 00:00:33,440
من در اینجا دو پوشه دارم که دادههای underscore را در اینجا مشاهده میکنم.
16
00:00:33,440 –> 00:00:35,760
مدل آموزش دیده ای
17
00:00:35,760 –> 00:00:37,840
که در اسناد رسمی opencv موجود است،
18
00:00:37,840 –> 00:00:39,120
19
00:00:39,120 –> 00:00:41,760
من همچنین این لیست از برچسب های کلاس را دارم
20
00:00:41,760 –> 00:00:43,600
که مدل بر روی آنها آموزش داده شده است،
21
00:00:43,600 –> 00:00:46,399
این لیست استاندارد برای مجموعه داده کوکو است
22
00:00:46,399 –> 00:00:48,320
که می توانید در مخزن رسمی github آنها پیدا
23
00:00:48,320 –> 00:00:50,719
کنید، من
24
00:00:50,719 –> 00:00:52,719
همه چیز را در این مخزن github آپلود کرده ام که می
25
00:00:52,719 –> 00:00:54,879
توانید
26
00:00:54,879 –> 00:00:57,360
دانلود برمیگرده به کد ویژوال استودیو من
27
00:00:57,360 –> 00:00:59,440
هم این دو ویدیو را دارم که
28
00:00:59,440 –> 00:01:02,160
برای تشخیص واقعی اشیا از آنها استفاده خواهیم کرد
29
00:01:02,160 –> 00:01:03,600
خوب
30
00:01:03,600 –> 00:01:06,960
اجازه دهید tw ایجاد کنیم o فایلهای detector.pi و
31
00:01:06,960 –> 00:01:08,479
32
00:01:08,479 –> 00:01:12,400
main.pi با وارد کردن ماژولهای cv2 numpy
33
00:01:12,400 –> 00:01:14,799
و time شروع
34
00:01:14,799 –> 00:01:17,119
میکنیم و اکنون کلاس تشخیص شی
35
00:01:17,119 –> 00:01:19,680
به نام
36
00:01:19,680 –> 00:01:21,680
آشکارساز را پیادهسازی میکنیم، سازنده کلاس
37
00:01:21,680 –> 00:01:23,680
چهار آرگومان
38
00:01:23,680 –> 00:01:26,479
مسیر پیکربندی مسیر ویدیویی را انتخاب میکند، مسیر مدل وزنها
39
00:01:26,479 –> 00:01:29,360
و مسیر برچسبهای کلاس را
40
00:01:29,360 –> 00:01:32,079
که باید انجام دهیم. این آرگومانها را به
41
00:01:32,079 –> 00:01:34,479
متغیرهای کل کلاس اختصاص دهید که با خود شروع میشوند.
42
00:01:34,479 –> 00:01:35,600
43
00:01:35,600 –> 00:01:37,759
این متغیرها در
44
00:01:37,759 –> 00:01:40,079
تمام روشهایی که
45
00:01:40,079 –> 00:01:42,159
در این کلاس پیادهسازی
46
00:01:42,159 –> 00:01:44,799
خواهیم کرد در دسترس خواهند بود، حالا شبکه را مقداردهی اولیه میکنیم و
47
00:01:44,799 –> 00:01:46,479
برخی پارامترها را تنظیم
48
00:01:46,479 –> 00:01:49,439
میکنیم،
49
00:01:49,439 –> 00:01:51,759
مدل تشخیص زیرخط
50
00:01:51,759 –> 00:01:54,720
و مدل پاس را راهاندازی میکنیم. مسیر و مسیر پیکربندی
51
00:01:54,720 –> 00:01:57,520
به عنوان پارامترهای شبکه به
52
00:01:57,520 –> 00:02:01,280
صورت self.net مقداردهی اولیه می شود و سپس
53
00:02:01,280 –> 00:02:03,280
باید اندازه تصویری را که مدل بر روی
54
00:02:03,280 –> 00:02:04,719
آن آموزش داده شده است
55
00:02:04,719 –> 00:02:08,080
که 320 کراس 320 است، ارسال کنیم.
56
00:02:08,080 –> 00:02:10,239
همه تصاویر بین
57
00:02:10,239 –> 00:02:12,319
1- و 1
58
00:02:12,319 –> 00:02:14,879
و در برابر هر کانال مقیاس بندی می شوند. مقدار میانگین
59
00:02:14,879 –> 00:02:17,480
کم می شود که
60
00:02:17,480 –> 00:02:21,040
در هر سه کانال روی 127.5 تنظیم می شود
61
00:02:21,040 –> 00:02:24,480
زیرا opencv تصاویر را با فرمت bgr بارگیری می کند و
62
00:02:24,480 –> 00:02:26,959
باید کانال های r و b را به m تغییر دهیم. ake it
63
00:02:26,959 –> 00:02:28,560
rgb
64
00:02:28,560 –> 00:02:30,959
همه این پارامترها و تنظیمات
65
00:02:30,959 –> 00:02:32,800
در اسناد رسمی opencv موجود هستند،
66
00:02:32,800 –> 00:02:34,080
67
00:02:34,080 –> 00:02:36,640
بنابراین مدل ما تنظیم شده است،
68
00:02:36,640 –> 00:02:38,640
اکنون باید لیست برچسب کلاس را
69
00:02:38,640 –> 00:02:41,840
از coco.names بخوانیم تا
70
00:02:41,840 –> 00:02:45,440
روش دیگری به نام کلاس های خواندن تعریف کنیم
71
00:02:45,440 –> 00:02:47,760
سپس می توانیم باز کنیم. مسیر کلاس
72
00:02:47,760 –> 00:02:50,720
را ذخیره کنید و تمام ورودی های فایل را به عنوان
73
00:02:50,720 –> 00:02:53,920
یک لیست در داخل متغیری به نام
74
00:02:53,920 –> 00:02:55,840
لیست کلاس های
75
00:02:55,840 –> 00:02:58,480
self dot ذخیره کنید، بیایید لیست کلاس های خود نقطه را چاپ کنیم تا
76
00:02:58,480 –> 00:03:00,480
مطمئن شویم که
77
00:03:00,480 –> 00:03:01,840
78
00:03:01,840 –> 00:03:04,319
فایل را به درستی بارگذاری
79
00:03:04,319 –> 00:03:08,480
کرده ایم.
80
00:03:09,920 –> 00:03:12,480
حالا به فایل اصلی برگردید و بیایید
81
00:03:12,480 –> 00:03:15,760
همه چیز را از detector.pi وارد کنیم
82
00:03:15,760 –> 00:03:18,800
و همچنین ماژول os را وارد
83
00:03:18,800 –> 00:03:21,360
کنیم، بیایید تابع اصلی را تعریف کنیم و یک
84
00:03:21,360 –> 00:03:24,799
مسیر ویدیویی متغیر را اعلام کنیم که در آن میتوانیم
85
00:03:24,799 –> 00:03:26,640
به یکی از ویدیوهایی که داریم مسیر
86
00:03:26,640 –> 00:03:27,760
87
00:03:27,760 –> 00:03:29,760
بعدی را بدهیم. باید مسیر پیکربندی را تعریف کنیم
88
00:03:29,760 –> 00:03:31,440
89
00:03:31,440 –> 00:03:33,920
که این فایل pbtxt است
90
00:03:33,920 –> 00:03:38,159
که اجازه دهید از os.path dot join استفاده
91
00:03:38,159 –> 00:03:39,840
کنیم تا مسیر فایل به
92
00:03:39,840 –> 00:03:43,120
طور خودکار توسط ماژول os استنتاج شود
93
00:03:43,120 –> 00:03:45,519
زیرا مسیر متفاوت استنباط می شود. ly در
94
00:03:45,519 –> 00:03:48,319
ویندوز و لینوکس و opencv گاهی اوقات
95
00:03:48,319 –> 00:03:50,720
هنگام بارگذاری مدل خطا را برمیگرداند، اگر
96
00:03:50,720 –> 00:03:52,720
مسیر را سخت کدنویسی کنیم
97
00:03:52,720 –> 00:03:54,239
، پوشه حاوی
98
00:03:54,239 –> 00:03:56,720
مسیر پیکربندی به عنوان
99
00:03:56,720 –> 00:03:59,200
آرگومان اول و نام فایل پیکربندی
100
00:03:59,200 –> 00:04:01,280
به عنوان آرگومان دوم داده میشود، به
101
00:04:01,280 –> 00:04:04,560
طور مشابه، مسیر مدل را تعریف میکنیم که ثابت است.
102
00:04:04,560 –> 00:04:06,879
استنتاج زیر خط نمودار زیر خط
103
00:04:06,879 –> 00:04:08,480
نقطه pb
104
00:04:08,480 –> 00:04:10,640
و در نهایت مسیر لیست برچسبهای کلاس
105
00:04:10,640 –> 00:04:11,519
106
00:04:11,519 –> 00:04:14,560
که نامهای کوکو در داخل دادههای زیرخط مدل است در
107
00:04:14,560 –> 00:04:16,079
108
00:04:16,079 –> 00:04:18,160
حال حاضر باید کلاس آشکارساز خود را مقداردهی اولیه کنیم
109
00:04:18,160 –> 00:04:20,320
که این
110
00:04:20,320 –> 00:04:21,918
چهار پارامتر را میگیرد و
111
00:04:21,918 –> 00:04:24,240
میتوانیم به سرعت آنها را از
112
00:04:24,240 –> 00:04:26,639
پیادهسازی کلاس کپی کنیم. در اینجا پیست کنید زیرا
113
00:04:26,639 –> 00:04:30,720
نام متغیرها دقیقاً یکسان است،
114
00:04:31,840 –> 00:04:34,160
اکنون تابع main را فراخوانی می کنیم و
115
00:04:34,160 –> 00:04:35,600
کد را اجرا
116
00:04:35,600 –> 00:04:37,520
می کنیم و می بینیم که لیبل های شیشه
117
00:04:37,520 –> 00:04:39,680
بارگذاری و چاپ شده اند اما یک مشکل وجود دارد که
118
00:04:39,680 –> 00:04:40,720
119
00:04:40,720 –> 00:04:44,400
شاخص 0 دارای کلاس شخص است اما
120
00:04:44,400 –> 00:04:47,440
مدل 0 را به عنوان پس زمینه پیش بینی می کند.
121
00:04:47,440 –> 00:04:50,639
با اضافه کردن یک ورودی در فهرست 0 از
122
00:04:50,639 –> 00:04:52,400
لیست کلاس، آن را برطرف کنید
123
00:04:52,400 –> 00:04:54,320
و ما آن را زیرخط
124
00:04:54,320 –> 00:04:56,320
زیرخط پس زمینه زیرخط
125
00:04:56,320 –> 00:04:57,520
unde بنامیم.
126
00:04:57,520 –> 00:05:00,000
حالا rscore اگر کد اصلی را اجرا کنیم، میتوانیم ببینیم
127
00:05:00,000 –> 00:05:03,120
که کلاس پسزمینه در شاخص 0 است.
128
00:05:03,120 –> 00:05:04,800
حالا نگاشت پیشبینیهای مدل
129
00:05:04,800 –> 00:05:08,800
به خوبی با لیست کلاسهای ما کار میکند،
130
00:05:08,800 –> 00:05:11,360
اجازه دهید به آشکارساز نقطه pi برگردیم و
131
00:05:11,360 –> 00:05:14,639
روش دیگری به نام ویدیو
132
00:05:14,639 –> 00:05:17,680
را تعریف کنیم. ویدیو را از طریق cv2 dot
133
00:05:17,680 –> 00:05:21,039
capture باز کنید و مسیر ویدیوی self dot
134
00:05:21,039 –> 00:05:23,600
را به عنوان پارامتر عبور دهید
135
00:05:23,600 –> 00:05:26,160
اگر ویدیو با موفقیت باز نشد
136
00:05:26,160 –> 00:05:28,479
می توانیم خطا چاپ کنیم و از
137
00:05:28,479 –> 00:05:29,440
تابع
138
00:05:29,440 –> 00:05:31,600
برگردیم در غیر این صورت
139
00:05:31,600 –> 00:05:34,240
با فراخوانی روش cap dot read اولین فریم از ویدیو را می
140
00:05:34,240 –> 00:05:36,240
خوانیم.
141
00:05:36,240 –> 00:05:38,080
با ذخیره کردن فریم در متغیری
142
00:05:38,080 –> 00:05:39,440
به نام تصویر
143
00:05:39,440 –> 00:05:42,160
و همچنین در صورت موفقیتآمیز بودن عکسبرداری، یک پرچم را برمیگرداند،
144
00:05:42,160 –> 00:05:44,479
145
00:05:44,479 –> 00:05:47,440
تا زمانی
146
00:05:47,440 –> 00:05:50,720
که فریم با موفقیت گرفته شد،
147
00:05:50,720 –> 00:05:52,560
باید یک حلقه while اجرا کنیم، اکنون باید این تصویر گرفته شده
148
00:05:52,560 –> 00:05:55,039
را به شبکه خود ارائه دهیم و سپس اطمینان را تعریف کنیم.
149
00:05:55,039 –> 00:05:57,039
آستانه تشخیص
150
00:05:57,039 –> 00:06:00,080
که روی 0.5 تنظیم شده است،
151
00:06:00,080 –> 00:06:02,240
این روش مجموعه ای از
152
00:06:02,240 –> 00:06:05,280
شناسه های سطح کلاس امتیازات اطمینان آنها
153
00:06:05,280 –> 00:06:08,240
و کادرهای محدود موجود در تصویر را برمی گرداند،
154
00:06:08,240 –> 00:06:10,720
اجازه دهید مرزبندی را تبدیل کنیم. جعبه و
155
00:06:10,720 –> 00:06:13,919
اطمینان به یک
156
00:06:13,919 –> 00:06:15,919
لیست همچنین باید
157
00:06:15,919 –> 00:06:19,039
با فراخوانی
158
00:06:19,039 –> 00:06:22,639
جعبههای نقطهای cv2.dnn یک حذف غیر حداکثری از جعبههای محدودکننده انجام دهیم، بنابراین این روش
159
00:06:22,639 –> 00:06:25,120
اساساً تمام کادرهای محدودکننده همپوشانی را حذف میکند
160
00:06:25,120 –> 00:06:28,560
و آستانه
161
00:06:28,560 –> 00:06:31,360
همپوشانی در آستانه زیر خط nms تنظیم میشود.
162
00:06:31,360 –> 00:06:33,919
بنابراین ایندکس
163
00:06:33,919 –> 00:06:36,319
های کادرهای مرزی را که
164
00:06:36,319 –> 00:06:38,960
زیر آن آستانه همپوشانی دارند برمی گرداند،
165
00:06:38,960 –> 00:06:40,720
من در پایان به شما نشان خواهم داد که منظورم چیست و
166
00:06:40,720 –> 00:06:41,840
167
00:06:41,840 –> 00:06:43,840
اجازه دهید فقط این را ببندم تا بتوانیم
168
00:06:43,840 –> 00:06:46,639
169
00:06:46,840 –> 00:06:49,120
کد کامل را
170
00:06:49,120 –> 00:06:52,080
در حال حاضر ببینیم، باید ببینیم که آیا طول
171
00:06:52,080 –> 00:06:55,039
کادرهای کراندار غیر همپوشانی صفر نیست،
172
00:06:55,039 –> 00:06:57,680
سپس به رسم
173
00:06:57,680 –> 00:07:00,000
کادرهای محدودکننده روی تصویر ادامه میدهیم،
174
00:07:00,000 –> 00:07:03,199
بیایید یک حلقه برای همه
175
00:07:03,199 –> 00:07:05,199
جعبههای مرزی
176
00:07:05,199 –> 00:07:07,039
غیرهمپوشانی اجرا کنیم و کادر محدودکننده را از فهرست اصلی استخراج کنیم،
177
00:07:07,039 –> 00:07:09,919
اما در شاخصی که
178
00:07:09,919 –> 00:07:12,400
توسط تابع nms
179
00:07:12,400 –> 00:07:14,319
یک آرایه خواهد بود، بنابراین بیایید آن را
180
00:07:14,319 –> 00:07:16,960
فشار دهیم تا عدد صحیح را به دست آوریم
181
00:07:16,960 –> 00:07:19,599
با اطمینان کلاس مطابقت دارد و
182
00:07:19,599 –> 00:07:21,440
میتوانیم آن را در برابر شاخص جعبه مرزی
183
00:07:21,440 –> 00:07:23,520
از لیست اصلی
184
00:07:23,520 –> 00:07:25,199
confide استخراج کنیم.
185
00:07:25,199 –> 00:07:27,280
nces اکنون باید شناسه سطح کلاس را
186
00:07:27,280 –> 00:07:30,080
از لیست اصلی شناسههای کلاس
187
00:07:30,080 –> 00:07:32,319
در مقابل نمایه جعبه مرزی
188
00:07:32,319 –> 00:07:34,560
189
00:07:34,560 –> 00:07:36,960
190
00:07:36,960 –> 00:07:39,680
استخراج کنیم. ID سطح کلاس یک عدد صحیح است که نمایانگر شاخص کلاس است و میتوانیم برچسب متنی را در برابر این شاخص
191
00:07:39,680 –> 00:07:42,080
از لیست کلاسها استخراج
192
00:07:42,080 –> 00:07:44,479
کنیم. جعبه مرزی برای
193
00:07:44,479 –> 00:07:47,520
بدست آوردن مختصات x و y و
194
00:07:47,520 –> 00:07:49,360
همچنی