Create your own object detection using ImageAI
ImageAI
Published in
5 min readMar 9, 2020
อ่าน post นี้ก่อน
การสร้าง Object Detection ด้วยข้อมูลที่สร้างขึ้นเอง
ตัวอย่างนี้ได้ทดสอบกับข้อมูล Hololens ซึ่งสามารถดาวน์โหลดโดยใช้คำสั่ง wget ดังตัวอย่างต่อไปนี้
!wget https://github.com/OlafenwaMoses/ImageAI/releases/download/essential-v4/hololens.zip
--2019-12-25 02:26:15-- https://github.com/OlafenwaMoses/ImageAI/releases/download/essential-v4/hololens.zip
Resolving github.com (github.com)... 140.82.118.3
Connecting to github.com (github.com)|140.82.118.3|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://github-production-release-asset-2e65be.s3.amazonaws.com/125932201/cd011f80-b2ad-11e9-9fa9-b04b13c50ea3?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20191225%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20191225T022615Z&X-Amz-Expires=300&X-Amz-Signature=64cb2e584ef9393496219d6d80564cfd7c011c86bc73b60501aea5ffbb18478d&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Dhololens.zip&response-content-type=application%2Foctet-stream [following]
--2019-12-25 02:26:15-- https://github-production-release-asset-2e65be.s3.amazonaws.com/125932201/cd011f80-b2ad-11e9-9fa9-b04b13c50ea3?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20191225%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20191225T022615Z&X-Amz-Expires=300&X-Amz-Signature=64cb2e584ef9393496219d6d80564cfd7c011c86bc73b60501aea5ffbb18478d&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Dhololens.zip&response-content-type=application%2Foctet-stream
Resolving github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)... 52.216.130.163
Connecting to github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)|52.216.130.163|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2348959 (2.2M) [application/octet-stream]
Saving to: ‘hololens.zip.1’
hololens.zip.1 100%[===================>] 2.24M 3.74MB/s in 0.6s
2019-12-25 02:26:16 (3.74 MB/s) - ‘hololens.zip.1’ saved [2348959/2348959]
- เมื่อโหลดไฟล์ hololens.zip เสร็จเรียบร้อยให้ unzip ไฟล์ ด้วยคำสั่งดังต่อไปนี้
!unzip hololens.zip
Archive: hololens.zip
replace hololens/hololens_test.pkl? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
inflating: hololens/hololens_test.pkl
replace hololens/hololens_train.pkl? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
inflating: hololens/hololens_train.pkl
replace hololens/train/annotations/image (1).xml? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
inflating: hololens/train/annotations/image (1).xml
replace hololens/train/annotations/image (10).xml? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
inflating: hololens/train/annotations/image (10).xml
replace hololens/train/annotations/image (100).xml? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
inflating: hololens/train/annotations/image (100).xml
replace hololens/train/annotations/image (101).xml? [y]es, [n]o, [A]ll, [N]one, [r]ename: a
error: invalid response [a]
replace hololens/train/annotations/image (101).xml? [y]es, [n]o, [A]ll, [N]one, [r]ename: A
inflating: hololens/train/annotations/image (101).xml
inflating: hololens/train/annotations/image (102).xml
..
inflating: hololens/train/annotations/image (98).xml
inflating: hololens/train/annotations/image (99).xml
inflating: hololens/train/images/image (1).jpg
inflating: hololens/train/images/image (10).jpg
..
inflating: hololens/train/images/image (98).jpg
inflating: hololens/train/images/image (99).jpg
...
inflating: hololens/validation/annotations/image (299).xml
inflating: hololens/validation/annotations/image (300).xml
...
inflating: hololens/validation/images/image (299).jpg
inflating: hololens/validation/images/image (300).jpg
- ดาวน์โหลด Pre-trained Model ของ YoloV3
Pre-trained Model — หมายถึง Model ที่ผ่านการ Train กับข้อมูลชุด COCO Image Dataset ด้วยวิธีการต่าง ๆ เช่น Inception, ResNet, และ VGGNet เป็นต้น แต่ในกรณีนี้ pre-trained model ได้มาจากการ train ด้วยวิธี YoloV3
!wget https://github.com/OlafenwaMoses/ImageAI/releases/download/essential-v4/pretrained-yolov3.h5
--2019-12-25 02:30:03-- https://github.com/OlafenwaMoses/ImageAI/releases/download/essential-v4/pretrained-yolov3.h5
Resolving github.com (github.com)... 140.82.118.3
Connecting to github.com (github.com)|140.82.118.3|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://github-production-release-asset-2e65be.s3.amazonaws.com/125932201/12701d80-b2ab-11e9-9f56-c06e1dfbec05?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20191225%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20191225T023003Z&X-Amz-Expires=300&X-Amz-Signature=6e55b2c1ddd3dbf8a40ca27b7dedb3a792decc16f65bf055c6ca7ba71cd492bf&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Dpretrained-yolov3.h5&response-content-type=application%2Foctet-stream [following]
--2019-12-25 02:30:03-- https://github-production-release-asset-2e65be.s3.amazonaws.com/125932201/12701d80-b2ab-11e9-9f56-c06e1dfbec05?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20191225%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20191225T023003Z&X-Amz-Expires=300&X-Amz-Signature=6e55b2c1ddd3dbf8a40ca27b7dedb3a792decc16f65bf055c6ca7ba71cd492bf&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Dpretrained-yolov3.h5&response-content-type=application%2Foctet-stream
Resolving github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)... 52.216.141.140
Connecting to github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)|52.216.141.140|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 248671664 (237M) [application/octet-stream]
Saving to: ‘pretrained-yolov3.h5’
pretrained-yolov3.h 100%[===================>] 237.15M 35.1MB/s in 7.3s
2019-12-25 02:30:11 (32.3 MB/s) - ‘pretrained-yolov3.h5’ saved [248671664/248671664]
- เริ่มต้น Train ตัว YoloV3
from imageai.Detection.Custom import DetectionModelTrainer
trainer = DetectionModelTrainer()
trainer.setModelTypeAsYOLOv3()
trainer.setDataDirectory(data_directory="/content/hololens")
trainer.setTrainConfig(object_names_array=["hololens"], batch_size=4, num_experiments=10, train_from_pretrained_model="/content/pretrained-yolov3.h5")
trainer.trainModel()
Using TensorFlow backend.Generating anchor boxes for training images and annotation...
Average IOU for 9 anchors: 0.78
Anchor Boxes generated.
Detection configuration saved in /content/hololens/json/detection_config.json
Training on: ['hololens']
Training with Batch Size: 4
Number of Experiments: 10
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Colocations handled automatically by placer.
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/imageai/Detection/Custom/yolo.py:24: to_float (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.cast instead.
Training with transfer learning from pretrained ModelInstructions for updating:
Use tf.cast instead.
Epoch 1/10
480/480 [==============================] - 411s 857ms/step - loss: 32.2983 - yolo_layer_1_loss: 3.3230 - yolo_layer_2_loss: 8.8533 - yolo_layer_3_loss: 20.1220 - val_loss: 11.9163 - val_yolo_layer_1_loss: 1.8629 - val_yolo_layer_2_loss: 3.9111 - val_yolo_layer_3_loss: 6.1424
Epoch 2/10
480/480 [==============================] - 374s 779ms/step - loss: 9.3328 - yolo_layer_1_loss: 1.3434 - yolo_layer_2_loss: 3.3928 - yolo_layer_3_loss: 4.5966 - val_loss: 7.6147 - val_yolo_layer_1_loss: 1.2607 - val_yolo_layer_2_loss: 2.6193 - val_yolo_layer_3_loss: 3.7347
Epoch 3/10
480/480 [==============================] - 370s 772ms/step - loss: 6.6165 - yolo_layer_1_loss: 1.0179 - yolo_layer_2_loss: 2.3349 - yolo_layer_3_loss: 3.2637 - val_loss: 7.1790 - val_yolo_layer_1_loss: 1.2495 - val_yolo_layer_2_loss: 2.2935 - val_yolo_layer_3_loss: 3.6360
Epoch 4/10
480/480 [==============================] - 368s 766ms/step - loss: 5.5891 - yolo_layer_1_loss: 0.9081 - yolo_layer_2_loss: 1.8914 - yolo_layer_3_loss: 2.7896 - val_loss: 6.3244 - val_yolo_layer_1_loss: 1.3588 - val_yolo_layer_2_loss: 2.0294 - val_yolo_layer_3_loss: 2.9363
Epoch 5/10
480/480 [==============================] - 364s 759ms/step - loss: 5.0505 - yolo_layer_1_loss: 0.7673 - yolo_layer_2_loss: 1.7522 - yolo_layer_3_loss: 2.5310 - val_loss: 6.3134 - val_yolo_layer_1_loss: 1.4739 - val_yolo_layer_2_loss: 2.1357 - val_yolo_layer_3_loss: 2.7037
Epoch 6/10
480/480 [==============================] - 369s 769ms/step - loss: 4.7872 - yolo_layer_1_loss: 0.7853 - yolo_layer_2_loss: 1.6456 - yolo_layer_3_loss: 2.3563 - val_loss: 6.1612 - val_yolo_layer_1_loss: 1.3190 - val_yolo_layer_2_loss: 2.0237 - val_yolo_layer_3_loss: 2.8185
Epoch 7/10
480/480 [==============================] - 367s 765ms/step - loss: 4.3860 - yolo_layer_1_loss: 0.7856 - yolo_layer_2_loss: 1.4188 - yolo_layer_3_loss: 2.1816 - val_loss: 6.0360 - val_yolo_layer_1_loss: 0.8701 - val_yolo_layer_2_loss: 2.3108 - val_yolo_layer_3_loss: 2.8550
Epoch 8/10
480/480 [==============================] - 362s 755ms/step - loss: 4.2424 - yolo_layer_1_loss: 0.6204 - yolo_layer_2_loss: 1.4439 - yolo_layer_3_loss: 2.1781 - val_loss: 5.5414 - val_yolo_layer_1_loss: 1.2344 - val_yolo_layer_2_loss: 1.9337 - val_yolo_layer_3_loss: 2.3732
Epoch 9/10
480/480 [==============================] - 365s 761ms/step - loss: 4.2746 - yolo_layer_1_loss: 0.7919 - yolo_layer_2_loss: 1.4812 - yolo_layer_3_loss: 2.0015 - val_loss: 5.3137 - val_yolo_layer_1_loss: 1.2211 - val_yolo_layer_2_loss: 1.7773 - val_yolo_layer_3_loss: 2.3152
Epoch 10/10
480/480 [==============================] - 357s 744ms/step - loss: 4.0202 - yolo_layer_1_loss: 0.6051 - yolo_layer_2_loss: 1.2527 - yolo_layer_3_loss: 2.1624 - val_loss: 5.5568 - val_yolo_layer_1_loss: 0.9480 - val_yolo_layer_2_loss: 2.0597 - val_yolo_layer_3_loss: 2.5491
Detection
Detection — หมายถึง การค้นหาวัตถุ (Object) ที่ปรากฎอยู่ในรูปภาพ — ในกรณีนี้ Object คือ Hololens
- ในการค้นหา (Detect) สามารถค้นพอวัตถุได้มากกว่า 1 ชิ้น
from imageai.Detection.Custom import CustomObjectDetection
import cv2
import matplotlib.pyplot as plt
detector = CustomObjectDetection()
detector.setModelTypeAsYOLOv3()
# choose the best model
detector.setModelPath("/content/hololens/models/detection_model-
ex-010--loss-0004.020.h5")
detector.setJsonPath("/content/hololens/json/detection_config.json")
detector.loadModel()
in_image = ['/content/hololens/validation/images/image (253).jpg',
'/content/hololens/validation/images/image (254).jpg',
'/content/hololens/validation/images/image (255).jpg']
out_image = ['/content/detect_image1.jpg','/content
/detect_image2.jpg', '/content/detect_image3.jpg']
for i in range(0, len(in_image)):
detections = detector.detectObjectsFromImage(
input_image=in_image[i],
output_image_path=out_image[i])
for detection in detections:
print(detection["name"], " : ",
detection["percentage_probability"], " : ",
detection["box_points"])
# show detected image
img = cv2.imread(out_image[i])
plt.imshow(img)
plt.show()
ผลลัพธ์ที่ได้จากการ Detection
hololens : 75.34997463226318 : [105, 42, 147, 58]
hololens : 66.01617336273193 : [160, 0, 267, 55]