├── Phone detection.ipynb ├── README.md └── video1.mp4 /Phone detection.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "cea1925f", 7 | "metadata": {}, 8 | "outputs": [], 9 | "source": [ 10 | "from ultralytics import YOLO\n", 11 | "# Burada kullanacağımız modeli seçiyoruz.\n", 12 | "model= YOLO(\"yolov8l.pt\") " 13 | ] 14 | }, 15 | { 16 | "cell_type": "code", 17 | "execution_count": 2, 18 | "id": "5b2a85d2", 19 | "metadata": {}, 20 | "outputs": [], 21 | "source": [ 22 | "# Gerekli kütüphaneleri dahil ediyoruz. \n", 23 | "import cv2\n", 24 | "import numpy as np\n", 25 | "from cvzone.HandTrackingModule import HandDetector" 26 | ] 27 | }, 28 | { 29 | "cell_type": "markdown", 30 | "id": "dfc9fbf7", 31 | "metadata": {}, 32 | "source": [ 33 | "Koda geçmeden önce buradaki mantığı anlatmak istiyorum." 34 | ] 35 | }, 36 | { 37 | "cell_type": "markdown", 38 | "id": "53749f31", 39 | "metadata": {}, 40 | "source": [ 41 | "Buradaki iki farklı model ile bir videodaki kişilerin konumu, telefonların konumu ve kişilerin ellerinin konumu tespit ediliyor. Ardından kişinin elindeki spesifik noktalar kullanılarak herhangi bir telefon ile kesişim içinde olup olmadığı tespit ediliyor. Eğer bir kesişim varsa bu kişinin hangi kişi olduğunu bulmak için el ile kesişen telefonun kişilerle kesişimine bakılıyor. Buna göre hangi kişide kesişim varsa o kişi telefon ile uğraşıyor diyoruz.\n", 42 | "\n", 43 | "Bu yöntemin her zaman olmasa da iki tane ufak sorunu var. Birincisi bazen kamera açısından dolayı telefon uğtaşan kişinin elinet gözükmüyor. Diğeri ise bazen kişiler birbirine çok yakın ise bulduğumuz kesişim noktası başka bir kişi ile daha kesişebiliyor." 44 | ] 45 | }, 46 | { 47 | "cell_type": "code", 48 | "execution_count": 6, 49 | "id": "d3fea3e9", 50 | "metadata": {}, 51 | "outputs": [], 52 | "source": [ 53 | "kamera= cv2.VideoCapture('video1.mp4')\n", 54 | "font = cv2.FONT_HERSHEY_SIMPLEX\n", 55 | "\n", 56 | "# El tespitinde kullanacağımız modeli tanımlıyoruz\n", 57 | "detector=HandDetector(maxHands=5)\n", 58 | "\n", 59 | "while True:\n", 60 | "\n", 61 | "\n", 62 | " \n", 63 | " \n", 64 | " ret,kare=kamera.read()\n", 65 | " if not ret:\n", 66 | " break\n", 67 | " # videoda bulunan insanların konumunu tutan liste\n", 68 | " person_list=[]\n", 69 | " \n", 70 | " # videoda bulunan telefonların konumunu tutan liste\n", 71 | " phone_list=[]\n", 72 | " \n", 73 | " # Resmi RGB formata çevirip nesne nesne tespit modeline veriyoruz.\n", 74 | " imgs=cv2.cvtColor(kare,cv2.COLOR_BGR2RGB)\n", 75 | " results = model(imgs,verbose=False) \n", 76 | " labels=results[0].names\n", 77 | " \n", 78 | " \n", 79 | " for i in range(len(results[0].boxes)):\n", 80 | " x1,y1,x2,y2=results[0].boxes.xyxy[i]\n", 81 | " score=results[0].boxes.conf[i]\n", 82 | " label=results[0].boxes.cls[i]\n", 83 | " x1,y1,x2,y2,score,label=int(x1),int(y1),int(x2),int(y2),float(score),int(label)\n", 84 | " name=labels[label]\n", 85 | " \n", 86 | " # %50'nin altında bulunan nesneleri göz ardı ediyoruz.\n", 87 | " if score<0.5:\n", 88 | " continue\n", 89 | " # Eğer nesne insan ise bu nesnenin konumunu gerekli listenin içine ekliyoruz.\n", 90 | " if name=='person':\n", 91 | " \n", 92 | " person_list.append((x1,y1,x2,y2))\n", 93 | " \n", 94 | " # Aynısını telefon için yapıyoruz.\n", 95 | " if name=='cell phone':\n", 96 | " \n", 97 | " phone_list.append((x1,y1,x2,y2)) \n", 98 | " \n", 99 | " \n", 100 | "\n", 101 | " # Burada videodaki karenin kopyası oluşturuluyor.\n", 102 | " # Bunun sebebi el tespitinde yapılan işlemler orijinal görseli etkilemesin diye\n", 103 | " copy=kare.copy() \n", 104 | " \n", 105 | " # Burada kopya görseli el tespit modeline veriyoruz.\n", 106 | " hands,copy=detector.findHands(copy,flipType=False)\n", 107 | " \n", 108 | " # Resimdeki el ile kesişen telefonların orta noktaların konumunu bununla tutuyoruz\n", 109 | " hand_list=[]\n", 110 | " \n", 111 | " # Burada her bir telefon için resimde bir bölge oluşturacağız.\n", 112 | " for phone in phone_list:\n", 113 | " (x21,y21,x22,y22)=phone\n", 114 | " region1=np.array([(x21,y21),(x22,y21),(x22,y22),(x21,y22)])\n", 115 | " \n", 116 | " region1 = region1.reshape((-1,1,2))\n", 117 | " \n", 118 | " # Burada her bir el için eldeki tüm noktalara bakacağız.\n", 119 | " for hand in hands:\n", 120 | " # 21 deme sebebimiz elde 21 adet nokta bulunması\n", 121 | " for j in range(21):\n", 122 | " # Her bir konumu sırayla alıyoruz.\n", 123 | " x,y,z=hand['lmList'][j]\n", 124 | " # Her bir nokta için bu noktanın telefonun olduğu bölgenin içinde olup olmadığına bakıyoruz.\n", 125 | " inside_region1=cv2.pointPolygonTest(region1,(x,y),False)\n", 126 | " # Eğer elin bir noktası telefonun olduğu bölgenin içinde ise o telefonun orta noktasını uygun listeye ekliyoruz \n", 127 | " if inside_region1>0:\n", 128 | " cx=int(x21/2+x22/2)\n", 129 | " cy=int(y21/2+y22/2)\n", 130 | " hand_list.append((cx,cy))\n", 131 | " \n", 132 | " # Burada ise her görseldeki her bir kişi için bir bölge oluşturup \n", 133 | " # el ile kesişen telefonun orta noktası var mı diye bakıyoruz. \n", 134 | " # Eğer var ise control değişkenini true yapıyoruz.\n", 135 | " for person in person_list:\n", 136 | " control=False\n", 137 | " (x21,y21,x22,y22)=person\n", 138 | " region1=np.array([(x21,y21),(x22,y21),(x22,y22),(x21,y22)])\n", 139 | " \n", 140 | " region1 = region1.reshape((-1,1,2))\n", 141 | " \n", 142 | " for hand in hand_list:\n", 143 | " (x,y)=hand\n", 144 | " inside_region1=cv2.pointPolygonTest(region1,(x,y),False)\n", 145 | " if inside_region1>0:\n", 146 | " control=True\n", 147 | " \n", 148 | " # Eğer bu kişi telefon ile uğraşıyorsa kare içine alınıp aşağıdaki yazı yazılıyor.\n", 149 | " if control:\n", 150 | " cv2.rectangle(kare,(x21,y21),(x22,y22),(102,0,153),5)\n", 151 | " cv2.putText(kare, 'Phone Detected',(x21, y21-20), font, 2, (255,0,0), 2)\n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | "\n", 158 | " \n", 159 | " \n", 160 | " cv2.imshow(\"kamera\",kare)\n", 161 | " \n", 162 | " if cv2.waitKey(1) & 0xFF == ord('q'):\n", 163 | " break\n", 164 | "kamera.release()\n", 165 | "cv2.destroyAllWindows()" 166 | ] 167 | } 168 | ], 169 | "metadata": { 170 | "kernelspec": { 171 | "display_name": "Python 3 (ipykernel)", 172 | "language": "python", 173 | "name": "python3" 174 | }, 175 | "language_info": { 176 | "codemirror_mode": { 177 | "name": "ipython", 178 | "version": 3 179 | }, 180 | "file_extension": ".py", 181 | "mimetype": "text/x-python", 182 | "name": "python", 183 | "nbconvert_exporter": "python", 184 | "pygments_lexer": "ipython3", 185 | "version": "3.9.13" 186 | } 187 | }, 188 | "nbformat": 4, 189 | "nbformat_minor": 5 190 | } 191 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Person-Using-Phone-Detection -------------------------------------------------------------------------------- /video1.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Deepandreinforcement/Person-Using-Phone-Detection/1d9296ca4e74bc743452125cf61fb78aa22547af/video1.mp4 --------------------------------------------------------------------------------