Helo, semua.
Hari ini saya akan berkongsi dengan anda projek pengecaman merokok + pengecaman muka. Banyak tempat awam, tapak pengeluaran dan sekolah mempunyai larangan merokok. Ia masih perlu untuk melaksanakan larangan merokok dan membiarkan AI secara automatik mengenal pasti tingkah laku merokok dan mengenal pasti siapa yang merokok.
Gunakan algoritma pengesanan sasaran untuk menentukan tingkah laku merokok, mengekstrak muka perokok dan menggunakan algoritma pengecaman muka untuk menentukan siapa yang merokok. Idea ini agak mudah, tetapi butirannya masih sedikit menyusahkan.
Data latihan dan kod sumber yang digunakan dalam projek telah dibungkus. Masih sama seperti dulu, dapatkan di ruangan komen.
Saya menggunakan 5k data berlabel merokok sebagai data latihan
dan meletakkannya dalam direktori set data.
Latih model pengesanan sasaran YOLOv5.
Langkah pertama, salin data/coco128.yaml ke smoke.yaml, dan ubah suai direktori set data dan maklumat konfigurasi kategori
path: ../dataset/smoke # dataset root dir train: images/train# train images (relative to 'path') 128 images val: images/test# val images (relative to 'path') 128 images test:# test images (optional) # Classes names: 0: smoke
Langkah kedua, salin ./models/yolov5s ialah smoke.yaml, ubah suai nc
nc: 1# number of classes
Langkah ketiga ialah memuat turun model pra-latihan yolov5s.pt dan letakkannya dalam direktori {yolov5}/weights
Laksanakan arahan berikut , latihan sudah cukup
python ./train.py --data ./data/smoke.yaml --cfg ./models/smoke.yaml --weights ./weights/yolov5s.pt --batch-size 30 --epochs 120 --workers 8 --name smoke --project smoke_s
Selepas latihan selesai, anda boleh melihat output berikut:
Telefon pun boleh.
Selepas latihan selesai, kedudukan terbaik.pt boleh didapati dan digunakan kemudian untuk pengesanan rokok.
model = torch.hub.load('../28_people_counting/yolov5', 'custom', './weights/ciga.pt', source='local') results = self.model(img[:, :, ::-1]) pd = results.pandas().xyxy[0] ciga_pd = pd[pd['class'] == 0]
Selepas dapat mengenal pasti rokok, kita masih perlu menentukan sama ada kita sedang merokok.
Anda boleh menggunakan bingkai pengesan rokok dan bingkai pengesanan mulut untuk mengira IOU untuk menilai secara terus terang, ia adalah untuk menentukan sama ada kedua-dua bingkai itu bersilang merokok.
Bingkai pengesan mulut, menggunakan mata kunci muka untuk mengenal pasti.
Terdapat banyak model matang untuk algoritma pengecaman muka Kami tidak perlu melatihnya sendiri, kami hanya boleh memindahkan pangkalan data secara langsung.
Saya menggunakan perpustakaan dlib di sini, yang boleh mengenal pasti 68 perkara utama pada wajah dan mengekstrak ciri muka berdasarkan 68 perkara utama ini.
face_detector = dlib.get_frontal_face_detector() face_sp = dlib.shape_predictor('./weights/shape_predictor_68_face_landmarks.dat') dets = face_detector(img, 1) face_list = [] for face in dets: l, t, r, b = face.left(), face.top(), face.right(), face.bottom() face_shape = face_sp(img, face)
pengesan_muka boleh mengesan muka dan mengembalikan bingkai pengesanan muka face_sp berdasarkan bingkai pengesanan muka dan mengenal pasti 68 titik utama muka.
Daripada 68 perkara utama ini, kami boleh mendapatkan bingkai pengesan mulut untuk menentukan sama ada anda merokok.
Akhir sekali, kami masih berharap untuk menggunakan algoritma pengecaman muka untuk mengenal pasti siapa yang merokok.
Langkah pertama ialah mengekstrak ciri muka
face_feature_model = dlib.face_recognition_model_v1('./weights/dlib_face_recognition_resnet_model_v1.dat') face_descriptor = face_feature_model.compute_face_descriptor(img, face_shape)
face_descriptorKira vektor ciri untuk setiap muka berdasarkan kedudukan dan jarak antara 68 titik utama muka. Prinsip ini serupa dengan word2vec yang kami kongsi sebelum ini atau memetakan video ke vektor N-dimensi.
Langkah kedua ialah memasukkan muka sedia ada ke dalam pangkalan data wajah. Saya menyediakan 3 tingkah laku merokok dalam filem dan siri TV
Potong wajah daripada video, vektorkannya dan tuliskannya ke dalam pangkalan data wajah (digantikan dengan fail)
Langkah ketiga, selepas merokok berlaku, kita boleh memotong muka perokok, mengira vektor muka, membandingkannya dengan ciri pangkalan data muka, dan mencari wajah Serupa yang terbaik, kembalikan nama yang sepadan
def find_face_name(self, face_feat): """ 人脸识别,计算吸烟者名称 :param face_feat: :return: """ cur_face_feature = np.asarray(face_feat, dtype=np.float64).reshape((1, -1)) # 计算两个向量(两张脸)余弦相似度 distances = np.linalg.norm((cur_face_feature - self.face_feats), axis=1) min_dist_index = np.argmin(distances) min_dist = distances[min_dist_index] if min_dist < 0.3: return self.face_name_list[min_dist_index] else: return '未知'
Terdapat banyak kawasan untuk pengembangan projek ini, contohnya: video yang saya sediakan hanya mempunyai satu muka, dan pemantauan sebenar mesti ada berbilang muka di dalamnya. Pada masa ini, anda boleh menggunakan algoritma MOT untuk menjejaki pejalan kaki, dan kemudian mengenal pasti setiap orang secara individu untuk merokok
Selain itu, anda boleh mencipta kawasan statistik yang berasingan untuk menyimpan tingkah laku merokok yang dikenal pasti dan menggunakannya sebagai bukti untuk amaran dan penalti.
Atas ialah kandungan terperinci AI larangan merokok tidak mengapa! Pengecaman merokok + pengecaman muka. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!