{"id":1233,"date":"2023-05-20T15:27:52","date_gmt":"2023-05-20T07:27:52","guid":{"rendered":"https:\/\/www.nmking.io\/?p=1233"},"modified":"2023-05-20T15:28:18","modified_gmt":"2023-05-20T07:28:18","slug":"tensorflow%e7%89%88%e7%9a%84yolov4%e8%bd%89%e6%8f%9b%e6%95%99%e5%ad%b8","status":"publish","type":"post","link":"https:\/\/www.nmking.io\/index.php\/2023\/05\/20\/1233\/","title":{"rendered":"Tensorflow\u7248\u7684YOLOv4\u8f49\u63db\u6559\u5b78"},"content":{"rendered":"\n<p>YOLOv4\u662f\u76ee\u524d\u975e\u5e38\u53d7\u5230\u6b61\u8fce\u7684\u7269\u4ef6\u5075\u6e2c\u5de5\u5177\uff0c\u4ed6\u672c\u8eab\u5f8c\u7aef\u4f7f\u7528\u7684\u985e\u795e\u7d93\u6846\u67b6\u662fDarknet\uff08https:\/\/github.com\/pjreddie\/darknet\uff09\uff0c\u800c\u4eca\u5929\u5247\u662f\u8981\u628a\u4ed6\u8f49\u63db\u6210Tensorflow\u6846\u67b6\uff0c\u9019\u6a23\u505a\u6709\u4ec0\u9ebc\u597d\u8655\u5462\uff1f<\/p>\n\n\n\n<p>1. \u4e00\u822c\u6211\u5011\u5728\u5b78\u7fd2AI\u6f14\u7b97\u6cd5\u7684\u904e\u7a0b\uff0c\u591a\u6578\u5df2TF\u6846\u67b6\u70ba\u5165\u9580\uff0c\u800cDarknet\u4e00\u822c\u53ea\u7528\u4f86\u5be6\u505aYOLO\u8fa8\u8b58\uff0c\u5b78\u751f\u5728\u5b78\u7fd2\u4e0a\u5f88\u96e3\u5f9eTF\u5f88\u5ffd\u7136\u8df3\u5230Darknet\u4e0a\uff0c\u800c\u8f49\u63db\u5f8cTF\u8a9e\u6cd5\u90fd\u53ef\u4ee5\u4f7f\u7528\uff0c\u5b78\u7fd2\u4e0a\u6c92\u6709\u65b7\u5c64\u3002<\/p>\n\n\n\n<p>2.&nbsp;Darknet\u5728Windows\u4e0a\u7de8\u8b6fGPU\u7248\u672c\u592a\u904e\u7463\u788e\uff0c\u800c\u76f4\u63a5\u4f7f\u7528OpenCV\u7684DNN\u6a21\u578b\u5247\u7121\u6cd5\u4f5c\u5230GPU\u52a0\u901f\uff0c\u4f46\u8f49\u63db\u6210TF\u5f8c\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u539f\u672cTF GPU\u52a0\u901f\u7684\u8a2d\u5b9a\u3002\u7d93\u904e\u6e2c\u8a66\uff0c\u57281024&#215;768\u7684\u89e3\u6790\u5ea6\u4e0b\uff0cOpenCV\uff08\u975eCuda\u52a0\u901f\u7248\uff09FPS=0.2X\uff0c\u800cTF\u7248\u7684FPS\u53ef\u9054\u52302-5\uff0c\u5dee\u7570\u5927\u6982\u5341\u500d\u3002<\/p>\n\n\n\n<p>\u6211\u5011\u4f7f\u7528\u7684\u8f49\u63db\u5de5\u5177\u662ftf-yolov4\uff08https:\/\/github.com\/sicara\/tf2-yolov4\uff09\uff0c\u6839\u64da\u5b98\u65b9\u8aaa\u660e\uff0c\u76ee\u524d\u6c92\u6709Train\u529f\u80fd\uff0c\u53ea\u80fd\u505aInference\uff0c\u6240\u4ee5\u8a13\u7df4\u9084\u662f\u5f97\u5230Colab\uff08\u8aa4\uff09\u3002<\/p>\n\n\n\n<p>\u4ee5\u4e0b\u5c07\u904e\u7a0b\u7c21\u8981\u7684\u8aaa\u660e<\/p>\n\n\n\n<p>1. \u4f7f\u7528Anaconda\u5efa\u7acbPython3.9\u7684\u865b\u64ec\u74b0\u5883\uff1a\u7531\u65bc\u8f49\u63db\u904e\u7a0b\u63d0\u793a\u5efa\u8b70\u4f7f\u7528TF2.6\u4ee5\u4e0a\uff0c\u56e0\u6b64\u4ee5Python3.9 \u7248\u672c\u4f86\u5efa\u8b70\u865b\u64ec\u74b0\u5883\uff0c\u56e0\u70ba\u4f9d\u64da\u7d93\u9a57TF-GPU 2.6 \u642d\u914d\u7684\u662fPy39\uff0c\u6240\u4ee5\u624d\u9700\u8981\u5efa\u7acbPython3.9\u7684\u865b\u64ec\u74b0\u5883\u3002\u82e5\u60a8\u4e0d\u4f7f\u7528GPU\u52a0\u901f\uff0c\u5247\u4e0d\u9650\u5236Python3.9\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"523\" height=\"323\" src=\"https:\/\/i0.wp.com\/www.nmking.io\/wp-content\/uploads\/2023\/05\/image-8.png?resize=523%2C323&#038;ssl=1\" alt=\"\" class=\"wp-image-1234\" srcset=\"https:\/\/i0.wp.com\/www.nmking.io\/wp-content\/uploads\/2023\/05\/image-8.png?w=523&amp;ssl=1 523w, https:\/\/i0.wp.com\/www.nmking.io\/wp-content\/uploads\/2023\/05\/image-8.png?resize=300%2C185&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.nmking.io\/wp-content\/uploads\/2023\/05\/image-8.png?resize=200%2C124&amp;ssl=1 200w\" sizes=\"auto, (max-width: 523px) 100vw, 523px\" \/><\/figure>\n\n\n\n<p>2. \u958b\u555f\u547d\u4ee4\u8996\u7a97<\/p>\n\n\n\n<p>&nbsp; &nbsp; 2.1 \u5b89\u88ddTensorflow-gpu\uff1aconda install tensorflow-gpu==2.6<\/p>\n\n\n\n<p>&nbsp; &nbsp; 2.2&nbsp;\u5b89\u88dd\u8f49\u63db\u5de5\u5177\uff1apip install tf2-yolov4<\/p>\n\n\n\n<p>3. \u4e0b\u8f09YOLOv4\u6b0a\u91cd\u6a94\uff1ahttps:\/\/github.com\/AlexeyAB\/darknet\/releases\/download\/darknet_yolo_v3_optimal\/yolov4.weights\uff0c\u4e26\u653e\u7f6e\u5230\u8cc7\u6599\u593e\u5167\u3002<\/p>\n\n\n\n<p>4. \u57f7\u884c\u8f49\u63db\u547d\u4ee4\uff0c\u8acb\u6ce8\u610fyolov4.weights\u7684\u8def\u5f91\u662f\u5426\u6b63\u78ba\uff1aconvert-darknet-weights yolov4.weights -o yolov4.h5<\/p>\n\n\n\n<p>\u82e5\u8981\u8f49\u63db\u6210\u5176\u4ed6\u7a2e\u985e\u683c\u5f0f\uff0c\u4f8b\u5982tflite\u8acb\u53c3\u95b1\u4f5c\u8005\u7684<a href=\"https:\/\/github.com\/sicara\/tf2-yolov4\" rel=\"noreferrer noopener\" target=\"_blank\">github<\/a>\u8aaa\u660e<\/p>\n\n\n\n<p>5. \u5b8c\u6210\u5f8c\u5c31\u53ef\u4ee5\u5f97\u5230yolov4\u7684TF\u7684H5\u6b0a\u91cd\u6a94\uff1ayolov4.h5<\/p>\n\n\n\n<p>\u63a5\u4e0b\u4f86\u5c31\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u6211\u5beb\u597d\u7684\u7a0b\u5f0f\u4f86\u57f7\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import tensorflow as tf\nfrom tf2_yolov4.anchors import YOLOV4_ANCHORS #pip install tf2-yolov4\nfrom tf2_yolov4.model import YOLOv4\nimport time\nimport cv2 #\u5efa\u8b70\u4f7f\u75284.5.5\u7248\u672c\nprint(cv2.__version__)\n# \u9078\u64c7\u651d\u5f71\u6a5f\n# target=\"https:\/\/thbcctv01.thb.gov.tw\/T2D-11K+190\"\ncap = cv2.VideoCapture(0) #cap = cv2.VideoCapture(target) \u53ef\u4ee5\u89c0\u5bdf\u8def\u6cc1\n\nWIDTH, HEIGHT = (640, 480) #\u9078\u64c7\u8fa8\u8b58\u756b\u9762\u89e3\u6790\u5ea6\n\nmodel = YOLOv4(\n    input_shape=(HEIGHT, WIDTH, 3), #\u8f38\u5165\u5f71\u50cf\u898f\u683c\n    anchors=YOLOV4_ANCHORS,#\u4f7f\u7528YOLO\u8a2d\u5b9a\u7684\u9328\n    num_classes=80, #\u8fa8\u8b58\u7269\u4ef680\u7a2e    \n    yolo_max_boxes=50, #\u6700\u591a\u627e\u523050\u500b\n    yolo_iou_threshold=0.5, #iou\u9580\u6abb0.5\n    yolo_score_threshold=0.5, #\u4fe1\u4efb\u9580\u6abb0.5\n)\n \nmodel.load_weights('yolov4.h5') #\u8acb\u6ce8\u610f\u8def\u5f91\u662f\u5426\u6b63\u78ba\n#YOLOv4\u6240\u80fd\u8fa8\u8b58\u7684\u7269\u4ef6\u5217\u8868 \nCLASSES = &#91;\n    'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck',\n    'boat', 'traffic light', 'fire hydrant', 'stop sign', 'parking meter', 'bench',\n    'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra',\n    'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',\n    'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove',\n    'skateboard', 'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup', 'fork',\n    'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange', 'broccoli',\n    'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch', 'potted plant',\n    'bed', 'dining table', 'toilet', 'tv', 'laptop',  'mouse', 'remote', 'keyboard',\n    'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book',\n    'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush'\n]\n\nwhile cap.isOpened():#\u93e1\u982d\u80fd\u958b\u555f\u55ce\uff1f\n    stime=time.time()\n    ret, frame = cap.read()\n    frame = cv2.resize(frame,(WIDTH, HEIGHT))\n    \n    #\u5c07cv2\u5f71\u50cf\u8f49\u63db\u6210TF\u683c\u5f0f\n    image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)\n    image = tf.expand_dims(tf.convert_to_tensor(image, dtype=tf.float32) , axis=0) \/ 255\n\n\n    #\u9032\u884c\u7269\u4ef6\u5075\u6e2c\n    boxes, scores, classes, null = model.predict(image)\n    #boxes\u7269\u4ef6\u5728\u756b\u9762\u7684\u4f4d\u7f6e\n    boxes = boxes&#91;0] * &#91;WIDTH, HEIGHT, WIDTH, HEIGHT]\n    #scores\u7269\u4ef6\u7684\u4fe1\u8cf4\u7a0b\u5ea6\n    scores = scores&#91;0]\n    #\u7269\u4ef6\u7684\u540d\u7a31\n    classes = classes&#91;0].astype(int)\n\n    #\u4f9d\u5e8f\u8b80\u53d6\u5075\u6e2c\u5230\u7684\u7269\u4ef6\uff0c\u4e26\u756b\u51fa\u6846\u7dda\n    for (xmin, ymin, xmax, ymax), score, class_idx in zip(boxes, scores, classes):\n        if score &gt; 0.5: #\u8a2d\u5b9a\u4fe1\u4efb\u5ea6&gt;0.5\u624d\u6703\u986f\u793a\n            #\u756b\u51fa\u7269\u4ef6\u7bc4\u570d\n            cv2.rectangle(frame, (int(xmin), int(ymin)), (int(xmax), int(ymax)), (255, 178, 50), 3)\n            #\u5728\u7269\u4ef6\u7bc4\u570d\u5de6\u4e0a\u5beb\u51fa\u7269\u4ef6\u540d\u7a31+\u4fe1\u4efb\u5ea6\n            text = CLASSES&#91;class_idx] + ': {0:.2f}'.format(score)            \n            cv2.putText(frame, text,  (int(xmin), int(ymin)), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0,0,0), 2)\n    #\u8a08\u7b97fps\n    etime=time.time()\n    fps=round(1\/(etime-stime),2)\n    #\u5c07fps\u653e\u5230\u5716\u7247\u5de6\u4e0a\u89d2\n    cv2.putText(frame, str(fps),  (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0,0,0), 2)\n    #\u986f\u793a\u8fa8\u8b58\u7d50\u679c\n    cv2.imshow(\"YOLO\", frame)   \n    key=cv2.waitKey(1)#0=\u5f37\u5236\u7b49\u5f85\u30011:\u7b49\u50191ms\u5c31\u8df3\u904e  \u66f4\u65b0\u5f71\u50cf\n    if key &amp; 0xFF == ord('q'): #\u4f7f\u7528\u8005\u6309\u4e86\u9375\u76e4'q'\n        break\n\n# \u91cb\u653e\u651d\u5f71\u6a5f\ncap.release()\n\n# \u95dc\u9589\u6240\u6709 OpenCV \u8996\u7a97\ncv2.destroyAllWindows()<\/code><\/pre>\n\n\n\n<p>\u9019\u88e1\u505a\u4e00\u500b\u7c21\u55ae\u7684demo\uff0c\u4e0a\u5716\u70ba\u4f7f\u7528opencv\u76f4\u63a5\u8f09\u5165yolov4\uff0c\u800c\u4e0b\u5716\u5247\u70ba\u4f7f\u7528tf-gpu\u7684yolov4\uff0c\u53ef\u4ee5\u767c\u73fe\u5075\u6e2c\u6548\u679c\u57fa\u672c\u6c92\u5dee\u7570\uff0c\u4f46\u662ffps\u5247\u5dee\u4e86\u5feb10\u500d\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"461\" src=\"https:\/\/i0.wp.com\/www.nmking.io\/wp-content\/uploads\/2023\/05\/image-9.png?resize=600%2C461&#038;ssl=1\" alt=\"\" class=\"wp-image-1235\" srcset=\"https:\/\/i0.wp.com\/www.nmking.io\/wp-content\/uploads\/2023\/05\/image-9.png?w=600&amp;ssl=1 600w, https:\/\/i0.wp.com\/www.nmking.io\/wp-content\/uploads\/2023\/05\/image-9.png?resize=300%2C231&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.nmking.io\/wp-content\/uploads\/2023\/05\/image-9.png?resize=200%2C154&amp;ssl=1 200w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"469\" src=\"https:\/\/i0.wp.com\/www.nmking.io\/wp-content\/uploads\/2023\/05\/image-10.png?resize=600%2C469&#038;ssl=1\" alt=\"\" class=\"wp-image-1236\" srcset=\"https:\/\/i0.wp.com\/www.nmking.io\/wp-content\/uploads\/2023\/05\/image-10.png?w=600&amp;ssl=1 600w, https:\/\/i0.wp.com\/www.nmking.io\/wp-content\/uploads\/2023\/05\/image-10.png?resize=300%2C235&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.nmking.io\/wp-content\/uploads\/2023\/05\/image-10.png?resize=200%2C156&amp;ssl=1 200w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/figure>\n\n\n\n<p>\u672c\u6587\u4e3b\u8981\u53c3\u8003\uff1ahttps:\/\/lindevs.com\/yolov4-object-detection-using-tensorflow-2\/<\/p>\n","protected":false},"excerpt":{"rendered":"<p>YOLOv4\u662f\u76ee\u524d\u975e\u5e38\u53d7\u5230\u6b61\u8fce\u7684\u7269\u4ef6\u5075\u6e2c\u5de5\u5177\uff0c\u4ed6\u672c\u8eab\u5f8c\u7aef\u4f7f\u7528\u7684\u985e\u795e\u7d93\u6846\u67b6\u662fDarknet\uff08https:\/\/gi [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[5],"tags":[],"class_list":["post-1233","post","type-post","status-publish","format-standard","hentry","category-python"],"blocksy_meta":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.nmking.io\/index.php\/wp-json\/wp\/v2\/posts\/1233","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.nmking.io\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.nmking.io\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.nmking.io\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nmking.io\/index.php\/wp-json\/wp\/v2\/comments?post=1233"}],"version-history":[{"count":2,"href":"https:\/\/www.nmking.io\/index.php\/wp-json\/wp\/v2\/posts\/1233\/revisions"}],"predecessor-version":[{"id":1238,"href":"https:\/\/www.nmking.io\/index.php\/wp-json\/wp\/v2\/posts\/1233\/revisions\/1238"}],"wp:attachment":[{"href":"https:\/\/www.nmking.io\/index.php\/wp-json\/wp\/v2\/media?parent=1233"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.nmking.io\/index.php\/wp-json\/wp\/v2\/categories?post=1233"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.nmking.io\/index.php\/wp-json\/wp\/v2\/tags?post=1233"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}